上次实验完成了对实时时钟的基本功能——计时的实验,这次在计时的基础上对rtc的可编程闹钟的功能进行测试。
rtc 单元提供两个可编程闹钟,即闹钟 a 和闹钟 b。
可通过将 rtc_cr 寄存器中的 alrae 和 alrbe 位置 1 来使能可编程闹钟功能。如果日历亚秒、秒、分钟、小时、日期或日分别与闹钟寄存器rtc_alrmassr/rtc_alrmar 和rtc_alrmbssr/rtc_alrmbr 中编程的值相匹配,则 alraf 和 alrbf 标志会被置为1。可通过 rtc_alrmar 和 rtc_alrmbr 寄存器的 mskx 位以及 rtc_alrmassr 和rtc_alrmbssr 寄存器的 maskssx 位单独选择各日历字段。可通过 rtc_cr 寄存器中的 alraie 和 alrbie 位使能闹钟中断。
闹钟 a 和闹钟 b(如果已通过 rtc_cr 寄存器中的位 osel[0:1] 使能)可连接到 rtc_alarm输出。可通过 rtc_cr 寄存器的 pol 位配置 rtc_alarm 极性。
要对可编程的闹钟(闹钟 a 或闹钟 b)进行编程或更新,必须执行类似的步骤:
将 rtc_cr 寄存器中的 alrae 或 alrbe 位清零以禁止闹钟 a 或闹钟 b。轮询 rtc_isr 寄存器中的 alrawf 或 alrbwf 位,直到其中一个置 1,以确保闹钟寄存器可以访问。大约需要 2 个 rtcclk 时钟周期(由于时钟同步)。编程闹钟 a 或闹钟 b 寄存器(rtc_alrmassr/rtc_alrmar 或 rtc_alrmbssr/rtc_alrmbr)。将 rtc_cr 寄存器中的 alrae 或 alrbe 位置 1 以再次使能闹钟 a 或闹钟 b。注意:约 2 个 rtcclk 时钟周期(由于时钟同步)后,将执行对 rtc_cr 寄存器的更改。
写程序前先简单了解下闹钟相关的寄存器:
rtc闹钟a寄存器 (rtc_alrmar)
位 31 msk4:闹钟 a 日期掩码 (alarm a date mask)
0:如果日期/日匹配,则闹钟 a 置 1
1:在闹钟 a 比较中,日期/日无关
位 30 wdsel:星期几选择 (week day selection)
0:du[3:0] 代表日期的个位
1:du[3:0] 代表星期几。dt[1:0] 为无关位。
位 29:28 dt[1:0]:日期的十位(bcd 格式)
位 27:24 du[3:0]:日期的个位或日(bcd 格式)
位 23 msk3:闹钟 a 小时掩码 (alarm a hours mask)
0:如果小时匹配,则闹钟 a 置 1
1:在闹钟 a 比较中,小时无关
位 22 pm :am/pm 符号 (am/pm notation)
0:am 或 24 小时制
1:pm
位 21:20 ht[1:0]:小时的十位(bcd 格式)
位 19:16 hu[3:0]:小时的个位(bcd 格式)
位 15 msk2:闹钟 a 分钟掩码 (alarm a minutes mask)
0:如果分钟匹配,则闹钟 a 置 1
1:在闹钟 a 比较中,分钟无关
位 14:12 mnt[2:0]:分钟的十位(bcd 格式)
位 11:8 mnu[3:0]:分钟的个位(bcd 格式)
位 7 msk1:闹钟 a 秒掩码 (alarm a seconds mask)
0:如果秒匹配,则闹钟 a 置 1
1:在闹钟 a 比较中,秒无关
位 6:4 st[2:0]:秒的十位(bcd 格式)
位 3:0 su[3:0]:秒的个位(bcd 格式)
闹钟b寄存器rtc_alrmbr与闹钟a寄存器rtc_alrmar的寄存器功能一样,这里不再进行介绍。
rtc闹钟配置函数和中断处理函数
void rtc_alarmconfig(u8 alarm_sel,u8 alarm_set,u8 alarm_day,u8 alarm_hour,u8 alarm_minute){ u32 prigroup = 0; u32 priority = 0; u32 temp = 0; //1.解除保护 //写密钥:先写0xca,再写0x53 rtc- >wpr = 0xca; rtc- >wpr = 0x53; switch(alarm_set) { case special_day: temp |= alarm_day< <24; //设置具体星期 break; case work_day: case all_day: temp |= (u32)(1< <31); break; case disable_day: break; } temp |= 1< <30; //用星期来匹配 temp |= ((alarm_hour/10)< <4 | (alarm_hour%10))< <16 | 1< <23; temp |= ((alarm_minute/10)< <4 | (alarm_minute%10))< <8 | 1< <15; temp |= 1< cr &= ~(1< isr & (1< alrmar = temp; rtc- >cr |= 1< cr |= 1< isr &= ~(1< cr &= ~(1< isr & (1< alrmbr = temp; rtc- >cr |= 1< cr |= 1< isr &= ~(1< imr |= 1< rtsr |= 1< pr |= 1< dr & 0x0000e000) >>13; if(temp >5) { if(alarm_sel == alarm_a) rtc- >cr &= ~(1< cr &= ~(1< cr |= 1< cr |= 1< cr &= ~(1< cr &= ~(1< wpr = 0xff; //写任意值,再次保护}//中断处理void rtc_alarm_irqhandler(){ exti- >pr |= 1< isr & (1< isr &= ~(1< isr & (1< isr &= ~(1< tr & 0x300000) >>20)*10 + ((rtc- >tr & 0xf0000) >>16); time.fen = ((rtc- >tr & 0x7000) >>12)*10 + ((rtc- >tr & 0xf00) >>8); time.miao = ((rtc- >tr & 0x70) >>4)*10 + (rtc- >tr & 0xf); printf(%d:%d:%drn,time.shi,time.fen,time.miao); delay_ms(1000); }}初始时间设为23:59:50,闹钟时间设为0:0:0。运行程序,经过10秒钟后,闹钟进入中断,led灯实现翻转,rtc闹钟实验测试成功。
惠威SWANS M1.2 音箱图
德承DI-1000利用机器学习来降低交通拥堵-减少60%的等待时间
荷兰的研究人员正在利用人体的热量来挖掘加密货币
三星Galaxy S10 Lite手机,配备4500mAh电池和45W充电
酷睿i9-10980XE曝光 18核心36线程热设计功耗165W
STM32 RTC实时时钟(二)
谷歌停止开发VR摄像机,进军AR技术
5G的下游应用有哪一些
TUV莱茵与阿里云联合发布减碳方案,助力中小企业可持续发展
【知识】聊一聊工业控制连接器的几大发展趋势
最高奖+青年奖 这家传感器企业如何做到科学技术双“奖”临门?
新品来袭!中兴通讯新一代FTTR产品RoomPON 5.0重磅发布
200 mm晶圆厂产能2018年持续紧张 200 mm设备缺货告急
比特币现金网的市场走势预测分析
华为何刚:2亿部销量坚定信心 华为畅享10 Plus欲再创新高
VR/AR行业发展至今,它的市场规模如何
三种常见的PCB软件比较
中国电信在海南正式开通了端到端的5G商用系统规模外场实验网
物联网在现实生活中可以提高我们的生活质量
在1:5CW转换器中具有N相和分相时钟的GaN FET开关