我用STM32的库环境,但也是直接操作寄存器的方式,让stm32进入睡眠模式,唤醒以后是从断点开始执行的。
但是为什么用了原子的操作寄存器环境,让STM32进入睡眠模式,唤醒以后是复位执行的???????
让我百思不得其解啊。。。。。。原子的库函数有啥漏洞么??
附件里面有两种方式的程序,麻烦大家帮忙下。
#include "sys.h"
#include "delay.h"
u32 t1=8,t2=8;
#define LED_K PAout(8) //键盘指示LED灯
#define LED_DOUBLE PBout(7) //双重锁定LED灯
#define LED_PASSWORD PBout(6) //密码错误LED灯
#define LED_LOCK PBout(5) //锁舌故障LED灯
#define LED_BAT PBout(15)//电池电量低LED灯
void LED_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
RCC->APB2ENR|=1<<3; //使能PORTB时钟
GPIOA->CRH&=0XFFFFFFF0;
GPIOA->CRH|=0X00000003;//PA8 推挽输出
GPIOA->ODR|=1<<8; //PA8 输出高
GPIOB->CRL&=0X000FFFFF;
GPIOB->CRL|=0X33300000;//PB.5.6.7推挽输出
GPIOB->ODR|=7<<5; //PB.5.6.7输出高
GPIOB->CRH&=0X0FFFFFFF;
GPIOB->CRH|=0X30000000;//PB15推挽输出
GPIOB->ODR|=1<<7; //PB15输出高
}
#define EXTI9_5_IRQChannel ((u8)0x17) /* External Line[9:5] Interrupts */
void KEY_Init(void)
{
RCC->APB2ENR|=1<<0; //开启辅助时钟
RCC->APB2ENR|=1<<2; //使能PORTA时钟
RCC->APB2ENR|=1<<4; //使能PORTC时钟
GPIOA->CRH&=0XFFF0FFFF;
GPIOA->CRH|=0X00080000;//PA12 输入
GPIOA->ODR|=1<<12; //PA12 上拉
GPIOC->CRL&=0XF00FFFFF;
GPIOC->CRL|=0X08800000;//PC.5.6输入
GPIOC->ODR|=3<<5; //PC.5.6上拉
GPIOC->CRH&=0X000FFFFF;
GPIOC->CRH|=0X88800000;//PC13.14.15输入
GPIOC->ODR|=7<<13; //上拉
Ex_NVIC_Config(GPIO_C,5,FTIR);//Pc5下降沿触发
MY_NVIC_Init(2,2,EXTI9_5_IRQChannel,2);//抢占2,子优先级2,组2
}
void EXTI9_5_IRQHandler(void)
{
LED_K = 0;
EXTI-> R=1<<5; //清除LINE5上的中断标志位
}
int main(void)
{
Stm32_Clock_Init(9);
delay_init(72); //延时函数初始化
LED_Init(); //LED端口初始化
KEY_Init();
delay_ms(1800);
while(1)
{
while(t1--)
{
LED_DOUBLE = !LED_DOUBLE;
delay_ms(100);
}
t1=4;
Sys_Enter_Standby();
while(t2--)
{
LED_PASSWORD = !LED_PASSWORD;
delay_ms(100);
}
t2=4;
}
}
__asm void WFI_SET(void)
{
WFI;
}
void Sys_Enter_Standby(void)
{
RCC->APB2RSTR &= ~0X01FC;
RCC->APB1ENR |= 0x10000000; //使能电源时钟
PWR->CR &= 0xFFFFFFFC;
PWR->CR |= 0x00000001;
SCB->SCR|=0X00000004;
WFI_SET(); //执行WFI指令
SCB->SCR&=~(0X00000004);
}
|