From f7705af136a190b5763aab38c0e53698c83ccda8 Mon Sep 17 00:00:00 2001 From: Siddharth Chandrasekaran Date: Sun, 21 May 2017 18:22:30 +0530 Subject: [PATCH] boards: arm: Add support for STM32 Minimum Development Board Add configuration, documentation, pinmux, fixup and dts support for STM32F103x8 based Minimum System Development board. Signed-off-by: Siddharth Chandrasekaran --- .../stm32f1/Kconfig.defconfig.stm32f103xx | 2 +- boards/arm/stm32_min_dev/Kconfig.board | 9 ++ boards/arm/stm32_min_dev/Kconfig.defconfig | 13 ++ boards/arm/stm32_min_dev/Makefile | 2 + boards/arm/stm32_min_dev/Makefile.board | 7 ++ boards/arm/stm32_min_dev/board.h | 16 +++ .../stm32_min_dev/doc/img/stm32_min_dev.jpg | Bin 0 -> 38172 bytes .../arm/stm32_min_dev/doc/stm32_min_dev.rst | 114 ++++++++++++++++++ boards/arm/stm32_min_dev/stm32_min_dev.yaml | 8 ++ .../arm/stm32_min_dev/stm32_min_dev_defconfig | 49 ++++++++ boards/arm/stm32_min_dev/support/openocd.cfg | 17 +++ drivers/pinmux/Makefile | 1 + .../pinmux/stm32/pinmux_board_stm32_min_dev.c | 41 +++++++ dts/arm/Makefile | 2 + dts/arm/stm32_min_dev.dts | 24 ++++ dts/arm/stm32_min_dev.fixup | 26 ++++ 16 files changed, 330 insertions(+), 1 deletion(-) create mode 100644 boards/arm/stm32_min_dev/Kconfig.board create mode 100644 boards/arm/stm32_min_dev/Kconfig.defconfig create mode 100644 boards/arm/stm32_min_dev/Makefile create mode 100644 boards/arm/stm32_min_dev/Makefile.board create mode 100644 boards/arm/stm32_min_dev/board.h create mode 100644 boards/arm/stm32_min_dev/doc/img/stm32_min_dev.jpg create mode 100644 boards/arm/stm32_min_dev/doc/stm32_min_dev.rst create mode 100644 boards/arm/stm32_min_dev/stm32_min_dev.yaml create mode 100644 boards/arm/stm32_min_dev/stm32_min_dev_defconfig create mode 100644 boards/arm/stm32_min_dev/support/openocd.cfg create mode 100644 drivers/pinmux/stm32/pinmux_board_stm32_min_dev.c create mode 100644 dts/arm/stm32_min_dev.dts create mode 100644 dts/arm/stm32_min_dev.fixup diff --git a/arch/arm/soc/st_stm32/stm32f1/Kconfig.defconfig.stm32f103xx b/arch/arm/soc/st_stm32/stm32f1/Kconfig.defconfig.stm32f103xx index 64c33cabf78..b9922eb0dd6 100644 --- a/arch/arm/soc/st_stm32/stm32f1/Kconfig.defconfig.stm32f103xx +++ b/arch/arm/soc/st_stm32/stm32f1/Kconfig.defconfig.stm32f103xx @@ -1,4 +1,4 @@ -# Kconfig - ST Microelectronics STM32F103RB MCU +# Kconfig - ST Microelectronics STM32F103XX MCU # # Copyright (c) 2017, embedjournal.com # diff --git a/boards/arm/stm32_min_dev/Kconfig.board b/boards/arm/stm32_min_dev/Kconfig.board new file mode 100644 index 00000000000..060230a145a --- /dev/null +++ b/boards/arm/stm32_min_dev/Kconfig.board @@ -0,0 +1,9 @@ +# Kconfig - STM32 Minimum Development Board Configuration +# +# Copyright (c) 2017, embedjournal.com +# +# SPDX-License-Identifier: Apache-2.0 +# +config BOARD_STM32_MIN_DEV + bool "STM32 Minimum Development Board" + depends on SOC_STM32F103X8 diff --git a/boards/arm/stm32_min_dev/Kconfig.defconfig b/boards/arm/stm32_min_dev/Kconfig.defconfig new file mode 100644 index 00000000000..61a240fdc83 --- /dev/null +++ b/boards/arm/stm32_min_dev/Kconfig.defconfig @@ -0,0 +1,13 @@ +# Kconfig - STM32 Minimum Development Board Configuration +# +# Copyright (c) 2017, embedjournal.com +# +# SPDX-License-Identifier: Apache-2.0 +# + +if BOARD_STM32_MIN_DEV + +config BOARD + default stm32_min_dev + +endif # BOARD_STM32_MIN_DEV diff --git a/boards/arm/stm32_min_dev/Makefile b/boards/arm/stm32_min_dev/Makefile new file mode 100644 index 00000000000..c925263c43a --- /dev/null +++ b/boards/arm/stm32_min_dev/Makefile @@ -0,0 +1,2 @@ +# No C files (yet) +obj- += dummy.o diff --git a/boards/arm/stm32_min_dev/Makefile.board b/boards/arm/stm32_min_dev/Makefile.board new file mode 100644 index 00000000000..e47333183d6 --- /dev/null +++ b/boards/arm/stm32_min_dev/Makefile.board @@ -0,0 +1,7 @@ +FLASH_SCRIPT = openocd.sh +DEBUG_SCRIPT = openocd.sh + +OPENOCD_LOAD_CMD = "flash write_image erase ${O}/${KERNEL_BIN_NAME} ${CONFIG_FLASH_BASE_ADDRESS}" +OPENOCD_VERIFY_CMD = "verify_image ${O}/${KERNEL_BIN_NAME} ${CONFIG_FLASH_BASE_ADDRESS}" + +export FLASH_SCRIPT OPENOCD_LOAD_CMD OPENOCD_VERIFY_CMD diff --git a/boards/arm/stm32_min_dev/board.h b/boards/arm/stm32_min_dev/board.h new file mode 100644 index 00000000000..7734557eefb --- /dev/null +++ b/boards/arm/stm32_min_dev/board.h @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2017, embedjournal.com + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifndef __INC_BOARD_H +#define __INC_BOARD_H + +#include + +/* On board LED */ +#define LED0_GPIO_PORT "GPIOB" +#define LED0_GPIO_PIN 12 + +#endif /* __INC_BOARD_H */ diff --git a/boards/arm/stm32_min_dev/doc/img/stm32_min_dev.jpg b/boards/arm/stm32_min_dev/doc/img/stm32_min_dev.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f9b10b163f5635c2c8f7a12ca3e7d6c2ae2bbebe GIT binary patch literal 38172 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 literal 0 HcmV?d00001 diff --git a/boards/arm/stm32_min_dev/doc/stm32_min_dev.rst b/boards/arm/stm32_min_dev/doc/stm32_min_dev.rst new file mode 100644 index 00000000000..78ef75e18b4 --- /dev/null +++ b/boards/arm/stm32_min_dev/doc/stm32_min_dev.rst @@ -0,0 +1,114 @@ +.. _stm32_min_dev: + +STM32 Minimum Development Board +############################### + +Overview +******** + +The STM32 Minimum Development Board, is a popular and inexpensive +breadboard-friendly breakout board for the `STM32F103x8`_ CPU. Zephyr +applications use the stm32_min_dev board configuration to run on these boards. + +.. figure:: img/stm32_min_dev.jpg + :width: 500px + :align: center + :height: 350px + :alt: STM32 Minimum Development Board + + STM32 Minimum Development Board + +As the name suggests, these boards have the bare minimum components required to +power on the CPU. For practical use, you'll need to add additional components +and circuits using a breadboard, for example. + +Pin Mapping +=========== + +This port is a starting point for your own customizations and not a complete +port for a specific board. Most of the GPIOs on the STM32 SoC has been exposed +in the external header with silk screen labels that match the SoC's pin names. + +Each board vendor has their own variations in pin mapping on their boards' +external connectors and placement of components. Many vendors use port PB12 for +connecting an LED, so only this device is supported by our Zephyr port. +Additional device support is left for the user to implement. + +More information on hooking up peripherals and lengthy how to articles can be +found at `EmbedJoural`_. + +STLinkV2 connection: +==================== + +The board can be flashed by using STLinkV2 with the following connections. + ++------------------------+ +| Pin | STLINKv2 | ++========+===============| +| G | GND | +| CLK | Clock | +| IO | SW IO | +| V3 | VCC | ++--------+---------------+ + +Boot Configuration +================== + +The boot configuration for this board is configured through jumpers on B0 (Boot 0) +and B1 (Boot 1). The pins B0 and B1 are present in between logic 0 and 1 lines. The +silk screen on the PCB reads BX- or BX+ to indicate 0 and 1 logic lines for B0 and B1 +respectively. + ++-----------------------------------------------------------------------------------+ +| Boot 1 | Boot 0 | Boot Mode | Aliasing | ++========+========+===================+=============================================+ +| X | 0 | Main Flash Memory | Main flash memory is selected as boot space | +| 0 | 1 | System Memory | System memory is selected as boot space | +| 1 | 1 | Embedded SRAM | Embedded SRAM is selected as boot space | ++--------+--------+-------------------+---------------------------------------------+ + + +Supported Features +================== + +The on board 8Mhz crystal is used to produce a 72Mhz system clock with PLL. +The stm32_min_dev board configuration supports the following hardware features: + ++-----------+------------+----------------------+ +| Interface | Controller | Driver/Component | ++===========+============+======================+ +| NVIC | on-chip | nested vectored | +| | | interrupt controller | ++-----------+------------+----------------------+ +| SYSTICK | on-chip | system clock | ++-----------+------------+----------------------+ +| UART | on-chip | serial port | ++-----------+------------+----------------------+ +| GPIO | on-chip | gpio | ++-----------+------------+----------------------+ + +Other hardware features are not supported by the Zephyr kernel. + +Building and Flashing Zephyr onto stm32_min_dev +*********************************************** + +You can build any of the Zephyr samples with, + + .. code-block:: console + + $ cd $ + $ source zephyr-env.sh + $ make -C samples/basic/blinky BOARD=stm32_min_dev + +Flashing the Zephyr kernel onto stm32_min_dev requires the popular ST-Link +debugger/programmer. This port comes with support for doing just that with the +flash target. + + .. code-block:: console + + $ make -C samples/basic/blinky BOARD=stm32_min_dev flash + +.. _STM32F103x8: + http://www.st.com/resource/en/datasheet/stm32f103c8.pdf +.. _EmbedJournal: + https://embedjournal.com/tag/stm32-min-dev/ diff --git a/boards/arm/stm32_min_dev/stm32_min_dev.yaml b/boards/arm/stm32_min_dev/stm32_min_dev.yaml new file mode 100644 index 00000000000..1337ea07d53 --- /dev/null +++ b/boards/arm/stm32_min_dev/stm32_min_dev.yaml @@ -0,0 +1,8 @@ +identifier: stm32_min_dev +name: STM32-MIN-DEV +type: mcu +arch: arm +toolchain: + - zephyr + - gccarmemb +ram: 20 diff --git a/boards/arm/stm32_min_dev/stm32_min_dev_defconfig b/boards/arm/stm32_min_dev/stm32_min_dev_defconfig new file mode 100644 index 00000000000..d2dd7ddca20 --- /dev/null +++ b/boards/arm/stm32_min_dev/stm32_min_dev_defconfig @@ -0,0 +1,49 @@ +CONFIG_ARM=y +CONFIG_BOARD_STM32_MIN_DEV=y +CONFIG_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32F1X=y +CONFIG_SOC_STM32F103X8=y +CONFIG_CORTEX_M_SYSTICK=y + +# 72MHz system clock +CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=72000000 + +# enable uart driver +CONFIG_SERIAL=y +CONFIG_UART_STM32=y + +# enable USART1 +CONFIG_UART_STM32_PORT_1=y + +# enable console on this port by default +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y +CONFIG_UART_CONSOLE_ON_DEV_NAME="UART_1" + +# enable pinmux +CONFIG_PINMUX=y +CONFIG_PINMUX_STM32=y + +# enable GPIO ports A, B +CONFIG_GPIO=y +CONFIG_GPIO_STM32=y +CONFIG_GPIO_STM32_PORTA=y +CONFIG_GPIO_STM32_PORTB=y +CONFIG_GPIO_STM32_PORTC=n +CONFIG_GPIO_STM32_PORTD=n + +# clock configuration +CONFIG_CLOCK_CONTROL=y +CONFIG_CLOCK_STM32_HSE_CLOCK=8000000 +CONFIG_CLOCK_STM32_SYSCLK_SRC_PLL=y + +# use HSE as PLL input +CONFIG_CLOCK_STM32_PLL_SRC_HSE=y +# produce 72MHz clock at PLL output +CONFIG_CLOCK_STM32_PLL_XTPRE=n +CONFIG_CLOCK_STM32_PLL_MULTIPLIER=9 +CONFIG_CLOCK_STM32_AHB_PRESCALER=1 + +# APB1 clock must not exceed 36MHz limit +CONFIG_CLOCK_STM32_APB1_PRESCALER=2 +CONFIG_CLOCK_STM32_APB2_PRESCALER=0 diff --git a/boards/arm/stm32_min_dev/support/openocd.cfg b/boards/arm/stm32_min_dev/support/openocd.cfg new file mode 100644 index 00000000000..b27b059fc65 --- /dev/null +++ b/boards/arm/stm32_min_dev/support/openocd.cfg @@ -0,0 +1,17 @@ +source [find interface/stlink-v2.cfg] + +# Work-area size (RAM size) = 20kB +set WORKAREASIZE 0x5000 + +source [find target/stm32f1x.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 +} diff --git a/drivers/pinmux/Makefile b/drivers/pinmux/Makefile index 2d5c2ebdf7e..de7123025e1 100644 --- a/drivers/pinmux/Makefile +++ b/drivers/pinmux/Makefile @@ -23,6 +23,7 @@ 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_BOARD_STM32_MIN_DEV) += stm32/pinmux_board_stm32_min_dev.o obj-$(CONFIG_PINMUX_QMSI) += pinmux_qmsi.o obj-$(CONFIG_PINMUX_FE310) += pinmux_fe310.o obj-$(CONFIG_PINMUX_CC2650) += pinmux_cc2650.o diff --git a/drivers/pinmux/stm32/pinmux_board_stm32_min_dev.c b/drivers/pinmux/stm32/pinmux_board_stm32_min_dev.c new file mode 100644 index 00000000000..ddd6060bb59 --- /dev/null +++ b/drivers/pinmux/stm32/pinmux_board_stm32_min_dev.c @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2017, embedjournal.com + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include +#include "pinmux/pinmux.h" + +#include "pinmux_stm32.h" + +/* pin assignments for STM32_MIN_DEV board */ +static const struct pin_config pinconf[] = { +#ifdef CONFIG_UART_STM32_PORT_1 + {STM32_PIN_PA9, STM32F1_PINMUX_FUNC_PA9_USART1_TX}, + {STM32_PIN_PA10, STM32F1_PINMUX_FUNC_PA10_USART1_RX}, +#endif /* CONFIG_UART_STM32_PORT_1 */ +#ifdef CONFIG_UART_STM32_PORT_2 + {STM32_PIN_PA2, STM32F1_PINMUX_FUNC_PA2_USART2_TX}, + {STM32_PIN_PA3, STM32F1_PINMUX_FUNC_PA3_USART2_RX}, +#endif /* CONFIG_UART_STM32_PORT_2 */ +#ifdef CONFIG_UART_STM32_PORT_3 + {STM32_PIN_PB10, STM32F1_PINMUX_FUNC_PB10_USART3_TX}, + {STM32_PIN_PB11, STM32F1_PINMUX_FUNC_PB11_USART3_RX}, +#endif /* CONFIG_UART_STM32_PORT_3 */ +}; + +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 f84c23bb680..d9d83502a32 100644 --- a/dts/arm/Makefile +++ b/dts/arm/Makefile @@ -42,5 +42,7 @@ dtb-$(CONFIG_BOARD_ARDUINO_DUE) = arduino_due.dts_compiled dtb-$(CONFIG_BOARD_SAM4S_XPLAINED) = sam4s_xplained.dts_compiled dtb-$(CONFIG_BOARD_OLIMEX_STM32_E407) = olimex_stm32_e407.dts_compiled dtb-$(CONFIG_BOARD_CC2650_SENSORTAG) = cc2650_sensortag.dts_compiled +dtb-$(CONFIG_BOARD_STM32_MIN_DEV) = stm32_min_dev.dts_compiled + always := $(dtb-y) endif diff --git a/dts/arm/stm32_min_dev.dts b/dts/arm/stm32_min_dev.dts new file mode 100644 index 00000000000..2db69f237e6 --- /dev/null +++ b/dts/arm/stm32_min_dev.dts @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2017, embedjournal.com + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; +#include + +/ { + model = "STM32 Minimum Development Board"; + compatible = "st,stm32_min_dev", "st,stm32f103rb"; + + chosen { + zephyr,console = &usart1; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + }; +}; + +&usart1 { + current-speed = <115200>; + status = "ok"; +}; diff --git a/dts/arm/stm32_min_dev.fixup b/dts/arm/stm32_min_dev.fixup new file mode 100644 index 00000000000..376eaaf9ee7 --- /dev/null +++ b/dts/arm/stm32_min_dev.fixup @@ -0,0 +1,26 @@ +/* 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 CONFIG_UART_STM32_PORT_1_NAME ST_STM32_USART_40013800_LABEL +#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 CONFIG_UART_STM32_PORT_2_NAME ST_STM32_USART_40004400_LABEL +#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 CONFIG_UART_STM32_PORT_3_NAME ST_STM32_USART_40004800_LABEL +#define PORT_3_IRQ ST_STM32_USART_40004800_IRQ_0