打印
[N32L4xx]

N32L406 RTC唤醒不稳定(sleep模式)

[复制链接]
295|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Sam131208|  楼主 | 2023-11-29 08:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Sam131208 于 2023-11-29 08:57 编辑

   RTC唤醒配置为0.5秒唤醒一次,上电后,前三次唤醒,大概1秒多才中断一次。
   另外还有未确认的问题,CPU计算任务重的时候,0.5秒的中断,似乎也变为了1秒钟。
   在STOP2模式下,0.5秒中断比较稳定,尚未发现问题。
   下面时RTC初始化:


    中断处理:
    EXTI_ClrITPendBit(EXTI_LINE20);
    if (RTC_GetITStatus(RTC_INT_WUT) != RESET)
    {
                RTC_ClrIntPendingBit(RTC_INT_WUT);
    }

    初始化:   
     RTC_InitType  RTC_InitStructure;
     RTC_DateType  RTC_DateStructure;
     RTC_TimeType  RTC_TimeStructure;
     EXTI_InitType EXTI_InitStructure;
     NVIC_InitType NVIC_InitStructure;
        
     PWR_BackupAccessEnable(ENABLE);
    if (0xA5A5 != BKP_ReadBkpData(0x0000) )
    {
                /* Enable the PWR clock */
                RCC_EnableAPB1PeriphClk(RCC_APB1_PERIPH_PWR, ENABLE);
                RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_AFIO, ENABLE);

                /* Allow access to RTC */
                PWR_BackupAccessEnable(ENABLE);
                /* Disable RTC clock */
                RCC_EnableRtcClk(DISABLE);

                /* Enable the LSE OSC32_IN PC14 */
                RCC_EnableLsi(DISABLE); // LSI is turned off here to ensure that only one clock is turned on
                RCC_ConfigLse(RCC_LSE_ENABLE,0x1FF);

                /****Waite LSE Ready *****/
                while(RCC_GetFlagStatus(RCC_LDCTRL_FLAG_LSERD) == RESET){
                        
                };
                RCC_ConfigRtcClk(RCC_RTCCLK_SRC_LSE);
                RCC_EnableRtcClk(ENABLE);
                RTC_WaitForSynchro();

                /* Configure the RTC data register and RTC prescaler */
                RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
                RTC_InitStructure.RTC_SynchPrediv  = 0xff;
                RTC_InitStructure.RTC_HourFormat   = RTC_24HOUR_FORMAT;
                /* Check on RTC init */
                if (RTC_Init(&RTC_InitStructure) == ERROR)
                {

                }

                RTC_DateStructure.WeekDay = 7;
                RTC_DateStructure.Date = 1;
                RTC_DateStructure.Month = 10;
                RTC_DateStructure.Year = 23;
                if(RTC_SetDate(RTC_FORMAT_BIN, &RTC_DateStructure) == ERROR){

                }

                RTC_TimeStructure.H12 = RTC_AM_H12;
                RTC_TimeStructure.Hours = 0;
                RTC_TimeStructure.Minutes = 0;
                RTC_TimeStructure.Seconds = 0;
                if (RTC_ConfigTime(RTC_FORMAT_BIN, &RTC_TimeStructure) == ERROR){

                }
                /* wake up clock select */
                RTC_ConfigWakeUpClock(RTC_WKUPCLK_RTCCLK_DIV16);
                /* wake up timer value */
                RTC_SetWakeUpCounter(0x400 - 1);
                BKP_WriteBkpData(0x0000, 0xA5A5);
    }
    EXTI_ClrITPendBit(EXTI_LINE20);
    EXTI_InitStructure.EXTI_Line = EXTI_LINE20;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_InitPeripheral(&EXTI_InitStructure);
    /* Enable the RTC WakeUp Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel                   = RTC_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    /* Enable the RTC Wakeup Interrupt */
    RTC_ClrIntPendingBit(RTC_INT_WUT);
    RTC_ConfigInt(RTC_INT_WUT, ENABLE);
    RTC_EnableWakeUp(ENABLE);

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

92

帖子

0

粉丝