OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4081|回复: 7

stm32L151低功耗-LSE做RCT时钟源,wakeup定时周期唤醒无法进入中断????求大佬救命!!

[复制链接]

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2020-10-6
在线时间
10 小时
发表于 2020-11-28 17:16:20 | 显示全部楼层 |阅读模式
20金钱
最近在搞lora低功耗通信,卡到stm32L151c8t6低功耗了。。。。
下面的程序可以进行睡眠,但是无法唤醒,进不去中断服务函数。。。。给位大佬帮帮忙

int main(void)
{
        uint8_t i,a;

        RTC_Config();
        GPIO_Configuration();
        USART1_Config();

        while(1)
        {       
                printf("111");
                /*控制CPU进入stop模式 */
                PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
                printf("222");
                /* CPU唤醒后,先停止自动唤醒功能 */
                RTC_WakeUpCmd(DISABLE);
                printf("333");                       
        }
}



void RTC_Config(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  EXTI_InitTypeDef EXTI_InitStructure;
       
         static RTC_InitTypeDef RTC_InitStructure;
    static RTC_TimeTypeDef RTC_TimeStructure;
       
         static RTC_DateTypeDef RTC_DateStruct;
   static RTC_AlarmTypeDef  RTC_AlarmStruct;

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
  //allow access to rtc
  PWR_RTCAccessCmd(ENABLE);   //启用访问功能
  //RESET RTC Domain
  RCC_RTCResetCmd(ENABLE);
  RCC_RTCResetCmd(DISABLE);
  //LSE enable   32.768k
  RCC_LSEConfig(RCC_LSE_ON);
  //wait till LSE is ready
  while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  {}
  //rtc clock select
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
  //enable rtc clock
  RCC_RTCCLKCmd(ENABLE);
  // wait for rtc APB registers synchronisation
  RTC_WaitForSynchro();
               
               
//    RTC_InitStructure.RTC_AsynchPrediv = 0x7F;
//    RTC_InitStructure.RTC_SynchPrediv = 0xFF;
//    RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
//    RTC_Init(&RTC_InitStructure);
               
  //EXIT Config
  EXTI_ClearITPendingBit(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_Init(&EXTI_InitStructure);
  //enable the rtc wakeup interrupt
  NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_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,ENABLE);
  //rtc wakeup interrupt generation:clock source:RTCDiv_16,
  //wakeup time base:4s
        RTC_WakeUpCmd(DISABLE);  //禁止唤醒计数器

  RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);  
  RTC_SetWakeUpCounter(5);   //设置唤醒计数器
        RTC_ClearFlag(RTC_FLAG_WUTF);
        RTC_ClearITPendingBit(RTC_IT_WUT);
  //enable the wakeup interrupt
  RTC_ITConfig(RTC_IT_WUT, ENABLE);   //使能唤醒中断
        RTC_WakeUpCmd(ENABLE);     //使能唤醒计数器
}


void RTC_WKUP_IRQHandler(void)
{
        //printf("frtrtrt");
  if(RTC_GetITStatus(RTC_IT_WUT) != RESET)
  {
    RTC_ClearITPendingBit(RTC_IT_WUT);
    EXTI_ClearITPendingBit(EXTI_Line20);
                //printf("asdf");
  }
}

最佳答案

查看完整内容[请看2#楼]

要在你的主循环里面,进入停止低功耗前打开RTC。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2020-11-28 17:16:21 | 显示全部楼层
xiaoshigua 发表于 2020-11-30 15:10
打开了,从这句开始数第七行

要在你的主循环里面,进入停止低功耗前打开RTC。
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2020-11-30 08:49:47 | 显示全部楼层
RTC_WakeUpCmd(DISABLE);   停止后你打开了吗??
回复

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2020-10-6
在线时间
10 小时
 楼主| 发表于 2020-11-30 15:10:25 | 显示全部楼层
c2007s 发表于 2020-11-30 08:49
RTC_WakeUpCmd(DISABLE);   停止后你打开了吗??

打开了,从这句开始数第七行
回复

使用道具 举报

3

主题

821

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3369
金钱
3369
注册时间
2011-11-10
在线时间
207 小时
发表于 2020-11-30 22:25:49 | 显示全部楼层
xiaoshigua 发表于 2020-11-30 15:10
打开了,从这句开始数第七行


        while(1)
        {      
                printf("111");
                /*控制CPU进入stop模式 */

必须在此处重新打开。必须在此处重新打开。必须在此处重新打开。必须在此处重新打开。

                PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
                printf("222");
                /* CPU唤醒后,先停止自动唤醒功能 */
                RTC_WakeUpCmd(DISABLE);
                printf("333");                       
        }
回复

使用道具 举报

11

主题

2154

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4947
金钱
4947
注册时间
2015-1-10
在线时间
620 小时
发表于 2020-12-1 09:15:03 | 显示全部楼层
xiaoshigua 发表于 2020-11-30 15:10
打开了,从这句开始数第七行

他说的是在while里面的那句
回复

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2020-10-6
在线时间
10 小时
 楼主| 发表于 2020-12-1 17:07:15 | 显示全部楼层
c2007s 发表于 2020-11-30 22:27
要在你的主循环里面,进入停止低功耗前打开RTC。

打开了不管用,但是目前我用Alarm闹钟唤醒成功了,可以用
回复

使用道具 举报

2

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2020-10-6
在线时间
10 小时
 楼主| 发表于 2020-12-1 17:07:45 | 显示全部楼层
阿侑kevin 发表于 2020-12-1 09:15
他说的是在while里面的那句

好的
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-23 12:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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