#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指令发送函数
void wifi_usart_transmit_cmd(const char *cmd,const char *expected);
//发送字节
void wifi_usart_transmit_byte(uint8_t ucch);
//发送字符串
void wifi_usart_transmit_string(uint8_t *ucstr);
//接收函数
void USART2_IRQHandler(void);
//配置wifi为热点模式
void esp8266_server_init(void);
#endif
#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);
//配置引脚复用
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指令发送响应函数
void wifi_usart_transmit_cmd(const char *cmd,const char *expected)
{
//发送指令
wifi_usart_transmit_string((uint8_t *)cmd);
//等待接收到期待响应
while((strcmp((const char *)wifi_usart_recv_buf, expected) != 0)||(wifi_usart_complete_flag==0))
{
wifi_usart_transmit_string("error");
delay_1ms(10000);
}
//清零存放响应的数组,便于下一次接收信息
memset(wifi_usart_recv_buf, '\0', sizeof(wifi_usart_recv_buf));
wifi_usart_recv_index = 0;
wifi_usart_complete_flag = 0;
}
//发送字节
void wifi_usart_transmit_byte(uint8_t ucch)
{
// 发送数据
usart_data_transmit(ESP_USART,(uint8_t)ucch);
// 等待发送数据缓冲区标志置位
while(usart_flag_get(ESP_USART,USART_FLAG_TBE)==RESET);
}
//发送字符串
void wifi_usart_transmit_string(uint8_t *string)
{
// 当字符串指针不为空且当前字符不为空时循环
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) // 接收缓冲区不为空
{
usart_flag_clear(ESP_USART,USART_FLAG_RBNE);
wifi_usart_recv_buf[wifi_usart_recv_index++] = usart_data_receive(ESP_USART); // 把收到的数据放在缓冲区中
}
if(usart_interrupt_flag_get(ESP_USART,USART_INT_FLAG_IDLE) == SET) // 检测到帧中断
{
usart_data_receive(ESP_USART); // 必须读,读出来的值不能要
wifi_usart_recv_buf[wifi_usart_recv_index] = '\0'; // 数据接收完毕,数组结束标志
wifi_usart_complete_flag = 1; // 接收完成
}
}
//配置wifi为热点模式
void esp8266_server_init(void)
{
//建立多连接模式
wifi_usart_transmit_cmd("AT+CIPMUX=1","OK");
//开启wifi服务器并设置端口
wifi_usart_transmit_cmd("AT+CIPSERVER=1,8080","OK");
}
|