在物联网时代,esp8266模块作为一款价格便宜、功能强大的Wi-Fi模块,被广泛应用于智能家居、智能工业、物联网等领域。而stm32则作为一款强大的32位微控制器也在物联网领域拥有广泛应用。在实际应用中,esp8266与stm32的通信非常重要,通过这篇文章将会详细讲解esp8266与stm32通信的实现方法。
一、基础概念
1.1 esp8266模块
esp8266模块是一款由中国乐鑫公司开发的Wi-Fi芯片,它不仅仅作为一款Wi-Fi芯片,还集成了一个32位Tensilica处理器。它提供了完整的TCP/IP协议栈,能够与其他模块或者设备进行数据交互。它的安装非常方便,只需要一个外部晶振和一些常见的低成本被动元件就可以工作。它支持STA/AP/AP+STA三种运行模式,还支持多路链接。
1.2 stm32微控制器
stm32是ST公司面向嵌入式应用市场推出的一系列高性能、低功耗微控制器,它基于ARM Cortex-M内核,提供了不同尺寸和性能级别的产品定位。它广泛应用于工业控制、汽车电子、医疗仪器等领域。它具有丰富的外设、低功耗、高性价比等特点。
二、esp8266与stm32通信协议
2.1 esp8266与stm32串口通信
esp8266与stm32之间的最简单的通信协议就是串口通信。串口通信是一种常见的通信方式,利用串口可以将数字信号转换成一定波特率的串行信号进行数据传输。在实际应用中发现,这种通信方式的稳定性和可靠性非常高。在进行串口通信时,主要需要注意波特率的选取和数据头的配置,esp8266和stm32需要设置相同的波特率和数据头才能成功传输数据。
/*STM32串口配置*/
UART_HandleTypeDef huart1;
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
HAL_UART_Init(&huart1);
/*ESP8266串口配置*/
#define Esp8266Usart huart1
#define Esp8266Send(s) HAL_UART_Transmit(&Esp8266Usart, s, strlen(s), 0x8fff);
#define Esp8266Wait(n) HAL_Delay(n)
2.2 esp8266与stm32 SPI通信
SPI通信是一种全双工、串行传输的通信方式,它采用主从模式,主机通过片选信号控制从机的选中和解选中。SPI通信具有传输速度快、数据传输可靠等特点。
/*stm32SPI配置*/
SPI_HandleTypeDef hspi1;
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 7;
HAL_SPI_Init(&hspi1);
/*ESP8266 SPI配置*/
#define Esp8266Spi hspi1
#define Esp8266CsLow() HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, GPIO_PIN_RESET);
#define Esp8266CsHigh() HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, GPIO_PIN_SET);
三、esp8266与stm32通信实现
3.1 esp8266与stm32通过串口通信实现
在这种方式下,stm32作为主控,利用串口与esp8266进行通信。下面的代码实现了在stm32上开启一个wifi热点,利用esp8266模块连接,并将接收到的字符串打印出来。
void wifi_init(void)
{
char buf[300];
memset(buf,0,300);
sprintf(buf,"AT+RST\r\n"); //模块复位
Esp8266Send(buf);
Esp8266Wait(500);
memset(buf,0,300);
sprintf(buf,"AT+CWMODE=2\r\n"); //设置为AP模式
Esp8266Send(buf);
Esp8266Wait(500);
memset(buf,0,300);
sprintf(buf,"AT+CWSAP=\"WIFI\",\"123456789\",5,0\r\n");//设置wifi名称和密码,通道和无加密
Esp8266Send(buf);
Esp8266Wait(500);
memset(buf,0,300);
sprintf(buf,"AT+CIPMUX=0\r\n"); //设置为单路链接
Esp8266Send(buf);
Esp8266Wait(500);
memset(buf,0,300);
sprintf(buf,"AT+CIPSTART=\"UDP\",\"192.168.4.1\",8080,8080,0\r\n");//设置udp server
Esp8266Send(buf);
Esp8266Wait(500);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
char buf[u_rxlen];
memset(buf,0,u_rxlen);
memcpy(buf,u_rxbuf,u_rxlen-1);
HAL_UART_Transmit(&huart1,buf,u_rxlen-1,0x8fff);
}
3.2 esp8266与stm32通过SPI通信实现
在这种方式下,esp8266作为主控,利用SPI与stm32进行通信。下面的代码实现了esp8266从stm32读取一个字节的数据,并返回给stm32,在stm32上将读取到的数据放到LD3和LD4两个led灯上。
void spi_init(void)
{
uint8_t ack=0;
do{
HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,SPI1_CS_Pin,GPIO_PIN_RESET);
HAL_SPI_Transmit(&hspi1,&cmd_01,1,0xffff);
HAL_SPI_Receive(&hspi1,&ack,1,0xffff);
HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,SPI1_CS_Pin,GPIO_PIN_SET);
}while(ack!=0xab);
delay(1000);
}
void LedBlink(void)
{
for(int i=0;i<8;i++)
{
HAL_GPIO_TogglePin(GPIOB,LD3_Pin|LD4_Pin);
HAL_Delay(250);
}
}
void SpiTest(void)
{
uint8_t spi_rx_buf[1];
uint8_t spi_tx_buf[1];
spi_tx_buf[0]=0x5a;
while(1)
{
HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,SPI1_CS_Pin,GPIO_PIN_RESET);
HAL_SPI_TransmitReceive(&hspi1,spi_tx_buf,spi_rx_buf,1,0xffff);
HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,SPI1_CS_Pin,GPIO_PIN_SET);
if(spi_rx_buf[0]==0x5a)
{
LedBlink();
}
HAL_Delay(200);
}
}
四、总结
在实际应用中,esp8266与stm32的通信非常重要,上述文章详细介绍了esp8666与stm32通信协议、通信实现方法。在使用串口通信时,需要注意波特率和数据头的选取。在使用SPI通信时,需要注意主从模式选择和SPI时序的设定。我们可以根据实际应用需求,选择适合的通信方式,将esp8266与stm32进行有效的通信。