STM32L051k8RTC闹钟
最近在进行一个实验项目,使用的是stm32L051k8,是8KRAM,64KFLASH,需要使用到RTC闹钟。同时使用的是LL库,但是发现RTC的闹钟根本无法启动。在此贴出RTC部分代码。希望使用过STM32L0系列闹钟的坛友们帮忙看看。RTC_AlarmStruct.AlarmTime.TimeFormat = LL_RTC_HOURFORMAT_24HOUR;
RTC_AlarmStruct.AlarmTime.Hours = Hours;
RTC_AlarmStruct.AlarmTime.Minutes = Minutes;
RTC_AlarmStruct.AlarmTime.Seconds = Seconds;
RTC_AlarmStruct.AlarmMask = LL_RTC_ALMB_MASK_DATEWEEKDAY ; //精确匹配星期,时分秒
RTC_AlarmStruct.AlarmDateWeekDaySel =LL_RTC_ALMB_DATEWEEKDAYSEL_DATE; //按星期闹
RTC_AlarmStruct.AlarmDateWeekDay = WeekDay;
LL_RTC_ALMB_Init(RTC, LL_RTC_FORMAT_BIN, &RTC_AlarmStruct);
LL_RTC_ClearFlag_ALRB(RTC);
LL_RTC_ALMB_Enable(RTC);
LL_RTC_EnableIT_ALRB(RTC);
NVIC_EnableIRQ(RTC_IRQn); //使能RTC中断
NVIC_SetPriority(RTC_IRQn, 3);
本帖最后由 toofree 于 2018-12-29 10:00 编辑
像类似问题,请给出STM32CubeMX、HAL的版本信息、工程文件,否则无法给你测试。你贴出的代码没有问题,可能会有问题的却没有交代。
请使用STM32CubeMX、HAL和LL库最新版本。
HAL都可能有BUG,LL更库容易有BUG,ST有时会不声不响的把BUG修复,版本更新。不要问我是怎么知道的,满满都是累。
stm32L0xx LL库RTC闹钟
本帖最后由 芯领神会 于 2018-12-29 22:16 编辑问题已解决:
首先想办法解决了无法开启RTC闹钟事件的问题:
1、在进行闹钟的开启和关闭的时候必须要首先禁用RTC的写保护;
LL_RTC_DisableWriteProtection(RTC);
RTC的闹钟事件就正常了,而且能够正常触发,但是问题来了,事件触发了,但是根本就无法进入中断,这个时候就需要修改两个地方,通过查询寄存器手册得知,RTC的闹钟是映射到了外部中断线,所以需要使用RTC闹钟的中断,就需要开启相应的外部中断:然后添加了两行代码: LL_EXTI_EnableIT_0_31(LL_EXTI_LINE_17);
LL_EXTI_EnableRisingTrig_0_31(LL_EXTI_LINE_17);
,再次贴出关键代码:
RTC初始化部分:
static void InitRTC(void)
{
LL_RTC_InitTypeDef RTC_InitStruct = {0};
/* Peripheral clock enable */
LL_RCC_EnableRTC();
RTC_InitStruct.HourFormat = LL_RTC_HOURFORMAT_24HOUR;
RTC_InitStruct.AsynchPrescaler = 124;
RTC_InitStruct.SynchPrescaler = 295;
LL_RTC_Init(RTC, &RTC_InitStruct);
}
//RTC中断部分设定
LL_EXTI_EnableIT_0_31(LL_EXTI_LINE_17);
LL_EXTI_EnableRisingTrig_0_31(LL_EXTI_LINE_17);
NVIC_EnableIRQ(RTC_IRQn); //使能RTC中断
NVIC_SetPriority(RTC_IRQn, 1);
BOOLEAN setRtcAlarmA(INT32U SleepTime)
{
LL_RTC_AlarmTypeDef RTC_AlarmStruct;
INT8U WeekDay = 0;//星期1-7
INT8U Hours = 0;
INT8U Minutes = 0;
INT8U Seconds = 0;
INT32U Time_Now = 0;
INT32U TimeSecNow = 0;
Time_Now = LL_RTC_TIME_Get(RTC);//测试改值,要求 该闹钟需要在当前的时间基础上添加闹钟
TimeSecNow = Time_Now&0xFF;
TimeSecNow += ((Time_Now>>8)&0xFF)*60;
TimeSecNow += ((Time_Now>>16)&0xFF)*3600;
SleepTime = SleepTime + TimeSecNow;
if (SleepTime < 60)
{
WeekDay = 0;
Hours = 0;
Minutes = 0;
Seconds = SleepTime;
}
else if (SleepTime < 3600)
{
WeekDay = 0;
Hours = 0;
Minutes = SleepTime / 60;
Seconds = SleepTime % 60;
}
else if (SleepTime < 86400)
{
WeekDay = 0;
Hours = SleepTime / 3600;
Minutes = SleepTime % 3600 / 60;
Seconds = SleepTime % 60;
}
else if (SleepTime < 259199)
{
WeekDay = SleepTime / 86400;
Hours = SleepTime % 36400 / 3600;
Minutes = SleepTime % 3600 / 60;
Seconds = SleepTime % 60;
}
else
{
return 0;
}
WeekDay+=1;
RTC_AlarmStruct.AlarmTime.TimeFormat = LL_RTC_HOURFORMAT_24HOUR;
RTC_AlarmStruct.AlarmTime.Hours = Hours;
RTC_AlarmStruct.AlarmTime.Minutes = Minutes;
RTC_AlarmStruct.AlarmTime.Seconds = Seconds;
RTC_AlarmStruct.AlarmMask = LL_RTC_ALMB_MASK_DATEWEEKDAY ; //精确匹配星期,时分秒
RTC_AlarmStruct.AlarmDateWeekDaySel =LL_RTC_ALMB_DATEWEEKDAYSEL_DATE; //按星期闹
RTC_AlarmStruct.AlarmDateWeekDay = WeekDay;
// LL_RTC_ALMA_EnableWeekday();
LL_RTC_ALMA_Init(RTC, LL_RTC_FORMAT_BIN, &RTC_AlarmStruct);
LL_RTC_ALMA_Enable(RTC);//开启闹钟A
LL_RTC_EnableIT_ALRA(RTC);
LL_RTC_DisableWriteProtection(RTC);
LL_RTC_DisableIT_ALRA(RTC);
LL_RTC_ALMA_Disable(RTC);
LL_RTC_ClearFlag_ALRA(RTC);
LL_RTC_EnableIT_ALRA(RTC);
LL_RTC_ALMA_Enable(RTC);
LL_RTC_EnableWriteProtection(RTC);
}
棒棒的
页:
[1]