Browse Source

stm32/sdcard: Make SD wait routine more power efficient by using WFI.

Using WFI allows the CPU to sleep while it is waiting, reducing power
consumption.
pull/3527/merge
Damien George 7 years ago
parent
commit
fed1b4fb56
  1. 12
      ports/stm32/sdcard.c

12
ports/stm32/sdcard.c

@ -244,11 +244,20 @@ void SDMMC2_IRQHandler(void) {
STATIC HAL_StatusTypeDef sdcard_wait_finished(SD_HandleTypeDef *sd, uint32_t timeout) { STATIC HAL_StatusTypeDef sdcard_wait_finished(SD_HandleTypeDef *sd, uint32_t timeout) {
// Wait for HAL driver to be ready (eg for DMA to finish) // Wait for HAL driver to be ready (eg for DMA to finish)
uint32_t start = HAL_GetTick(); uint32_t start = HAL_GetTick();
while (sd->State == HAL_SD_STATE_BUSY) { for (;;) {
// Do an atomic check of the state; WFI will exit even if IRQs are disabled
uint32_t irq_state = disable_irq();
if (sd->State != HAL_SD_STATE_BUSY) {
enable_irq(irq_state);
break;
}
__WFI();
enable_irq(irq_state);
if (HAL_GetTick() - start >= timeout) { if (HAL_GetTick() - start >= timeout) {
return HAL_TIMEOUT; return HAL_TIMEOUT;
} }
} }
// Wait for SD card to complete the operation // Wait for SD card to complete the operation
for (;;) { for (;;) {
HAL_SD_CardStateTypedef state = HAL_SD_GetCardState(sd); HAL_SD_CardStateTypedef state = HAL_SD_GetCardState(sd);
@ -261,6 +270,7 @@ STATIC HAL_StatusTypeDef sdcard_wait_finished(SD_HandleTypeDef *sd, uint32_t tim
if (HAL_GetTick() - start >= timeout) { if (HAL_GetTick() - start >= timeout) {
return HAL_TIMEOUT; return HAL_TIMEOUT;
} }
__WFI();
} }
return HAL_OK; return HAL_OK;
} }

Loading…
Cancel
Save