8000 Some peripheral support for the Daisy Seed stm32H750 board. · adafruit/circuitpython@71962eb · GitHub
[go: up one dir, main page]

Skip to content

Commit 71962eb

Browse files
committed
Some peripheral support for the Daisy Seed stm32H750 board.
- Added the SDRAM controller and set up heap to use the 64 MB external RAM - Added the rest of the board pin definitions from the pinout - Did peripheral pins cleanup for the stm32H750 chip - Added SDMMC peripheral and sdioio module support - Added pwmio support and started work on audiopwmio
1 parent f885cac commit 71962eb

File tree

15 files changed

+912
-55
lines changed

15 files changed

+912
-55
lines changed

locale/circuitpython.pot

Lines changed: 5 additions & 0 deletions
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

Lines changed: 7 additions & 0 deletions
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/mpconfigboard.h

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,40 @@
3131

3232
// for RNG not audio
3333
#define CPY_CLK_USB_USES_AUDIOPLL (1)
34+
35+
// SDRAM -- on FMC controller
36+
37+
#define CPY_SDRAM_REGION MPU_REGION_NUMBER10
38+
#define CPY_SDRAM_REGION_SIZE MPU_REGION_SIZE_64MB
39+
40+
#define CIRCUITPY_HW_FMC_SDCKE0
41+
#define CIRCUITPY_HW_FMC_SDNE0
42+
43+
#define CIRCUITPY_HW_SDRAM_SIZE (64 * 1024 * 1024) // 64 MByte
44+
#define CIRCUITPY_HW_SDRAM_STARTUP_TEST (1)
45+
#define CIRCUITPY_HW_FMC_SWAP_BANKS (0)
46+
47+
#define CIRCUITPY_HW_SDRAM_CLOCK_PERIOD 2
48+
#define CIRCUITPY_HW_SDRAM_CAS_LATENCY 3
49+
#define CIRCUITPY_HW_SDRAM_FREQUENCY_KHZ (100000) // 100 MHz
50+
#define CIRCUITPY_HW_SDRAM_TIMING_TMRD (2)
51+
#define CIRCUITPY_HW_SDRAM_TIMING_TXSR (8)
52+
#define CIRCUITPY_HW_SDRAM_TIMING_TRAS (5)
53+
#define CIRCUITPY_HW_SDRAM_TIMING_TRC (6)
54+
#define CIRCUITPY_HW_SDRAM_TIMING_TWR (3)
55+
#define CIRCUITPY_HW_SDRAM_TIMING_TRP (2)
56+
#define CIRCUITPY_HW_SDRAM_TIMING_TRCD (2)
57+
58+
#define CIRCUITPY_HW_SDRAM_ROW_BITS_NUM 13
59+
#define CIRCUITPY_HW_SDRAM_MEM_BUS_WIDTH 32
60+
#define CIRCUITPY_HW_SDRAM_REFRESH_CYCLES 8192
61+
62+
#define CIRCUITPY_HW_SDRAM_COLUMN_BITS_NUM 9
63+
#define CIRCUITPY_HW_SDRAM_INTERN_BANKS_NUM 4
64+
#define CIRCUITPY_HW_SDRAM_RPIPE_DELAY 0
65+
#define CIRCUITPY_HW_SDRAM_RBURST (1)
66+
#define CIRCUITPY_HW_SDRAM_WRITE_PROTECTION (0)
67+
68+
#define CIRCUITPY_HW_SDRAM_AUTOREFRESH_NUM (8)
69+
#define CIRCUITPY_HW_SDRAM_BURST_LENGTH 4
70+
#define CIRCUITPY_HW_SDRAM_REFRESH_RATE (64) // ms

ports/stm/boards/daisy_seed_with_sdram/mpconfigboard.mk

Lines changed: 4 additions & 0 deletions
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

Lines changed: 48 additions & 0 deletions
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/sdioio/SDCard.c

Lines changed: 45 additions & 4 deletions
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 10BB1 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

Lines changed: 1 addition & 1 deletion
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)
0