前言
拿到开发板是开心的,调试过程是苦涩的,完成了自己的期望值是美好的,我可能处于苦涩和美好之间。 一开始理想很美好,想基于EVB_AIoT做个智能家居中控BOX,但陷入调试LVGL的一个多月后,发现可能做不成自己想做的东西了,虽然最后没有成功,但也移植开发了一些功能,所以本篇幅主要介绍自己在使用基于TencentOS Tiny的 RT1062开发过程中的一些记录吧。 希望后续可以移植成功LVGL,做完自己想做的事情。
产品功能
- 广和通4G模组 L610 上云
- TencentOS Tiny 的 kv库的移植
- LVGL的移植
硬件说明
开发板特性
- 这次的 开发板EVB_AIoT 采用的处理器是 i.MX RT1062,它是由 NXP 推出的跨界处理器,跨界是指该系列MCU的定位既非传统的微控制器、也非传统的微处理器,i.MX RT 系列 MCU 则综合了两者的优势,既具备高频率(最高主频600M)、高处理性能,也具备中断响应迅速、实时性高的特点。
- 1M RAM 16M SDRAM 64MB qspi flash 128MB spi flash。
- 板载Type-C接口CMSIS DAP仿真器。
- 板载PCIE接口,可扩展4G类物联网模组。
- 板载物联网俱乐部WAN Interface接口,可支持NB-IoT、WiFi、4G cat1、LoRa等模组。
- 板载物联网俱乐部E53 Interface接口,可扩展全系E53传感器。
- 板载标准24P DVP摄像头接口,可支持最高500万像素摄像头。
- 板载RGB显示接口,可转换HDMI输出。
- 板载高性能音频解码芯片,可做语音识别测试。
- 预留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、设备名称、设备密钥,生成后,可以将这些内容拷贝到对应的代码处
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
2) 将W25Qxx的驱动 从 TencentOS-tiny/board/TencentOS_tiny_EVB_AIoT/BSP/Hardware/W25QXX-SPI 拷贝到项目source中
从tencentos tiny/commonts/fs/kv 拷贝出来
3) kv接口移植
4) kv task实现和测试
5) 在main函数里调用
然后调用 osThreadCreate(osThread(kv_task), NULL);
6)移植成功,打印数据
3. lvgl移植
使用的是SDK提供的demo进行的移植,参考了一个参加比赛的同学的移植记录,很感谢,这个地方,我对时钟、寄存器和屏幕的设置比较缺乏,但第一次跑LVGL,还是很开心的。
我参考的是这篇文章,虽然不认识,但很感谢,作者写的很详细,我就不多写了,写的不如作者好,放上链接
https://cloud.tencent.com/developer/article/1925828
仓库地址
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增加网口,尝试做边缘网关,不要浪费掉这么强的性能。