From b92c5655c671c25f1d28d03b31c1b8c0400402a7 Mon Sep 17 00:00:00 2001 From: Sahaj Sarup Date: Fri, 25 Oct 2024 03:15:27 +0530 Subject: [PATCH] board: arm: Add support for WeAct Mini STM32H7B0 This board is mostly the same as mini_stm32h743. Noatable diffrences for dt: - rcc config - octospi in quadspi mode - pinmux naming for USB and quadspi Signed-off-by: Sahaj Sarup --- boards/weact/mini_stm32h7b0/Kconfig.defconfig | 35 +++ .../mini_stm32h7b0/Kconfig.mini_stm32h7b0 | 5 + boards/weact/mini_stm32h7b0/board.cmake | 8 + boards/weact/mini_stm32h7b0/board.yml | 6 + .../mini_stm32h7b0/doc/img/stm32h7xx.webp | Bin 0 -> 26310 bytes boards/weact/mini_stm32h7b0/doc/index.rst | 241 ++++++++++++++++++ .../weact/mini_stm32h7b0/mini_stm32h7b0.dts | 223 ++++++++++++++++ .../weact/mini_stm32h7b0/mini_stm32h7b0.yaml | 19 ++ .../mini_stm32h7b0/mini_stm32h7b0_defconfig | 24 ++ 9 files changed, 561 insertions(+) create mode 100644 boards/weact/mini_stm32h7b0/Kconfig.defconfig create mode 100644 boards/weact/mini_stm32h7b0/Kconfig.mini_stm32h7b0 create mode 100644 boards/weact/mini_stm32h7b0/board.cmake create mode 100644 boards/weact/mini_stm32h7b0/board.yml create mode 100644 boards/weact/mini_stm32h7b0/doc/img/stm32h7xx.webp create mode 100644 boards/weact/mini_stm32h7b0/doc/index.rst create mode 100644 boards/weact/mini_stm32h7b0/mini_stm32h7b0.dts create mode 100644 boards/weact/mini_stm32h7b0/mini_stm32h7b0.yaml create mode 100644 boards/weact/mini_stm32h7b0/mini_stm32h7b0_defconfig diff --git a/boards/weact/mini_stm32h7b0/Kconfig.defconfig b/boards/weact/mini_stm32h7b0/Kconfig.defconfig new file mode 100644 index 00000000000000..55b000e82de99b --- /dev/null +++ b/boards/weact/mini_stm32h7b0/Kconfig.defconfig @@ -0,0 +1,35 @@ +# Copyright (c) 2024 Linaro Limited +# SPDX-License-Identifier: Apache-2.0 + +# WeAct Studio MiniSTM32H7B0 board configuration + +if BOARD_MINI_STM32H7B0 + +if DISPLAY + +config INPUT + default y + +if LVGL + +config LV_COLOR_16_SWAP + default y + +config LV_Z_BITS_PER_PIXEL + default 16 + +endif # LVGL + +endif # DISPLAY + +if USB_DEVICE_STACK + +config UART_CONSOLE + default CONSOLE + +config USB_DEVICE_INITIALIZE_AT_BOOT + default y + +endif # USB_DEVICE_STACK + +endif # BOARD_MINI_STM32H7B0 diff --git a/boards/weact/mini_stm32h7b0/Kconfig.mini_stm32h7b0 b/boards/weact/mini_stm32h7b0/Kconfig.mini_stm32h7b0 new file mode 100644 index 00000000000000..cf900ccd67028f --- /dev/null +++ b/boards/weact/mini_stm32h7b0/Kconfig.mini_stm32h7b0 @@ -0,0 +1,5 @@ +# Copyright (c) 2024 Linaro Limited +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_MINI_STM32H7B0 + select SOC_STM32H7B0XX diff --git a/boards/weact/mini_stm32h7b0/board.cmake b/boards/weact/mini_stm32h7b0/board.cmake new file mode 100644 index 00000000000000..cf935a32ffaf20 --- /dev/null +++ b/boards/weact/mini_stm32h7b0/board.cmake @@ -0,0 +1,8 @@ +# Copyright (c) 2024 Linaro Limited +# SPDX-License-Identifier: Apache-2.0 + +board_runner_args(dfu-util "--pid=0483:df11" "--alt=0" "--dfuse") +board_runner_args(jlink "--device=STM32H7B0VB" "--speed=4000") + +include(${ZEPHYR_BASE}/boards/common/dfu-util.board.cmake) +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) diff --git a/boards/weact/mini_stm32h7b0/board.yml b/boards/weact/mini_stm32h7b0/board.yml new file mode 100644 index 00000000000000..9baae2f9f9612b --- /dev/null +++ b/boards/weact/mini_stm32h7b0/board.yml @@ -0,0 +1,6 @@ +board: + name: mini_stm32h7b0 + full_name: MiniSTM32H7B0 Core Board + vendor: weact + socs: + - name: stm32h7b0xx diff --git a/boards/weact/mini_stm32h7b0/doc/img/stm32h7xx.webp b/boards/weact/mini_stm32h7b0/doc/img/stm32h7xx.webp new file mode 100644 index 0000000000000000000000000000000000000000..7f92df0963b61e6eaebd78aa3be0d00a2a0d589e GIT binary patch literal 26310 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�=r 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 N4vJ}>n8&~X0044e7!Cjc literal 0 HcmV?d00001 diff --git a/boards/weact/mini_stm32h7b0/doc/index.rst b/boards/weact/mini_stm32h7b0/doc/index.rst new file mode 100644 index 00000000000000..5e21d5d65fb189 --- /dev/null +++ b/boards/weact/mini_stm32h7b0/doc/index.rst @@ -0,0 +1,241 @@ +.. _mini_stm32h7b0: + +WeAct Studio MiniSTM32H7B0 Core Board +##################################### + +Overview +******** + +The MiniSTM32H7B0 Core board is a compact development board equipped with +an STM32H7B0VBT6 microcontroller. It features a variety of peripherals, +including a user LED and button, a display, and external SPI and QuadSPI +NOR flash memory. + +Key Features + +- STM32 microcontroller in LQFP100 package +- USB OTG or full-speed device +- 1 user LED +- User, boot, and reset push-buttons +- 32.768 kHz and 25MHz HSE crystal oscillators +- External NOR Flash memories: 64-Mbit Quad-SPI and 64-Mbit SPI +- Board connectors: + - Camera (8 bit) connector + - ST7735 TFT-LCD 160 x 80 pixels (RGB565 3-SPI) + - microSD |trade| card + - USB Type-C Connector + - SWD header for external debugger + - 2x 40-pin GPIO connector + +.. figure:: img/stm32h7xx.webp + :align: center + :alt: MiniSTM32H7B0 Core Board + + MiniSTM32H7B0 Core Board (Credit: WeAct Studio) + +More information about the board can be found on the `Mini_STM32H7B0 website`_. + +Hardware +******** + +The MiniSTM32H743 Core board provides the following hardware components: + +- STM32H7B0VBT6 in LQFP100 package +- ARM 32-bit Cortex-M7 CPU with FPU +- Chrom-ART Accelerator +- Hardware JPEG Codec +- 280 MHz max CPU frequency +- VDD from 1.62 V to 3.6 V +- 128 KB Flash +- 1.4 MB SRAM +- High-resolution timer (2.1 ns) +- 32-bit timers(2) +- 16-bit timers(10) +- SPI(5) +- I2C(4) +- I2S (4) +- USART(5) +- UART(5) +- USB OTG Full Speed and High Speed(1) +- CAN FD(2) +- SAI(4) +- SPDIF_Rx(4) +- HDMI_CEC(1) +- Dual Mode Quad SPI(1) +- Camera Interface +- GPIO (up to 80) with external interrupt capability +- 16-bit ADC(2) with 16 channels +- 12-bit DAC with 2 channels(2) +- True Random Number Generator (RNG) +- 16-channel DMA +- LCD-TFT Controller with XGA resolution + +More information about STM32H7BO can be found here: + +- `STM32H7B0VB on www.st.com`_ +- `STM32H7B0VB reference manual`_ +- `STM32H7B0VB datasheet`_ + +Supported Features +================== + +The mini_stm32h7b0 board configuration supports the following hardware features: + ++-----------+------------+-------------------------------------+ +| Interface | Controller | Driver/Component | ++===========+============+=====================================+ +| NVIC | on-chip | nested vector interrupt controller | ++-----------+------------+-------------------------------------+ +| WDT | on-chip | watchdog | ++-----------+------------+-------------------------------------+ +| PINMUX | on-chip | pinmux | ++-----------+------------+-------------------------------------+ +| FLASH | on-chip | flash memory | ++-----------+------------+-------------------------------------+ +| GPIO | on-chip | gpio | ++-----------+------------+-------------------------------------+ +| SPI | on-chip | spi | ++-----------+------------+-------------------------------------+ +| QSPI NOR | on-chip | off-chip flash | ++-----------+------------+-------------------------------------+ +| SDMMC | on-chip | disk access | ++-----------+------------+-------------------------------------+ +| DISPLAY | on-chip | display | ++-----------+------------+-------------------------------------+ + +Other hardware features have not been enabled yet for this board. + +The default configuration per core can be found in the defconfig file: +``boards/weact/mini_stm32h743/mini_stm32h7b0_defconfig`` + +Pin Mapping +=========== + +MiniSTM32H7B0 Core board has 5 GPIO controllers. These controllers are responsible for pin muxing, +input/output, pull-up, etc. + +For more details please refer to `Mini_STM32H7B0 website`_. + +Default Zephyr Peripheral Mapping: +---------------------------------- + +The MiniSTM32H743 Core board is configured as follows + +- USER_LED : PE3 +- USER_PB : PC13 +- SPI1 SCK/MISO/MOSI/NSS : PB3/PB4/PD7/PD6 (NOR Flash memory) +- SPI4 SCK/MOSI/NSS : PE12/PE14/PE11 (LCD) +- QuadSPI CLK/NCS/IO0/IO1/IO2/IO3 : PB2/PB6/PD11/PD12/PE2/PD13 (NOR Flash memory) +- SDMMC1 CLK/DCMD/CD/D0/D1/D2/D3 : PC12/PD2/PD4/PC8/PC9/PC10/PC11 (microSD card) +- USB DM/DP : PA11/PA12 (USB CDC ACM) + +System Clock +============ + +The STM32H7B0VB System Clock can be driven by an internal or external oscillator, +as well as by the main PLL clock. By default, the System clock is driven +by the PLL clock at 280MHz. PLL clock is fed by a 25MHz high speed external clock. + +Serial Port (USB CDC ACM) +========================= + +The Zephyr console output is assigned to the USB CDC ACM virtual serial port. +Virtual COM port interface. Default communication settings are 115200 8N1. + +Programming and Debugging +************************* + +The MiniSTM32H7B0 Core board facilitates firmware flashing via the USB DFU +bootloader. This method simplifies the process of updating images, although +it doesn't provide debugging capabilities. However, the board provides header +pins for the Serial Wire Debug (SWD) interface, which can be used to connect +an external debugger, such as ST-Link. + +Flashing +======== + +To activate the bootloader, follow these steps: + +1. Press and hold the BOOT0 key. +2. While still holding the BOOT0 key, press and release the RESET key. +3. Wait for 0.5 seconds, then release the BOOT0 key. + +Upon successful execution of these steps, the device will transition into +bootloader mode and present itself as a USB DFU Mode device. You can program +the device using the west tool or the STM32CubeProgrammer. + +Flashing an application to MiniSTM32H743 +---------------------------------------- + +Here is an example for the :zephyr:code-sample:`hello_world` application. + +First, put the board in bootloader mode as described above. Then build and flash +the application in the usual way. Just add ``CONFIG_BOOT_DELAY=5000`` to the +configuration, so that USB CDC ACM is initialized before any text is printed, +as below: + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: mini_stm32h7b0 + :goals: build flash + :gen-args: -DCONFIG_BOOT_DELAY=5000 + +Run a serial host program to connect with your board: + +.. code-block:: console + + $ minicom -D -b 115200 + +Then, press the RESET button, you should see the following message after few seconds: + +.. code-block:: console + + Hello World! mini_stm32h7b0 + +Replace :code:`` with the port where the board XIAO BLE +can be found. For example, under Linux, :code:`/dev/ttyACM0`. + +Debugging +--------- + +This current Zephyr port does not support debugging. + +Testing the LEDs in the MiniSTM32H7B0 +************************************* + +There is a sample that allows to test that LED on the board are working +properly with Zephyr: + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: mini_stm32h7b0 + :goals: build flash + :gen-args: -DCONFIG_BOOT_DELAY=5000 + +You can build and flash the examples to make sure Zephyr is running correctly on +your board. The LED definitions can be found in +:zephyr_file:`boards/weact/mini_stm32h743/mini_stm32h7b0.dts`. + +Testing shell over USB in the MiniSTM32H7B0 +******************************************* + +There is a sample that allows to test shell interface over USB CDC ACM interface +with Zephyr: + +.. zephyr-app-commands:: + :zephyr-app: samples/subsys/shell/shell_module + :board: mini_stm32h7b0 + :goals: build flash + :gen-args: -DCONFIG_BOOT_DELAY=5000 + +.. _Mini_STM32H7B0 website: + https://github.com/WeActStudio/WeActStudio.MiniSTM32H7B0 + +.. _STM32H7B0VB on www.st.com: + https://www.st.com/en/microcontrollers-microprocessors/stm32h7b0vb.html + +.. _STM32H7B0 reference manual: + https://www.st.com/resource/en/reference_manual/rm0455-stm32h7a37b3-and-stm32h7b0-value-line-advanced-armbased-32bit-mcus-stmicroelectronics.pdf + +.. _STM32H7B0VB datasheet: + https://www.st.com/resource/en/datasheet/stm32h7b0vb.pdf diff --git a/boards/weact/mini_stm32h7b0/mini_stm32h7b0.dts b/boards/weact/mini_stm32h7b0/mini_stm32h7b0.dts new file mode 100644 index 00000000000000..9c69f06dd9cf17 --- /dev/null +++ b/boards/weact/mini_stm32h7b0/mini_stm32h7b0.dts @@ -0,0 +1,223 @@ +/* + * Copyright (c) 2024 Linaro Limited + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include +#include +#include +#include + +/ { + model = "WeAct Studio MiniSTM32H7B0 Core Board"; + compatible = "weact,mini-stm32h7b0"; + + chosen { + zephyr,console = &usb_cdc_acm_uart; + zephyr,shell-uart = &usb_cdc_acm_uart; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,display = &st7735r_160x80; + }; + + leds { + compatible = "gpio-leds"; + user_led: led { + gpios = <&gpioe 3 GPIO_ACTIVE_HIGH>; + label = "User LED"; + }; + }; + + gpio_keys { + compatible = "gpio-keys"; + user_button: button { + label = "User PB"; + gpios = <&gpioc 13 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>; + zephyr,code = ; + }; + }; + + mipi_dbi_st7735r_160x80 { + compatible = "zephyr,mipi-dbi-spi"; + spi-dev = <&spi4>; + dc-gpios = <&gpioe 13 GPIO_ACTIVE_HIGH>; + #address-cells = <1>; + #size-cells = <0>; + + st7735r_160x80: st7735r@0 { + compatible = "sitronix,st7735r"; + mipi-max-frequency = <20000000>; + mipi-mode = ; + reg = <0>; + width = <160>; + height = <80>; + inversion-on; + rgb-is-inverted; + x-offset = <1>; + y-offset = <26>; + pwctr1 = [A2 02 84]; + pwctr2 = [C5]; + pwctr3 = [0A 00]; + pwctr4 = [8A 2A]; + pwctr5 = [8A EE]; + invctr = <7>; + frmctr1 = [01 2C 2D]; + frmctr2 = [01 2C 2D]; + frmctr3 = [01 2C 2D 01 2C 2D]; + vmctr1 = <14>; + gamctrp1 = [02 1C 07 12 37 32 29 2D 29 25 2B 39 00 01 03 10]; + gamctrn1 = [03 1D 07 06 2E 2C 29 2D 2E 2E 37 3F 00 00 02 10]; + colmod = <5>; + /* Set D3 (RGB) bit to 1. LV_COLOR_16_SWAP is enabled by default */ + madctl = <120>; /* Set to <184> to rotate the image 180 degrees. */ + caset = [00 01 00 a0]; + raset = [00 1a 00 69]; + }; + }; + + aliases { + led0 = &user_led; + sw0 = &user_button; + watchdog0 = &iwdg; + sdhc0 = &sdmmc1; + }; +}; + +&clk_lsi { + status = "okay"; +}; + +&clk_hsi48 { + status = "okay"; +}; + +&clk_hse { + clock-frequency = ; + status = "okay"; +}; + +&pll { + div-m = <5>; + mul-n = <112>; + div-p = <2>; + div-q = <2>; + div-r = <2>; + clocks = <&clk_hse>; + status = "okay"; +}; + +&rcc { + clocks = <&pll>; + clock-frequency = ; + d1cpre = <1>; + hpre = <2>; + d1ppre = <1>; + d2ppre1 = <1>; + d2ppre2 = <1>; + d3ppre = <1>; +}; + +&sdmmc1 { + pinctrl-0 = <&sdmmc1_d0_pc8 &sdmmc1_d1_pc9 + &sdmmc1_d2_pc10 &sdmmc1_d3_pc11 + &sdmmc1_ck_pc12 &sdmmc1_cmd_pd2>; + pinctrl-names = "default"; + cd-gpios = <&gpiod 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + status = "okay"; +}; + +zephyr_udc0: &usbotg_hs { + pinctrl-0 = <&usb_otg_hs_dm_pa11 &usb_otg_hs_dp_pa12>; + pinctrl-names = "default"; + status = "okay"; + + usb_cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + }; +}; + + +&octospi1 { + pinctrl-names = "default"; + pinctrl-0 = <&octospim_p1_clk_pb2 &octospim_p1_ncs_pb6 + &octospim_p1_io0_pd11 &octospim_p1_io1_pd12 + &octospim_p1_io2_pe2 &octospim_p1_io3_pd13>; + status = "okay"; + + w25q64_qspi: ospi-nor-flash@90000000 { + compatible = "st,stm32-ospi-nor"; + reg = <0x90000000 DT_SIZE_M(64)>; /* 64 Mbits */ + ospi-max-frequency = <40000000>; + status = "okay"; + spi-bus-width = <4>; + data-rate = ; + writeoc = "PP_1_1_4"; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + slot0_partition: partition@0 { + reg = <0x00000000 DT_SIZE_M(64)>; + }; + }; + }; +}; + +&spi1 { + pinctrl-0 = <&spi1_sck_pb3 &spi1_miso_pb4 &spi1_mosi_pd7>; + cs-gpios = <&gpiod 6 GPIO_ACTIVE_LOW>; + pinctrl-names = "default"; + status = "okay"; + w25q64_spi: spi-nor-flash@0 { + compatible = "jedec,spi-nor"; + reg = <0>; + spi-max-frequency = <40000000>; + size = ; /* 64 Mbits */ + status = "okay"; + jedec-id = [ef 40 17]; + has-dpd; + t-enter-dpd = <3500>; + t-exit-dpd = <3500>; + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + storage_partition: partition@0 { + label = "storage"; + reg = <0x00000000 DT_SIZE_M(64)>; + }; + }; + }; +}; + +&gpioe { + status = "okay"; + + lcd_led { + gpio-hog; + gpios = <10 GPIO_ACTIVE_LOW>; + output-high; + }; +}; + +&spi4 { + pinctrl-0 = <&spi4_sck_pe12 &spi4_mosi_pe14>; + cs-gpios = <&gpioe 11 GPIO_ACTIVE_LOW>; + pinctrl-names = "default"; + status = "okay"; +}; + +&rng { + status = "okay"; +}; + +&backup_sram { + status = "okay"; +}; + +&iwdg1 { + status = "okay"; +}; diff --git a/boards/weact/mini_stm32h7b0/mini_stm32h7b0.yaml b/boards/weact/mini_stm32h7b0/mini_stm32h7b0.yaml new file mode 100644 index 00000000000000..d9904423aa6608 --- /dev/null +++ b/boards/weact/mini_stm32h7b0/mini_stm32h7b0.yaml @@ -0,0 +1,19 @@ +identifier: mini_stm32h7b0 +name: WeAct Studio MiniSTM32H7B0 Core Board +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +ram: 512 +flash: 2048 +supported: + - gpio + - counter + - spi + - backup_sram + - watchdog + - qspi + - video +vendor: weact diff --git a/boards/weact/mini_stm32h7b0/mini_stm32h7b0_defconfig b/boards/weact/mini_stm32h7b0/mini_stm32h7b0_defconfig new file mode 100644 index 00000000000000..9c0dba97e59c76 --- /dev/null +++ b/boards/weact/mini_stm32h7b0/mini_stm32h7b0_defconfig @@ -0,0 +1,24 @@ +# Copyright (c) 2024 Linaro Limited +# SPDX-License-Identifier: Apache-2.0 + +# Enable MPU +CONFIG_ARM_MPU=y + +# Enable HW stack protection +CONFIG_HW_STACK_PROTECTION=y + +# Enable UART driver +CONFIG_SERIAL=y + +# Enable console +CONFIG_CONSOLE=y + +# Enable GPIO +CONFIG_GPIO=y + +# Logger cannot use itself to log +CONFIG_USB_CDC_ACM_LOG_LEVEL_OFF=y + +# Enable USB +CONFIG_USB_DEVICE_STACK=y +