开发者成长激励计划-基于TencentOS Tiny的电子表

2022-08-11 11:43:21 浏览数 (2)

有幸能够参与这次比赛,学到了很多知识,由于时间比较匆忙,赶在结束前几天完成了这个DEMO。这个项目基于TOS的mqtt的例程,通过滴答数计时并显示时间,通过联网校对时间,云端下发指令矫正时间,项目目的主要是完成对TencentOS移植以及腾讯物联网平台的实践。

TencentOS tiny整体架构

1.TencentOS tiny整体架构1.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口,方便开发者扩展硬件模块

2.demo展示2.demo展示

代码部分

使用TencentOS 创建了三个thread,分别用于LCD显示,计时和传输数据。gitee链接

3.进程结构3.进程结构

由于屏幕的刷新率感人,而且我也没有找到更加经济的方法来改变展示效果,因此将动态的时钟换成了静态: ) 这里时钟的部分要用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,等明天收到快递后会继续更新。

0 人点赞