硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4326|回复: 2
收起左侧

[有问必答] STM32F103 低功耗下RTC闹钟唤醒问题

[复制链接]

3

主题

4

回帖

13

积分

新手上路

积分
13
发表于 2017-4-27 17:18:58 | 显示全部楼层 |阅读模式
如题,本人在测试STOP模式下闹钟唤醒,发现唤醒间隙不一致,如图所示:  在非低功耗模式下,则可以获得等宽的脉冲(等间隙唤醒),希望得到大神解惑 QQ图片20170427171736.jpg
回复

使用道具 举报

3

主题

4

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2017-4-27 17:20:40 | 显示全部楼层
下面是代码:



int RTC_Init_User(void)
{   
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
   // RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);   
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);  
        BKP_DeInit();
    //使能后备寄存器访问  
    PWR_BackupAccessCmd(ENABLE);  


    RCC_LSICmd(ENABLE);  
        while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == 0) {};
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);   
    RCC_RTCCLKCmd(ENABLE);
    RTC_WaitForLastTask();
        RTC_WaitForSynchro();
    RTC_SetPrescaler(4000);
    RTC_WaitForLastTask();  
        
    RTC_SetCounter(0);  
    RTC_WaitForLastTask();  
    RTC_SetAlarm(RTC_GetCounter()+2);  //设置闹钟时间  默认初始化为0.5秒钟后闹钟事件
    RTC_WaitForLastTask();
    RTC_ITConfig(RTC_IT_ALR, ENABLE);              
      RTC_WaitForLastTask();        
            
//        PWR_Cfg_User();   
            
            //闹钟中断接到第17线外部中断  
    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);
   
        NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;//闹钟唤醒
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
            
        return 0;   
}
int RTC_Cfg_User(uint8_t Alarm)
{   

      RTC_SetAlarm(RTC_GetCounter()+Alarm);  //设置闹钟时间
    RTC_WaitForLastTask();
    return 0;
}


void RTCAlarm_IRQHandler()
{
    uint32_t iTemp=0;
        RTC_WaitForSynchro();  
  if (RTC_GetITStatus(RTC_IT_ALR) != RESET)  
  {

            EXTI_ClearITPendingBit(EXTI_Line17);
            RTC_WaitForLastTask();
            RTC_ClearITPendingBit(RTC_IT_ALR);
            RTC_WaitForLastTask();
            if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET)  
            {
                PWR_ClearFlag(PWR_FLAG_WU); // 清除唤醒标志
                RTC_WaitForLastTask();
            }


            GPIO_ToggleBits(GPIO_Pin_13,GPIOC);
            RTC_SetCounter(0);  
            RTC_WaitForLastTask();
            iTemp=RTC_GetCounter();
            RTC_SetAlarm((uint32_t)(iTemp+2));  //设置闹钟时间  默认初始化为0.5秒钟后闹钟事件
            RTC_WaitForLastTask();
            RTC_ClearITPendingBit(RTC_IT_ALR);
            RTC_WaitForLastTask();
  }  
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2017-4-28 01:46:52 | 显示全部楼层
RTX系统的低功耗tickless模式里面有折腾过一次,可以参看:http://www.armbbs.cn/forum.php?mod=viewthread&tid=14837
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-13 04:23 , Processed in 0.211436 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表