如题:烦请大师过目一下,这个问题折腾小弟好几天了,一直找不到问题的根源,如大师指点,感激不尽。
代码如下:
void WFI_SET(void);
void EXTI0_IRQHandler(void)
{
SCB->SCR&=~(1<<2);
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口1初始化
LED_Init();
delay_ms(100); //消抖
EXTI-> R|=1<<0; //清除LINE0上的中断标志位
}
int main(void)
{
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口1初始化
LED_Init();
wkup_init();
DBGMCU->CR&=~(1<<1);
EXTI-> R=0xFFFF;//所有外部请求位被清除,使得CPU能进入停机模式
while(!(RTC->CRL>>5));
RTC->CRL&=~(1<<1);//清除闹钟请求中断标志,使得CPU能进入停机模式
RCC->APB1ENR|=1<<28;//PWR接口时钟使能
  WR->CR&=~(1<<1);//CPU进入深度睡眠时,进入停机模式
  WR->CR|=1<<0;//停机模式下电压调压器处于低功耗模式
SCB->SCR|=1<<2;//设置系统控制寄存器的SLEEPDEEP位为深度睡眠模式。
WFI_SET(); //进入停机
SCB->SCR&=~(1<<2);
while(1)
{
LED1=!LED1;
delay_ms(1000);
}
}
void wkup_init(void)//待机初始化函数
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0xFFFFFFF0;
GPIOA->CRL|=1<<3;//定义PA0为输入,PA0默认复用可以充当WKUP。
GPIOA->ODR&=~(1<<0);//定义PA0为下拉输入,高电平可以唤醒,所以此处设计为下拉输入。
Ex_NVIC_Config(GPIO_A,0,RTIR); //定义PA0为上升沿触发事件
MY_NVIC_Init(2,1,EXTI0_IRQChannel,2); //定义PA0中断:抢占2,子优先级2,组2
}
监控发现:外部PA0.0触发中断后,执行ISR,单步执行完后,进入到启动文件的:
; Reset Handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT __main
LDR R0, =__main
BX R0
ENDP
中,再单步,出现死机现象。
|