diff options
| author | Damien George | 2018-02-01 12:20:45 +1100 |
|---|---|---|
| committer | Damien George | 2018-02-01 12:20:45 +1100 |
| commit | fed1b4fb56421e8f8a1ee54b2c16296204176bb3 (patch) | |
| tree | dbf13736d94ec79512cca648d43fe12b8333e4ce | |
| parent | c0496fd44de562cd11e66acd9e42f796c3dcb5fb (diff) | |
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.
| -rw-r--r-- | ports/stm32/sdcard.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/ports/stm32/sdcard.c b/ports/stm32/sdcard.c index a54e05011..46f08f78f 100644 --- a/ports/stm32/sdcard.c +++ b/ports/stm32/sdcard.c @@ -244,11 +244,20 @@ void SDMMC2_IRQHandler(void) { STATIC HAL_StatusTypeDef sdcard_wait_finished(SD_HandleTypeDef *sd, uint32_t timeout) { // Wait for HAL driver to be ready (eg for DMA to finish) 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) { return HAL_TIMEOUT; } } + // Wait for SD card to complete the operation for (;;) { 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) { return HAL_TIMEOUT; } + __WFI(); } return HAL_OK; } |
