File tree 1 file changed +17
-0
lines changed
1 file changed +17
-0
lines changed Original file line number Diff line number Diff line change @@ -96,6 +96,19 @@ static volatile uint8_t *sdmmc_buf_top;
96
96
#define MICROPY_HW_SDIO_CMD (pin_D2)
97
97
#endif
98
98
99
+ #if defined(STM32H7 )
100
+ static uint32_t safe_divide (uint32_t denom ) {
101
+ uint32_t num = HAL_RCCEx_GetPeriphCLKFreq (RCC_PERIPHCLK_SDMMC );
102
+ uint32_t divres ;
103
+
104
+ divres = num / (2U * denom );
105
+ if ((num % (2U * denom )) > denom ) {
106
+ divres ++ ;
107
+ }
108
+ return divres ;
109
+ }
110
+ #endif
111
+
99
112
void sdio_init (uint32_t irq_pri ) {
100
113
// configure IO pins
101
114
mp_hal_pin_config_alt_static (MICROPY_HW_SDIO_D0 , MP_HAL_PIN_MODE_ALT , MP_HAL_PIN_PULL_UP , STATIC_AF_SDMMC_D0 );
@@ -110,6 +123,8 @@ void sdio_init(uint32_t irq_pri) {
110
123
SDMMC_TypeDef * SDIO = SDMMC ;
111
124
#if defined(STM32F7 )
112
125
SDIO -> CLKCR = SDMMC_CLKCR_HWFC_EN | SDMMC_CLKCR_PWRSAV | (120 - 2 ); // 1-bit, 400kHz
126
+ #elif defined(STM32H7 )
127
+ SDIO -> CLKCR = SDMMC_CLKCR_HWFC_EN | SDMMC_CLKCR_PWRSAV | safe_divide (400000U ); // 1-bit, 400kHz
113
128
#else
114
129
SDIO -> CLKCR = SDMMC_CLKCR_HWFC_EN | SDMMC_CLKCR_PWRSAV | (120 / 2 ); // 1-bit, 400kHz
115
130
#endif
@@ -157,6 +172,8 @@ void sdio_enable_high_speed_4bit(void) {
157
172
mp_hal_delay_us (10 );
158
173
#if defined(STM32F7 )
159
174
SDIO -> CLKCR = SDMMC_CLKCR_HWFC_EN | SDMMC_CLKCR_WIDBUS_0 | SDMMC_CLKCR_BYPASS /*| SDMMC_CLKCR_PWRSAV*/ ; // 4-bit, 48MHz
175
+ #elif defined(STM32H7 )
176
+ SDIO -> CLKCR = SDMMC_CLKCR_HWFC_EN | SDMMC_CLKCR_WIDBUS_0 | safe_divide (48000000U ); // 4-bit, 48MHz
160
177
#else
161
178
SDIO -> CLKCR = SDMMC_CLKCR_HWFC_EN | SDMMC_CLKCR_WIDBUS_0 ; // 4-bit, 48MHz
162
179
#endif
You can’t perform that action at this time.
0 commit comments