千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > esp8266与stm32通信详解

esp8266与stm32通信详解

来源:千锋教育
发布人:xqq
时间: 2023-11-25 14:41:48 1700894508

在物联网时代,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进行有效的通信。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT