站内搜索
发作品签到
时间跳动小钟,全反射局刷,裸机支持空闲休眠与tickless
专业版

时间跳动小钟,全反射局刷,裸机支持空闲休眠与tickless

4.3k
0
0
18

简介

Tick Dance,时间跳动全反射屏局刷小钟。用于验证自己设计的支持tickless的裸机调度器。

简介:Tick Dance,时间跳动全反射屏局刷小钟。用于验证自己设计的支持tickless的裸机调度器。

开源协议

CERN Open Hardware License

创建时间:2026-01-13 20:56:37更新时间:2026-02-02 10:31:02

描述

Tick Dance 时间跳动小钟

封面.jpg

一、项目简介

演示视频:【Bilibili】@realTiX - 时间跳动小钟

这是一个以 8Hz 频率跳动字符的全反射屏小钟。使用局刷刷屏,效率更高。设计用于验证我最近编写的一个支持 空闲任务与 tickless 的裸机事件驱动框架:

这篇文章是我对裸机多任务与低功耗的介绍博客:【CSDN】@realTiX - 单片机裸机多任务与低功耗方案总结
如果更喜欢看视频,那么可以看这个:【Bilibili】@realTiX - 单片机裸机多任务与低功耗方案总结

二、开源说明

仅供个人复刻学习,未经许可禁止商用。

本仓库负责管理本项目的原理图与 PCB 部分,所有部分开源链接如下:

三、硬件

1、烧录

使用 jlink/daplink/... 等等 swd 调试器进行固件烧录,可使用 keil 编译烧录或其他 swd 固件烧录工具,固件在 pcb 开源页面附件有提供

2、组装

屏幕使用鱼鹰光电 2.13 寸 st7305 全反射屏幕;外壳为滑槽卡扣设计,无需螺丝或胶水;安装屏幕时,需要先撕膜再安装。

四、局刷说明

数据传输一般是以字节为单位,因为是单色屏,所以这里的局刷是不可能以像素点为最小刷屏单元的,对于 st7305,暂时没在网上找到局刷教程,所以我在这里提及一下这款屏幕驱动的局刷方法。

st7305 的最小刷屏单元为 3 个字节(24 个像素),这三个字节的像素比特排列如下所示:

pix 分布(竖屏,122*250,因为 122 不能整除以 12,所以 x 需要偏移 (122%12==0?0:(12-122%12)) = 10 pix):
                                                                                                   第1列                               ...  第122列
                   第一个单元起始列                                                                   |         右侧单元起始列                  |
                         |                                                                           |               |                        |
                         V                                                                           V               V                        V
第1行,1单元起行   -> [pix1] [pix3] [pix5] [pix7] [tix9]  [pix11] [pix13] [pix15] [pix17] [pix19] [pix21] [pix23] [pix1] [pix3] [pix5] ... [pix23]
第2行,1单元终行      [pix2] [pix4] [pix6] [pix8] [pix10] [pix12] [pix14] [pix16] [pix18] [pix20] [pix22] [pix24] [pix2] [pix4] [tix6] ... [pix24]
第3行,下侧单元起行-> [pix1] [pix3] ...
第4行,下侧单元终行   [pix2] [pix4] ...
 ...                  ...
第250行              [pix2] ...

搞不懂这款 2.13 屏幕为什么不做成 120*250 的,为了多刷两列得浪费十列,也就是(全刷)刷屏效率只有 92%

所以选定刷屏窗口的时候也不能以像素为单位作起点终点,必须以单元为单位起止。
您可以使用我编写的库直接体验局刷功能:

对于本项目,您也可以使用 draw_unit 这一调试命令传入单元 xy 以及三个字节像素数据来体验刷屏效果。

五、功耗测试

ltx_config.h 中,可以通过开关如下宏定义来选用空闲休眠与 tickless 功能:

// 需要空闲任务则打开此宏,并将调度器从主循环转移到最低优先级的软中断中
// #define ltx_cfg_USE_IDLE_TASK
// 需要 tickless 则打开此宏,前提是必须打开空闲任务宏
// #define ltx_cfg_USE_TICKLESS

两个宏都不打开的话,单片机会不断轮询是否有活跃任务产生,简单说就是 cpu 利用率始终 100%

仅打开第一个宏的话,单片机会在空闲时进入休眠,但是由于 systick 会在每毫秒产生中断,所以系统会每毫秒被唤醒而后发现没有任务需要做便又进入休眠。

两个宏都打开的话,单片机会计算下一个任务到来的时间,便把 systick 设置在那个时间点再唤醒单片机,这样就不会频繁被唤醒了

下图是屏幕 8Hz 低功耗模式下单片机关闭空闲休眠的功耗测试:
IMG_20260129_151332.jpg

下图是屏幕 8Hz 低功耗模式下单片机开启空闲休眠的功耗测试:
IMG_20260129_150030.jpg

下图是拔掉屏幕单片机关闭空闲休眠的功耗测试:
IMG_20260129_185306.jpg

可以看到单片机一直维持在满载的状态

下图是拔掉屏幕单片机仅开启空闲休眠的功耗测试:
IMG_20260129_184727_edit_209714602270081.jpg

将采样数据放大到 1ms 刻度可以看到每个毫秒都被唤醒而后又进入休眠,相较不开启空闲休眠降低约 293uA
IMG_20260129_184539.jpg

下图是拔掉屏幕单片机开启 tickless 的功耗测试:
IMG_20260129_180036.jpg

开启 tickless 后单片机不会每频繁被每毫秒的 systick 唤醒,功耗降低约 14uA

因为暂时没有在进入休眠前写关闭外设,所以绝对功耗还是比较高的,以及为了验证调度器的异步能力,所以选用的是带 dma 的非低功耗特化的单片机型号(用的是 py32f030,spi 带 dma,如果用 py32l020 的话没有 dma),甚至单片机功耗比屏幕还高好多倍。但是从相对功耗来看,还是能降低不少功耗的,摆脱了传统裸机的不能空闲休眠的缺陷。

六、调试

如果您需要对本项目进行二次开发或拓展,那么应该需要一些调试手段。

本项目没有引出串口,输入输出信息是通过 segger RTT 保存在一块 ram 中的,当调试器链接后,电脑用通过 openOCD 来对内存进行写入读出以实现输入输出,理论上,这会比串口更快,毕竟只要读写内存,而无需外设收发,并且还能保存一定的历史输出。

如果您有 jlink,那么可以直接用 segger 提供的 rttviewer 进行调试,这里仅提供使用 dap-link 的调试方法:

  1. 在普冉官网下载官方提供的 openocd 版本,将其加入环境变量
  2. 链接调试器和设备,打开任意 shell,输入 openocd -f rtt2tcp.cfg
    • 注:如果没有加入环境变量,那么上述命令需要输入 openocd.exe 的完整路径
  3. 打开任意支持 tcp 的串口调试工具,这里以 vofa+ 为例,填入如下图的配置信息
    • Snipaste_2025-07-22_00-23-08.jpg
  4. 链接成功后,即可查看输入输出信息

通过自定义命令,可控制单片机的运行状态,比如暂停某些 app 如 usb 等等,也可依赖发布订阅机制实现数据更新后的自动打印,在 ltx_cmd.c 中提供的 /print 命令有一个 heart_beat 样例,用来每秒打印心跳,您可参考该样例来设置自己的订阅数据打印;
如果您需要经常修改一些参数如尝试某些不同的背景颜色,那么也无需重新烧录,在 ltx_cmd.c 中提供了一个 /param 命令,该命令可对 ltx_param.c 中指向的自定义数据进行读写;

所有的自定义命令可在 ltx_cmd.c 中查看,也可开机后给单片机发送 /help 命令来列出所有命令,您也可以参考这些命令创建一些方便调试自定义命令,以下是目前所有的自定义命令,部分命令可能会影响系统的正常运行:

命令作用
echo返回第二个参数来测试收发功能
hello打印 hello world
help帮助,无参数则列出所有命令,第二个参数可设置为某个命令(如 /help print
print在某些数据更新后进行打印,非阻塞,非 poll,依赖 ltx 发布订阅机制
param读写自定义参数
alarm测试 ltx 闹钟功能用,非阻塞,第二个参数可设置闹钟倒计时 tick,会在闹钟到时后打印
reboot重启
ltx_app管理 ltx app 用,可列出所有 app 及其 task,可对其进行暂停继续或销毁操作
fill_unit将某个 unit 填为单色块,阻塞
draw_unit将某个 unit 填为传入的三个字节,阻塞
rtc_get获取 rtc 时间
rtc_set设置 rtc 时间
frame_low_rate设置低功耗模式下屏幕刷新率

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

3D模型

序号文件名称下载次数
1
发布.3mf
41

附件

序号文件名称下载次数
1
idlesleeponly.bin
30
2
tickless.bin
20
克隆工程
添加到专辑
0
0
分享
Logo GIF0
侵权投诉
知识产权声明&复刻说明

本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。

请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。

底部导航