完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
为了实现stm32的每隔一定时间RTC闹钟响铃一次,使用了一种笨方法,基本思路是:在RTC闹钟中断获取当前时间,并且修改下一次闹钟中断时间为当前时间+需要定时的时间。 如果有更好的思路请一定告知我,呜呜呜~。
RTC基本配置 在stm32 cubeMX中RTC部分做如下配置。时钟配置为外部32.768Khz高精度晶振。 激活时钟源,激活日历功能。 同步预分频值和异步预分频值是根晶振大小有关系的。这里我的板子使用的是32.768KHz的高精度晶振,定时时间为1秒,根据定时频率=晶振频率 / (异步预分频值 + 1) / (同步预分频值 + 1) : 1Hz = 32.768KHz / (127 + 1) / (255 + 1), 因此填入127与255。数据格式为BCD格式,日历时间啥的更具需要设置。在闹钟设置当中,将Alarm Mask Date Week day设置为enable,这样设置闹钟每天都会响,而不会只是设置的那一天才响,下面的alarm date week day sel 和 alarm date将无效。 使能RTC中断。 间隔定时 首先实现一定时函数,传入的参数为具体的时间,比如13点30分30秒。 void RTC_Set_AlarmA(uint8_t hour,uint8_t min,uint8_t sec) { /** Enable the Alarm A */ RTC_AlarmTypeDef sAlarm = {0}; sAlarm.AlarmTime.Hours = hour; sAlarm.AlarmTime.Minutes = min; sAlarm.AlarmTime.Seconds = sec; sAlarm.AlarmTime.SubSeconds = 0; sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET; sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY; sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL; sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE; sAlarm.AlarmDateWeekDay = 1; sAlarm.Alarm = RTC_ALARM_A; if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK) //重新设置定时中断 { Error_Handler(); } } 实现一个间隔定时的函数,只能在RTC中断回调函数中使用,传入参数为含义为 下一次响铃为多久之后及间隔时长首先先获取当前时间,然后加上需要间隔的时间,最后调用RTC_Set_AlarmA设置闹钟。 /** * @note 只能在RTC 闹钟回调函数中调用 */ void RTC_SetAlarmFrec(uint8_t hour, uint8_t min, uint8_t sec) { uint8_t h=0,m=0,s=0; RTC_TimeTypeDef gTime = {0}; RTC_DateTypeDef gDate = {0}; HAL_RTC_GetTime(&hrtc, &gTime, RTC_FORMAT_BIN); HAL_RTC_GetDate(&hrtc, &gDate, RTC_FORMAT_BIN); if ( (s = (sec + gTime.Seconds) ) > 59 ) { s = s % 60 ; ++ gTime.Minutes; } if ( (m = (min + gTime.Minutes) ) > 59 ) { m = m % 60 ; ++ gTime.Hours; } if ( (h = (hour + gTime.Hours) ) > 23 ) { h = h % 24 ; } //printf("set time: %d: %d: %drn", h, m, s); RTC_Set_AlarmA( h, m, s); } 最后在中断回调函数中调用,如下设置,闹钟将会每一小时响铃一次。 #define alarm_hour 1 #define alarm_min 0 #define alarm_sec 0 void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc) { RTC_SetAlarmFrec(alarm_hour, alarm_min, alarm_sec); } |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3458 浏览 1 评论
9002 浏览 16 评论
4051 浏览 18 评论
1112浏览 3评论
573浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
570浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2303浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1859浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 01:13 , Processed in 1.260394 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号