creep 发表于 2016-12-14 22:52:20

【F769IDISCOVERY评测】ESP8266简单上手

         最近看到很多社区论坛大神用ESP8266配合STM32F769 Discovery(STM32官网)做了很多高端的应用,想起我也有一个闲置好久的ESP8266模块,决定重新找出来折腾折腾。高端的应用我不会搞就弄个简单的上手程序给需要的做个参考。


    STM32F32769 Discovery上有个ESP8266 串口WIFI模块的扩展接口,如果有模块的话直接装上即可使用,省了不少用杜邦线连接模块到开发板的板麻烦。我找了下丢在一边好久没用的ESP8266 吹吹灰然后插到板子上,看到熟悉的蓝灯闪烁几下灭掉红灯常亮应该问题不大可以继续战斗。


    常见的串口WIFI模块在进入数据透传模式之前都会包含很多的AT命令用于设置模块、接收发送数据。如果是第一次接触最好的找个WIFI模块的评估开发板而不是一个单独的WIFI模块.一般的WIFI模块评估板上面都会有一个USB转串口用于测试熟悉各种的AT命令,等彻底了解了各种AT命令以及发送接收数据的设置后再在程序固化WIFI的初始化设置用的AT命令序列。比较幸运是ST官方的Discovery、Nucleo 开发板上都会有一个带虚拟串口的STLink,可以借助这个虚拟串口方便的进行AT命令测试,WIFI模块接收发送数据测试,这样在前期的测试中我们可以借助这个虚拟串口做一个类似中转的作用,不需要在程序中写任何的AT命令就可以测试所的模块的命令和数据收发。


1、虚拟串口中转数据
STM32F32769 Discovery 上的ESP8266扩展接口和MCU的UART5 相连,stlink的虚拟串口和MCU的USART1 相连,由于AT命令的收发都是不定长的数据,我们可以参考上一个帖子中超时中断+DMA的模式来设置USART1\UART5同时打开超时中断和DMA收发。这样做之后我们就可以直接在电脑上同过串口助手借助stlink的虚拟串口进行ESP8266的各种AT命令测试了。
stlink的虚拟串口超时中断的回调函数如下:
<font size="3" face="Tahoma">void UART_ReceiverTimeOut_Callback(UART_HandleTypeDef *huart)
{
    uint16_t len;
    uint32_t tmp1 = 0;
    tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_RTOF);
    if((tmp1 != RESET))
    {
      __HAL_UART_CLEAR_IT(huart, UART_CLEAR_RTOF);
      /* set uart stateready*/
      huart->RxState = HAL_UART_STATE_READY;
      /* Disable the rxDMA peripheral */
      __HAL_DMA_DISABLE(huart->hdmarx);
      /*Clear the DMA Stream pending flags.*/
      __HAL_DMA_CLEAR_FLAG(huart->hdmarx, __HAL_DMA_GET_TC_FLAG_INDEX(huart->hdmarx));
      /* get rx data len */
      len = huart->hdmarx->Instance->NDTR;
      U1_Rxlen = RXBUFFLENGTH - len;
      /* Process Unlocked */
      __HAL_UNLOCK(huart->hdmarx);
      
       huart->hdmarx->State = HAL_DMA_STATE_READY;

       HAL_UART_Receive_DMA(huart, U1_RxBuff, RXBUFFLENGTH);
                         WIFI_CMD_Received_Sta = ENABLE;
    }
}
</font>ESP8266超时中断回调函数如下:<font size="3" face="Tahoma">void WIFI_ReceiverTimeOut_Callback(UART_HandleTypeDef *huart)
{
    uint16_t len;
    uint32_t tmp1 = 0;
    tmp1 = __HAL_UART_GET_FLAG(huart, UART_FLAG_RTOF);
    if((tmp1 != RESET))
    {
      __HAL_UART_CLEAR_IT(huart, UART_CLEAR_RTOF);
      /* set uart stateready*/
      huart->RxState = HAL_UART_STATE_READY;
      /* Disable the rxDMA peripheral */
      __HAL_DMA_DISABLE(huart->hdmarx);
      /*Clear the DMA Stream pending flags.*/
      __HAL_DMA_CLEAR_FLAG(huart->hdmarx, __HAL_DMA_GET_TC_FLAG_INDEX(huart->hdmarx));
      /* get rx data len */
      len = huart->hdmarx->Instance->NDTR;
      WIFI_Rxlen = RXBUFFLENGTH - len;
      /* Process Unlocked */
      __HAL_UNLOCK(huart->hdmarx);
      
       huart->hdmarx->State = HAL_DMA_STATE_READY;

      HAL_UART_Receive_DMA(huart, WIFI_RxBuff, RXBUFFLENGTH);
                        WIFI_CMD_Response_Sta = ENABLE;
    }
}</font>在mian函数中实现stlink虚拟串口的中转:<font size="3" face="Tahoma">int main(void)
{
CPU_CACHE_Enable();
HAL_Init();
SystemClock_Config();
USART1_Init();
My_ESP8266_Init();
while (1)
{
                //发送接收的esp8266模块响应到stlink的虚拟串口
                if(WIFI_CMD_Response_Sta && WIFI_Rxlen)
                {
                              HAL_UART_Transmit_DMA(&UartHandle, WIFI_RxBuff, WIFI_Rxlen);
                              WIFI_CMD_Response_Sta = DISABLE;
                              WIFI_Rxlen = 0;
                }
                //发送接收到的stlink虚拟串口数据esp8266模块
                if(WIFI_CMD_Received_Sta && U1_Rxlen)
                {
                        HAL_UART_Transmit_DMA(&WiFiUartHandle,U1_RxBuff,U1_Rxlen);
                        WIFI_CMD_Received_Sta = DISABLE;
                        U1_Rxlen = 0;
                }
}
}</font>通过上面的设置我们就可以用串口助手完全控制ESP8266模块了。
2、AT命令测试
我们先用AT命令看下ESP8266的版本信息和复位命令

然后查看下模块的工作模式和连接到路由器后的IP地址

3、TCP测试除了测试模块的AT指令之外我们测试下TCP传输,设置模块和电脑连接同一个路由,模块发送数据到电脑的TCP Server调试软件,同时TCP Server发送数据到模块,基本的设置AT指令顺序如下:<font size="3" face="Tahoma">1.设置工作模式:3(STA+AP)
AT+CWMODE=3

2.设置无线路由器的用户名和密码
AT+CWJAP="ssid","password"

3.查询IP,常见的是192.168.x.x局域网IP
AT+CIFSR

4.设置单链接
AT+CIPMUX=0

5.设置透传模式
AT+CIPMODE=1

6.连接电脑上的TCPServer,IP和端口号根据具体情况进行修改即可
AT+CIPSTART="TCP","192.168.1.102",8080

7.启动透传发送
AT+CIPSEND

8.发送透传数据
</font>测试结果如下:
4、UDP测试
设置AT命令如下;<font size="3" face="Tahoma">1.设置工作模式:3(STA+AP)
AT+CWMODE=3

2.设置无线路由器的用户名和密码(已连接过路由请忽略)
AT+CWJAP="ssid","password"

3.查询IP,常见的是192.168.x.x局域网IP
AT+CIFSR

4.设置单链接
AT+CIPMUX=0

5.设置透传模式
AT+CIPMODE=1

6.连接电脑上的udp,IP和端口号根据具体情况进行修改即可
AT+CIPSTART="UDP","192.168.1.102",8080,8899,0

7.启动透传发送
AT+CIPSEND

8.发送透传数据</font>测试结果:
除了上面的工作模式之外还有其他数据传输模块,借助于stlink的虚拟串口进行中转数据我们可以很快的熟悉AT命令和数据收发的设置。
5、ESP8266调试软件
如果感觉输入各种的AT命令麻烦可以使用ESP8266调试软件配合stlink的虚拟串口进行AT命令测试和数据收发测试



测试代码:AT命令文档;ESP8266调试工具:

推荐阅读:
【F769IDISCOVERY评测】串口接收超时中断和字符匹配中断
   

creep 发表于 2017-9-21 21:56:12

lijain 发表于 2017-9-14 11:07
你好,你这个udp做的很不错。不过每次连接要是换不同电脑ip变了。还的重新烧写,不是很麻烦。可以交流下? ...

IP固定写死是不方便,IP 可以做成为可以设置应该方便些。
欢迎加入社区QQ群交流讨论:427779516

creep 发表于 2017-1-13 08:57:45

maomoa 发表于 2017-1-12 22:06
谢谢楼主,这个应用是极好的,很有启发性.

:handshake                           

creep 发表于 2016-12-15 18:03:37

zero99 发表于 2016-12-15 15:58
橙子出品,必属精品

:lol:lol:lol               

霹雳之火 发表于 2016-12-15 09:03:29

谢谢分享 占沙发:lol:lol

jackten 发表于 2016-12-15 09:14:44

谢谢分享                     

风子 发表于 2016-12-15 09:44:45

膜拜大神

anobodykey 发表于 2016-12-15 10:02:26

感谢楼主分享

creep 发表于 2016-12-15 10:23:12

风子 发表于 2016-12-15 09:44
膜拜大神

:P            

Stm32McuLover 发表于 2016-12-15 12:08:22

:):):)顶大神

Paderboy 发表于 2016-12-15 12:47:30

膜拜大神:loveliness:

5265325 发表于 2016-12-15 12:57:35

:lol:lol:lol:lol:lol:lol:lol:lol

creep 发表于 2016-12-15 13:40:20

哈佛祖安智 发表于 2016-12-15 12:08
顶大神

感谢版主支持!:)

creep 发表于 2016-12-15 13:41:14

Paderboy 发表于 2016-12-15 12:47
膜拜大神

Hello,PB !!!:P

zero99 发表于 2016-12-15 15:58:18

橙子出品,必属精品:lol

zbber 发表于 2016-12-15 17:50:36

顶大神,楼主加油,我们都看好你哦

creep 发表于 2016-12-15 18:04:45

zbber 发表于 2016-12-15 17:50
顶大神,楼主加油,我们都看好你哦

我们同样也看好你哦
页: [1] 2
查看完整版本: 【F769IDISCOVERY评测】ESP8266简单上手