Browse Source

boards: quail: MikroBUS

boards: mikroe: Add quail board

Signed-off-by: Oleg Kokorin <ole2mail@mail.com>
pull/89404/head
Oleg Kokorin 2 months ago committed by Benjamin Cabé
parent
commit
7b7b0de6d6
  1. 10
      boards/mikroe/quail/Kconfig.defconfig
  2. 5
      boards/mikroe/quail/Kconfig.mikroe_quail
  3. 7
      boards/mikroe/quail/board.cmake
  4. 6
      boards/mikroe/quail/board.yml
  5. BIN
      boards/mikroe/quail/doc/img/mikroe_quail.webp
  6. 99
      boards/mikroe/quail/doc/mikroe_quail.rst
  7. 374
      boards/mikroe/quail/mikroe_quail.dts
  8. 17
      boards/mikroe/quail/mikroe_quail.yaml
  9. 11
      boards/mikroe/quail/mikroe_quail_defconfig
  10. 18
      tests/drivers/flash/common/boards/mikroe_quail.overlay

10
boards/mikroe/quail/Kconfig.defconfig

@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
# MikroE Quail board configuration
# Copyright (c) 2025 ThoseBoards
# SPDX-License-Identifier: Apache-2.0
source "boards/common/usb/Kconfig.cdc_acm_serial.defconfig"
config SPI_STM32_INTERRUPT
default y
depends on SPI

5
boards/mikroe/quail/Kconfig.mikroe_quail

@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
# Copyright (c) 2025 ThoseBoards
# SPDX-License-Identifier: Apache-2.0
config BOARD_MIKROE_QUAIL
select SOC_STM32F427XX

7
boards/mikroe/quail/board.cmake

@ -0,0 +1,7 @@ @@ -0,0 +1,7 @@
# SPDX-License-Identifier: Apache-2.0
board_runner_args(dfu-util "--pid=0483:df11" "--alt=0" "--dfuse")
board_runner_args(jlink "--device=STM32F427VIT6" "--speed=4000")
include(${ZEPHYR_BASE}/boards/common/dfu-util.board.cmake)
include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake)

6
boards/mikroe/quail/board.yml

@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
board:
name: mikroe_quail
full_name: MikroE Quail
vendor: mikroe
socs:
- name: stm32f427xx

BIN
boards/mikroe/quail/doc/img/mikroe_quail.webp

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

99
boards/mikroe/quail/doc/mikroe_quail.rst

@ -0,0 +1,99 @@ @@ -0,0 +1,99 @@
.. zephyr:board:: mikroe_quail
Overview
********
MikroE Quail for STM32 is a development board containing an `STM32F427`_
microcontroller. It is equipped with four mikroBUS sockets.
The edges of the board are lined with screw terminals and USB ports for
additional connectivity.
Hardware
********
The Quail board contains the following connections:
- Four mikroBUS connectors
- 32 screw terminals
- two USB ports, one for programming and one for external storage
Furthermore the board contains three LEDs that are connected
to the microcontroller.
Supported Features
==================
.. zephyr:board-supported-hw::
Connections and IOs
===================
The four mikroBUS interfaces are aliased in the device tree so that their
peripherals can be accessed using ``mikrobus_N_INTERFACE`` so e.g. the SPI on
bus 2 can be found by the alias ``mikrobus_2_spi``. The numbering corresponds
with the marking on the board.
For connections on the edge connectors, please refer to `Quail for STM32 User Manual`_.
Programming and Debugging
*************************
.. zephyr:board-supported-runners::
Applications for the ``mikroe_quail`` board can be built and flashed in the usual way
(see :ref:`build_an_application` and :ref:`application_run` for more details).
Flashing
========
The board ships with a locked flash, and will fail with the message:
.. code-block:: console
Error: stm32x device protected
Unlocking with OpenOCD makes it possible to flash.
.. code-block:: console
$ openocd -f /usr/share/openocd/scripts/interface/stlink-v2.cfg \
-f /usr/share/openocd/scripts/target/stm32f4x.cfg -c init\
-c "reset halt" -c "stm32f4x unlock 0" -c "reset run" -c shutdown
Here is an example for the :zephyr:code-sample:`hello_world` application.
.. zephyr-app-commands::
:zephyr-app: samples/hello_world
:board: mikroe_quail
:goals: build flash
You should see the following message on the console:
.. code-block:: console
Hello World! mikroe_quail
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: mikroe_quail
:maybe-skip-config:
:goals: debug
References
**********
.. target-notes::
.. _Quail website:
https://www.mikroe.com/quail
.. _Quail for STM32 User Manual:
https://download.mikroe.com/documents/starter-boards/other/quail/quail-board-manual-v100.pdf
.. _STM32F427VIT6 Website:
https://www.st.com/en/microcontrollers-microprocessors/stm32f427vi.html
.. _STM32F427:
https://www.st.com/resource/en/datasheet/stm32f427vg.pdf

374
boards/mikroe/quail/mikroe_quail.dts

@ -0,0 +1,374 @@ @@ -0,0 +1,374 @@
/*
* Copyright (c) 2025 ThoseBoards
*
* SPDX-License-Identifier: Apache-2.0
*/
/dts-v1/;
#include <st/f4/stm32f427vi.dtsi>
#include <st/f4/stm32f427v(g-i)tx-pinctrl.dtsi>
#include <zephyr/dt-bindings/input/input-event-codes.h>
/ {
model = "MikroE Quail for STM32";
compatible = "mikroe,stm32-e427", "st,stm32f427";
chosen {
zephyr,sram = &sram0;
zephyr,flash = &flash0;
zephyr,flash-controller = &flash1;
zephyr,ccm = &ccm0;
};
leds {
compatible = "gpio-leds";
ld1: led_1 {
gpios = <&gpioe 15 GPIO_ACTIVE_HIGH>;
label = "User LD1";
};
ld2: led_2 {
gpios = <&gpioe 10 GPIO_ACTIVE_HIGH>;
label = "User LD2";
};
ld3: led_3 {
gpios = <&gpioc 3 GPIO_ACTIVE_HIGH>;
label = "User LD3";
};
};
zephyr,user {
io-channels = <&adc1 0>, <&adc1 1>, <&adc2 0>, <&adc2 1>;
};
mikrobus_1_header: mikrobus-connector-1 {
compatible = "mikro-bus";
#gpio-cells = <2>;
gpio-map-mask = <0xffffffff 0xffffffc0>;
gpio-map-pass-thru = <0 0x3f>;
gpio-map = <0 0 &gpioa 6 0>, /* AN */
<1 0 &gpioa 2 0>, /* RST */
<2 0 &gpioa 3 0>, /* CS */
<3 0 &gpiob 3 0>, /* SCK */
<4 0 &gpiob 4 0>, /* MISO */
<5 0 &gpiob 5 0>, /* MOSI */
/* +3.3V */
/* GND */
<6 0 &gpioe 9 0>, /* PWM */
<7 0 &gpioa 1 0>, /* INT */
<8 0 &gpiod 9 0>, /* RX */
<9 0 &gpiod 8 0>, /* TX */
<10 0 &gpiob 6 0>, /* SCL */
<11 0 &gpiob 7 0>; /* SDA */
/* +5V */
/* GND */
};
mikrobus_2_header: mikrobus-connector-2 {
compatible = "mikro-bus";
#gpio-cells = <2>;
gpio-map-mask = <0xffffffff 0xffffffc0>;
gpio-map-pass-thru = <0 0x3f>;
gpio-map = <0 0 &gpioa 4 0>, /* AN */
<1 0 &gpioe 1 0>, /* RST */
<2 0 &gpioe 0 0>, /* CS */
<3 0 &gpiob 3 0>, /* SCK */
<4 0 &gpiob 4 0>, /* MISO */
<5 0 &gpiob 5 0>, /* MOSI */
/* +3.3V */
/* GND */
<6 0 &gpiod 15 0>, /* PWM */
<7 0 &gpiob 9 0>, /* INT */
<8 0 &gpiod 6 0>, /* RX */
<9 0 &gpiod 5 0>, /* TX */
<10 0 &gpiob 6 0>, /* SCL */
<11 0 &gpiob 7 0>; /* SDA */
/* +5V */
/* GND */
};
mikrobus_3_header: mikrobus-connector-3 {
compatible = "mikro-bus";
#gpio-cells = <2>;
gpio-map-mask = <0xffffffff 0xffffffc0>;
gpio-map-pass-thru = <0 0x3f>;
gpio-map = <0 0 &gpioa 7 0>, /* AN */
<1 0 &gpiod 8 0>, /* RST */
<2 0 &gpiod 11 0>, /* CS */
<3 0 &gpioc 10 0>, /* SCK */
<4 0 &gpioc 11 0>, /* MISO */
<5 0 &gpioc 12 0>, /* MOSI */
/* +3.3V */
/* GND */
<6 0 &gpiod 13 0>, /* PWM */
<7 0 &gpioc 8 0>, /* INT */
<8 0 &gpioc 7 0>, /* RX */
<9 0 &gpioc 6 0>, /* TX */
<10 0 &gpiob 6 0>, /* SCL */
<11 0 &gpiob 7 0>; /* SDA */
/* +5V */
/* GND */
};
mikrobus_4_header: mikrobus-connector-4 {
compatible = "mikro-bus";
#gpio-cells = <2>;
gpio-map-mask = <0xffffffff 0xffffffc0>;
gpio-map-pass-thru = <0 0x3f>;
gpio-map = <0 0 &gpioa 5 0>, /* AN */
<1 0 &gpiod 0 0>, /* RST */
<2 0 &gpiod 1 0>, /* CS */
<3 0 &gpioc 10 0>, /* SCK */
<4 0 &gpioc 11 0>, /* MISO */
<5 0 &gpioc 12 0>, /* MOSI */
/* +3.3V */
/* GND */
<6 0 &gpiod 14 0>, /* PWM */
<7 0 &gpioa 14 0>, /* INT */
<8 0 &gpioa 10 0>, /* RX */
<9 0 &gpioa 9 0>, /* TX */
<10 0 &gpiob 6 0>, /* SCL */
<11 0 &gpiob 7 0>; /* SDA */
/* +5V */
/* GND */
};
edge_header: connector {
#gpio-cells = <2>;
gpio-map-mask = <0xffffffff 0xffffffc0>;
gpio-map-pass-thru = <0 0x3f>;
gpio-map = <0 0 &gpioc 5 0>, /* ,PC5 */
<1 0 &gpiob 0 0>, /* ,PB0 */
<2 0 &gpioe 7 0>, /* ,PE7 */
<3 0 &gpioe 8 0>, /* ,PE8 */
<4 0 &gpioe 11 0>, /* ,PE11 */
<5 0 &gpioc 4 0>, /* ,PC4 */
<6 0 &gpioe 13 0>, /* ,PE13 */
<7 0 &gpioe 14 0>, /* ,PE14 */
<8 0 &gpiob 10 0>, /* ,PB10 */
<9 0 &gpiob 11 0>, /* ,PB11 */
<10 0 &gpiob 12 0>, /* ,PB12 */
<11 0 &gpiob 13 0>, /* ,PB13 */
<12 0 &gpiob 6 0>, /* ,PB6 # I2C1 */
<13 0 &gpiob 7 0>, /* ,PB7 # I2C1 */
<14 0 &gpioc 10 0>, /* ,PC10 # SPI3 */
<15 0 &gpioc 11 0>, /* ,PC11 # SPI3 */
<16 0 &gpioc 12 0>, /* ,PC12 # SPI3 */
<17 0 &gpiod 10 0>, /* ,PD10 # SPI3 */
<18 0 &gpioa 15 0>, /* ,PA15 */
<19 0 &gpioc 13 0>, /* ,PC13 */
<20 0 &gpioe 6 0>, /* ,PE6 */
<21 0 &gpioe 5 0>, /* ,PE5 */
<22 0 &gpiod 2 0>, /* ,PD2 */
<23 0 &gpiod 3 0>, /* ,PD3 */
<24 0 &gpiod 4 0>, /* ,PD4 */
<25 0 &gpiod 7 0>, /* ,PD7 */
<26 0 &gpioe 2 0>, /* ,PE2 */
<27 0 &gpioe 3 0>, /* ,PE3 */
<28 0 &gpioe 4 0>; /* ,PE4 */
};
aliases {
led0 = &ld1;
led1 = &ld2;
led2 = &ld3;
volt-sensor0 = &vref;
volt-sensor1 = &vbat;
};
skd1: socket_1_adc {
status = "okay";
io-channels = <&adc2 0>;
};
skd2: socket_2_adc {
status = "okay";
io-channels = <&adc1 0>;
};
skd3: socket_3_adc {
status = "okay";
io-channels = <&adc2 1>;
};
skd4: socket_4_adc {
status = "okay";
io-channels = <&adc1 1>;
};
};
&clk_lsi {
status = "okay";
};
&clk_hsi {
clock-frequency = <DT_FREQ_M(16)>;
status = "okay";
};
&pll {
div-m = <8>;
mul-n = <96>;
div-p = <2>;
div-q = <4>;
clocks = <&clk_hsi>;
status = "okay";
};
&rcc {
clocks = <&pll>;
clock-frequency = <DT_FREQ_M(96)>;
ahb-prescaler = <1>;
apb1-prescaler = <4>;
apb2-prescaler = <2>;
};
&usart1 {
pinctrl-0 = <&usart1_tx_pa9 &usart1_rx_pa10>;
pinctrl-names = "default";
current-speed = <115200>;
status = "okay";
};
&usart2 {
pinctrl-0 = <&usart2_tx_pd5 &usart2_rx_pd6>;
pinctrl-names = "default";
current-speed = <115200>;
status = "okay";
};
&usart3 {
pinctrl-0 = <&usart3_tx_pd8 &usart3_rx_pd9>;
pinctrl-names = "default";
current-speed = <115200>;
status = "okay";
};
&usart6 {
pinctrl-0 = <&usart6_tx_pc6 &usart6_rx_pc7>;
pinctrl-names = "default";
current-speed = <115200>;
status = "okay";
};
&rtc {
clocks = <&rcc STM32_CLOCK_BUS_APB1 0x10000000>,
<&rcc STM32_SRC_LSI RTC_SEL(2)>;
status = "okay";
};
zephyr_udc0: &usbotg_fs {
pinctrl-0 = <&usb_otg_fs_dm_pa11 &usb_otg_fs_dp_pa12>;
pinctrl-names = "default";
status = "okay";
};
#include <../boards/common/usb/cdc_acm_serial.dtsi>
&spi1 {
pinctrl-0 = <&spi1_sck_pb3 &spi1_miso_pb4 &spi1_mosi_pb5>;
pinctrl-names = "default";
cs-gpios = <&gpioa 3 GPIO_ACTIVE_LOW>, <&gpioe 0 GPIO_ACTIVE_LOW>;
status = "okay";
};
&spi3 {
status = "okay";
pinctrl-0 = <&spi3_sck_pc10 &spi3_miso_pc11 &spi3_mosi_pc12>;
pinctrl-names = "default";
cs-gpios =
<&gpiod 11 GPIO_ACTIVE_LOW>, // CS0
<&gpiod 1 GPIO_ACTIVE_LOW>, // CS1
<&gpioa 13 GPIO_ACTIVE_LOW>; // CS2
};
/* Flash chip 1 (extra flash connected to CS2) */
&spi3 {
flash1: flash@2 {
compatible = "jedec,spi-nor"; // Typical flash chip compatibility string
reg = <2>; // The CS0 pin on the SPI bus
// S25FL164K flash's actual JEDEC: Device ID = 16h, Device Type = 40h,
// Capacity = 17h
//jedec-id = [16 40 17];
jedec-id = [01 60 17];
spi-max-frequency = <50000000>; // Max frequency for the flash chip (e.g., 50 MHz)
size = <0x800000>; // Flash memory size (16MB example)
page-size = <256>; // Flash page size (usually 256 or 512 bytes)
status = "okay";
};
};
&i2c1 {
pinctrl-0 = <&i2c1_scl_pb6 &i2c1_sda_pb7>;
pinctrl-names = "default";
status = "okay";
};
&adc1 {
status ="okay";
pinctrl-0 = <&adc1_in4_pa4 &adc1_in5_pa5>;
pinctrl-names = "default";
st,adc-clock-source = "SYNC";
st,adc-prescaler = <2>;
};
&adc2 {
status ="okay";
pinctrl-0 = <&adc2_in6_pa6 &adc2_in7_pa7>;
pinctrl-names = "default";
st,adc-clock-source = "SYNC";
st,adc-prescaler = <2>;
};
&vref {
status = "okay";
};
&vbat {
status = "okay";
};
mikrobus_1_adc: &skd1 {};
mikrobus_1_i2c: &i2c1 {};
mikrobus_1_spi: &spi1 {};
mikrobus_1_uart: &usart3 {};
mikrobus_2_adc: &skd2 {};
mikrobus_2_i2c: &i2c1 {};
mikrobus_2_spi: &spi1 {};
mikrobus_2_uart: &usart2 {};
mikrobus_3_adc: &skd3 {};
mikrobus_3_i2c: &i2c1 {};
mikrobus_3_spi: &spi3 {};
mikrobus_3_uart: &usart6 {};
mikrobus_4_adc: &skd4 {};
mikrobus_4_i2c: &i2c1 {};
mikrobus_4_spi: &spi3 {};
mikrobus_4_uart: &usart1 {};
mikrobus_adc: &skd1 {};
mikrobus_i2c: &i2c1 {};
mikrobus_spi: &spi1 {};
mikrobus_uart: &usart3 {};
mikrobus_header: &mikrobus_1_header {};

17
boards/mikroe/quail/mikroe_quail.yaml

@ -0,0 +1,17 @@ @@ -0,0 +1,17 @@
identifier: mikroe_quail
name: MikroE Quail for STM32
type: mcu
arch: arm
toolchain:
- zephyr
- gnuarmemb
ram: 256
flash: 2048
supported:
- spi
- i2c
- uart
- adc
- gpio
- flash
vendor: mikroe

11
boards/mikroe/quail/mikroe_quail_defconfig

@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
# Enable MPU
CONFIG_ARM_MPU=y
CONFIG_SERIAL=y
# Console
CONFIG_CONSOLE=y
CONFIG_UART_CONSOLE=y
# Enable GPIO
CONFIG_GPIO=y

18
tests/drivers/flash/common/boards/mikroe_quail.overlay

@ -0,0 +1,18 @@ @@ -0,0 +1,18 @@
/*
* Copyright (c) 2025 STMicroelectronics
* SPDX-License-Identifier: Apache-2.0
*/
&flash0 {
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
/* Set last blocks of the code flash as storage partition */
storage_partition: partition@1e0000 {
label = "storage";
reg = <0x1e000 DT_SIZE_K(8)>;
};
};
};
Loading…
Cancel
Save