From b729b478ecc56e2a4732b619880fde15fabd9232 Mon Sep 17 00:00:00 2001 From: Neil Armstrong Date: Tue, 9 May 2017 14:29:01 +0200 Subject: [PATCH] boards: arm: Add support for STM32L496G Discovery board Add configuration, pinmux, dts and documentation for the STM32L496G Discovery board based on the STM32L496AG SoC. Signed-off-by: Neil Armstrong --- boards/arm/stm32l496g_disco/Kconfig.board | 11 + boards/arm/stm32l496g_disco/Kconfig.defconfig | 14 + boards/arm/stm32l496g_disco/Makefile | 2 + boards/arm/stm32l496g_disco/board.h | 21 ++ .../doc/img/en.stm32l496g-disco.jpg | Bin 0 -> 62282 bytes .../stm32l496g_disco/doc/stm32l496g_disco.rst | 255 ++++++++++++++++++ .../stm32l496g_disco_defconfig | 59 ++++ drivers/pinmux/Makefile | 1 + .../stm32/pinmux_board_stm32l496g_disco.c | 46 ++++ dts/arm/Makefile | 1 + dts/arm/stm32l496g_disco.dts | 24 ++ dts/arm/stm32l496g_disco.fixup | 32 +++ scripts/sanity_chk/arches/arm.ini | 2 +- 13 files changed, 467 insertions(+), 1 deletion(-) create mode 100644 boards/arm/stm32l496g_disco/Kconfig.board create mode 100644 boards/arm/stm32l496g_disco/Kconfig.defconfig create mode 100644 boards/arm/stm32l496g_disco/Makefile create mode 100644 boards/arm/stm32l496g_disco/board.h create mode 100644 boards/arm/stm32l496g_disco/doc/img/en.stm32l496g-disco.jpg create mode 100644 boards/arm/stm32l496g_disco/doc/stm32l496g_disco.rst create mode 100644 boards/arm/stm32l496g_disco/stm32l496g_disco_defconfig create mode 100644 drivers/pinmux/stm32/pinmux_board_stm32l496g_disco.c create mode 100644 dts/arm/stm32l496g_disco.dts create mode 100644 dts/arm/stm32l496g_disco.fixup diff --git a/boards/arm/stm32l496g_disco/Kconfig.board b/boards/arm/stm32l496g_disco/Kconfig.board new file mode 100644 index 00000000000..0538d444ab3 --- /dev/null +++ b/boards/arm/stm32l496g_disco/Kconfig.board @@ -0,0 +1,11 @@ +# Kconfig - STM32L496G Discovery board configuration +# +# Copyright (c) 2016 Open-RnD Sp. z o.o. +# Copyright (c) 2016 BayLibre, SAS +# +# SPDX-License-Identifier: Apache-2.0 +# + +config BOARD_STM32L496G_DISCO + bool "STM32L496G Discovery Development Board" + depends on SOC_STM32L496XG diff --git a/boards/arm/stm32l496g_disco/Kconfig.defconfig b/boards/arm/stm32l496g_disco/Kconfig.defconfig new file mode 100644 index 00000000000..cb3c08e07d4 --- /dev/null +++ b/boards/arm/stm32l496g_disco/Kconfig.defconfig @@ -0,0 +1,14 @@ +# Kconfig - STM32L476G Nucleo board configuration +# +# Copyright (c) 2016 Open-RnD Sp. z o.o. +# Copyright (c) 2016 BayLibre, SAS +# +# SPDX-License-Identifier: Apache-2.0 +# + +if BOARD_STM32L496G_DISCO + +config BOARD + default stm32l496g_disco + +endif # BOARD_STM32L496G_DISCO diff --git a/boards/arm/stm32l496g_disco/Makefile b/boards/arm/stm32l496g_disco/Makefile new file mode 100644 index 00000000000..c925263c43a --- /dev/null +++ b/boards/arm/stm32l496g_disco/Makefile @@ -0,0 +1,2 @@ +# No C files (yet) +obj- += dummy.o diff --git a/boards/arm/stm32l496g_disco/board.h b/boards/arm/stm32l496g_disco/board.h new file mode 100644 index 00000000000..21cb7fa721e --- /dev/null +++ b/boards/arm/stm32l496g_disco/board.h @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2015 Intel Corporation + * Copyright (c) 2017 Linaro Limited. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef __INC_BOARD_H +#define __INC_BOARD_H + +#include + +/* LD2 green LED */ +#define LD2_GPIO_PORT "GPIOB" +#define LD2_GPIO_PIN 13 + +/* Create aliases to make the basic samples work */ +#define LED0_GPIO_PORT LD2_GPIO_PORT +#define LED0_GPIO_PIN LD2_GPIO_PIN + +#endif /* __INC_BOARD_H */ diff --git a/boards/arm/stm32l496g_disco/doc/img/en.stm32l496g-disco.jpg b/boards/arm/stm32l496g_disco/doc/img/en.stm32l496g-disco.jpg new file mode 100644 index 0000000000000000000000000000000000000000..798f5f3fa4c9ec8ed79d2bed3f10fe0980c28564 GIT binary patch literal 62282 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
    Q0#_ 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 literal 0 HcmV?d00001 diff --git a/boards/arm/stm32l496g_disco/doc/stm32l496g_disco.rst b/boards/arm/stm32l496g_disco/doc/stm32l496g_disco.rst new file mode 100644 index 00000000000..187442ab02b --- /dev/null +++ b/boards/arm/stm32l496g_disco/doc/stm32l496g_disco.rst @@ -0,0 +1,255 @@ +.. _stm32l496g_disco_board: + +ST STM32L496G Discovery +######################## + +Overview +******** + +The STM32L496G Discovery board features an ARM Cortex-M4 based STM32L496AG MCU +with a wide range of connectivity support and configurations. Here are +some highlights of the STM32L496G Discovery board: + + +- STM32L496AGI6 microcontroller featuring 1 Mbyte of Flash memory and 320 Kbytes of RAM in an UFBGA169 package +- 1.54 inch 240 x 240 pixel-TFT color LCD with parallel interface +- SAI Audio CODEC, with a stereo headset jack, including analog microphone input +- Stereo digital MEMS microphones +- microSD card connector (card included) +- Camera 8 bit-connector +- 8 Mbit-PSRAM +- IDD measurement +- 64 Mbit-Quad-SPI Flash +- USB OTG FS with Micro-AB connector +- Two types of extension resources: + + - STMod+ and PMOD connectors + - Compatible Arduino™ Uno V3 connectors + +- On-board ST-LINK/V2-1 debugger/programmer with SWD connector +- 5 source options for power supply + + - ST-LINK/V2-1 USB connector + - User USB FS connector + - VIN from Arduino™ connector + - 5 V from Arduino™ connector + - USB charger + - USB VBUS or external source(3.3V, 5V, 7 - 12V) + - Power management access point + +- 8 LEDs +- Reset push button +- 4 direction-joystick with selection + +.. image:: img/en.stm32l496g-disco.jpg + :width: 450px + :align: center + :height: 394px + :alt: STM32L496G Discovery + +More information about the board can be found at the `STM32L496G Discovery website`_. + +Hardware +******** + +The STM32L496AG SoC provides the following hardware capabilities: + +- Ultra-low-power with FlexPowerControl (down to 108 nA Standby mode and 91 μA/MHz run mode) +- Core: ARM® 32-bit Cortex®-M4 CPU with FPU, frequency up to 80 MHz, 100DMIPS/1.25DMIPS/MHz (Dhrystone 2.1) +- Clock Sources: + + - 4 to 48 MHz crystal oscillator + - 32 kHz crystal oscillator for RTC (LSE) + - Internal 16 MHz factory-trimmed RC (±1%) + - Internal low-power 32 kHz RC (±5%) + - Internal multispeed 100 kHz to 48 MHz oscillator, auto-trimmed by LSE (better than ±0.25 % accuracy) + - Internal 48 MHz with clock recovery + - 3 PLLs for system clock, USB, audio, ADC + +- RTC with HW calendar, alarms and calibration +- LCD 8 × 40 or 4 × 44 with step-up converter +- Up to 24 capacitive sensing channels: support touchkey, linear and rotary touch sensors +- 16x timers: + + - 2x 16-bit advanced motor-control + - 2x 32-bit and 5x 16-bit general purpose + - 2x 16-bit basic + - 2x low-power 16-bit timers (available in Stop mode) + - 2x watchdogs + - SysTick timer + +- Up to 136 fast I/Os, most 5 V-tolerant, up to 14 I/Os with independent supply down to 1.08 V +- Memories + + - Up to 1 MB Flash, 2 banks read-while-write, proprietary code readout protection + - 320 KB of SRAM including 64 KB with hardware parity check + - External memory interface for static memories supporting SRAM, PSRAM, NOR, and NAND memories + - Quad SPI memory interface + +- 4x digital filters for sigma delta modulator +- Rich analog peripherals (independent supply) + + - 3× 12-bit ADC 5 MSPS, up to 16-bit with hardware oversampling, 200 μA/MSPS + - 2x 12-bit DAC, low-power sample and hold + - 2x operational amplifiers with built-in PGA + - 2x ultra-low-power comparators + +- 20x communication interfaces + + - USB OTG 2.0 full-speed, LPM and BCD + - 2x SAIs (serial audio interface) + - 4x I2C FM+(1 Mbit/s), SMBus/PMBus + - 5x USARTs (ISO 7816, LIN, IrDA, modem) + - 1x LPUART + - 3x SPIs (4x SPIs with the Quad SPI) + - 2x CAN (2.0B Active) and SDMMC interface + - SWPMI single wire protocol master I/F + - IRTIM (Infrared interface) + +- 14-channel DMA controller +- True random number generator +- CRC calculation unit, 96-bit unique ID +- Development support: serial wire debug (SWD), JTAG, Embedded Trace Macrocell™ + + +More information about STM32L496AG can be found here: + - `STM32L496AG on www.st.com`_ + - `STM32L496 reference manual`_ + +Supported Features +================== + +The Zephyr stm32l496g_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 | ++-----------+------------+-------------------------------------+ +| PWM | on-chip | pwm | ++-----------+------------+-------------------------------------+ + +Other hardware features are not yet supported on this Zephyr port. + +The default configuration can be found in the defconfig file: + + ``boards/arm/stm32l496g_disco/stm32l496g_disco_defconfig`` + + +Connections and IOs +=================== + +STM32L496G Discovery Board has 8 GPIO controllers. These controllers are responsible for pin muxing, +input/output, pull-up, etc. + +For mode details please refer to `STM32L496G Discovery board User Manual`_. + +Default Zephyr Peripheral Mapping: +---------------------------------- + +- UART_1_TX : PB6 +- UART_1_RX : PG10 +- UART_2_TX : PA2 +- UART_2_RX : PD6 +- I2C_1_SCL : PB8 +- I2C_1_SDA : PB7 +- PWM_2_CH1 : PA0 +- LD2 : PB13 + +System Clock +------------ + +STM32L496G Discovery 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 80MHz, +driven by 16MHz high speed internal oscillator. + +Serial Port +----------- + +STM32L496G Discovery board has 5 U(S)ARTs. The Zephyr console output is assigned to UART2. +Default settings are 115200 8N1. + + +Programming and Debugging +************************* + +Flashing +======== + +STM32L496G Discovery board includes an ST-LINK/V2-1 embedded debug tool interface. +This interface is not supported by the openocd version 0.9 included by the Zephyr SDK v0.9, +use openocd v0.10.0 from the openocd-stm32 project on GitHub to get the minimum set of scripts +needed to flash and debug STM32 development boards. + +.. code-block:: console + + $ git clone https://github.com/erwango/openocd-stm32.git + +Then follow instructions in README.md + + +Flashing an application to STM32L496G Discovery +----------------------------------------------- + +The sample application :ref:`hello_world` is being used in this tutorial: + +To build the Zephyr kernel and application, enter: + +.. code-block:: console + + $ cd + $ source zephyr-env.sh + $ cd $ZEPHYR_BASE/samples/hello_world/ + $ make BOARD=stm32l496g_disco + +Connect the STM32L496G Discovery to your host computer using the USB port. +Then, enter the following command: + +.. code-block:: console + + $ cd + $ stm32_flsh l4 $ZEPHYR_BASE/samples/hello_world/outdir/stm32l496g_disco/zephyr.bin + +Run a serial host program to connect with your Discovery board. + +.. code-block:: console + + $ minicom -D /dev/ttyACM0 + +You should see the following message: + +.. code-block:: console + + $ Hello World! arm + + +Debugging +========= + +Access gdb with the following make command: + +.. code-block:: console + + $ cd + $ stm32_dbg l4 $ZEPHYR_BASE/samples/hello_world/outdir/stm32l496g_disco/zephyr.elf + +.. _STM32L496G Discovery website: + http://www.st.com/en/evaluation-tools/32l496gdiscovery.html + +.. _STM32L496G Discovery board User Manual: + http://www.st.com/resource/en/user_manual/dm00353127.pdf + +.. _STM32L496AG on www.st.com: + http://www.st.com/en/microcontrollers/stm32l496ag.html + +.. _STM32L496 reference manual: + http://www.st.com/resource/en/reference_manual/DM00083560.pdf diff --git a/boards/arm/stm32l496g_disco/stm32l496g_disco_defconfig b/boards/arm/stm32l496g_disco/stm32l496g_disco_defconfig new file mode 100644 index 00000000000..b9610c602a7 --- /dev/null +++ b/boards/arm/stm32l496g_disco/stm32l496g_disco_defconfig @@ -0,0 +1,59 @@ +CONFIG_ARM=y +CONFIG_BOARD_STM32L496G_DISCO=y +CONFIG_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32L4X=y +CONFIG_SOC_STM32L496XG=y +CONFIG_CORTEX_M_SYSTICK=y +# 80MHz system clock +CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=80000000 + +# enable uart driver +CONFIG_SERIAL=y +CONFIG_UART_STM32=y +CONFIG_UART_STM32_PORT_2=y + +# enable pinmux +CONFIG_PINMUX=y +CONFIG_PINMUX_STM32=y + +# enable GPIOs +CONFIG_GPIO=y +CONFIG_GPIO_STM32=y +CONFIG_GPIO_STM32_PORTA=y +CONFIG_GPIO_STM32_PORTB=y +CONFIG_GPIO_STM32_PORTC=y +CONFIG_GPIO_STM32_PORTD=y +CONFIG_GPIO_STM32_PORTE=y +CONFIG_GPIO_STM32_PORTF=y +CONFIG_GPIO_STM32_PORTG=y +CONFIG_GPIO_STM32_PORTH=y + +# clock configuration +CONFIG_CLOCK_CONTROL=y +CONFIG_CLOCK_CONTROL_STM32_CUBE=y +# SYSCLK selection +CONFIG_CLOCK_STM32_SYSCLK_SRC_PLL=y +# PLL configuration +CONFIG_CLOCK_STM32_PLL_SRC_HSI +# produce 80MHz clock at PLL output +CONFIG_CLOCK_STM32_PLL_M_DIVISOR=1 +CONFIG_CLOCK_STM32_PLL_N_MULTIPLIER=20 +CONFIG_CLOCK_STM32_PLL_P_DIVISOR=7 +CONFIG_CLOCK_STM32_PLL_Q_DIVISOR=2 +CONFIG_CLOCK_STM32_PLL_R_DIVISOR=4 +CONFIG_CLOCK_STM32_AHB_PRESCALER=1 +CONFIG_CLOCK_STM32_APB1_PRESCALER=1 +CONFIG_CLOCK_STM32_APB2_PRESCALER=1 + +# console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y +CONFIG_UART_CONSOLE_ON_DEV_NAME="UART_2" + +#enable pwm +CONFIG_PWM=y +CONFIG_PWM_STM32=y +CONFIG_PWM_STM32_2=y + +#enable DTS +CONFIG_HAS_DTS=y diff --git a/drivers/pinmux/Makefile b/drivers/pinmux/Makefile index 4a0cee01ff7..0e5adf9eff5 100644 --- a/drivers/pinmux/Makefile +++ b/drivers/pinmux/Makefile @@ -17,6 +17,7 @@ obj-$(CONFIG_BOARD_96B_CARBON) += stm32/pinmux_board_carbon.o obj-$(CONFIG_BOARD_NUCLEO_L476RG) += stm32/pinmux_board_nucleo_l476rg.o obj-$(CONFIG_BOARD_NUCLEO_L432KC) += stm32/pinmux_board_nucleo_l432kc.o obj-$(CONFIG_BOARD_DISCO_L475_IOT1) += stm32/pinmux_board_disco_l475_iot1.o +obj-$(CONFIG_BOARD_STM32L496G_DISCO) += stm32/pinmux_board_stm32l496g_disco.o obj-$(CONFIG_BOARD_OLIMEXINO_STM32) += stm32/pinmux_board_olimexino_stm32.o obj-$(CONFIG_BOARD_STM32_MINI_A15) += stm32/pinmux_board_stm32_mini_a15.o obj-$(CONFIG_PINMUX_QMSI) += pinmux_qmsi.o diff --git a/drivers/pinmux/stm32/pinmux_board_stm32l496g_disco.c b/drivers/pinmux/stm32/pinmux_board_stm32l496g_disco.c new file mode 100644 index 00000000000..8e0ff4dd05d --- /dev/null +++ b/drivers/pinmux/stm32/pinmux_board_stm32l496g_disco.c @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2016 Open-RnD Sp. z o.o. + * Copyright (c) 2016 BayLibre, SAS + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include +#include "pinmux/pinmux.h" + +#include "pinmux_stm32.h" + +/* pin assignments for STM32L476G-DISCO board */ +static const struct pin_config pinconf[] = { +#ifdef CONFIG_UART_STM32_PORT_1 + {STM32_PIN_PB6, STM32L4X_PINMUX_FUNC_PB6_USART1_TX}, + {STM32_PIN_PG10, STM32L4X_PINMUX_FUNC_PG10_USART1_RX}, +#endif /* CONFIG_UART_STM32_PORT_1 */ +#ifdef CONFIG_UART_STM32_PORT_2 + {STM32_PIN_PA2, STM32L4X_PINMUX_FUNC_PA2_USART2_TX}, + {STM32_PIN_PD6, STM32L4X_PINMUX_FUNC_PD6_USART2_RX}, +#endif /* CONFIG_UART_STM32_PORT_2 */ +#ifdef CONFIG_I2C_1 + {STM32_PIN_PB8, STM32L4X_PINMUX_FUNC_PB8_I2C1_SCL}, + {STM32_PIN_PB7, STM32L4X_PINMUX_FUNC_PB7_I2C1_SDA}, +#endif /* CONFIG_I2C_1 */ +#ifdef CONFIG_PWM_STM32_2 + {STM32_PIN_PA0, STM32L4X_PINMUX_FUNC_PA0_PWM2_CH1}, +#endif /* CONFIG_PWM_STM32_2 */ +}; + +static int pinmux_stm32_init(struct device *port) +{ + ARG_UNUSED(port); + + 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/dts/arm/Makefile b/dts/arm/Makefile index 54a882a3be5..488a9bc09e2 100644 --- a/dts/arm/Makefile +++ b/dts/arm/Makefile @@ -20,6 +20,7 @@ dtb-$(CONFIG_BOARD_NUCLEO_F413ZH) = nucleo_f413zh.dts_compiled dtb-$(CONFIG_BOARD_NUCLEO_F103RB) = nucleo_f103rb.dts_compiled dtb-$(CONFIG_BOARD_STM3210C_EVAL) = stm3210c_eval.dts_compiled dtb-$(CONFIG_BOARD_STM32_MINI_A15) = stm32_mini_a15.dts_compiled +dtb-$(CONFIG_BOARD_STM32L496G_DISCO) = stm32l496g_disco.dts_compiled dtb-$(CONFIG_BOARD_NUCLEO_F334R8) = nucleo_f334r8.dts_compiled dtb-$(CONFIG_BOARD_STM32373C_EVAL) = stm32373c_eval.dts_compiled dtb-$(CONFIG_BOARD_96B_NITROGEN) = 96b_nitrogen.dts_compiled diff --git a/dts/arm/stm32l496g_disco.dts b/dts/arm/stm32l496g_disco.dts new file mode 100644 index 00000000000..65bab5a6b04 --- /dev/null +++ b/dts/arm/stm32l496g_disco.dts @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2017 Linaro Limited + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include + +/ { + model = "STMicroelectronics STM32L496G-DISCO board"; + compatible = "st,stm32l496g-disco", "st,stm32l496"; + + chosen { + zephyr,console = &usart2; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + }; +}; + +&usart2 { + current-speed = <115200>; + status = "ok"; +}; diff --git a/dts/arm/stm32l496g_disco.fixup b/dts/arm/stm32l496g_disco.fixup new file mode 100644 index 00000000000..ac9af9a7608 --- /dev/null +++ b/dts/arm/stm32l496g_disco.fixup @@ -0,0 +1,32 @@ +/* This file is a temporary workaround for mapping of the generated information + * to the current driver definitions. This will be removed when the drivers + * are modified to handle the generated information, or the mapping of + * generated data matches the driver definitions. + */ + +#define CONFIG_NUM_IRQ_PRIO_BITS ARM_V7M_NVIC_E000E100_ARM_NUM_IRQ_PRIORITY_BITS + +#define CONFIG_UART_STM32_PORT_1_BASE_ADDRESS ST_STM32_USART_40013800_BASE_ADDRESS +#define CONFIG_UART_STM32_PORT_1_BAUD_RATE ST_STM32_USART_40013800_CURRENT_SPEED +#define CONFIG_UART_STM32_PORT_1_IRQ_PRI ST_STM32_USART_40013800_IRQ_0_PRIORITY +#define PORT_1_IRQ ST_STM32_USART_40013800_IRQ_0 + +#define CONFIG_UART_STM32_PORT_2_BASE_ADDRESS ST_STM32_USART_40004400_BASE_ADDRESS +#define CONFIG_UART_STM32_PORT_2_BAUD_RATE ST_STM32_USART_40004400_CURRENT_SPEED +#define CONFIG_UART_STM32_PORT_2_IRQ_PRI ST_STM32_USART_40004400_IRQ_0_PRIORITY +#define PORT_2_IRQ ST_STM32_USART_40004400_IRQ_0 + +#define CONFIG_UART_STM32_PORT_3_BASE_ADDRESS ST_STM32_USART_40004800_BASE_ADDRESS +#define CONFIG_UART_STM32_PORT_3_BAUD_RATE ST_STM32_USART_40004800_CURRENT_SPEED +#define CONFIG_UART_STM32_PORT_3_IRQ_PRI ST_STM32_USART_40004800_IRQ_0_PRIORITY +#define PORT_3_IRQ ST_STM32_USART_40004800_IRQ_0 + +#define CONFIG_UART_STM32_PORT_4_BASE_ADDRESS ST_STM32_USART_40004C00_BASE_ADDRESS +#define CONFIG_UART_STM32_PORT_4_BAUD_RATE ST_STM32_USART_40004C00_CURRENT_SPEED +#define CONFIG_UART_STM32_PORT_4_IRQ_PRI ST_STM32_USART_40004C00_IRQ_0_PRIORITY +#define PORT_4_IRQ ST_STM32_USART_40004C00_IRQ_0 + +#define CONFIG_UART_STM32_PORT_5_BASE_ADDRESS ST_STM32_USART_40005000_BASE_ADDRESS +#define CONFIG_UART_STM32_PORT_5_BAUD_RATE ST_STM32_USART_40005000_CURRENT_SPEED +#define CONFIG_UART_STM32_PORT_5_IRQ_PRI ST_STM32_USART_40005000_IRQ_0_PRIORITY +#define PORT_5_IRQ ST_STM32_USART_40005000_IRQ_0 diff --git a/scripts/sanity_chk/arches/arm.ini b/scripts/sanity_chk/arches/arm.ini index 2b675ddff54..866e33f67a1 100644 --- a/scripts/sanity_chk/arches/arm.ini +++ b/scripts/sanity_chk/arches/arm.ini @@ -8,7 +8,7 @@ platforms = qemu_cortex_m3 frdm_k64f arduino_due nucleo_f103rb stm32_mini_a15 stm3210c_eval nucleo_f334r8 stm32373c_eval mps2_an385 frdm_kw41z sam_e70_xplained curie_ble nrf52_blenano2 hexiwear_kw40z cc3220sf_launchxl frdm_kl25z disco_l475_iot1 nucleo_l432kc - nucleo_f413zh + nucleo_f413zh stm32l496g_disco supported_toolchains = zephyr gccarmemb