有幸能够参与这次比赛,学到了很多知识,由于时间比较匆忙,赶在结束前几天完成了这个DEMO。这个项目基于TOS的mqtt的例程,通过滴答数计时并显示时间,通过联网校对时间,云端下发指令矫正时间,项目目的主要是完成对TencentOS移植以及腾讯物联网平台的实践。
TencentOS tiny整体架构
开发板简介
CH32V_EVB是腾讯物联网操作系统TencentOS tiny 团队联合沁恒微电子设计的一款物联网评估板,用于TencentOS tiny 基础内核、RISC-V IP核架构和IoT组件功能体验和评估。
开发板特性
- 内置TencentOS Tiny开源物联网操作系统
- 开发板采用沁恒RISC-V MCU CH32V307VCT6芯片,CH32V305/7系列是基于沁恒自研RISC-V架构微处理器青稞V4系列设计的32位工业级互联型微控制器,配备了硬件堆栈区、快速中断入口,在标准RISC-V基础上大大提高了中断响应速度。加入单精度浮点指令集,扩充堆栈区,具有更高的运算性能。扩展串口UART数量到8组,定时器到10组,其中4组高级定时器。提供USB2.0高速接口(480Mbps)并内置了PHY收发器,以太网MAC升级到千兆并集成了10M-PHY模块。
- 64KB SRAM,256KB Flash
- 板载Type-C接口WCH-LINK仿真器
- 板载esp8266 WiFi模组,支持腾讯云固件
- 板载以太网接口
- 板载物联网俱乐部WAN Interface接口,可支持NB-IoT、WiFi、4G cat1、LoRa等模组
- 板载物联网俱乐部E53 Interface接口,可扩展全系E53传感器以及音频模块;
- 板载标准24P DVP摄像头接口,可支持最高500万像素摄像头;
- 板载1.54寸 IPS高清显示屏,支持240*240分辨率;
- 预留SD卡、用户按键、SPI Flash,
- 扩展IO口,方便开发者扩展硬件模块
代码部分
使用TencentOS 创建了三个thread,分别用于LCD显示,计时和传输数据。gitee链接
由于屏幕的刷新率感人,而且我也没有找到更加经济的方法来改变展示效果,因此将动态的时钟换成了静态: ) 这里时钟的部分要用TOS内核的sleep或者delay接口,而不是RTC的delay,否则会死循环无法调度。
画时钟使用的是LCD例程中的画线函数,一些三角函数移植了LVGL的三角函数实现,lvgl的实现比较有意思,学到了很多节约资源的方法。
表的指针根据角度计算出来就好了
代码语言:javascript复制 //转动秒针
secondAngle = calendar.sec * 6; // 2 * pi / 60 =一秒钟走的角度 ti.wSecond =系统当前秒
secondEnd_x = center_x (r * lv_trigo_sin(secondAngle) >> LV_TRIGO_SHIFT);
secondEnd_y = center_y - (r * lv_trigo_cos(secondAngle) >> LV_TRIGO_SHIFT);
// printf("secondEnd_x is %urn",secondEnd_x);
// printf("secondEnd_y is %urn",secondEnd_y);
LCD_DrawLine(center_x,center_y,secondEnd_x,secondEnd_y,BLUE);
//转动分钟
uint16_t minuteAngle = calendar.min * 2 * 3.14 / 60 secondAngle / 60;
uint16_t minuteEnd_x = center_x (72 * lv_trigo_sin(minuteAngle) >> LV_TRIGO_SHIFT);
uint16_t minuteEnd_y = center_y - (72 * lv_trigo_cos(minuteAngle) >> LV_TRIGO_SHIFT);
LCD_DrawLine(center_x,center_y,minuteEnd_x,minuteEnd_y,YELLOW);
//转动时钟
uint16_t hoursAngle = calendar.hour * 2 * 3.14 / 12 minuteAngle / 60;
uint16_t hoursEnd_x = center_x (45* lv_trigo_sin(hoursAngle)>> LV_TRIGO_SHIFT);
uint16_t hoursEnd_y = center_y (45* lv_trigo_cos(hoursAngle)>> LV_TRIGO_SHIFT);
LCD_DrawLine(center_x,center_y,hoursEnd_x,hoursEnd_y,RED);
代码语言:javascript复制//三角函数预先存储90个值(除以32767)
/**********************
* STATIC VARIABLES
**********************/
static const int16_t sin0_90_table[] = {
0, 572, 1144, 1715, 2286, 2856, 3425, 3993, 4560, 5126, 5690, 6252, 6813, 7371, 7927, 8481,
9032, 9580, 10126, 10668, 11207, 11743, 12275, 12803, 13328, 13848, 14364, 14876, 15383, 15886, 16383, 16876,
17364, 17846, 18323, 18794, 19260, 19720, 20173, 20621, 21062, 21497, 21925, 22347, 22762, 23170, 23571, 23964,
24351, 24730, 25101, 25465, 25821, 26169, 26509, 26841, 27165, 27481, 27788, 28087, 28377, 28659, 28932, 29196,
29451, 29697, 29934, 30162, 30381, 30591, 30791, 30982, 31163, 31335, 31498, 31650, 31794, 31927, 32051, 32165,
32269, 32364, 32448, 32523, 32587, 32642, 32687, 32722, 32747, 32762, 32767
};
代码语言:javascript复制//每次画对称的8个点
LV_ATTRIBUTE_FAST_MEM int16_t lv_trigo_sin(int16_t angle)
{
int16_t ret = 0;
angle = angle % 360;
if(angle < 0) angle = 360 angle;
if(angle < 90) {
ret = sin0_90_table[angle];
}
else if(angle >= 90 && angle < 180) {
angle = 180 - angle;
ret = sin0_90_table[angle];
}
else if(angle >= 180 && angle < 270) {
angle = angle - 180;
ret = -sin0_90_table[angle];
}
else { /*angle >=270*/
angle = 360 - angle;
ret = -sin0_90_table[angle];
}
return ret;
}
写在最后
感谢腾讯给我这次接触嵌入式开发的机会,感谢腾讯和沁恒的所有技术支持,所有工具(处理跳线)和代码可以直接运行,减少了很多不必要的麻烦,尤其是对于我这种半吊子的软件开发小学生 : )。我有幸尝试了摄像头等大部分例程,也在群里学习到了很多有用的知识。由于一些硬件限制,不太适合直接在板子上进行AI推理部署,因此我改变了原有的想法(TB买的模块明天才到),在比赛结束前的这几天完成了这个DEMO,等明天收到快递后会继续更新。