|
|
#include "WIFI.h"
#include <stdio.h>
uint8_t wifi_usart_recv_buf[ESP_USART_RX_BUF_SIZE] = {};
uint16_t wifi_usart_recv_index = 0;
uint8_t wifi_usart_complete_flag = 0;
//wifi串口初始化
void wifi_usart_config(void)
{
//禁用usart2
usart_disable(ESP_USART);
//給usart2和pc10、pc11使能
rcu_periph_clock_enable(ESP_USART_RCU);
rcu_periph_clock_enable(ESP_USART_PORT_RCU);
//配置pc10 tx為推挽輸出,pc11 rx為浮空輸入
gpio_mode_set(ESP_USART_PORT,GPIO_MODE_AF,GPIO_PUPD_PULLUP,ESP_USART_TX_PIN);
gpio_output_options_set(ESP_USART_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,ESP_USART_TX_PIN);
gpio_mode_set(ESP_USART_PORT,GPIO_MODE_AF,GPIO_PUPD_PULLUP,ESP_USART_RX_PIN);
gpio_output_options_set(ESP_USART_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,ESP_USART_RX_PIN);
//配置引腳復(fù)用
gpio_af_set(ESP_USART_PORT, GPIO_AF_7, ESP_USART_TX_PIN);
gpio_af_set(ESP_USART_PORT, GPIO_AF_7, ESP_USART_RX_PIN);
//usart2配置
usart_deinit(ESP_USART);
usart_baudrate_set(ESP_USART, 115200);
usart_word_length_set(ESP_USART, USART_WL_8BIT);
usart_stop_bit_set(ESP_USART, USART_STB_1BIT);
usart_parity_config(ESP_USART, USART_PM_NONE);
usart_receive_config(ESP_USART, USART_RECEIVE_ENABLE);
usart_transmit_config(ESP_USART, USART_TRANSMIT_ENABLE);
//使能usart2
usart_enable(ESP_USART);
//配置usart2中斷
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
nvic_irq_enable(USART2_IRQn, 2, 2);
usart_interrupt_enable(ESP_USART,USART_INT_RBNE);
usart_interrupt_enable(ESP_USART,USART_INT_IDLE);
}
//AT指令發(fā)送響應(yīng)函數(shù)
void wifi_usart_transmit_cmd(const char *cmd,const char *expected)
{
//發(fā)送指令
wifi_usart_transmit_string((uint8_t *)cmd);
//等待接收到期待響應(yīng)
while((strcmp((const char *)wifi_usart_recv_buf, expected) != 0)||(wifi_usart_complete_flag==0))
{
wifi_usart_transmit_string("error");
delay_1ms(10000);
}
//清零存放響應(yīng)的數(shù)組,便于下一次接收信息
memset(wifi_usart_recv_buf, '\0', sizeof(wifi_usart_recv_buf));
wifi_usart_recv_index = 0;
wifi_usart_complete_flag = 0;
}
//發(fā)送字節(jié)
void wifi_usart_transmit_byte(uint8_t ucch)
{
// 發(fā)送數(shù)據(jù)
usart_data_transmit(ESP_USART,(uint8_t)ucch);
// 等待發(fā)送數(shù)據(jù)緩沖區(qū)標(biāo)志置位
while(usart_flag_get(ESP_USART,USART_FLAG_TBE)==RESET);
}
//發(fā)送字符串
void wifi_usart_transmit_string(uint8_t *string)
{
// 當(dāng)字符串指針不為空且當(dāng)前字符不為空時(shí)循環(huán)
while(string && *string) // 地址為空或者值為空跳出
{
wifi_usart_transmit_byte(*string++);
}
wifi_usart_transmit_byte('\r');
wifi_usart_transmit_byte('\n');
}
void USART2_IRQHandler(void)
{
if(usart_interrupt_flag_get(ESP_USART,USART_INT_FLAG_RBNE) == SET) // 接收緩沖區(qū)不為空
{
usart_flag_clear(ESP_USART,USART_FLAG_RBNE);
wifi_usart_recv_buf[wifi_usart_recv_index++] = usart_data_receive(ESP_USART); // 把收到的數(shù)據(jù)放在緩沖區(qū)中
}
if(usart_interrupt_flag_get(ESP_USART,USART_INT_FLAG_IDLE) == SET) // 檢測(cè)到幀中斷
{
usart_data_receive(ESP_USART); // 必須讀,讀出來(lái)的值不能要
wifi_usart_recv_buf[wifi_usart_recv_index] = '\0'; // 數(shù)據(jù)接收完畢,數(shù)組結(jié)束標(biāo)志
wifi_usart_complete_flag = 1; // 接收完成
}
}
//配置wifi為熱點(diǎn)模式
void esp8266_server_init(void)
{
//建立多連接模式
wifi_usart_transmit_cmd("AT+CIPMUX=1","OK");
//開啟wifi服務(wù)器并設(shè)置端口
wifi_usart_transmit_cmd("AT+CIPSERVER=1,8080","OK");
}
#include <string.h>
#include "systick.h"
#include <stdbool.h>
//宏定義
#define ESP_USART_PORT_RCU RCU_GPIOC
#define ESP_USART_PORT GPIOC
#define ESP_USART_TX_PIN GPIO_PIN_10
#define ESP_USART_RX_PIN GPIO_PIN_11
#define ESP_USART USART2
#define ESP_USART_RCU RCU_USART2
#define ESP_USART_RX_BUF_SIZE 128
//wifi串口初始化
void wifi_usart_config(void);
//AT指令發(fā)送函數(shù)
void wifi_usart_transmit_cmd(const char *cmd,const char *expected);
//發(fā)送字節(jié)
void wifi_usart_transmit_byte(uint8_t ucch);
//發(fā)送字符串
void wifi_usart_transmit_string(uint8_t *ucstr);
//接收函數(shù)
void USART2_IRQHandler(void);
//配置wifi為熱點(diǎn)模式
void esp8266_server_init(void);
#endif
|
|