GD32F310连接ESP8266实现远程灯控制

发布者:和谐共融最新更新时间:2024-12-06 来源: elecfans 手机看文章 扫描二维码
随时随地手机看文章

功能描述

通过mcu与esp01通过uart连接,通过at指令来创建socket连接,接收远端控制灯的指令,来实现灯亮,灭及闪烁;

开启两路串口,usart0(GPIO09-TX,GPIO10-RX)连接esp01,进行收发at指令,usart1(GPIO02-TX,GPIO03-RX)作为log输出口;


接线图

poYBAGMsNFOATpujAADTzf4hZCo728.png?imageView2/2/w/1000

ps.电阻可以不接,直接EN和3.3V拉一根线也能起来;

有条件的话,可以选esp01s,不用接电阻。

代码流程介绍

uart0连接esp01,收发数据使用中断方式进行,接收数据检测到OK,ERROR等关键字以后关闭接收。


uart中断


void USART0_IRQHandler(void) {


    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) {

        /* receive data */

        rx_buffer[rx_count++] = usart_data_receive(USART0);

        if(rx_count >= BUFFER_SIZE) {

            usart_interrupt_disable(USART0, USART_INT_RBNE);

                        printf('rx buffer is full!!n');

                        recv_flag = 0;

        }

                

                if(strstr((const char *)rx_buffer, 'OKrn') || 

                    strstr((const char *)rx_buffer, 'ERRORrn')

                ){

                    usart_interrupt_disable(USART0, USART_INT_RBNE);

                    recv_flag = 0;

                }

                else if(strstr((const char *)rx_buffer, 'blink') || 

                    strstr((const char *)rx_buffer, 'on') || 

                    strstr((const char *)rx_buffer, 'off')

                ){

                    usart_interrupt_disable(USART0, USART_INT_RBNE);

                    recv_flag = 0;

                }

    }


    if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE)) {

        /* transmit data */

        usart_data_transmit(USART0, tx_buffer[tx_count++]);

        if(tx_count >= BUFFER_SIZE) {

          usart_interrupt_disable(USART0, USART_INT_TBE);

                    send_flag = 0;

        }

                if(tx_count >= send_len)

                {

                    usart_interrupt_disable(USART0, USART_INT_TBE);

                    send_flag = 0;

                    send_len = 0;

                }

    }

}

uart初始化:


    /* enable COM GPIO clock */

    rcu_periph_clock_enable(RCU_GPIOA);


    /* connect port to USARTx_Tx */

    gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_9);


    /* connect port to USARTx_Rx */

    gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_10);


    /* configure USART Tx as alternate function push-pull */

    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_9);

    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_9);


    /* configure USART Rx as alternate function push-pull */

    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_10);

    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_10);


    /* enable USART clock */

    rcu_periph_clock_enable(RCU_USART0);


    /* USART configure */

    usart_deinit(USART0);

    usart_baudrate_set(USART0, 115200U);

    usart_receive_config(USART0, USART_RECEIVE_ENABLE);

    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);


    usart_enable(USART0);

    nvic_irq_enable(USART0_IRQn, 0, 0);

LED初始化:


GPIO_InitTypeDef GPIO_InitStruct = {0};

    /*GPIO Port Clock Enable */

    rcu_periph_clock_enable(RCU_GPIOA);

    

    /*Configure GPIO pin : PtPin  PA8*/

    GPIO_InitStruct.gpio_periph = GPIOA;

    GPIO_InitStruct.mode = GPIO_MODE_OUTPUT;

    GPIO_InitStruct.pin = GPIO_PIN_8;

    GPIO_InitStruct.otype = GPIO_OTYPE_PP;

    GPIO_InitStruct.speed = GPIO_OSPEED_50MHZ;

    GPIO_InitStruct.pull_up_down = GPIO_PUPD_NONE;

    gpio_mode_set(GPIO_InitStruct.gpio_periph,GPIO_InitStruct.mode,GPIO_InitStruct.pull_up_down,GPIO_InitStruct.pin);


    /*Configure GPIO pin Output Level */

    gpio_output_options_set(GPIO_InitStruct.gpio_periph,GPIO_InitStruct.otype,GPIO_InitStruct.speed,GPIO_InitStruct.pin);

    GPIO_BC(GPIO_InitStruct.gpio_periph) = GPIO_InitStruct.pin;

    /* EXTI interrupt init*/

程序代码:


int main(void)

{

        e_at_state at_state = e_init;

    /* enable DMA clock */

    

        init();

        led_flash(5);

    while(1) {

            switch (at_state)

            {

                case e_init:

                    sat('ATE0rn', 'OK');

                

                    if(!sat('ATrn', 'OK')){

                        led_on();

                        at_state = e_at_ok;

                    }

                    else{

                        delay_1ms(100);

                        led_off();

                    }

                break;

                case e_at_ok:

                    if(!sat('AT+CWJAP='testssid','12345678'rn', 'WIFI GOT IP'))

                    {

                        at_state = e_wifi_ok;

                    }

                    else{

                        delay_1ms(100);

                    }

                break;

                case e_wifi_ok:

                    if(!sat('AT+CIFSRrn', 'CIFSR:STAIP'))

                    {

                        at_state = e_sock_ok;

                    }

                    else

                    {

                        delay_1ms(100);

                    }

                    at_state = e_sock_ok;

                break;

                case e_sock_ok:

                    //close socket

                    sat('AT+CIPCLOSErn', 'OK');

                    //start a new socket

                    if(!sat('AT+CIPSTART='TCP','192.168.1.36',1314rn', 'CONNECT'))

                    {

                        //sat('AT+CIPSEND=10','OK');

                        at_state = e_connect_ok;

                    }

                    else

                    {

                        delay_1ms(100);

                    }

                break;

                case e_connect_ok:

                {

                    char at_resp[128] = {0};

                    wait_atrsp(at_resp);

                    

                    if(strstr(at_resp,'on')){

                        printf('light onn');

[1] [2]
引用地址:GD32F310连接ESP8266实现远程灯控制

上一篇:基于GD32F310使用串口的空闲中断完成不定长数据的接收
下一篇:GD32F303固件库开发(2)----读保护与写保护

推荐阅读最新更新时间:2026-03-25 12:43

51单片机 nRF24L01 无线模块 测试 按键远程控制
入正题,这个实验的功能就是一个发送模块(大的那个板)连接4个按键,通过按动这4个不同的按键来发送4种不同的命令,来控制接收端(小的板)点亮4个不同的灯。 _ !首先是发送模块: 1 void main() 2 { 3 uchar Tx_Buf1 ={1}; //发送的信息1 4 uchar Rx_Buf ; //接收到的数据暂存器,最多32字节数据 5 init_NRF24L01(); 6 LED6=1; //初始灯6熄灭 7 8 while(NRF24L01_Check()) //检查不到24l01则报警 9 { 10 beep=0;
[单片机]
51单片机 nRF24L01 无线模块 测试 按键<font color='red'>灯</font><font color='red'>远程</font><font color='red'>控制</font>
STM32连接ESP8266向oneNET上传数据
前期的工作就是通过STM32控制ESP8266的初始化,使其连接wifi。其中UART1与ESP8266通讯,UART2接收ESP8266传输回来的数据,并将其打印在电脑上,方便调试。 类似: 现在尝试使用STM32上传一个数据保存到oneNET的value1中。首先需要将ESP8266连接到服务器上 AT+CIPSTART= TCP , 183.230.40.33 ,80 AT+CIPMODE=1//开启透传模式 AT+CIPSEND//开始透传 在连接成功时,才会返回succ 然后就可以在oneNET上看最最新上传的数据32 向设备发送:+++ 为退出发送模式 之后的任务是继续优化发送接收的函数。发送能够多次
[单片机]
Atmega16微控制连接ESP8266 NodeMCU实现发送电子邮件
Atmega16是一款低成本的8位微控制器,与之前版本的微控制器相比,其GPIO数量更多。它具有所有常用的通信协议,如UART、USART、SPI和I2C。由于其广泛的社区支持和简单性,它在机器人、汽车和自动化行业中具有广泛的应用。 Atmega16不支持任何无线通信协议,如Wi-Fi和蓝牙,这限制了其在某些领域内的应用领域,如物联网。为了克服这种限制,可以连接支持无线协议的其他控制器。有许多控制器支持无线协议,如被广泛使用的ESP8266等。 在本篇文章中,我们将Atmega16微控制器与ESP8266 NodeMCU进行连接,使其通过互联网进行无线通信。 ESP8266 NodeMCU是广泛使用的WiFi模块,具
[单片机]
Atmega16微<font color='red'>控制</font>器<font color='red'>连接</font><font color='red'>ESP8266</font> NodeMCU实现发送电子邮件
基于GD32F310使用串口的空闲中断完成不定长数据的接收
我们在单片机开发中,经常会用到串口,这时候我可以通过使用DMA,减少CPU的占用。使用串口的空闲中断可以完成不定长数据的接受。所以本次我们从基础的外设移植开始完成此款板子的体验。 首先看下板子吧。 板子整体还是GD一贯风格,还是白色板子,这次由于芯片的管脚较小,目前所以引出方式变了。把可以用的IO都引出了。 本次我们使用串口0进行测试,此测试完成后我们也可以非常方便的移植到串口1上。 我在其基础上移植了新的开发模板,主要导入我们的外设库和CMSIS库即可。例程上我使用了一个闪烁LED灯的例子。 主循环中我们就两个任务,一个是点灯,一个是完成串口接收和发送。 在串口初始话的时候需要主要下,我们使能了串口的中断后,还需要打
[单片机]
基于<font color='red'>GD32F310</font>使用串口的空闲中断完成不定长数据的接收
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved