芯领神会 发表于 2018-12-26 16:22:08

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 09:57:57

本帖最后由 toofree 于 2018-12-29 10:00 编辑

像类似问题,请给出STM32CubeMX、HAL的版本信息、工程文件,否则无法给你测试。你贴出的代码没有问题,可能会有问题的却没有交代。
请使用STM32CubeMX、HAL和LL库最新版本。
HAL都可能有BUG,LL更库容易有BUG,ST有时会不声不响的把BUG修复,版本更新。不要问我是怎么知道的,满满都是累。

芯领神会 发表于 2018-12-29 22:11:09

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);
       


}

sheol1017 发表于 2020-1-14 17:02:17

棒棒的
页: [1]
查看完整版本: STM32L051k8RTC闹钟