看到标题,你可能要纳闷了,为什么要基于ESP8266?
STM32H7S78-DK不是自到了WIFI模块吗?
就是下图中左边的MXCHIP EWM3080(通过SPI通信与STM32H7S78-DK)
然而,问题来了。
首先官方例程或BSP,并没有这个wifi模块的例程(或者是我没找到?)
其次,对于这个模块的信息只有官网有一些,ST官方提到用之前要升级固件。
https://www.st.com.cn/zh/development-tools/x-wifi-emw3080b.html#
然而下载下来是这样的:
也就是B-U585I-IOT02A和STM32H573I-DK的固件。下面两个是通用固件?
或者有大神可以移植到STM32H7S78-DK?
(B-U585I-IOT02A的官方例程)
尝试用官方网站的UART升级办法,得到的是串口错误信息。
尝试到最后只能放弃。
只能选择ESP8266,
眼尖的你可能已经看到了,扩展板上有ESP-01插孔。
淘宝买了个ESP8266模块(5元包邮)
结果问题又来了。
看到了吗?STMOD+(CN3) UART7的RXT和TXD引脚跟SPI4是共用端口,而且是没有焊接的(DNF,DNP是英文(Do Not Populate)的意思,译为“不焊接”。)
那就干脆,把SB1、SB5焊接起来,测试果然OK。
回到ESP8266.
3V3 RST EN直接短接,要保持高电平。
剩下的就是程序来完成配置了(通过AT指令)。
本程序的基本思路是。
通过扩展版USRT7 TXD——>AT指令配置并获取时间——>USRT7 RXD 获取数据——>进行数据加工,单独摘出时间——>虚拟串口USRT4 TXD——>PC 串口助手显示时间(也可以在上一步直接通过开发板的LCD显示时间)
关于串口部分的测试,详见前贴,本例要同时开启UART4(——>虚拟串口)和UART7(——>ESP8266 WIFI)
https://bbs.eeworld.com.cn/thread-1295306-1-1.html
其中UART7要开启中断:
关于ESP8266的使用方法,以及时间获取方式,网上有很多资料可以参考。
#include "main.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stm32h7rsxx_hal_uart.h"
unsigned char UART_BUF1[] = "AT\r\n"; //AT指令确认
unsigned char UART_BUF2[] = "AT+CWMODE=1\r\n"; //STA模式
unsigned char UART_BUF3[] = "AT+CWJAP=\"Xiaomi_D7CB\",\"密码\"\r\n"; //连接wifi
unsigned char UART_BUF4[] = "AT+CIPSTART=\"TCP\",\"tianqiapi.com\",80\r\n";
unsigned char UART_BUF5[] = "AT+CIPSEND=5\r\n";
unsigned char UART_BUF6[] = "GET\r\n";
unsigned char UART_BUF7[] = "AT+CIPCLOSE\r\n";
unsigned char UART_BUF0[300] ;
unsigned char UART_BUF00[25] ;
核心的AT代码是:
unsigned char UART_BUF4[] = "AT+CIPSTART=\"TCP\",\"tianqiapi.com\",80\r\n";
unsigned char UART_BUF5[] = "AT+CIPSEND=5\r\n";
unsigned char UART_BUF6[] = "GET\r\n";
main函数代码:
int main(void)
{
MPU_Config();
SystemCoreClockUpdate();
HAL_Init();
MX_GPIO_Init();
MX_UART7_Init();
MX_UART4_Init();
HAL_UART_Receive_IT(&huart7, UART_BUF0,sizeof(UART_BUF0));
HAL_UART_Transmit(&huart7,UART_BUF1, sizeof(UART_BUF1),1000);
HAL_Delay(1000);
HAL_UART_Transmit(&huart7,UART_BUF2, sizeof(UART_BUF2),1000);
HAL_Delay(1000);
HAL_UART_Transmit(&huart7,UART_BUF3, sizeof(UART_BUF3),1000);
HAL_Delay(1000);
HAL_UART_Transmit(&huart7,UART_BUF4, sizeof(UART_BUF4),1000);
HAL_Delay(100);
HAL_UART_Transmit(&huart7,UART_BUF5, sizeof(UART_BUF5),1000);
HAL_Delay(100);
HAL_UART_Transmit(&huart7,UART_BUF6, sizeof(UART_BUF6),1000);
HAL_Delay(100);
HAL_UART_Transmit(&huart7,UART_BUF7, sizeof(UART_BUF7),1000);
HAL_Delay(1000);
for(int i=175;i<200;i++)
{
UART_BUF00[i-175]=UART_BUF0[i];
}
HAL_UART_Transmit(&huart4,UART_BUF00, sizeof(UART_BUF00),1000);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//HAL_Delay(1000);
//HAL_UART_Transmit(&huart7,UART_BUF1, sizeof(UART_BUF1),1000);
}
/* USER CODE END 3 */
}
此部分就是进行数据加工,单独摘出时间
for(int i=175;i<200;i++)
{
UART_BUF00[i-175]=UART_BUF0;
}
UART7串口中断函数:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Receive_IT(&huart7, UART_BUF0,sizeof(UART_BUF0));
}
运行结果如图,时间与北京时间有8小时差别(时区原因),后续再优化了。
本次分享就到这里。