You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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卡时,只需反向执行上述操作:

  1. 重新启用SDMMC和DMA时钟
  2. 将引脚重新配置为SDMMC复用模式(可直接调用CubeMX生成的MX_SDMMC1_SD_MspInit()函数)
  3. 重新初始化SDMMC外设(HAL_SD_Init(&hsd1)
  4. 重新挂载FatFs文件系统

额外注意事项

  • 如果系统会进入STOP或STANDBY低功耗模式,STM32L4的RCC会自动关闭未使用的外设时钟,但引脚状态仍需手动配置,否则引脚可能会继续消耗电流。
  • 直接调用__HAL_RCC_xxx宏是安全的,这些宏在HAL库中已预定义,无需直接操作寄存器地址。

内容的提问来源于stack exchange,提问作者Nithin Kurian

火山引擎 最新活动