用STM32CubeMX 配置好RTC

因为用的是LL库,生成的代码并不完整。关于中断只有两行代码.
/* RTC interrupt Init */
NVIC_SetPriority(RTC_IRQn, 0);
NVIC_EnableIRQ(RTC_IRQn);
这样是不可以使用的。
需要增加以下代码:
MX_RTC_Init(void)
{
/* USER CODE BEGIN RTC_Init 2 */
LL_RTC_DisableWriteProtection(RTC); //关闭RTC写保护
LL_RTC_ALMA_Disable(RTC); //失能Alarm A
tickstart = 0;
/* Wait till RTC ALRAWF flag is set and if Time out is reached exit */
while(!LL_RTC_IsActiveFlag_ALRAW(RTC)) //等待可写Alarm A
{
if(tickstart++ > 10000u)
{
/* Enable the write protection for RTC registers */
LL_RTC_EnableWriteProtection(RTC);
return;
}
}
LL_RTC_ALMA_SetSubSecond(RTC, 0); //设置亚秒初值
LL_RTC_ALMA_SetSubSecondMask(RTC, 6); //设置中断周期 异步分频结果/2^7
LL_RTC_ALMA_SetMask(RTC, LL_RTC_ALMA_MASK_ALL); //
LL_RTC_ALMA_Enable(RTC); //使能Alarm A
LL_RTC_EnableIT_ALRA(RTC); //Alarm A 中断使能
LL_EXTI_EnableIT_0_31(LL_EXTI_LINE_17); //外部中断17使能
LL_EXTI_EnableRisingTrig_0_31(LL_EXTI_LINE_17); //外部中断极性
LL_RTC_EnableWriteProtection(RTC); //打开RTC写保护
/* USER CODE END RTC_Init 2 */
}
//中断服务程序
void RTC_IRQHandler(void)
{
/* USER CODE BEGIN RTC_IRQn 0 */
if(LL_RTC_IsActiveFlag_ALRA(RTC))
LL_RTC_ClearFlag_ALRA(RTC);
if(LL_RTC_IsActiveFlag_RS(RTC))
LL_RTC_ClearFlag_RS(RTC);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_17);
/* USER CODE END RTC_IRQn 0 */
/* USER CODE BEGIN RTC_IRQn 1 */
/* USER CODE END RTC_IRQn 1 */
}
本文详细介绍了如何使用STM32CubeMX配置实时钟(RTC)模块,并补充了必要的中断初始化代码,确保RTC中断功能正常工作。通过具体代码示例,讲解了关闭写保护、设置AlarmA中断周期等关键步骤。

836

被折叠的 条评论
为什么被折叠?



