三. 睡眠模式的进入代码 进入睡眠模式的代码实现 int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
HAL_Delay(500); // 上电之后延时一会再进入睡眠模式,这样可以保证复位之后可以立即下载程序
HAL_SuspendTick(); // 关闭 tick 中断,防止唤醒睡眠状态的 MCU
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
HAL_ResumeTick();
while (1)
{
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_13);
HAL_Delay(500);
}
}
代码解析:
进入睡眠模式后将导致调试器无法识别到 MCU,所以在启动的时候加了一个 HAL_Delay(500) ,如果没有加,则需要按住复位键点击下载,点击下载之后立即松开复位键,就可以正常的下载程序了。 HAL 生成的代码默认将 systick 的中断设置为 1KHZ.进入睡眠模式前需要关闭 tick 中断,防止唤醒睡眠状态的 MCU 让 MCU 进入睡眠模式 HAL_PWR_EnterSLEEPMode 唤醒 MCU 之后,将执行进入睡眠模式的下一个指令。所以要立刻打开 tick 中断
通过这个表可以看到,睡眠模式支持 WFI 和 WFE WFI: 立刻进入低功耗模式 WFE: 不是立刻进入低功耗模式,根据Event Register(一个单bit的寄存器,每个PE一个)的状态,有两种情况:如果Event Register为1,该指令会把它清零,然后执行完成(不会standby) 选择 WFE 可是使用如下代码 HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFE);
|