前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >AIoT应用创新大赛-基于TencentOS Tiny 广和通L610连接腾讯连连 以及 KV库移植

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

原创
作者头像
用户6286747
发布2022-03-15 22:28:33
1.2K0
发布2022-03-15 22:28:33
举报
文章被收录于专栏:iot-catiot-cat
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,还是很开心的。

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

/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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 产品功能
  • 硬件说明
    • 开发板特性
    • 软件设计
      • 1. 广和通4G L610 上云
        • 2. kv移植
          • 3. lvgl移植
          • 仓库地址
            • L610 上云仓库:
              • KV 和 LVGL 移植
              • 改进计划
              • 总结
              相关产品与服务
              TencentOS Server
              TencentOS Server 是腾讯云推出的 Linux 操作系统,它旨在为云上运行的应用程序提供稳定、安全和高性能的执行环境。它可以运行在腾讯云 CVM 全规格实例上,包括黑石物理服务器2.0。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
              http://www.vxiaotou.com