OpenEdv-开源电子网

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

STM32 停机模式唤醒 求助!!!!!

[复制链接]

7

主题

32

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2015-4-16
在线时间
13 小时
发表于 2016-3-28 14:26:44 | 显示全部楼层 |阅读模式
10金钱
STM32 停机模式唤醒 求助    如题 想用STM32   RTC定时    5秒后进入停机模式,   然后通过WKUP(PA0)按键 或者闹钟中断触发唤醒;

但是RTC闹钟唤醒不了, 按键触发唤醒后  定义的变量数据仍然丢失; 程序如下:

停机模式:
void Sys_Standby(void)
{
        SCB->SCR|=1<<2;//使能SLEEPDEEP位 (SYS->CTRL)          
          RCC->APB1ENR|=1<<28;     //使能电源时钟            
        PWR->CSR|=1<<8;          //设置WKUP用于唤醒
        PWR->CR|=1<<2;           //清除Wake-up 标志
        PWR->CR|=~(1<<0);      //LPDS置位   
       PWR->CR&=0<<1;    //PDDS位                  
        WFI_SET();                                 //执行WFI指令                 
}


按键中断
//中断,检测到PA0脚的一个上升沿.          
//中断线0线上的中断检测
void EXTI0_IRQHandler(void)
{                                                                                                  
        EXTI->PR=1<<0;  //清除LINE10上的中断标志位          
       
}
//PA0 WKUP唤醒初始化
void WKUP_Init(void)
{                            
        RCC->APB2ENR|=1<<2;     //先使能外设IO PORTA时钟   
        RCC->APB2ENR|=1<<0;     //开启辅助时钟                  
       
        GPIOA->CRL&=0XFFFFFFF0;//PA0设置成输入          
        GPIOA->CRL|=0X00000008;  
        Ex_NVIC_Config(GPIO_A,0,RTIR);//PA0上升沿触发            
        MY_NVIC_Init(2,2,EXTI0_IRQn,2);//抢占2,子优先级2,组2
}


主函数:
int main(void)
{       
        u8 t;
        u8 i=0;
        u32 rtccnt;
          Stm32_Clock_Init(9);        //系统时钟设置
        uart_init(72,9600);                 //串口初始化为9600
        delay_init(72);                            //延时初始化
        LED_Init();                                  //初始化与LED连接的硬件接口
        LCD_Init();                                   //初始化LCD                                
        WKUP_Init();         
        while(RTC_Init())                //RTC初始化        ,一定要初始化成功
        {
                LCD_ShowString(60,130,200,16,16,"RTC ERROR!   ");       
                delay_ms(800);
                LCD_ShowString(60,130,200,16,16,"RTC Trying...");       
        }                                                                           
        rtccnt=RTC->CNTH;//得到闹钟值
        rtccnt<<=16;
        rtccnt|=RTC->CNTL;
        ALARM_CNT_Set(rtccnt+8);//设置8秒钟后,闹钟唤醒 //实际上5秒钟后,才进入待机模式,所以待机3秒后即唤醒。                                               
        i=5;
        while(1)
        {                                                                    
                if(t!=calendar.sec)
                {
                        t=calendar.sec;               
                        LCD_ShowNum(60+88,180,i,1,16);        //显示倒计时       
                        if(i==0)Sys_Enter_Standby();        //5秒后,进入停机模式
                        i--;
                        LCD_ShowNum(80,200,tt,4,16);                               
                        LCD_ShowNum(60,130,calendar.w_year,4,16);                                                                          
                        LCD_ShowNum(100,130,calendar.w_month,2,16);                                                                          
                        LCD_ShowNum(124,130,calendar.w_date,2,16);                
                        LED0=!LED0;
                       
                }       
                delay_ms(10);                                                                  
        };  
       
}


void Sys_Enter_Standby(void)
{                         
        //关闭所有外设(根据实际情况写)
           RCC->APB2RSTR|=0X01FC;//复位所有IO口
        Sys_Standby();//进入待机模式
}


void ALARM_CNT_Set(u32 cntx)
{
        //设置时钟
    RCC->APB1ENR|=1<<28;//使能电源时钟
    RCC->APB1ENR|=1<<27;//使能备份时钟
        PWR->CR|=1<<8;    //取消备份区写保护
        //上面三步是必须的!
        RTC->CRL|=1<<4;   //允许配置
        RTC->CRH|=1<<1;   //允许闹钟中断
        RTC->ALRL=cntx&0xffff;
        RTC->ALRH=cntx>>16;
        RTC->CRL&=~(1<<4);//配置更新
        while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成  
}




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

使用道具 举报

7

主题

32

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2015-4-16
在线时间
13 小时
 楼主| 发表于 2016-3-28 14:27:01 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 13:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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