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 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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy