新手上路
- 积分
- 40
- 金钱
- 40
- 注册时间
- 2015-4-16
- 在线时间
- 13 小时
|
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寄存器操作完成
}
|
|