在蜂鸟处理器上进行RT-Thread+ESP8266 wifi模块开发

本文介绍在蜂鸟处理器上运行RT-Thread实时操作系统,并进行ESP8266 wifi模块开发。

在蜂鸟配套的sdk中提供了RT-Thread的移植 https://github.com/riscv-mcu/hbird-sdk/tree/0.1.2/application/rtthread/msh,我们只需要在其基础上进行具体应用开发,很大程度上减少了用户的工作量。我们选择在官方提供的msh应用基础上开发,因为它包含了RT-Thread中的finsh组件,可以使用户和程序很好地交互。

RT-Thread学习可以参考以下连接:
旧文档中心 https://www.rt-thread.org/document/site/
新文档中心 https://docs.rt-thread.org/
RT-Thread官方账号在B站发布的视频教程 https://www.bilibili.com/video/BV1of4y1S7Ju/?spm_id_from=333.788.recommend_more_video.0

ESP8266 wifi模块可以实现无线通信,相比于网口传输更加便携,功能更强大、开发更方便,基于串口控制的方式决定了其适合数据传输量不大,通信速率要求不高的情况,在低功耗物联网系统中被经常使用。ESP8266模块通过定制的AT指令集进行开发,支持STA/AP/STA+AP三种工作模式,具体不再展开。

我们选用了安信可科技的ESP-01S模块,对于基本的AT集的使用不需要自己烧录固件,可以做到开箱即用。拿到ESP-01S模块时可以首先通过USB-TTL转接口连接到电脑进行测试,AT指令集和测试方法可以参考RT-Thread官方发布的教程https://www.bilibili.com/video/BV1of4y1S7Ju?p=18

测试完毕后将其连接到开发板,典型的连接方式如下所示(图片来自https://www.bilibili.com/video/BV1of4y1S7Ju?p=18 )。在我们的应用中,ESP-01S的引脚都连接到FPGA开发板的PMOD接口。
在这里插入图片描述
ESP-01S模块可以基于串口通信,因此我们使用蜂鸟的UART1(对应gpioB[17:16])进行开发,首先对UART1进行初始化,将gpioB[17:16]配置为IOF模式,并通过INIT_BOARD_EXPORT使UART1初始化在操作系统启动过程中自动进行。

void wifi_init() {
    gpio_iof_config(GPIOB, IOF_UART_MASK);
    uart_init(UART1, 115200);
}
INIT_BOARD_EXPORT(wifi_init);

随后实现AT指令发送,为了方便指令测试,将cmd函数导出到msh中,这样可以在RT-Thread运行过程中通过终端直接发送指令到wifi模块。比如通过输入"cmd AT"加回车键,把AT指令发送到wifi模块,将接收并打印“OK”字符,表示模块可以正常访问。

void wifi_cmd(char *cmd, int wait_time) {
    send_str(cmd);
    rt_thread_mdelay(wait_time);
}

int cmd(int argc, char **argv) {
    if(argc != 2) {
        rt_kprintf("USE: %s \n", argv[0]);
        return RT_ERROR;
    }
    wifi_cmd(argv[1], 0);
    return RT_EOK;
}
MSH_CMD_EXPORT(cmd, send wifi cmd.)

接下来需要实现接收ESP8266模块返回字符的函数,这里采用一个单独线程实现。由于蜂鸟没有像一些STM32单片机一样提供直接访问uart接收区的方法,我们需要通过连续读取单个字符来读出uart buffer中的内容,当遇到换行时打印接收的一行字符。

void recv_thread_entry(void *parameter) {
    int i = 0;
    char ch;
    while (1) {
        ch = wifi_read(UART1);
        if (ch == '\r' || ch == '\n') {
            recv_buff[i] = '\0';
            if (rt_strlen(recv_buff) > 0) {
                i = 0;
                rt_kprintf("%s\n", recv_buff);
            }
        }
        else {
            recv_buff[i] = ch;
            i++;
        }
    }
}

创建静态线程,并使其随系统启动:

int wifi_thread_init(void) {
    rt_kprintf("wifi_thread_init\n");
    rt_err_t ret = RT_EOK;
    rt_thread_t tid = &recv_thread;
    ret = rt_thread_init(&recv_thread,
                        "receive_thread",
                        recv_thread_entry, RT_NULL,
                        &recv_thread_stack[0], sizeof(recv_thread_stack),
                        RECV_THREAD_PRIORITY, 10);
    if (tid != RT_NULL && ret == RT_EOK) 
        rt_thread_startup(tid);
    return RT_EOK;
}
INIT_APP_EXPORT(wifi_thread_init);

以上完成了指令的发送和字符接收,实现了板子和ESP8266模块的通信,测试效果如下,可以在此基础上进一步开发。
在这里插入图片描述

版权声明:本文为CSDN博主「wxiang357」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_38825494/article/details/121088944

生成海报
点赞 0

wxiang357

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

stm32f373利用esp8266连接onenet平台

学习目标: 1.注册onenet平台 2.esp8266引脚连接 3.stm32373代码移植编写 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 一、注册onene

辉光管时钟

辉光管时钟 一、缘起 为什么会做这个辉光管时钟呢,是因为有一天看到其他同学的电脑桌面是这个辉光管时钟,她说她很喜欢这个,非常喜欢,一直想做一个,我说可以啊,挺

X-bot

X-bot 前言 这个项目是我在稚辉君的视频里面看见的,是一个完全开源的项目,而且对他来说是一个比较简单的项目,但对于我这种没有什么DIY经验的同学来说,还是有点难的,不过