IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【GD32F310开发板试用】GD32F310连接ESP8266实现远程灯控制(双串口) -> 正文阅读

[嵌入式]【GD32F310开发板试用】GD32F310连接ESP8266实现远程灯控制(双串口)

首发极术社区。如对兆易创新GD32F310 MCU感兴趣,欢迎添加微信 aijishu2020 加入GD32技术讨论群。

功能描述

通过mcu与esp01通过uart连接,通过at指令来创建socket连接,接收远端控制灯的指令,来实现灯亮,灭及闪烁;
开启两路串口,usart0(GPIO09-TX,GPIO10-RX)连接esp01,进行收发at指令,usart1(GPIO02-TX,GPIO03-RX)作为log输出口;

效果视频

在这里插入图片描述

接线图

截图.png

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, "OK\r\n") || 
                    strstr((const char *)rx_buffer, "ERROR\r\n")
                ){
                    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("ATE0\r\n", "OK");
                
                    if(!sat("AT\r\n", "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\"\r\n", "WIFI GOT IP"))
                    {
                        at_state = e_wifi_ok;
                    }
                    else{
                        delay_1ms(100);
                    }
                break;
                case e_wifi_ok:
                    if(!sat("AT+CIFSR\r\n", "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+CIPCLOSE\r\n", "OK");
                    //start a new socket
                    if(!sat("AT+CIPSTART=\"TCP\",\"192.168.1.36\",1314\r\n", "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 on\n");
                        led_on();
                    }
                    else if(strstr(at_resp,"off")){
                        printf("light off\n");
                        led_off();
                    }
                    else if(strstr(at_resp, "blink"))
                    {
                        printf("buling buling\n");
                        led_flash(10);
                    }
                    else
                    {
                        printf("other cmd got:[%s]\r\n", at_resp);
                    }
                }
                break;
                default:
                    printf("Get into other:%d\n",at_state);
                break;
            }
            //delay_1ms(100);
    }
}

代码仓库地址

https://gitee.com/lyzcc/gd32-…

待改善

usart接收数据采用关键字判断结束,效率较低;
at指令接收没有超时,如果得不到期望结果会卡住;
socket异常断开没有做处理;
后面可以接一个继电器控制插座或者台灯
因为esp01升级不到最新版本,无法支持mqtt,只能点对点控制玩玩了,支持mqtt就可以做更多事情;
异步中断处理usart_interrupt_flag_get不是很理解,正常接收或者发送完数据应该是可以退出,但是好像一直无法退出,不知道是使用的问题还是哪里出的问题,有经验的大神可以交流交流指导指导;

作者:Ljfly

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-05-24 18:23:18  更:2022-05-24 18:23:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:41:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码