关于stm32的STOP模式

1.停止模式唤醒后从哪里执行?

  • 停止模式特性

    • MCU 在进入停止模式时,会保存当前的上下文(包括程序计数器和寄存器状态)。
    • 当有有效的唤醒事件时,MCU 会退出停止模式,并从进入模式时暂停的指令处继续执行。
  • 执行流程

    • 唤醒后,MCU 不会重新复位,也不会从主函数 main() 开始,而是直接从调用
       HAL_PWR_EnterSTOPMode()
      的下一行代码继续。

2. 系统时钟在停止模式中的变化

进入停止模式后,MCU 的时钟系统被部分或完全关闭以节省功耗:

  • 主系统时钟(如 HSE 和 PLL)停止运行
  • 低功耗时钟(如 HSI 或 LSI)可能保留,用于唤醒事件源(如 RTC、LPTIM)
  • 唤醒时,MCU 默认使用内部高速时钟(HSI)。

3. 唤醒后为什么需要重新配置时钟?

  • 唤醒后,虽然 MCU 从停止的地方继续执行,但默认的系统时钟可能已经发生了变化:

    • 系统时钟切换为 HSI(默认 8 MHz)。
    • 如果应用需要更高的时钟频率(如 PLL 运行在 72 MHz)或外部时钟(如 HSE),需要重新配置。
  • 直接执行代码的影响:

    • 许多外设(如 UART、SPI 等)依赖于特定的时钟频率。默认切换到 HSI 后,这些外设可能无法正常工作。
    • 因此,唤醒后立即调用 SystemClock_Config(),恢复系统时钟到应用预期的状态。

### STM32 STOP 模式的工作原理 STM32STOP 模式是一种低功耗模式,允许设备在不需要高性能运行时进入节能状态。在此模式下,CPU 和大部分外设会被关闭,而 SRAM 和寄存器的内容得以保留[^1]。通过这种方式,可以在保持数据的同时降低系统的能耗。 当进入 STOP 模式时,系统时钟(HSI、HSE、LSI 或 LSE)被停止,PLL 也被禁用。然而,某些低速振荡器(如 LSI 或 LSE)可能会继续运行以支持 RTC 功能或其他唤醒源。STOP 模式的退出可以通过外部中断、RTC 唤醒事件或 WKUP 引脚触发。 以下是关于如何配置 STM32 进入 STOP 模式的说明: ### 配置方法 为了使 STM32 正确进入 STOP 模式,需要完成以下几个关键步骤: #### 1. 启用电源控制模块 确保 PWR 控制寄存器已启用,并且电压调节器处于正常或低功耗模式。这通常涉及设置 `PWR_CR` 寄存器中的相应位。 ```c // 启用电压调节器 (Normal/Low Power Mode) PWR->CR |= PWR_CR_LPDS; // 设置低功耗模式 ``` #### 2. 配置唤醒源 定义哪些信号可以作为唤醒条件。例如,WKUP 引脚或者 EXTI 中断线都可以用来唤醒设备。 ```c // 配置 WKUP 引脚为 GPIO 输入 GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); // 替换为实际使用的端口 GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; GPIO_InitStruct.Pull = GPIO_PULLDOWN; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 替换为实际使用的端口和引脚 // 清除挂起标志并启用中断 __HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); ``` #### 3. 请求进入 STOP 模式 调用 HAL 库函数或直接操作 SCB 系统控制块来请求进入 STOP 模式。 ```c // 使用 HAL 库进入 STOP 模式 HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI); // 或者手动实现 SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; __WFI(); ``` 以上代码片段展示了如何利用 HAL 函数简化 STOP 模式的配置过程。 --- ### 注意事项 - 在进入 STOP 模式之前,应保存所有必要的上下文信息以便恢复。 - 如果使用了 RTC,则需确保其时基来自 LSE 或 LSI 振荡器。 - 不同型号的 STM32 可能具有不同的 STOP 模式变体(如 Stop1/Stop2),具体细节参见对应的数据手册。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值