Skip to content

Commit ea91e38

Browse files
authored
Merge pull request #10198 from snkYmkrct/main
Added peripheral support for Daisy Seed stm32H750 board
2 parents ad73d0b + 330480d commit ea91e38

File tree

18 files changed

+894
-57
lines changed

18 files changed

+894
-57
lines changed

locale/circuitpython.pot

+5
Original file line numberDiff line numberDiff line change
@@ -1369,6 +1369,11 @@ msgstr ""
13691369
msgid "MITM security not supported"
13701370
msgstr ""
13711371

1372+
#: ports/stm/common-hal/sdioio/SDCard.c
1373+
#, c-format
1374+
msgid "MMC/SDIO Clock Error %x"
1375+
msgstr ""
1376+
13721377
#: shared-bindings/is31fl3741/IS31FL3741.c
13731378
msgid "Mapping must be a tuple"
13741379
msgstr ""

ports/stm/Makefile

+7
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,13 @@ ifeq ($(MCU_VARIANT),$(filter $(MCU_VARIANT),STM32F765xx STM32F767xx STM32F769xx
169169
SRC_STM32 += $(HAL_DIR)/Src/stm32$(MCU_SERIES_LOWER)xx_hal_uart_ex.c
170170
endif
171171

172+
ifeq ($(MCU_VARIANT),$(filter $(MCU_VARIANT),STM32H750xx))
173+
C_DEFS += -DHAL_SDRAM_MODULE_ENABLED
174+
SRC_STM32 += st_driver/stm32$(MCU_SERIES_LOWER)xx_hal_driver/Src/stm32h7xx_hal_sdram.c
175+
SRC_STM32 += st_driver/stm32$(MCU_SERIES_LOWER)xx_hal_driver/Src/stm32h7xx_ll_fmc.c
176+
SRC_C += peripherals/sdram.c
177+
endif
178+
172179
SRC_STM32 += boards/system_stm32$(MCU_SERIES_LOWER)xx.c
173180

174181
SRC_C += \

ports/stm/boards/daisy_seed_with_sdram/board.c

+52-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,58 @@
33
// SPDX-FileCopyrightText: Copyright (c) 2024 snkYmkrct
44
//
55
// SPDX-License-Identifier: MIT
6+
#include STM32_HAL_H
67

78
#include "supervisor/board.h"
9+
#include "supervisor/stm.h"
10+
#include "sdram.h"
811

9-
// Use the MP_WEAK supervisor/shared/board.c versions of routines not defined here.
12+
13+
/** SDRAM banks configuration. */
14+
static const struct stm32_sdram_bank_config bank_config[] = {
15+
{ .init = {
16+
.SDBank = FMC_SDRAM_BANK1,
17+
.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_9,
18+
.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_13,
19+
.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_32,
20+
.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4,
21+
.CASLatency = FMC_SDRAM_CAS_LATENCY_3,
22+
.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE,
23+
.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2,
24+
.ReadBurst = FMC_SDRAM_RBURST_ENABLE,
25+
.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0
26+
},
27+
.timing = {
28+
.LoadToActiveDelay = 2,
29+
.ExitSelfRefreshDelay = 8,
30+
.SelfRefreshTime = 5,
31+
.RowCycleDelay = 6,
32+
.WriteRecoveryTime = 3,
33+
.RPDelay = 2,
34+
.RCDDelay = 2
35+
}}
36+
};
37+
38+
/* SDRAM configuration. */
39+
static const struct stm32_sdram_config config = {
40+
.sdram = FMC_SDRAM_DEVICE,
41+
.power_up_delay = 100,
42+
.num_auto_refresh = 8,
43+
.mode_register = SDRAM_MODEREG_BURST_LENGTH_4 |
44+
SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL |
45+
SDRAM_MODEREG_CAS_LATENCY_3 |
46+
SDRAM_MODEREG_WRITEBURST_MODE_SINGLE,
47+
/* Set the device refresh rate based on the RM0433 STM reference manual
48+
refresh_rate = [(SDRAM self refresh time / number of rows) x SDRAM CLK] – 20
49+
= [(64ms/8192) * 100MHz] - 20 = 781.25 - 20
50+
*/
51+
.refresh_rate = (64 * 100000 / 8192 - 20),
52+
.banks = bank_config,
53+
.banks_len = 1,
54+
};
55+
56+
void board_init(void) {
57+
sdram_init(&config);
58+
// sdram_test(true);
59+
stm_add_sdram_to_heap();
60+
}

ports/stm/boards/daisy_seed_with_sdram/mpconfigboard.h

+7
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,10 @@
3131

3232
// for RNG not audio
3333
#define CPY_CLK_USB_USES_AUDIOPLL (1)
34+
35+
// SDRAM and MPU region
36+
37+
#define CIRCUITPY_HW_SDRAM_SIZE (64 * 1024 * 1024) // 64 MByte
38+
39+
#define CPY_SDRAM_REGION MPU_REGION_NUMBER10
40+
#define CPY_SDRAM_REGION_SIZE MPU_REGION_SIZE_64MB

ports/stm/boards/daisy_seed_with_sdram/mpconfigboard.mk

+4
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,7 @@ MCU_PACKAGE = UFBGA176
1212

1313
LD_COMMON = boards/common_tcm.ld
1414
LD_FILE = boards/STM32H750.ld
15+
16+
CIRCUITPY_SDIOIO = 1
17+
CIRCUITPY_PWMIO = 1
18+
CIRCUITPY_AUDIOPWMIO = 1

ports/stm/boards/daisy_seed_with_sdram/pins.c

+48
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,56 @@
66

77
#include "shared-bindings/board/__init__.h"
88

9+
// See pinout on Daisy Seed product page
10+
// https://electro-smith.com/products/daisy-seed?variant=45234245108004
911
static const mp_rom_map_elem_t board_module_globals_table[] = {
1012
{MP_ROM_QSTR(MP_QSTR_LED), MP_ROM_PTR(&pin_PC07)},
1113
{MP_ROM_QSTR(MP_QSTR_BOOT), MP_ROM_PTR(&pin_PG03)},
14+
{MP_ROM_QSTR(MP_QSTR_D0), MP_ROM_PTR(&pin_PB12)},
15+
{MP_ROM_QSTR(MP_QSTR_D1), MP_ROM_PTR(&pin_PC11)},
16+
{MP_ROM_QSTR(MP_QSTR_D2), MP_ROM_PTR(&pin_PC10)},
17+
{MP_ROM_QSTR(MP_QSTR_D3), MP_ROM_PTR(&pin_PC09)},
18+
{MP_ROM_QSTR(MP_QSTR_D4), MP_ROM_PTR(&pin_PC08)},
19+
{MP_ROM_QSTR(MP_QSTR_D5), MP_ROM_PTR(&pin_PD02)},
20+
{MP_ROM_QSTR(MP_QSTR_D6), MP_ROM_PTR(&pin_PC12)},
21+
{MP_ROM_QSTR(MP_QSTR_D7), MP_ROM_PTR(&pin_PG10)},
22+
{MP_ROM_QSTR(MP_QSTR_D8), MP_ROM_PTR(&pin_PG11)},
23+
{MP_ROM_QSTR(MP_QSTR_D9), MP_ROM_PTR(&pin_PB04)},
24+
{MP_ROM_QSTR(MP_QSTR_D10), MP_ROM_PTR(&pin_PB05)},
25+
{MP_ROM_QSTR(MP_QSTR_D11), MP_ROM_PTR(&pin_PB08)},
26+
{MP_ROM_QSTR(MP_QSTR_D12), MP_ROM_PTR(&pin_PB09)},
27+
{MP_ROM_QSTR(MP_QSTR_D13), MP_ROM_PTR(&pin_PB06)},
28+
{MP_ROM_QSTR(MP_QSTR_D14), MP_ROM_PTR(&pin_PB07)},
29+
30+
{MP_ROM_QSTR(MP_QSTR_D15), MP_ROM_PTR(&pin_PC00)},
31+
{MP_ROM_QSTR(MP_QSTR_A0), MP_ROM_PTR(&pin_PC00)},
32+
{MP_ROM_QSTR(MP_QSTR_D16), MP_ROM_PTR(&pin_PA03)},
33+
{MP_ROM_QSTR(MP_QSTR_A1), MP_ROM_PTR(&pin_PA03)},
34+
{MP_ROM_QSTR(MP_QSTR_D17), MP_ROM_PTR(&pin_PB01)},
35+
{MP_ROM_QSTR(MP_QSTR_A2), MP_ROM_PTR(&pin_PB01)},
36+
{MP_ROM_QSTR(MP_QSTR_D18), MP_ROM_PTR(&pin_PA07)},
37+
{MP_ROM_QSTR(MP_QSTR_A3), MP_ROM_PTR(&pin_PA07)},
38+
{MP_ROM_QSTR(MP_QSTR_D19), MP_ROM_PTR(&pin_PA06)},
39+
{MP_ROM_QSTR(MP_QSTR_A4), MP_ROM_PTR(&pin_PA06)},
40+
{MP_ROM_QSTR(MP_QSTR_D20), MP_ROM_PTR(&pin_PC01)},
41+
{MP_ROM_QSTR(MP_QSTR_A5), MP_ROM_PTR(&pin_PC01)},
42+
{MP_ROM_QSTR(MP_QSTR_D21), MP_ROM_PTR(&pin_PC04)},
43+
{MP_ROM_QSTR(MP_QSTR_A6), MP_ROM_PTR(&pin_PC04)},
44+
{MP_ROM_QSTR(MP_QSTR_D22), MP_ROM_PTR(&pin_PA05)},
45+
{MP_ROM_QSTR(MP_QSTR_A7), MP_ROM_PTR(&pin_PA05)},
46+
{MP_ROM_QSTR(MP_QSTR_D23), MP_ROM_PTR(&pin_PA04)},
47+
{MP_ROM_QSTR(MP_QSTR_A8), MP_ROM_PTR(&pin_PA04)},
48+
{MP_ROM_QSTR(MP_QSTR_D24), MP_ROM_PTR(&pin_PA01)},
49+
{MP_ROM_QSTR(MP_QSTR_A9), MP_ROM_PTR(&pin_PA01)},
50+
{MP_ROM_QSTR(MP_QSTR_D25), MP_ROM_PTR(&pin_PA00)},
51+
{MP_ROM_QSTR(MP_QSTR_A10), MP_ROM_PTR(&pin_PA00)},
52+
{MP_ROM_QSTR(MP_QSTR_D26), MP_ROM_PTR(&pin_PD11)},
53+
{MP_ROM_QSTR(MP_QSTR_D27), MP_ROM_PTR(&pin_PG09)},
54+
{MP_ROM_QSTR(MP_QSTR_D28), MP_ROM_PTR(&pin_PA02)},
55+
{MP_ROM_QSTR(MP_QSTR_A11), MP_ROM_PTR(&pin_PA02)},
56+
{MP_ROM_QSTR(MP_QSTR_D29), MP_ROM_PTR(&pin_PB14)},
57+
{MP_ROM_QSTR(MP_QSTR_D30), MP_ROM_PTR(&pin_PB15)},
58+
1259
};
60+
1361
MP_DEFINE_CONST_DICT(board_module_globals, board_module_globals_table);

ports/stm/common-hal/audiopwmio/PWMAudioOut.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,6 @@ void common_hal_audiopwmio_pwmaudioout_stop(audiopwmio_pwmaudioout_obj_t *self)
342342
tim_handle.Instance->CR1 &= ~TIM_CR1_CEN;
343343
stm_peripherals_timer_free(tim_handle.Instance);
344344

345-
active_audio = NULL;
346345
self->stopping = false;
347346
self->paused = false;
348347

@@ -352,6 +351,8 @@ void common_hal_audiopwmio_pwmaudioout_stop(audiopwmio_pwmaudioout_obj_t *self)
352351
set_pin(1, GPIO_PIN_RESET);
353352
}
354353

354+
active_audio = NULL;
355+
355356
// Cannot free buffers here because we may be called from
356357
// the interrupt handler, and the heap is not reentrant.
357358
}

ports/stm/common-hal/sdioio/SDCard.c

+45-4
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,11 @@ void common_hal_sdioio_sdcard_construct(sdioio_sdcard_obj_t *self,
104104
uint8_t num_data, const mcu_pin_obj_t **data, uint32_t frequency) {
105105

106106
int periph_index = check_pins(self, clock, command, num_data, data);
107+
#ifdef STM32H750xx
108+
SDMMC_TypeDef *SDMMCx = mcu_sdio_banks[periph_index - 1];
109+
#else
107110
SDIO_TypeDef *SDIOx = mcu_sdio_banks[periph_index - 1];
111+
#endif
108112

109113
GPIO_InitTypeDef GPIO_InitStruct = {0};
110114

@@ -128,6 +132,25 @@ void common_hal_sdioio_sdcard_construct(sdioio_sdcard_obj_t *self,
128132
GPIO_InitStruct.Pin = pin_mask(clock->number);
129133
HAL_GPIO_Init(pin_port(clock->port), &GPIO_InitStruct);
130134

135+
#ifdef STM32H750xx
136+
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
137+
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SDMMC;
138+
PeriphClkInitStruct.SdmmcClockSelection = RCC_SDMMCCLKSOURCE_PLL;
139+
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) {
140+
mp_raise_ValueError_varg(MP_ERROR_TEXT("MMC/SDIO Clock Error %x"));
141+
}
142+
__HAL_RCC_SDMMC1_CLK_ENABLE();
143+
144+
self->handle.Init.ClockDiv = SDMMC_NSPEED_CLK_DIV;
145+
self->handle.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
146+
self->handle.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
147+
self->handle.Init.BusWide = SDMMC_BUS_WIDE_1B;
148+
// For the SDMMC controller Hardware Flow Control needs to be enabled
149+
// at the default speed of 25MHz, in order to avoid FIFO underrun (TX mode)
150+
// and overrun (RX mode) errors.
151+
self->handle.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_ENABLE;
152+
self->handle.Instance = SDMMCx;
153+
#else
131154
__HAL_RCC_SDIO_CLK_ENABLE();
132155

133156
self->handle.Init.ClockDiv = SDIO_TRANSFER_CLK_DIV;
@@ -137,6 +160,7 @@ void common_hal_sdioio_sdcard_construct(sdioio_sdcard_obj_t *self,
137160
self->handle.Init.BusWide = SDIO_BUS_WIDE_1B;
138161
self->handle.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
139162
self->handle.Instance = SDIOx;
163+
#endif
140164

141165
HAL_StatusTypeDef r = HAL_SD_Init(&self->handle);
142166
if (r != HAL_OK) {
@@ -150,9 +174,14 @@ void common_hal_sdioio_sdcard_construct(sdioio_sdcard_obj_t *self,
150174
}
151175

152176
self->num_data = 1;
177+
#ifdef STM32H750xx
178+
uint32_t bus_wide_opt = SDMMC_BUS_WIDE_4B;
179+
#else
180+
uint32_t bus_wide_opt = SDIO_BUS_WIDE_4B;
181+
#endif
153182
if (num_data == 4) {
154-
if ((r = HAL_SD_ConfigWideBusOperation(&self->handle, SDIO_BUS_WIDE_4B)) == HAL_SD_ERROR_NONE) {
155-
self->handle.Init.BusWide = SDIO_BUS_WIDE_4B;
183+
if ((r = HAL_SD_ConfigWideBusOperation(&self->handle, bus_wide_opt)) == HAL_SD_ERROR_NONE) {
184+
self->handle.Init.BusWide = bus_wide_opt;
156185
self->num_data = 4;
157186
} else {
158187
}
@@ -216,7 +245,13 @@ int common_hal_sdioio_sdcard_writeblocks(sdioio_sdcard_obj_t *self, uint32_t sta
216245
wait_write_complete(self);
217246
self->state_programming = true;
218247
common_hal_mcu_disable_interrupts();
219-
HAL_StatusTypeDef r = HAL_SD_WriteBlocks(&self->handle, bufinfo->buf, start_block, bufinfo->len / 512, 1000);
248+
#ifdef STM32H750xx
249+
// longer timeouts needed because code executing from QSPI is slower
250+
uint32_t time_out = SDMMC_DATATIMEOUT;
251+
#else
252+
uint32_t time_out = 1000;
253+
#endif
254+
HAL_StatusTypeDef r = HAL_SD_WriteBlocks(&self->handle, bufinfo->buf, start_block, bufinfo->len / 512, time_out);
220255
common_hal_mcu_enable_interrupts();
221256
if (r != HAL_OK) {
222257
return -EIO;
@@ -229,7 +264,13 @@ int common_hal_sdioio_sdcard_readblocks(sdioio_sdcard_obj_t *self, uint32_t star
229264
check_whole_block(bufinfo);
230265
wait_write_complete(self);
231266
common_hal_mcu_disable_interrupts();
232-
HAL_StatusTypeDef r = HAL_SD_ReadBlocks(&self->handle, bufinfo->buf, start_block, bufinfo->len / 512, 1000);
267+
#ifdef STM32H750xx
268+
// longer timeouts needed because code executing from QSPI is slower
269+
uint32_t time_out = SDMMC_DATATIMEOUT;
270+
#else
271+
uint32_t time_out = 1000;
272+
#endif
273+
HAL_StatusTypeDef r = HAL_SD_ReadBlocks(&self->handle, bufinfo->buf, start_block, bufinfo->len / 512, time_out);
233274
common_hal_mcu_enable_interrupts();
234275
if (r != HAL_OK) {
235276
return -EIO;

ports/stm/peripherals/periph.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ typedef struct {
3030
// Timer Peripheral
3131

3232
typedef struct {
33-
uint8_t tim_index : 4;
33+
uint8_t tim_index : 5;
3434
uint8_t altfn_index : 4;
3535
uint8_t channel_index : 4;
3636
const mcu_pin_obj_t *pin;

0 commit comments

Comments
 (0)