diff --git a/boards/arm/stm32g0316_disco/CMakeLists.txt b/boards/arm/stm32g0316_disco/CMakeLists.txt new file mode 100644 index 00000000000..d1b8108cfed --- /dev/null +++ b/boards/arm/stm32g0316_disco/CMakeLists.txt @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: Apache-2.0 + +if(CONFIG_PINMUX) +zephyr_library() +zephyr_library_sources(pinmux.c) +zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) +endif() diff --git a/boards/arm/stm32g0316_disco/Kconfig.board b/boards/arm/stm32g0316_disco/Kconfig.board new file mode 100644 index 00000000000..3f00f126fe3 --- /dev/null +++ b/boards/arm/stm32g0316_disco/Kconfig.board @@ -0,0 +1,8 @@ +# STM32G0316 Discovery board configuration + +# Copyright (c) 2019 SEAL AG +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_STM32G0316_DISCO + bool "STM32G0316 Discovery Development Board" + depends on SOC_STM32G031XX diff --git a/boards/arm/stm32g0316_disco/Kconfig.defconfig b/boards/arm/stm32g0316_disco/Kconfig.defconfig new file mode 100644 index 00000000000..d7b2618acef --- /dev/null +++ b/boards/arm/stm32g0316_disco/Kconfig.defconfig @@ -0,0 +1,18 @@ +# STM32G0316 Discovery board configuration + +# Copyright (c) 2019 SEAL AG +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_STM32G0316_DISCO + +config BOARD + default "stm32g0316_disco" + +if UART_CONSOLE + +config UART_1 + default y + +endif # UART_CONSOLE + +endif # BOARD_STM32G0316_DISCO diff --git a/boards/arm/stm32g0316_disco/board.cmake b/boards/arm/stm32g0316_disco/board.cmake new file mode 100644 index 00000000000..21de9a12efd --- /dev/null +++ b/boards/arm/stm32g0316_disco/board.cmake @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: Apache-2.0 +board_runner_args(pyocd "--target=stm32g031j6mx") + +include(${ZEPHYR_BASE}/boards/common/pyocd.board.cmake) diff --git a/boards/arm/stm32g0316_disco/doc/img/stm32g0316-disco.jpg b/boards/arm/stm32g0316_disco/doc/img/stm32g0316-disco.jpg new file mode 100644 index 00000000000..cf372085e6f Binary files /dev/null and b/boards/arm/stm32g0316_disco/doc/img/stm32g0316-disco.jpg differ diff --git a/boards/arm/stm32g0316_disco/doc/index.rst b/boards/arm/stm32g0316_disco/doc/index.rst new file mode 100644 index 00000000000..a7d12aca010 --- /dev/null +++ b/boards/arm/stm32g0316_disco/doc/index.rst @@ -0,0 +1,132 @@ +.. _stm32g0316_disco_board: + +STM32G0316-DISCO +################ + +Overview +******** + +The STM32G0316-DISCO Discovery kit helps to discover features of STM32G0 in SO8 package. +This discovery kit offers an SO8 to DIL8 module designed with the STM32G031J6 microcontroller +and allows the user to develop applications. It includes an on-board ST-LINK/V2-1 to debug +and program the embedded STM32 microcontroller. + +.. image:: img/stm32g0316-disco.jpg + :width: 670px + :align: center + :alt: STM32G0316-DISCO + +Hardware +******** + +- STM32G031J6 Arm |reg| Cortex |reg|-M0+ core-based microcontroller, + featuring 32 Kbytes of Flash memory and 8 Kbytes of SRAM, in an SO8 package +- 1 user LED +- 1 reset/user push-button +- Individual and breakable STM32 SO8 to DIL8 module +- ST-LINK Micro-B USB connector +- DIL8 socket to ease programming of the STM32 MCU +- On-board ST-LINK/V2-1 debugger/programmer + +For more information about the STM32G03x SoC and the STM32G0316-DISCO board, see these ST reference documents: + +- `STM32G031J6 website`_ +- `STM32G031 datasheet`_ +- `STM32G0x1 reference manual`_ +- `STM32G0316-DISCO website`_ + +Supported Features +================== + +The Zephyr stm32g0316_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 | ++-----------+------------+-------------------------------------+ +| CLOCK | on-chip | reset and clock control | ++-----------+------------+-------------------------------------+ + +Other hardware features are not currently supported by the port. + +The default configuration can be found in the defconfig file: +``boards/arm/stm32g0316_disco/stm32g0316_disco_defconfig`` + +Connections and IOs +=================== + +Due to the small number of I/O pins on the SO8 package, multiple die I/Os are bonded +to the same package pins to maximize the number of peripherals which can be used. +Care must be taken not to set two I/Os which are connected together to conflicting +states (e.g. both as outputs, one low, the other high). + +Default Zephyr Peripheral Mapping: +---------------------------------- + +.. rst-class:: rst-columns + +- UART_1 TX/RX : PA9/PB7 (pins 5/1) +- USER_PB : PA0 (pin 4) +- LD2 : PA12 (pin 6) + +Programming and Debugging +************************* + +Applications for the ``stm32g0316_disco`` board configuration can be built the +usual way (see :ref:`build_an_application` and :ref:`application_run` for more details). + +Flashing +======== + +The STM32G0316-DISCO board includes an ST-LINK/V2-1 embedded debug tool +interface. This interface is not yet supported by the openocd version included in +the Zephyr SDK. Instead, support can be enabled on pyocd by adding "pack" support with +the following pyocd command: + +.. code-block:: console + + $ pyocd pack --install stm32g031j6 + +Flashing an application to the STM32G0316-DISCO +----------------------------------------------- + +Here is an example for the :ref:`blinky-sample` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/basic/blinky + :board: stm32g0316_disco + :goals: build flash + +You should see the LED blinking every second. + +Debugging +========= + +You can debug an application in the usual way. Here is an example for the +:ref:`hello_world` application. + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: stm32g0316_disco + :maybe-skip-config: + :goals: debug + +.. _STM32G031J6 website: + https://www.st.com/en/microcontrollers-microprocessors/stm32g031j6.html + +.. _STM32G031 datasheet: + https://www.st.com/resource/en/datasheet/stm32g031j6.pdf + +.. _STM32G0x1 reference manual: + https://www.st.com/resource/en/reference_manual/dm00371828.pdf + +.. _STM32G0316-DISCO website: + https://www.st.com/en/evaluation-tools/stm32g0316-disco.html diff --git a/boards/arm/stm32g0316_disco/pinmux.c b/boards/arm/stm32g0316_disco/pinmux.c new file mode 100644 index 00000000000..32d561b8d3d --- /dev/null +++ b/boards/arm/stm32g0316_disco/pinmux.c @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2019 SEAL AG + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include + +#include + +/* pin assignments for STM32G0316-DISCO board */ +static const struct pin_config pinconf[] = { +#ifdef CONFIG_UART_1 + {STM32_PIN_PA9, STM32G0_PINMUX_FUNC_PA9_USART1_TX}, + {STM32_PIN_PB7, STM32G0_PINMUX_FUNC_PB7_USART1_RX}, +#endif /* CONFIG_UART_1 */ +}; + +static int pinmux_stm32_init(struct device *port) +{ + ARG_UNUSED(port); + +#ifdef CONFIG_UART_1 + /* Remap PA11 to PA9 */ + LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG); + LL_SYSCFG_EnablePinRemap(LL_SYSCFG_PIN_RMP_PA11); +#endif /* CONFIG_UART_1 */ + + stm32_setup_pins(pinconf, ARRAY_SIZE(pinconf)); + + return 0; +} + +SYS_INIT(pinmux_stm32_init, PRE_KERNEL_1, + CONFIG_PINMUX_STM32_DEVICE_INITIALIZATION_PRIORITY); diff --git a/boards/arm/stm32g0316_disco/stm32g0316_disco.dts b/boards/arm/stm32g0316_disco/stm32g0316_disco.dts new file mode 100644 index 00000000000..8db7af49442 --- /dev/null +++ b/boards/arm/stm32g0316_disco/stm32g0316_disco.dts @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2019 SEAL AG + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include + +/ { + model = "STMicroelectronics STM32G0316 Discovery board"; + compatible = "st,stm32g0316-disco", "st,stm32g031"; + + aliases { + led0 = &green_led_1; + sw0 = &user_button; + }; + + chosen { + zephyr,console = &usart1; + zephyr,shell-uart = &usart1; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + }; + + leds { + compatible = "gpio-leds"; + green_led_1: led_2 { + gpios = <&gpioa 12 GPIO_INT_ACTIVE_LOW>; + label = "User LD2"; + }; + }; + + gpio_keys { + compatible = "gpio-keys"; + user_button: button { + label = "User"; + gpios = <&gpioa 0 GPIO_INT_ACTIVE_LOW>; + }; + }; +}; + +&usart1 { + current-speed = <115200>; + status = "okay"; +}; diff --git a/boards/arm/stm32g0316_disco/stm32g0316_disco.yaml b/boards/arm/stm32g0316_disco/stm32g0316_disco.yaml new file mode 100644 index 00000000000..1c777cda379 --- /dev/null +++ b/boards/arm/stm32g0316_disco/stm32g0316_disco.yaml @@ -0,0 +1,13 @@ +identifier: stm32g0316_disco +name: STM32G0316-DISCO +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +ram: 8 +flash: 32 +supported: + - gpio + - uart diff --git a/boards/arm/stm32g0316_disco/stm32g0316_disco_defconfig b/boards/arm/stm32g0316_disco/stm32g0316_disco_defconfig new file mode 100644 index 00000000000..1bb8ff62b5f --- /dev/null +++ b/boards/arm/stm32g0316_disco/stm32g0316_disco_defconfig @@ -0,0 +1,42 @@ +# Zephyr Kernel Configuration +CONFIG_ARM=y +CONFIG_SOC_SERIES_STM32G0X=y +CONFIG_SOC_STM32G031XX=y +CONFIG_CORTEX_M_SYSTICK=y +CONFIG_BOARD_STM32G0316_DISCO=y + +# 64MHz system clock +CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=64000000 + +# Kernel Options due to Low Memory (8k) +CONFIG_MAIN_STACK_SIZE=640 +CONFIG_IDLE_STACK_SIZE=200 +CONFIG_ISR_STACK_SIZE=512 + +# Serial Drivers +CONFIG_SERIAL=y +CONFIG_UART_INTERRUPT_DRIVEN=y +# enable console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y + +# Pinmux Driver +CONFIG_PINMUX=y + +# GPIO Controller +CONFIG_GPIO=y + +# Clock configuration +CONFIG_CLOCK_CONTROL=y +# SYSCLK selection +CONFIG_CLOCK_STM32_SYSCLK_SRC_PLL=y +# PLL configuration +CONFIG_CLOCK_STM32_PLL_SRC_HSI=y +# produce 64MHz clock at PLL output +CONFIG_CLOCK_STM32_PLL_M_DIVISOR=1 +CONFIG_CLOCK_STM32_PLL_N_MULTIPLIER=8 +CONFIG_CLOCK_STM32_PLL_P_DIVISOR=2 +CONFIG_CLOCK_STM32_PLL_Q_DIVISOR=2 +CONFIG_CLOCK_STM32_PLL_R_DIVISOR=2 +CONFIG_CLOCK_STM32_AHB_PRESCALER=1 +CONFIG_CLOCK_STM32_APB1_PRESCALER=1 diff --git a/drivers/pinmux/stm32/pinmux_stm32g0.h b/drivers/pinmux/stm32/pinmux_stm32g0.h index 448afb4ccde..21374d39ab0 100644 --- a/drivers/pinmux/stm32/pinmux_stm32g0.h +++ b/drivers/pinmux/stm32/pinmux_stm32g0.h @@ -16,6 +16,8 @@ #define STM32G0_PINMUX_FUNC_PA3_USART2_RX \ (STM32_PINMUX_ALT_FUNC_1 | STM32_PUPDR_NO_PULL) +#define STM32G0_PINMUX_FUNC_PA9_USART1_TX \ + (STM32_PINMUX_ALT_FUNC_1 | STM32_PUSHPULL_NOPULL) #define STM32G0_PINMUX_FUNC_PB6_USART1_TX \ (STM32_PINMUX_ALT_FUNC_0 | STM32_PUSHPULL_NOPULL) #define STM32G0_PINMUX_FUNC_PB7_USART1_RX \