STM32的RTC能产生毫秒级的中断吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32的RTC能产生毫秒级的中断吗相关的知识,希望对你有一定的参考价值。
参考技术A RTC支持三种中断,分别是秒中断,闹钟中断和溢出中断。从这三种方式可以看出,正常情况下,RTC的中断是秒级的。
如果使用设置分频的方式让秒中断变成毫秒级中断的话,RTC就不能当作时真正的秒时钟来用了。
如果需要毫秒级中断,推荐使用systick.
所有使用Cortex-M3内核的CPU都有一个systick计数器。
在不使用操作系统的工程中,一般都用systick作为毫秒级中断发生器。
在使用ucos或其它简单操作系统的工程中,systick都作为操作系统的系统时钟滴答,周期是1毫秒一个中断。
另外您也可以使用STM32的几个TIM。
TIM1是最复杂的,在只需要简单功能情况下,建议使用TIM2或其它TIM。
STM32Cube STM32L053配置RTC WAKEUP中断唤醒
芯片手册中提到的从停止模式唤醒说明
芯片手册中提到的从待机模式唤醒说明
配置
LL_RTC_InitTypeDef RTC_InitStruct = 0;
LL_RCC_EnableRTC();
NVIC_SetPriority(RTC_IRQn,0);
NVIC_EnableIRQ(RTC_IRQn);
RTC_InitStruct.HourFormat = LL_RTC_HOURFORMAT_24HOUR;
RTC_InitStruct.AsynchPrescaler = 127;
RTC_InitStruct.SynchPrescaler = 255;
LL_RTC_Init(RTC, &RTC_InitStruct);
LL_RTC_WAKEUP_SetClock(RTC, LL_RTC_WAKEUPCLOCK_CKSPRE);
LL_RTC_WAKEUP_SetAutoReload(RTC, 60);
中断唤醒清除中断
void RTC_IRQHandler(void)
/* USER CODE BEGIN RTC_IRQn 0 */
INTRTC = 1;
while(LL_RTC_IsActiveFlag_WUT(RTC))
LL_RTC_ClearFlag_WUT(RTC);
LL_RCC_MSI_Enable();
LL_RCC_LSI_Enable();
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_20);
/* USER CODE END RTC_IRQn 0 */
/* USER CODE BEGIN RTC_IRQn 1 */
/* USER CODE END RTC_IRQn 1 */
休眠函数
void stop(void)
/* 开启PWR时钟 */
LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR);
/* 设置中断线 */
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_20);
LL_EXTI_EnableIT_0_31(LL_EXTI_LINE_20);
LL_EXTI_EnableRisingTrig_0_31(LL_EXTI_LINE_20);
/* 设置RTC唤醒时间 */
LL_RTC_DisableWriteProtection(RTC);
LL_RTC_WAKEUP_Disable(RTC);
while(!LL_RTC_IsActiveFlag_WUTW(RTC));
LL_RTC_WAKEUP_SetAutoReload(RTC, 20);
LL_RTC_WAKEUP_SetClock(RTC, LL_RTC_WAKEUPCLOCK_CKSPRE);
LL_RTC_EnableIT_WUT(RTC);
LL_RTC_WAKEUP_Enable(RTC);
LL_RTC_EnableWriteProtection(RTC);
//power_off();
LL_PWR_EnableUltraLowPower();
LL_PWR_SetRegulModeLP(LL_PWR_REGU_LPMODES_LOW_POWER);
LL_PWR_SetPowerMode(LL_PWR_MODE_STOP);
LL_LPM_EnableDeepSleep();
__WFI();
//power_on();
以上是关于STM32的RTC能产生毫秒级的中断吗的主要内容,如果未能解决你的问题,请参考以下文章