micropython stm32f411 RTC时钟任务调度器
如下图,F4的外部低速时钟为32.768K,经过第一个RTC_PRER(默认128分频)分频变为256Hz,也就是RTC时钟里的亚秒,然后经过第二个RTC_PRER(默认256分频)分频变为1Hz,也就是1秒。我们这里用到的是亚秒,也就是一个256Hz的频率
初始化RTC时钟之后,在主函数循环中不断获取当前时间,然后将亚秒的值赋给一个变量new,将变量new与变量old进行对比,如果不同,时间刻度(1/256秒)加一,将new的值赋给old,然后重新获取亚秒的值赋给new,当计时达到预定数值时,比如128(也就是500ms)调用一次预定函数。
核心代码
from pyb import Pin,LED,delay,Timer,RTC
# RTC时钟初始化Start
rtc=RTC()
rtc.datetime((2023,04,26,03,10,0,0,0)) # 年 月 日 星期 时 分 秒 亚秒
# RTC时钟初始化End
# 任务调度器Start
buf1=rtc.datetime()
old=0
new=buf1[7] # 亚秒的频率为256Hz
times=0
# 任务调度器End
# 每500ms需要调用一次函数Start
def func_128():
pass
# 每500ms需要调用一次函数End
# 每250ms需要调用一次函数Start
def func_64():
pass
# 每250ms需要调用一次函数End
# 每125ms需要调用一次函数Start
def func_32():
pass
# 每125ms需要调用一次函数End
# 每62.5ms需要调用一次函数Start
def func_16():
pass
# 每62.5ms需要调用一次函数End
# 每15.625ms需要调用一次函数Start
def func_4():
pass
# 每15.625ms需要调用一次函数End
while True:
buf1=rtc.datetime()
new=buf1[7]
if new!=old:
old=new
times=times+1
if (times%128)==0:
flag_128=1
if (times%64)==0:
flag_64=1
if (times%32)==0:
flag_32=1
if (times%8)==0:
flag_16=1
if (times%3)==0:
flag_4=1
# 计数器归零Start
if times>=5120: # 最大计时5120/256=20s
times=0
# 计数器归零End
if flag_128==1:
func_128()
flag_128=0
if flag_64==1:
func_64()
flag_64=0
if flag_32==1:
func_32()
flag_32=0
if flag_16==1:
func_16()
flag_16=0
if flag_4==1:
func_4()
flag_4=0
此使用RTC时钟作为任务调度器的时钟源有一定缺陷,首先时RTC的频率太低,计时不太准确,实际测试的时候,RTC亚秒的频率为250到270的一个大概值,其次是需要在循环里不断检测,当代码量增多时,检测不及时,会出现漏拍情况,减慢程序运行速度。
时RTC的频率太低,计时不太准确,实际测试的时候,RTC亚秒的频率为250到270的一个大概值,其次是需要在循环里不断检测,当代码量增多时,检测不及时,会出现漏拍情况,减慢程序运行速度。
这里还可以采用TIM定时器作为时钟源,首先是频率较高。还可以通过定时器中断实现时间前进效果,不需要在主函数判断,提供程序运行速度。