上边的PRL是计数目标,写入6就是7分频,写入9就是10分频,因为计数值包含了0,重装值写入n就是n+1分频,下边的DIV就是每来一个时钟记一个数,DIV计数器是一个自减计数器,每来一个时钟DIV的值自减一次,自减到0的时候,再来一个输入时钟,DIV输出一个脉冲产生溢出信号,同时DIV从PRL获取重装值,回到重装值继续自减。
举个例子,RTCCLK为36728Hz时,为了分频后得到1Hz,PRL就要给32727,这个数值是始终不变的,DIV可以保持初始值为0,第一个输入时钟到来时,DIV立刻溢出产生溢出信号给后续电路,同时DIV变为重装值32767,第二个时钟DIV自减变为32766,第三个时钟DIV变为32765,之后来一个时钟自减一次直到为0,再来一个输入时钟会产生一个溢出信号,同时DIV回到32767,这样的话每来32768个输入脉冲,计数器溢出一次,产生一个输出脉冲,分频后输出的频率是1Hz,提供给后边的秒计数器
32位可编程计数器RTC_CNT,就是计时最核心的部分,可以把这个计数器看成是UNIX时间戳的秒计数器,借助time.h函数可方便的获得年月日时分秒,这个RTC还设计有闹钟寄存器RTC_ALR,这个ALR也是32位的寄存器,和CNT等宽,作用就是设置闹钟,可以在ALR写一个秒数设定闹钟,当CNT和ALR设定的闹钟一样时,代表闹钟响,这时会产生一个RTC_Alarm信号通向右边的中断系统,在中断函数里可以执行相应的操作。闹钟兼具一个功能,闹钟信号可以让STM32退出待机模式,比如设计一个数据采集设备需要再环境非常恶劣的地方工作,要求是每天中午12点采集一次数据,其他时间为了节省电量芯片需处于待机模式,此时就可以使用RTC自带的闹钟功能,时间到闹钟响,采集数据完成继续待机。闹钟值是一个定值,只能响一次,如果想实现周期性的闹钟,在每次闹钟响之后都需要重新设置下一个闹钟时间
中断输出使能和NVIC部分:
在右边的中断系统中可以注意到有3个信号可以出发中断:
第一个是RTC_Second,秒中断,来源是CNT的输入时钟,如果开启这个中断,那么程序就会每秒进一次RTC中断,
第二个是RTC_Overflow溢出中断,来源是CNT的右边,意思是CNT的计数器计满溢出后会触发一次中断,这个中断一般不会触发,因为CNT定义的是无符号数,到2106年才会溢出
第三个RTC_Alarm闹钟中断,当计数器和闹钟值相等时触发闹钟中断,同时可以将设备从待机模式唤醒
中断信号到右边的地方,那一块是中断标志位和中断输出控制,F(Flag)结尾的是对应中断标志位,IE(Interrupt Enable)结尾的是中断使能最后三个信号通过一个或门汇聚到NVIC中断控制器
APB1总线的读写部分:
APB总线和APB1接口是程序读写寄存器的地方,读写寄存器可以通过APB1总线完成,也可以看出RTC是APB1总线上的设备
PWR关联的部分:
下边的退出待机模式,还有一个WKUP(wake up)引脚,闹钟信号和WKUP引脚都可以唤醒设备,接在PA0的引脚上