aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George2018-02-01 12:20:45 +1100
committerDamien George2018-02-01 12:20:45 +1100
commitfed1b4fb56421e8f8a1ee54b2c16296204176bb3 (patch)
treedbf13736d94ec79512cca648d43fe12b8333e4ce
parentc0496fd44de562cd11e66acd9e42f796c3dcb5fb (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.c12
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;
}