整个lorawan应用层,所有的时间管理和任务调度都和RTC有关。
使能了ALARM_A功能,通过设置超时时间,我们可以完成对应的任务序列。
宏 N_PREDIV_S 定义了同步预分频的位数,即同步预分频寄存器的重装载值为2^10-1,即得到宏 PREDIV_S。
为了得到最终 1Hz 的日历更新频率,异步预分频的值为 宏 PREDIV_A ( RTC时钟为32.768KHz )。
RTC源码中定义了一个时间戳结构体:
在需要执行定时任务时,就是会更新这个结构体对象的值,并作为时间参考点。可以看做一个时间戳结构体。
RtcTimeContext_t 对象由 uint32_t RtcSetTimerContext( void ) 函数更新。返回32位的同步异分频计数器的总计数值。
void RtcInit( void ); //初始化RTC日历寄存器并使能RTC。
void RtcSetMcuWakeUpTime( void ); //计算MCU从休眠状态切换到工作状态需要的时间,与McuWakeUpTimeInitialized有关,只需要执行一次
void RtcSetAlarm( uint32_t timeout ); //初始化RTC时,并没有使能ALARM_A,此时才使能,timeout是超时时间,即多少时间后触发报警
void RtcStartAlarm( uint32_t timeout );//启动ALARM_A警报功能,开始计时,经过timeout后触发警报
在rtc_board.c和.h文件中还有其他一些功能,比如获取时间,计算时间间隔之类的,都是RTC时钟功能的一些扩展。
就8说了
对了,还要补充的是低功耗管理,这个是STM32L0系列的招牌。
在官方源码中大家可以看,分别是lpm_board.c和board.c。
在 board.c 中定义了每个芯片的低功耗的具体实现方式。