如何在STM32L476中禁用SDMMC接口以降低功耗?
如何在STM32L476上禁用SDMMC接口以降低功耗
针对你提到的STM32L476+SW4STM32+STM32CubeMX开发低功耗应用,需要在闲置时禁用SDMMC接口的问题,HAL库确实没有提供直接的专用禁用API,但我们可以通过手动操作外设时钟、引脚配置和文件系统状态来实现,具体步骤如下:
1. 先确保FatFs文件系统已安全卸载
在禁用SDMMC之前,必须先卸载挂载的SD卡文件系统,避免后续重新启用时出现文件系统损坏或挂载失败:
// 假设你的FatFs挂载点是"",请根据实际代码调整 FRESULT res = f_mount(NULL, "", 0); if (res != FR_OK) { // 处理卸载失败的情况(比如还有未关闭的文件) }
2. 复位并关闭SDMMC外设时钟
STM32L4的SDMMC外设挂在AHB2总线上,我们需要先复位外设,再关闭其时钟以切断供电:
// 若使用SDMMC2则替换为SDMMC2 __HAL_RCC_SDMMC1_FORCE_RESET(); HAL_Delay(1); // 短延时确保复位完成 __HAL_RCC_SDMMC1_RELEASE_RESET(); // 关闭SDMMC1时钟 __HAL_RCC_SDMMC1_CLK_DISABLE();
3. 将SDMMC引脚配置为低功耗模式
原来的SDMMC引脚是复用推挽输出模式,闲置时会有额外电流消耗,我们可以将其配置为模拟输入模式(STM32低功耗下最省电的引脚状态):
GPIO_InitTypeDef GPIO_InitStruct = {0}; // 以下是SDMMC1的典型引脚配置,请根据你的硬件连接调整 // GPIOC: PC8(D0), PC9(D1), PC10(D2), PC11(D3), PC12(CLK) GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); // GPIOD: PD2(CMD) GPIO_InitStruct.Pin = GPIO_PIN_2; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
如果你不确定引脚配置,可以查看STM32CubeMX生成的MX_SDMMC1_SD_Init()函数里的GPIO初始化代码,再反向修改为模拟输入模式即可。
4. 关闭SDMMC相关的DMA时钟(如果使用了DMA)
如果你的SDMMC配置了DMA传输(CubeMX默认会启用),还需要关闭DMA外设的时钟:
// 假设SDMMC1使用的是DMA2通道4,请根据CubeMX配置调整通道和DMA编号 __HAL_RCC_DMA2_CLK_DISABLE();
重新启用SDMMC的步骤
当需要再次使用SD卡时,只需反向执行上述操作:
- 重新启用SDMMC和DMA时钟
- 将引脚重新配置为SDMMC复用模式(可直接调用CubeMX生成的
MX_SDMMC1_SD_MspInit()函数) - 重新初始化SDMMC外设(
HAL_SD_Init(&hsd1)) - 重新挂载FatFs文件系统
额外注意事项
- 如果系统会进入STOP或STANDBY低功耗模式,STM32L4的RCC会自动关闭未使用的外设时钟,但引脚状态仍需手动配置,否则引脚可能会继续消耗电流。
- 直接调用
__HAL_RCC_xxx宏是安全的,这些宏在HAL库中已预定义,无需直接操作寄存器地址。
内容的提问来源于stack exchange,提问作者Nithin Kurian




