OpenEdv-开源电子网

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

停止模式下 RTC不能唤醒问题

[复制链接]

3

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2013-5-2
在线时间
23 小时
发表于 2013-8-7 11:23:17 | 显示全部楼层 |阅读模式
用内部LSI作为RTC的时钟源,正常工作时,测试闹钟能正常中断,但进入停止模式后,闹钟唤醒不了

u8 RTC_Init(void)
{
  RCC->APB1ENR|=1<<28;     //使能电源时钟    
RCC->APB1ENR|=1<<27;     //使能备份时钟  
       
PWR->CR|=1<<8;           //取消备份区写保护
RCC->BDCR|=1<<16;        //备份区域软复位   
RCC->BDCR&=~(1<<16);     //备份区域软复位结束
     
    RCC->CSR|=1<<0;         //开启内部低速振荡器 
    while(!(RCC->CSR&0X02));//等待内部时钟就绪

RCC->BDCR|=0x0200;      //LSI作为RTC时钟    
RCC->BDCR|=1<<15;        //RTC时钟使能     
//    RTC->CRL &= (u16)(~(1<<3));  
while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步
                                       
RTC->CRL|=1<<4;              //允许配置  
RTC->RLH=0X0000;
RTC->RLL=32767;          //时钟周期设置(有待观察,看是否跑慢了?)理论值:32767  
RTC->CRL&=~(1<<4);//配置更新
  while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成 

RTC->CRH|=0X02;    //允许闹钟中断
while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
         
RTC->CRL|=1<<4;              //允许配置  
    RTC->ALRH=(((RTC->CNTH << 16)+RTC->CNTL)+5) >> 16;
    RTC->ALRL=(u16)((((RTC->CNTH << 16)+RTC->CNTL)+5) & 0x0000FFFF);//4915; //150ms
RTC->CRL&=~(1<<4);//配置更新
while(!(RTC->CRL&(1<<5)));   //等待RTC寄存器操作完成
           
RCC->APB2ENR|=0x01;//使能io复用时钟    

    //自动设置
EXTI->IMR|=1<<17;//  开启line 上的中断
EXTI->EMR|=1<<17;//不屏蔽line 上的事件 (如果不屏蔽这句,在硬件上是可以的,但是在软件仿真的时候无法进入中断!)
  EXTI->RTSR|=1<<17;//line 上事件上升降沿触发  
                                                  
MY_NVIC_Init(2,5,RTC_IRQChannel,2);//优先级设置
return 0; //ok
}

//RTC时钟中断
//每秒触发一次    
void RTC_IRQHandler(void)
{  
if(RTC->CRL&0x0002)//闹钟中断
{                 
   RTC->CRH|=0X02;    //允许闹钟中断
RTC->CRL&=~(0x0002); //清闹钟中断
  }    
    RTC->CRL&=0X0FFA;         //清除溢出,秒钟中断标志
while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成

    if (EXTI->R & (1<<17)) {         
        PoutLedHost = ~PoutLedHost;

    RTC->CRL|=1<<4;              //允许配置
        RTC->ALRH=(((RTC->CNTH << 16)+RTC->CNTL)+5) >> 16;
        RTC->ALRL=(u16)((((RTC->CNTH << 16)+RTC->CNTL)+5) & 0x0000FFFF);//4915; //150ms
    RTC->CRL&=~(1<<4);//配置更新
    while(!(RTC->CRL&(1<<5)));   //等待RTC寄存器操作完成
    
    EXTI->R=1<<17;  //清除LINE17上的中断标志位  
    }            
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
375
金钱
375
注册时间
2013-5-2
在线时间
23 小时
 楼主| 发表于 2013-8-7 11:29:52 | 显示全部楼层
我是要按键与RTC都具有唤醒功能的,按键可以正常唤醒,但就是RTC不行,把按键屏蔽掉单独RTC也不能唤醒
回复 支持 反对

使用道具 举报

9

主题

37

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-5-4
在线时间
9 小时
发表于 2016-9-22 12:00:53 | 显示全部楼层
进入停止模式后,内部LSI作被关闭了,RTC没有时钟源,闹钟中断就不能产生了
回复 支持 反对

使用道具 举报

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
62
金钱
62
注册时间
2016-8-12
在线时间
26 小时
发表于 2016-9-24 11:25:03 | 显示全部楼层
jayi1109 发表于 2013-8-7 11:29
我是要按键与RTC都具有唤醒功能的,按键可以正常唤醒,但就是RTC不行,把按键屏蔽掉单独RTC也不能唤醒

请问楼主,按键唤醒是怎么实现的呢?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 21:00

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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