
时间跳动小钟,全反射局刷,裸机支持空闲休眠与tickless
简介
Tick Dance,时间跳动全反射屏局刷小钟。用于验证自己设计的支持tickless的裸机调度器。
简介:Tick Dance,时间跳动全反射屏局刷小钟。用于验证自己设计的支持tickless的裸机调度器。开源协议
:CERN Open Hardware License
描述
Tick Dance 时间跳动小钟

一、项目简介
演示视频:【Bilibili】@realTiX - 时间跳动小钟
这是一个以 8Hz 频率跳动字符的全反射屏小钟。使用局刷刷屏,效率更高。设计用于验证我最近编写的一个支持 空闲任务与 tickless 的裸机事件驱动框架:
- Github: TiX233/ltx
- Gitee: TiX233/ltx
这篇文章是我对裸机多任务与低功耗的介绍博客:【CSDN】@realTiX - 单片机裸机多任务与低功耗方案总结
如果更喜欢看视频,那么可以看这个:【Bilibili】@realTiX - 单片机裸机多任务与低功耗方案总结
二、开源说明
仅供个人复刻学习,未经许可禁止商用。
本仓库负责管理本项目的原理图与 PCB 部分,所有部分开源链接如下:
- 单片机代码:
- Github:TiX233/tick_dance
- Gitee:TiX233/tick_dance
- 原理图/PCB:
- 立创开源平台:本文
- 外壳:
- 本文附件
- MakerWorld:@realTiX - 时间跳动全反射小钟
三、硬件
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%
所以选定刷屏窗口的时候也不能以像素为单位作起点终点,必须以单元为单位起止。
您可以使用我编写的库直接体验局刷功能:
- Github: TiX233/st7305_213
- Gitee: TiX233/st7305_213
对于本项目,您也可以使用 draw_unit 这一调试命令传入单元 xy 以及三个字节像素数据来体验刷屏效果。
五、功耗测试
在 ltx_config.h 中,可以通过开关如下宏定义来选用空闲休眠与 tickless 功能:
// 需要空闲任务则打开此宏,并将调度器从主循环转移到最低优先级的软中断中
// #define ltx_cfg_USE_IDLE_TASK
// 需要 tickless 则打开此宏,前提是必须打开空闲任务宏
// #define ltx_cfg_USE_TICKLESS
两个宏都不打开的话,单片机会不断轮询是否有活跃任务产生,简单说就是 cpu 利用率始终 100%
仅打开第一个宏的话,单片机会在空闲时进入休眠,但是由于 systick 会在每毫秒产生中断,所以系统会每毫秒被唤醒而后发现没有任务需要做便又进入休眠。
两个宏都打开的话,单片机会计算下一个任务到来的时间,便把 systick 设置在那个时间点再唤醒单片机,这样就不会频繁被唤醒了
下图是屏幕 8Hz 低功耗模式下单片机关闭空闲休眠的功耗测试:

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

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

可以看到单片机一直维持在满载的状态
下图是拔掉屏幕单片机仅开启空闲休眠的功耗测试:

将采样数据放大到 1ms 刻度可以看到每个毫秒都被唤醒而后又进入休眠,相较不开启空闲休眠降低约 293uA
下图是拔掉屏幕单片机开启 tickless 的功耗测试:

开启 tickless 后单片机不会每频繁被每毫秒的 systick 唤醒,功耗降低约 14uA
因为暂时没有在进入休眠前写关闭外设,所以绝对功耗还是比较高的,以及为了验证调度器的异步能力,所以选用的是带 dma 的非低功耗特化的单片机型号(用的是 py32f030,spi 带 dma,如果用 py32l020 的话没有 dma),甚至单片机功耗比屏幕还高好多倍。但是从相对功耗来看,还是能降低不少功耗的,摆脱了传统裸机的不能空闲休眠的缺陷。
六、调试
如果您需要对本项目进行二次开发或拓展,那么应该需要一些调试手段。
本项目没有引出串口,输入输出信息是通过 segger RTT 保存在一块 ram 中的,当调试器链接后,电脑用通过 openOCD 来对内存进行写入读出以实现输入输出,理论上,这会比串口更快,毕竟只要读写内存,而无需外设收发,并且还能保存一定的历史输出。
如果您有 jlink,那么可以直接用 segger 提供的 rttviewer 进行调试,这里仅提供使用 dap-link 的调试方法:
- 在普冉官网下载官方提供的
openocd版本,将其加入环境变量 - 链接调试器和设备,打开任意
shell,输入openocd -f rtt2tcp.cfg- 注:如果没有加入环境变量,那么上述命令需要输入 openocd.exe 的完整路径
- 打开任意支持
tcp的串口调试工具,这里以vofa+为例,填入如下图的配置信息 - 链接成功后,即可查看输入输出信息
通过自定义命令,可控制单片机的运行状态,比如暂停某些 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
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。












