ESP8266基于STM32的开发实质上就是AT开发,这里以ESP8266连接路由器为例,为了证明是否连接上了,这里我是开手机热点来验证的。当然,你也可以ESP8266作为AP热点,这样可能现象更明显,只要配置成功了,打开手机WiFi,就会出现ESP8266的AP。由于开始就是以连接路由为例写的程序,所以这里就用这个例子讲解。
首先,需要知道AT指令如何配置入网,代码如下
AT+CWMODE=3
AT+RET
AT+CWJAP="这里填WiFi名字","这里填密码"
STM32和WIFI之间的通信原理实质上就是通过串口通讯,单片机通过串口发送AT指令给ESP8266,从而实现通讯。
我这里用的是正点原子的探索者,串口用的是串口三(PB10,PB11),直接在实验四串口实验上进行写程序,程序会以网盘形式放在最后
这里,我将上面三条指令进行HEX显示(又叫十六进制显示),从而得到如下代码
u8 at_cwmode[] = {0x00,0x41,0x54,0x2B,0x43,0x57,0x4D,0x4F,0x44,0x45,0x3D,
0x33,0X0D,0x0A};
u8 at_rst[] = {0x41, 0x54, 0x2B, 0x52, 0x53, 0x54, 0x0D, 0x0A};
u8 at_cwjap[]={0x41,0x54,0x2B,0x43,0x57,0x4A,0x41,0x50,0x3D,0x22,0x68,0x6F,0x6E,0x6F,0x72,0x39,
0x22,0x2C,0x22,0x6D,0x6C,0x64,0x31,0x32,0x33,0x34,0x35,0x36,0x22,0x0D,0x0A};
之后直接进入主函数,就是通过串口发送这三条指令
int main(void)
{
u8 t=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //延时初始化
uart_init(115200); //串口初始化波特率为115200
usart3_init(115200);
LED_Init(); //初始化与LED连接的硬件接口
delay_ms(1000);
for(t=0;t<14;t++)
{
USART_SendData(USART3, at_cwmode[t]); //向串口3发送数据
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束
}
delay_ms(1000);
for(t=0;t<8;t++)
{
USART_SendData(USART3, at_rst[t]); //向串口3发送数据
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束
}
delay_ms(1000);
for(t=0;t<31;t++)
{
USART_SendData(USART3, at_cwjap[t]); //向串口3发送数据
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束
}
delay_ms(1000);
while(1)
{
}
}
程序:链接:https://pan.baidu.com/s/1uKPKYFmz9Ccve46MBTUfwQ 提取码:ht1w
说说开发的时候遇到的问题
1.起初我没有加AT+RST重启,因为我在操作AT指令的时候不加该步也能配网成功,然而在STM32开发时,发现并不行。
2.我是自己写了个串口三,并没有用串口一,在照串口一移植之后,本以为不需要串口中断,然后就发现只能发,不能收,然后看了下串口中断的函数,发现这是为了验证数据是否发送完全,如果没有的话,程序就会一直卡着不走。
3.起初串口打印信息看看发的AT指令完不完整的时候,发现永远打印不出开头第一个A,后面的几句都正常,所以我在最前面加了个0x00把长度增加一个得以解决。