AIoT应用创新大赛-基于TencentOS Tiny 广和通L610连接腾讯连连 以及 KV库移植

2022-03-15 22:28:33 浏览数 (1)

TencentOS Tiny 广和通L610连接腾讯连连

前言

拿到开发板是开心的,调试过程是苦涩的,完成了自己的期望值是美好的,我可能处于苦涩和美好之间。 一开始理想很美好,想基于EVB_AIoT做个智能家居中控BOX,但陷入调试LVGL的一个多月后,发现可能做不成自己想做的东西了,虽然最后没有成功,但也移植开发了一些功能,所以本篇幅主要介绍自己在使用基于TencentOS Tiny的 RT1062开发过程中的一些记录吧。 希望后续可以移植成功LVGL,做完自己想做的事情。

非常 nice 的 EVB_AIoT非常 nice 的 EVB_AIoT

产品功能

  1. 广和通4G模组 L610 上云
  2. TencentOS Tiny 的 kv库的移植
  3. LVGL的移植

硬件说明

开发板特性

  1. 这次的 开发板EVB_AIoT 采用的处理器是 i.MX RT1062,它是由 NXP 推出的跨界处理器,跨界是指该系列MCU的定位既非传统的微控制器、也非传统的微处理器,i.MX RT 系列 MCU 则综合了两者的优势,既具备高频率(最高主频600M)、高处理性能,也具备中断响应迅速、实时性高的特点。
  2. 1M RAM 16M SDRAM 64MB qspi flash 128MB spi flash。
  3. 板载Type-C接口CMSIS DAP仿真器。
  4. 板载PCIE接口,可扩展4G类物联网模组。
  5. 板载物联网俱乐部WAN Interface接口,可支持NB-IoT、WiFi、4G cat1、LoRa等模组。
  6. 板载物联网俱乐部E53 Interface接口,可扩展全系E53传感器。
  7. 板载标准24P DVP摄像头接口,可支持最高500万像素摄像头。
  8. 板载RGB显示接口,可转换HDMI输出。
  9. 板载高性能音频解码芯片,可做语音识别测试。
  10. 预留SD卡、用户按键、SPI Flash。

软件设计

开发环境:MCUXpressoIDE_11.4.1_6260

SDK版本:sdk_2.x_evk-mimxrt1060_2.10.1.201911251446.zip

串口助手:有善 & 格西

1. 广和通4G L610 上云

与使用官方提供的ESP8266上云的方式一直,这里主要是移植L610和对于的串口,因为我一开始计划使用2个ESP8266,通过http通讯,并把数据通过WLAN 串口(LUART2)传给MCU,所以与L610通讯的串口我使用的是E53的串口(LUART5) 在云端创建设备这里不再赘述,网上有很多链接可以查看学习,简单说下移植过程

1) 通过mqtt_config_gen.py工具生成 mqtt的topic的一些宏定义,运行 python mqtt_config_gen.py 输入产品ID、设备名称、设备密钥,生成后,可以将这些内容拷贝到对应的代码处

使用mqtt_config_gen.py生成的mqtt客户端配置信息使用mqtt_config_gen.py生成的mqtt客户端配置信息

2) 添加L610的头文件文件到includes

3) 修改AT串口初始化代码,增加支持LUART5的支持,代码如下,增加了LPUART5

代码语言:txt复制
UART_HandleTypeDef huart0;
UART_HandleTypeDef huart1;
UART_HandleTypeDef huart2;
UART_HandleTypeDef huart3;
UART_HandleTypeDef huart4;
UART_HandleTypeDef huart5;

__API__ int tos_hal_uart_init(hal_uart_t *uart, hal_uart_port_t port)
{
    lpuart_config_t config;
    if (!uart) {
        return -1;
    }

    if (port == HAL_UART_PORT_0) {
        uart->private_uart = &huart0;
        huart0.channel = LPUART4;
        LPUART_GetDefaultConfig(&config);
        config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;
        config.enableTx     = true;
        config.enableRx     = true;

        LPUART_Init(LPUART4, &config, BOARD_DebugConsoleSrcFreq());

        /* Enable RX interrupt. */
        LPUART_EnableInterrupts(LPUART4, kLPUART_RxDataRegFullInterruptEnable);
        EnableIRQ(LPUART4_IRQn);

    } else if (port == HAL_UART_PORT_1) {


        uart->private_uart = &huart1;
        huart1.channel = LPUART1;
        LPUART_GetDefaultConfig(&config);
        config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;
        config.enableTx     = true;
        config.enableRx     = true;

        LPUART_Init(LPUART1, &config, BOARD_DebugConsoleSrcFreq());

        /* Enable RX interrupt. */
        LPUART_EnableInterrupts(LPUART1, kLPUART_RxDataRegFullInterruptEnable);
        EnableIRQ(LPUART1_IRQn);

    } else if (port == HAL_UART_PORT_2) {

        uart->private_uart = &huart2;
        huart2.channel = LPUART2;
        LPUART_GetDefaultConfig(&config);
        config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;
        config.enableTx     = true;
        config.enableRx     = true;

        LPUART_Init(LPUART2, &config, BOARD_DebugConsoleSrcFreq());

        /* Enable RX interrupt. */
        LPUART_EnableInterrupts(LPUART2, kLPUART_RxDataRegFullInterruptEnable);
        EnableIRQ(LPUART2_IRQn);
    } else if (port == HAL_UART_PORT_4) {

        uart->private_uart = &huart4;
        huart4.channel = LPUART4;
        LPUART_GetDefaultConfig(&config);
        config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;
        config.enableTx     = true;
        config.enableRx     = true;

        LPUART_Init(LPUART4, &config, BOARD_DebugConsoleSrcFreq());

        /* Enable RX interrupt. */
        LPUART_EnableInterrupts(LPUART4, kLPUART_RxDataRegFullInterruptEnable);
        EnableIRQ(LPUART4_IRQn);
    } else if (port == HAL_UART_PORT_5) {

        uart->private_uart = &huart5;
        huart5.channel = LPUART5;
        LPUART_GetDefaultConfig(&config);
        config.baudRate_Bps = BOARD_DEBUG_UART_BAUDRATE;
        config.enableTx     = true;
        config.enableRx     = true;

        LPUART_Init(LPUART5, &config, BOARD_DebugConsoleSrcFreq());

        /* Enable RX interrupt. */
        LPUART_EnableInterrupts(LPUART5, kLPUART_RxDataRegFullInterruptEnable);
        EnableIRQ(LPUART5_IRQn);
    }
    return 0;
}

4) 修改 mqttclient_iot_explorer.c

5)在使用AT指令联网时,发现传递的IP有问题,可能是解析IP错误导致的,这里直接修改AT代码(图方便,但不建议)

6)编译烧录查看日志 // 日志打印

代码语言:txt复制

Hello world from i.MX RT1060.
Welcome to TencentOS tiny
Init l610 ...

AT CMD:
AT


--->OK
AT CMD:
ATE0


--->ATE0


--->OK
AT CMD:
AT CPIN?


---> CPIN: READY


--->OK
AT CMD:
AT CSQ


---> CSQ: 31,0


--->OK
AT CMD:
AT CREG?


---> CREG: 0,3


--->OK
AT CMD:
AT CREG?


---> CREG: 0,3


--->OK
AT CMD:
AT CREG?


---> CREG: 0,3


--->OK
AT CMD:
AT CREG?


---> CREG: 0,3


--->OK
AT CMD:
AT CREG?


---> CREG: 0,3


--->OK
AT CMD:
AT CREG?


---> CREG: 0,3


--->OK
AT CMD:
AT CREG?


---> CREG: 0,1


--->OK
AT CMD:
AT CGREG?


---> CGREG: 0,1


--->OK
AT CMD:
AT GTSET="IPRFMT",0


--->OK
AT CMD:
AT MIPCALL?


---> MIPCALL: 0


--->OK
AT CMD:
AT MIPCALL=1,"CMNET"


--->OK
---> MIPCALL
--->: 10.148.138.196


AT CMD:
AT MIPCALL?


---> MIPCALL: 1,10.148.138.196


--->OK
Init l610 ok

l610_sal_init
AT CMD:
AT MIPDNS="12IK8SZTH3.iotcloud.tencentdevices.com"


---> MIPDNS: "12IK8SZTH3.iotcloud.tencentdevices.com",49.233.106.190


--->OK
GOT IP: 49.233.106.190

AT CMD:
AT MIPOPEN=1,,"111.230.189.156",1883,0


--->OK
---> MIPOPEN
--->: 1,1


.mqttclient.c:985 mqtt_connect_with_results()... mqtt connect success...
AT CMD:
AT MIPSEND=1,121


--->>

--->OK
---> MIPPUSH: 1,0


---> MIPSEND
--->: 1,0,2048


--->OK

7)连接成功

2. kv移植

其实做物联网的,使用RTOS肯定离不开kv的使用,所以当时移植了kv,用来准备给移植完屏幕使用,谁知道,屏幕没有移植成功,欸,,,,,

1)PIN配置和使用IO

硬件原理图硬件原理图
使用的GPIO使用的GPIO
在IDE里设置PIN在IDE里设置PIN

2) 将W25Qxx的驱动 从 TencentOS-tiny/board/TencentOS_tiny_EVB_AIoT/BSP/Hardware/W25QXX-SPI 拷贝到项目source中

从tencentos tiny/commonts/fs/kv 拷贝出来

3) kv接口移植

增加w25q65_kvport.c增加w25q65_kvport.c

4) kv task实现和测试

5) 在main函数里调用

然后调用 osThreadCreate(osThread(kv_task), NULL);

6)移植成功,打印数据

3. lvgl移植

使用的是SDK提供的demo进行的移植,参考了一个参加比赛的同学的移植记录,很感谢,这个地方,我对时钟、寄存器和屏幕的设置比较缺乏,但第一次跑LVGL,还是很开心的。

我参考的是这篇文章,虽然不认识,但很感谢,作者写的很详细,我就不多写了,写的不如作者好,放上链接

https://cloud.tencent.com/developer/article/1925828

没有修改lvgl demo的情况没有修改lvgl demo的情况
修改完成后,可以跑LVGL修改完成后,可以跑LVGL

仓库地址

L610 上云仓库:

https://gitee.com/hanxiaomo9527/nxp_rt1062_tencent-os_tiny_aiot.git

KV 和 LVGL 移植

https://gitee.com/hanxiaomo9527/nxp_rt1062_tencentos_tiny_aiot_test.git

改进计划

后续找到移植LVGL导致串口调试打印 hardfault的原因,完成LCD屏幕移植和GT911的触摸移植,希望成功!!

总结

对于不熟悉嵌入式裸机的人,开始没有可以直接调用的库,专心负责应用层,有点吃亏。不过debug过程中也了解了写NXP MCU启动流程之类的一些知识点,同时也知道了自己后续要如何去学习裸机代码。

基于这个比赛的机会,认真的把TencentOS Tiny的内核好好看了一遍,感觉真的很简洁,代码风格很赞,可以从里面学到一些很好的设计思路,感谢汪神他们做的工作。因为自己也准备写一个RTOS,作为自己学习一个阶段的整理~

希望后续可以把开发板好好用起来,做一个有意思的产品,并自己layout增加网口,尝试做边缘网关,不要浪费掉这么强的性能。

TencentOS Tiny AIoT应用创新大赛.pptx

0 人点赞