#include <stm32f10x_lib.h>
#include "sys.h"
...................
....................
void EXTI0_IRQHandler(void)
{
EXTI->PR=1<<0; //清除LINE 中断標誌位 , 如果只为了唤醒, 就只要清除此旗标就行了.
}
void main(void)
{
........略1........
RCC->APB2ENR|=1<<2; //PORTA時鐘 ENABLE
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_IRQChannel,2); //搶佔2, 子優先級2, 組2
.....略2........
if (PWR->CSR==258) // 待機下喚醒, 非RESET ? "258"是我单步跟踪得到的值, 就直接拿来用了, 详细可见CSR电源记存器的定义
{
goto proc2; // 如果是外部中断CPU喚醒, 则跳至proc2处
}
......略3............
RCC->APB2RSTR|=0X01FC; //重設所有I/O口
RCC->APB2ENR=0;
Sys_Standby(); //系統進入Standby狀態
}
最后, 当进入待机状态后, 如果PA0被触发了(例如接一个按键, 另一脚接到3.3V) , CPU就会被唤醒离开待机模式,
唤醒后就会从 "......略1........." (第1行)开始运行, 就相当于复位或重新上电. 差异只是我们可以透过判断电源记存器
得知是否是一个唤醒事件, 然后对应做某些事.
已经讲的这么详细了, 应该能明白了吧 ? 至于时间定时中断唤醒, 很多网路**说有些小问题, 唤醒时间有长有短, 也不是很容易设置. 您可以自己再TRY看看.
|