实验使用资源:正点原子F1
USART1:PA9P、A10(串口打印调试)
USART3:PB10、PB11(WiFi模块)
DHT11:PG11(采集数据、上报)
LED0、1:PB5、PE5(介绍命令,控制亮灭)
显示屏(可有可无)
HAL库创建工程
参考之前的博客:STM32CubeMX安装_stm32cubemx下载-CSDN博客
ESP8266固件烧录
参考之前的博客:ESP8266连接阿里云_esp8266+阿里云-CSDN博客
阿里云创建物模型
参考之前的博客:ESP8266连接阿里云_esp8266+阿里云-CSDN博客
模块移植
这里主要说usart模块和WiFi相关模块,其他模块的驱动很简单,不再描述
usart模块
- 将【stm32f1xx_it.c】里面的
void USART1_IRQHandler(void)
和void USART3_IRQHandler(void)
函数注释掉
- 将下面的代码粘贴到【usart.c】中的最下面的
/* USER CODE BEGIN 1 */
和/* USER CODE END 1 */
之间
/**
* @brief ATK-MW8266D UART printf
* @param fmt: 待打印的数据
* @retval 无
*/
void atk_mw8266d_uart_printf(char *fmt, ...)
{
va_list ap;
uint16_t len;
va_start(ap, fmt);
vsprintf((char *)g_uart_tx_buf, fmt, ap);
va_end(ap);
len = strlen((const char *)g_uart_tx_buf);
HAL_UART_Transmit(&huart3, g_uart_tx_buf, len, HAL_MAX_DELAY);
}
/**
* @brief ATK-MW8266D UART重新开始接收数据
* @param 无
* @retval 无
*/
void atk_mw8266d_uart_rx_restart(void)
{
g_uart_rx_frame.sta.len = 0;
g_uart_rx_frame.sta.finsh = 0;
}
/**
* @brief 获取ATK-MW8266D UART接收到的一帧数据
* @param 无
* @retval NULL: 未接收到一帧数据
* 其他: 接收到的一帧数据
*/
uint8_t *atk_mw8266d_uart_rx_get_frame(void)
{
if (g_uart_rx_frame.sta.finsh == 1)
{
g_uart_rx_frame.buf[g_uart_rx_frame.sta.len] = '\0';
return g_uart_rx_frame.buf;
}
else
{
return NULL;
}
}
/**
* @brief 获取ATK-MW8266D UART接收到的一帧数据的长度
* @param 无
* @retval 0 : 未接收到一帧数据
* 其他: 接收到的一帧数据的长度
*/
uint16_t atk_mw8266d_uart_rx_get_frame_len(void)
{
if (g_uart_rx_frame.sta.finsh == 1)
{
return g_uart_rx_frame.sta.len;
}
else
{
return 0;
}
}
void USART1_IRQHandler(void)
{
#if SYS_SUPPORT_OS /* 使用OS */
OSIntEnter();
#endif
HAL_UART_IRQHandler(&huart1); /* 调用HAL库中断处理公用函数 */
while (HAL_UART_Receive_IT(&huart1, (uint8_t *)g_rx_buffer, RXBUFFERSIZE) != HAL_OK) /* 重新开启中断并接收数据 */
{
/* 如果出错会卡死在这里 */
}
#if SYS_SUPPORT_OS /* 使用OS */
OSIntExit();
#endif
}
void USART3_IRQHandler(void)
{
/* USER CODE BEGIN USART3_IRQn 0 */
/* USER CODE END USART3_IRQn 0 */
HAL_UART_IRQHandler(&huart3