STM32
直播中

梁宏满

7年用户 856经验值
私信 关注
[问答]

stm32l151c8t6 rtc的闹钟中断进不了是怎么回事?

不知道是不是配置不对 请大神帮忙看看   用的是STM32l151c8t6   就是进不去中断  到了制定的闹钟时间 没有进中断 求帮忙瞄一瞄是什么地方没配置好
void RTC_conig(void)

{
    static NVIC_InitTypeDef  NVIC_InitStructure;
    static EXTI_InitTypeDef  EXTI_InitStructure;
    static RTC_InitTypeDef RTC_InitStructure;
    static RTC_TimeTypeDef RTC_TimeStructure;
                static RTC_DateTypeDef RTC_DateStruct;
           static        RTC_AlarmTypeDef  RTC_AlarmStruct;
    static uint32_t AsynchPrediv = 0, SynchPrediv = 0;
                uint8_t ret;
        
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

    /*!< Allow access to RTC */
    PWR_RTCAccessCmd(ENABLE);

    /*!< 使能外部低速时钟 */
    RCC_LSEConfig(RCC_LSE_ON);

    /*!< 等待外部低速时钟就绪 */
    while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
    {}

    /*!< 配置RTC时钟来源 */
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

    /*!< 使能RTC时钟 */
    RCC_RTCCLKCmd(ENABLE);

    /*!< Wait for RTC APB registers synchronisation */
    RTC_WaitForSynchro();
                        

    //配置日历
    /* 配置RTC数据寄存器以及时钟分频 */
    SynchPrediv = 255;
    AsynchPrediv = 127;//分频为1Hz
    RTC_InitStructure.RTC_AsynchPrediv = AsynchPrediv;
    RTC_InitStructure.RTC_SynchPrediv = SynchPrediv;

    RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;//24小时制
                        
    /* 检查RTC初始化 */
    if (RTC_Init( RTC_InitStructure) == ERROR)
    {
        printf("nr        /!\***** RTC Prescaler Config failed ********/!\ nr");
    }

               
               

//                while(!ret)
//                {
//                        ret = RTC_EnterInitMode();
//                }
    RTC_TimeStructure.RTC_H12     = RTC_HourFormat_24;//RTC_H12_PM;
    RTC_TimeStructure.RTC_Hours = 9;
    RTC_TimeStructure.RTC_Minutes = 59;
    RTC_TimeStructure.RTC_Seconds = 1;
    RTC_SetTime(RTC_Format_BIN,  RTC_TimeStructure);

               
                RTC_DateStruct.RTC_Date=4;
                RTC_DateStruct.RTC_Month=6;
                RTC_DateStruct.RTC_WeekDay=1;
                RTC_DateStruct.RTC_Year=18;

    RTC_SetDate( RTC_Format_BIN,  RTC_DateStruct );
    //配置自动定时功能
    /* 中断配置 *******************************************************/
               
               
        
               
    EXTI_ClearITPendingBit(EXTI_Line17);
    EXTI_InitStructure.EXTI_Line = EXTI_Line17;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init( EXTI_InitStructure);

    /*使能 RTC Wakeup Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = RTC_Alarm_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init( NVIC_InitStructure);
               
                //先关闭        RTC_AlarmCmd(RTC_Alarm_A,DISABLE);  才能使用RTC_SetAlarm
               
                        ret = RTC_AlarmCmd(RTC_Alarm_A,DISABLE);
               
                printf("ret = %drn",ret);
               
                RTC_AlarmStruct.RTC_AlarmTime.RTC_H12=RTC_HourFormat_24;
                RTC_AlarmStruct.RTC_AlarmTime.RTC_Hours=9;
                RTC_AlarmStruct.RTC_AlarmTime.RTC_Minutes=59;
                RTC_AlarmStruct.RTC_AlarmTime.RTC_Seconds=20;
               
//                RTC_AlarmStruct.RTC_AlarmDateWeekDay=
//                        RTC_AlarmStruct.RTC_AlarmDateWeekDaySel=
                RTC_AlarmStruct.RTC_AlarmMask=RTC_AlarmMask_Seconds | RTC_AlarmMask_Minutes | RTC_AlarmMask_Hours;
               
                RTC_SetAlarm(RTC_Format_BIN,RTC_Alarm_A, RTC_AlarmStruct);
               
                RTC_ClearFlag(RTC_FLAG_ALRAF);
                ret = RTC_AlarmCmd(RTC_Alarm_A,ENABLE);
                printf("ret2 = %drn",ret);
                        
    /* RTC 唤醒中端配置: Clock Source: RTCDiv_16, Wakeup Time Base: 4s */
//    RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16);
//    RTC_SetWakeUpCounter(0x1FFF);//0x1FFF = 8191; 4s = (8191+1)*(1/(32768/16))

    /* 使能 the Wakeup Interrupt */
//    RTC_ITConfig(RTC_IT_ALRA, ENABLE);  
    RTC_ITConfig(RTC_IT_ALRA, ENABLE);
}




==================中断处理函数========================

void RTC_Alarm_IRQHandler( void )
{
               
    if( RTC_GetITStatus( RTC_IT_ALRA ) != RESET )
    {   
        RtcRecoverMcuStatus( );
    printf("====RTC_Alarm_IRQHandler======rn");
        TimerIrqHandler( );
                                
        RTC_ClearITPendingBit( RTC_IT_ALRA );
        EXTI_ClearITPendingBit( EXTI_Line17 );
    }
}


回帖(1)

fansz

2024-4-29 17:51:50
首先,我们需要确保STM32L151C8T6的RTC闹钟中断配置正确。以下是一些关键步骤和检查点,以确保您的配置正确:

1. 时钟配置:确保RTC时钟已正确配置。通常,我们需要使能LSI或LSE作为RTC的时钟源。以下是启用LSI时钟的示例代码:

```c
RCC_LSICmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET); // 等待LSI时钟稳定
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
```

2. 使能RTC:确保RTC时钟已使能。

```c
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
```

3. RTC初始化:使用`RTC_InitTypeDef`结构体初始化RTC。

```c
RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
RTC_InitStructure.RTC_SynchPrediv = 0xFF;
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
RTC_Init(&RTC_InitStructure);
```

4. 设置闹钟时间:使用`RTC_TimeTypeDef`结构体设置闹钟时间。

```c
RTC_TimeStructure.RTC_Hours = 12;
RTC_TimeStructure.RTC_Minutes = 0;
RTC_TimeStructure.RTC_Seconds = 0;
RTC_SetAlarm(RTC_Format_BIN, &RTC_TimeStructure, RTC_Alarm_A);
```

5. 使能闹钟中断:使能RTC闹钟A中断。

```c
RTC_ITConfig(RTC_IT_ALRA, ENABLE);
```

6. NVIC配置:配置NVIC以允许RTC闹钟中断。

```c
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
```

7. EXTI配置:如果您使用外部中断作为闹钟触发器,请确保EXTI配置正确。

8. 使能中断:确保全局中断和RTC中断使能。

```c
__enable_irq();
```

9. 中断服务例程:实现RTC闹钟中断服务例程。

```c
void RTC_IRQHandler(void)
{
    if (RTC_GetITStatus(RTC_IT_ALRA) != RESET)
    {
        RTC_ClearITPendingBit(RTC_IT_ALRA);
        // 在此处添加您的代码
    }
}
```

请检查您的代码,确保以上步骤都已正确执行。如果问题仍然存在,请检查硬件连接,确保RTC模块没有受到外部干扰。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分