From 8b403ba641ca2e2bcb560cc904b25d9d0e7c95c3 Mon Sep 17 00:00:00 2001 From: "F. Ramu" Date: Wed, 27 Nov 2024 12:34:16 +0100 Subject: [PATCH] boards: st: introduce new STM32F413H-DISCO discovery kit Add the stm32f413h_disco target to the boards/st Add the PLLi2S when needed by the USB or SDMMC or RNG. Signed-off-by: Francois Ramu --- .../stm32f413h_disco/Kconfig.stm32f413h_disco | 5 + .../arduino_r3_connector.dtsi | 40 ++++ boards/st/stm32f413h_disco/board.cmake | 10 + boards/st/stm32f413h_disco/board.yml | 6 + .../doc/img/stm32F413H_DiscoveryKit.webp | Bin 0 -> 39482 bytes boards/st/stm32f413h_disco/doc/index.rst | 206 ++++++++++++++++++ .../st/stm32f413h_disco/stm32f413h_disco.dts | 102 +++++++++ .../st/stm32f413h_disco/stm32f413h_disco.yaml | 14 ++ .../stm32f413h_disco_defconfig | 16 ++ .../st/stm32f413h_disco/support/openocd.cfg | 12 + 10 files changed, 411 insertions(+) create mode 100644 boards/st/stm32f413h_disco/Kconfig.stm32f413h_disco create mode 100644 boards/st/stm32f413h_disco/arduino_r3_connector.dtsi create mode 100644 boards/st/stm32f413h_disco/board.cmake create mode 100644 boards/st/stm32f413h_disco/board.yml create mode 100644 boards/st/stm32f413h_disco/doc/img/stm32F413H_DiscoveryKit.webp create mode 100644 boards/st/stm32f413h_disco/doc/index.rst create mode 100644 boards/st/stm32f413h_disco/stm32f413h_disco.dts create mode 100644 boards/st/stm32f413h_disco/stm32f413h_disco.yaml create mode 100644 boards/st/stm32f413h_disco/stm32f413h_disco_defconfig create mode 100644 boards/st/stm32f413h_disco/support/openocd.cfg diff --git a/boards/st/stm32f413h_disco/Kconfig.stm32f413h_disco b/boards/st/stm32f413h_disco/Kconfig.stm32f413h_disco new file mode 100644 index 00000000000..0dc50d88be0 --- /dev/null +++ b/boards/st/stm32f413h_disco/Kconfig.stm32f413h_disco @@ -0,0 +1,5 @@ +# Copyright (c) 2024 STMicroelectronics +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_STM32F413H_DISCO + select SOC_STM32F413XX diff --git a/boards/st/stm32f413h_disco/arduino_r3_connector.dtsi b/boards/st/stm32f413h_disco/arduino_r3_connector.dtsi new file mode 100644 index 00000000000..1a5a2bc468c --- /dev/null +++ b/boards/st/stm32f413h_disco/arduino_r3_connector.dtsi @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2024 STMicroelectronics + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + arduino_header: connector { + compatible = "arduino-header-r3"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map = <0 0 &gpioc 0 0>, /* A0 */ + <1 0 &gpioa 1 0>, /* A1 */ + <2 0 &gpioa 2 0>, /* A2 */ + <3 0 &gpioa 5 0>, /* A3 */ + <4 0 &gpiob 1 0>, /* A4 */ + <5 0 &gpioc 4 0>, /* A5 */ + <6 0 &gpiof 6 0>, /* D0 */ + <7 0 &gpiof 7 0>, /* D1 */ + <8 0 &gpiog 13 0>, /* D2 */ + <9 0 &gpiof 10 0>, /* D3 */ + <10 0 &gpiob 6 0>, /* D4 */ + <11 0 &gpioe 6 0>, /* D5 */ + <12 0 &gpiob 0 0>, /* D6 */ + <13 0 &gpioc 13 0>, /* D7 */ + <14 0 &gpioa 4 0>, /* D8 */ + <15 0 &gpiob 8 0>, /* D9 */ + <16 0 &gpioa 15 0>, /* D10 */ + <17 0 &gpiob 5 0>, /* D11 */ + <18 0 &gpiob 4 0>, /* D12 */ + <19 0 &gpiob 12 0>, /* D13 */ + <20 0 &gpiob 11 0>, /* D14 */ + <21 0 &gpiob 10 0>; /* D15 */ + }; +}; + +arduino_i2c: &i2c2 {}; +arduino_spi: &spi3 {}; +arduino_serial: &uart7 {}; diff --git a/boards/st/stm32f413h_disco/board.cmake b/boards/st/stm32f413h_disco/board.cmake new file mode 100644 index 00000000000..800b779a42d --- /dev/null +++ b/boards/st/stm32f413h_disco/board.cmake @@ -0,0 +1,10 @@ +# SPDX-License-Identifier: Apache-2.0 + +# keep first +board_runner_args(stm32cubeprogrammer "--port=swd" "--reset-mode=hw") +board_runner_args(jlink "--device=STM32F413ZH" "--speed=4000") + +# keep first +include(${ZEPHYR_BASE}/boards/common/stm32cubeprogrammer.board.cmake) +include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake) +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) diff --git a/boards/st/stm32f413h_disco/board.yml b/boards/st/stm32f413h_disco/board.yml new file mode 100644 index 00000000000..e29d47b57be --- /dev/null +++ b/boards/st/stm32f413h_disco/board.yml @@ -0,0 +1,6 @@ +board: + name: stm32f413h_disco + full_name: STM32F413H Discovery + vendor: st + socs: + - name: stm32f413xx diff --git a/boards/st/stm32f413h_disco/doc/img/stm32F413H_DiscoveryKit.webp b/boards/st/stm32f413h_disco/doc/img/stm32F413H_DiscoveryKit.webp new file mode 100644 index 0000000000000000000000000000000000000000..93785299b0ba0057b210807b19c9d09220a8fa84 GIT binary patch literal 39482 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 literal 0 HcmV?d00001 diff --git a/boards/st/stm32f413h_disco/doc/index.rst b/boards/st/stm32f413h_disco/doc/index.rst new file mode 100644 index 00000000000..49ce176da65 --- /dev/null +++ b/boards/st/stm32f413h_disco/doc/index.rst @@ -0,0 +1,206 @@ +.. zephyr:board:: stm32f413h_disco + +Overview +******** + +The STM32F413H-DISCO Discovery kit features an ARM Cortex-M4 based STM32F413ZH MCU +with a wide range of connectivity support and configurations. Here are +some highlights of the STM32F413H-DISCO board: + + +- STM32F413ZHT6 microcontroller featuring 1.5 Mbyte of Flash memory and 320 Kbytes of RAM in an LQFP144 package +- On-board ST-LINK/V2-1 SWD debugger supporting USB re-enumeration capability: + + - USB virtual COM port + - mass storage + - debug port + +- 1.54 inch 240x240 pixel TFT color LCD with parallel interface and capacitive touchscreen +- I2S Audio CODEC, with a stereo headset jack, including analog microphone input and a loudspeaker output +- Stereo digital MEMS microphones +- MicroSD card connector extension +- I2C extension connector +- 128 Mbit Quad-SPI Nor Flash +- 8 Mbit 16-bit wide PSRAM +- Reset and User buttons +- Two color user LEDs. +- USB OTG FS with Micro-AB connector +- Four power supply options: + + - ST-LINK/V2-1 USB connector + - User USB FS connector + - VIN from Arduino* connectors + - + 5 V from Arduino* connectors + +- Two power supplies for MCU: 2.0 V and 3.3 V +- Compatible with Arduino(tm) Uno revision 3 connectors +- Extension connector for direct access to various features of STM32F413ZHT6 MCU +- Comprehensive free software including a variety of examples, part of STM32Cube package + +More information about the board can be found at the `32F413HDISCOVERY website`_. + +Hardware +******** + +STM32F413H-DISCO Discovery kit provides the following hardware components: + +- STM32F413ZHT6 in LQFP144 package +- ARM |reg| 32-bit Cortex |reg| -M4 CPU with FPU +- 100 MHz max CPU frequency +- VDD from 1.7 V to 3.6 V +- 1.5 MB Flash +- 320 KB SRAM +- GPIO with external interrupt capability +- LCD parallel interface, 8080/6800 modes +- 1x12-bit ADC with 16 channels +- RTC +- Advanced-control Timer +- General Purpose Timers (12) +- Watchdog Timers (2) +- USART/UART (10) +- I2C (4) +- SPI (5) +- SDIO +- SAI +- 3xCAN +- USB OTG 2.0 Full-speed +- CRC calculation unit +- True random number generator +- DMA Controller + +More information about STM32F413ZH can be found here: + - `STM32F413ZH on www.st.com`_ + - `STM32F413 reference manual`_ + +Supported Features +================== + +The Zephyr STM32F413H-DISCO board configuration supports the following hardware features: + ++-----------+------------+-------------------------------------+ +| Interface | Controller | Driver/Component | ++===========+============+=====================================+ +| NVIC | on-chip | nested vector interrupt controller | ++-----------+------------+-------------------------------------+ +| UART | on-chip | serial port-polling; | +| | | serial port-interrupt | ++-----------+------------+-------------------------------------+ +| PINMUX | on-chip | pinmux | ++-----------+------------+-------------------------------------+ +| GPIO | on-chip | gpio | ++-----------+------------+-------------------------------------+ +| I2C | on-chip | i2c | ++-----------+------------+-------------------------------------+ +| SPI | on-chip | spi | ++-----------+------------+-------------------------------------+ + +Other hardware features are not yet supported by Zephyr. + +The default configuration can be found in +:zephyr_file:`boards/st/stm32f413h_disco/stm32f413h_disco_defconfig` + + +Pin Mapping +=========== + +STM32F413H-DISCO Discovery kit has 8 GPIO controllers. These controllers are responsible for pin muxing, +input/output, pull-up, etc. + +For more details please refer to `32F413HDISCOVERY board User Manual`_. + +Default Zephyr Peripheral Mapping: +---------------------------------- +- UART_6_TX : PG14 +- UART_6_RX : PG9 +- LD1 : PE3 +- LD2 : PC5 + +System Clock +============ + +STM32F413H-DISCO System Clock could be driven by internal or external oscillator, +as well as main PLL clock. By default System clock is driven by PLL clock at 100MHz, +that is driven by the internal oscillator. + +Serial Port +=========== + +The STM32F413H-DISCO Discovery kit has up to 10 UARTs. The Zephyr console output is assigned to UART6. +Default settings are 115200 8N1. + + +Programming and Debugging +************************* + +STM32F413H-DISCO Discovery kit includes an ST-LINK/V2 embedded debug tool interface. + +Applications for the STM32F413H-DISCO board configuration can be built and +flashed in the usual way (see :ref:`build_an_application` and +:ref:`application_run` for more details). + +Flashing +======== + +The board is configured to be flashed using west `STM32CubeProgrammer`_ runner, +so its :ref:`installation ` is required. + +Alternatively, OpenOCD or JLink can also be used to flash the board using +the ``--runner`` (or ``-r``) option: + +.. code-block:: console + + $ west flash --runner openocd + $ west flash --runner jlink + +Flashing an application to STM32F413H-DISCO +------------------------------------------- + +Connect the STM32F413H-DISCO Discovery kit to your host computer using +the USB port, then run a serial host program to connect with your +board: + +.. code-block:: console + + $ minicom -D /dev/ttyACM0 + +Then build and flash an application. Here is an example for the +:zephyr:code-sample:`hello_world` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: stm32f413h_disco + :goals: build flash + +You should see the following message on the console: + +.. code-block:: console + + Hello World! stm32f413h_disco/stm32f413xx + + +Debugging +========= + +You can debug an application in the usual way. Here is an example for the +:zephyr:code-sample:`hello_world` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: stm32f413h_disco + :maybe-skip-config: + :goals: debug + +.. _32F413HDISCOVERY website: + https://www.st.com/en/evaluation-tools/32f413hdiscovery.html + +.. _32F413HDISCOVERY board User Manual: + https://www.st.com/resource/en/user_manual/um2135-discovery-kit-with-stm32f413zh-mcu-stmicroelectronics.pdf + +.. _STM32F413ZH on www.st.com: + https://www.st.com/en/microcontrollers/stm32f413zh.html + +.. _STM32F413 reference manual: + https://www.st.com/resource/en/reference_manual/rm0430-stm32f413423-advanced-armbased-32bit-mcus-stmicroelectronics.pdf + +.. _STM32CubeProgrammer: + https://www.st.com/en/development-tools/stm32cubeprog.html diff --git a/boards/st/stm32f413h_disco/stm32f413h_disco.dts b/boards/st/stm32f413h_disco/stm32f413h_disco.dts new file mode 100644 index 00000000000..72315d784e2 --- /dev/null +++ b/boards/st/stm32f413h_disco/stm32f413h_disco.dts @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2024 STMicroelectronics + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include +#include +#include "arduino_r3_connector.dtsi" +#include + +/ { + model = "STMicroelectronics STM32F413H-DISCO board"; + compatible = "st,stm32f413h-disco"; + + chosen { + zephyr,console = &usart6; + zephyr,shell-uart = &usart6; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + }; + + leds { + compatible = "gpio-leds"; + green_led_1: led_1 { + gpios = <&gpioc 5 GPIO_ACTIVE_HIGH>; + label = "User LD1"; + }; + red_led_2: led_2 { + gpios = <&gpioe 3 GPIO_ACTIVE_HIGH>; + label = "User LD4"; + }; + }; + + aliases { + led0 = &green_led_1; + led1 = &red_led_2; + + }; +}; + +&clk_lsi { + status = "okay"; +}; + +&clk_hse { + hse-bypass; + clock-frequency = ; /* STLink 8MHz clock */ + status = "okay"; +}; + +&pll { + div-m = <4>; + mul-n = <100>; + div-p = <2>; + div-q = <8>; + clocks = <&clk_hse>; + status = "okay"; +}; + +&rcc { + clocks = <&pll>; + clock-frequency = ; + ahb-prescaler = <1>; + apb1-prescaler = <2>; + apb2-prescaler = <1>; +}; + +&usart6 { + pinctrl-0 = <&usart6_tx_pg14 &usart6_rx_pg9>; + pinctrl-names = "default"; + current-speed = <115200>; + status = "okay"; +}; + +&uart7 { + pinctrl-0 = <&uart7_tx_pf7 &uart7_rx_pf6>; + pinctrl-names = "default"; + current-speed = <115200>; + status = "okay"; +}; + +&i2c2 { + pinctrl-0 = <&i2c2_scl_pb10 &i2c2_sda_pb11>; + pinctrl-names = "default"; + clock-frequency = ; + status = "okay"; +}; + +&spi3 { + pinctrl-0 = <&spi3_nss_pa15 &spi3_sck_pb12 + &spi3_miso_pb4 &spi3_mosi_pb5>; + pinctrl-names = "default"; + status = "okay"; +}; + +&rtc { + clocks = <&rcc STM32_CLOCK_BUS_APB1 0x10000000>, + <&rcc STM32_SRC_LSI RTC_SEL(2)>; + status = "okay"; +}; diff --git a/boards/st/stm32f413h_disco/stm32f413h_disco.yaml b/boards/st/stm32f413h_disco/stm32f413h_disco.yaml new file mode 100644 index 00000000000..27f178934f8 --- /dev/null +++ b/boards/st/stm32f413h_disco/stm32f413h_disco.yaml @@ -0,0 +1,14 @@ +identifier: stm32f413h_disco +name: ST STM32F413H Discovery +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - arduino_gpio + - arduino_serial + - arduino_i2c + - arduino_spi +vendor: st diff --git a/boards/st/stm32f413h_disco/stm32f413h_disco_defconfig b/boards/st/stm32f413h_disco/stm32f413h_disco_defconfig new file mode 100644 index 00000000000..2ae252482c9 --- /dev/null +++ b/boards/st/stm32f413h_disco/stm32f413h_disco_defconfig @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: Apache-2.0 + +# Enable MPU +CONFIG_ARM_MPU=y + +# Enable HW stack protection +CONFIG_HW_STACK_PROTECTION=y + +CONFIG_SERIAL=y + +# Console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y + +# Enable GPIO ports A, B, C, D, E, F, G, H +CONFIG_GPIO=y diff --git a/boards/st/stm32f413h_disco/support/openocd.cfg b/boards/st/stm32f413h_disco/support/openocd.cfg new file mode 100644 index 00000000000..837f0cd2958 --- /dev/null +++ b/boards/st/stm32f413h_disco/support/openocd.cfg @@ -0,0 +1,12 @@ +source [find board/stm32f4discovery.cfg] + +$_TARGETNAME configure -event gdb-attach { + echo "Debugger attaching: halting execution" + reset halt + gdb_breakpoint_override hard +} + +$_TARGETNAME configure -event gdb-detach { + echo "Debugger detaching: resuming execution" + resume +}