【RISC-V MCU CH32V103测评】 ---前进的维子---RTC
[复制链接]
【RISC-V MCU CH32V103测评】 ---前进的维子---RTC
前进的维子
2021年2月1日
前言:
本文是维子在EEWORLD上对ch32v103测评的第九篇文章。本文主要讲解手册中RTC的基础知识。并走读例程代码。
首先RTC归根到底也是定时器的一种。系统滴答定时器、看门狗定时器、RTC都是定时器。是定时器就有输入的时钟源。有输入就有比较和输出。也就产生了:秒事件、闹钟事件和溢出事件。我师傅说过,单片机工程师控制其实就是在合适的时候输出合适的电平。定时器是判断时间是否合适的一个条件。
- 手册阅读
官方给出的PDF手册描述的已经很清楚。不过,维子还是带这大家看一看,请相信我!——一定能把大家带迷路,哈哈。
1:先看结构图:
2:再看RTC的时钟源:
“RTC 时钟(RTCCLK)通过设置 RCC_BDCTLR 寄存器的 RTCSEL[1:0]位,RTCCLK 时钟源可以由 HSE/128、LSE 或 LSI 时钟提供。修改此位前要保证电源控制寄存器(PWR_CR)应为PWR_CTLR 中的 DBP(第8位) 位置 1,只有后备区域复位,才能复位此位。
LSE 作为 RTC 时钟:由于 LSE 处于后备域由 VBAT供电,只要 VBAT维持供电,尽管 VDD供电被切断,RTC 仍继续工作。
LSI 作为 RTC 时钟:如果 VDD供电被切断,RTC 自动唤醒不能保证。
HSE/128 作为 RTC 时钟:如果 VDD 供电被切断或内部电压调压器被关闭(1.8V 域的供电被切断),则 RTC 状态不确定。 ”
结论:时钟源:HSE/128、LSE 、LSI;但是要VDD断电仍能工作还是用LSE。
3:再看能干啥?
先说结论:可中断、可唤醒。事件包括:秒、溢出、闹钟……都可以从standby唤醒。唤醒是,闹钟和从WKU引脚的上升沿从Standby退出。
说的远一点:WKUP pin 是属于RTC模块的吗?维子觉着不属,但把人家当孤儿也不好吧。
4:查看寄存器
RTC功能简单,只要扫一眼,什么都知道了。维子啰嗦几句啊:现在官方给的库,都很完善好用。一般看着官方的例子就可以修改自己的代码。很多人不去看寄存器(时间紧的时候,很多人都不看手册),但是维子觉着最好花两分钟把寄存器过一遍,时间不长,做个了解。
- 走读代码
有了手册阅读的基础,我们再看代码的时候就很轻松的理解编程的人是为什么这样写的了。程序很简单,RTC初始化和RTC中断。
主函数
int main(void)
{
……
RTC_Init();
while(1){
Delay_Ms(1000);
打印时间。
}
}
中断处理函数 每次中断读一下时间
void RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_SEC) != RESET) /* Seconds interrupt */
RTC_Get();
if(RTC_GetITStatus(RTC_IT_ALR)!= RESET){
RTC_ClearITPendingBit(RTC_IT_ALR);
RTC_Get();
}
RTC_ClearITPendingBit(RTC_IT_SEC|RTC_IT_OW);
RTC_WaitForLastTask();
}
RTC_Init :
这里就不复制代码上来了。只要知道,在后备寄存器特定位置写入特定值做一下证明可以了。同样用类似的方法,可以判断单片机是复位还是断电。
下面是RTC库的函数列表。有了寄存器的阅读,稍微看一下函数体就懂了。
- 编译和观察结果
- 总结
RTC作为非常易用的内部外设。使用起来也很简单。一般RTC在低功耗的时候的作用很中重要。用它来做低功耗的延时是个不错的办法。这个例程代码是可以直接借鉴到自己代码里的。单片机越来越简单了。
|