From fab0e506bed244228e4e7f3d8dbeb471557d97c4 Mon Sep 17 00:00:00 2001
From: Misthao <71510503+ZangCHSHub@users.noreply.github.com>
Date: Mon, 6 Mar 2023 10:09:03 +0800
Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9Estm32f401-weact-blackpill=20B?=
=?UTF-8?q?SP=EF=BC=88STM32F401CCU6=E6=9C=80=E5=B0=8F=E7=B3=BB=E7=BB=9F?=
=?UTF-8?q?=E6=9D=BF=EF=BC=89=20(#6973)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* 新增stm32f401-weact-blackpill
---
.github/workflows/action.yml | 1 +
bsp/stm32/stm32f401-weact-blackpill/.config | 799 +++++
.../stm32f401-weact-blackpill/.gitignore | 42 +
.../EventRecorderStub.scvd | 9 +
bsp/stm32/stm32f401-weact-blackpill/Kconfig | 21 +
bsp/stm32/stm32f401-weact-blackpill/README.md | 111 +
.../stm32f401-weact-blackpill/SConscript | 15 +
.../stm32f401-weact-blackpill/SConstruct | 60 +
.../applications/SConscript | 15 +
.../applications/main.c | 33 +
.../board/CubeMX_Config/.mxproject | 14 +
.../board/CubeMX_Config/CubeMX_Config.ioc | 119 +
.../board/CubeMX_Config/Inc/main.h | 68 +
.../CubeMX_Config/Inc/stm32f4xx_hal_conf.h | 491 +++
.../board/CubeMX_Config/Inc/stm32f4xx_it.h | 66 +
.../board/CubeMX_Config/Src/main.c | 232 ++
.../CubeMX_Config/Src/stm32f4xx_hal_msp.c | 146 +
.../board/CubeMX_Config/Src/stm32f4xx_it.c | 203 ++
.../CubeMX_Config/Src/system_stm32f4xx.c | 747 +++++
.../stm32f401-weact-blackpill/board/Kconfig | 44 +
.../board/SConscript | 37 +
.../stm32f401-weact-blackpill/board/board.c | 53 +
.../stm32f401-weact-blackpill/board/board.h | 50 +
.../board/linker_scripts/link.icf | 28 +
.../board/linker_scripts/link.lds | 157 +
.../board/linker_scripts/link.sct | 15 +
.../figures/board.png | Bin 0 -> 177116 bytes
.../stm32f401-weact-blackpill/project.ewd | 2834 +++++++++++++++++
.../stm32f401-weact-blackpill/project.ewp | 2410 ++++++++++++++
.../stm32f401-weact-blackpill/project.eww | 10 +
.../stm32f401-weact-blackpill/project.uvopt | 162 +
.../stm32f401-weact-blackpill/project.uvoptx | 992 ++++++
.../stm32f401-weact-blackpill/project.uvproj | 1189 +++++++
.../stm32f401-weact-blackpill/project.uvprojx | 744 +++++
.../stm32f401-weact-blackpill/rtconfig.h | 233 ++
.../stm32f401-weact-blackpill/rtconfig.py | 184 ++
.../stm32f401-weact-blackpill/template.ewp | 2031 ++++++++++++
.../stm32f401-weact-blackpill/template.eww | 10 +
.../stm32f401-weact-blackpill/template.uvopt | 162 +
.../stm32f401-weact-blackpill/template.uvoptx | 192 ++
.../stm32f401-weact-blackpill/template.uvproj | 407 +++
.../template.uvprojx | 397 +++
.../EventRecorderStub.scvd | 9 +
43 files changed, 15542 insertions(+)
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/.config
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/.gitignore
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/EventRecorderStub.scvd
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/Kconfig
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/README.md
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/SConscript
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/SConstruct
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/applications/SConscript
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/applications/main.c
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/.mxproject
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/CubeMX_Config.ioc
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Inc/main.h
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Inc/stm32f4xx_it.h
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Src/main.c
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Src/stm32f4xx_it.c
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Src/system_stm32f4xx.c
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/board/Kconfig
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/board/SConscript
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/board/board.c
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/board/board.h
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/board/linker_scripts/link.icf
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/board/linker_scripts/link.lds
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/board/linker_scripts/link.sct
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/figures/board.png
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/project.ewd
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/project.ewp
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/project.eww
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/project.uvopt
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/project.uvoptx
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/project.uvproj
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/project.uvprojx
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/rtconfig.h
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/rtconfig.py
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/template.ewp
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/template.eww
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/template.uvopt
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/template.uvoptx
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/template.uvproj
create mode 100644 bsp/stm32/stm32f401-weact-blackpill/template.uvprojx
create mode 100644 bsp/stm32/stm32f411-weact-blackpill/EventRecorderStub.scvd
diff --git a/.github/workflows/action.yml b/.github/workflows/action.yml
index b2f98fb116..77aee2fdb7 100644
--- a/.github/workflows/action.yml
+++ b/.github/workflows/action.yml
@@ -148,6 +148,7 @@ jobs:
- {RTT_BSP: "stm32/stm32f207-st-nucleo", RTT_TOOL_CHAIN: "sourcery-arm"}
- {RTT_BSP: "stm32/stm32f302-st-nucleo", RTT_TOOL_CHAIN: "sourcery-arm"}
- {RTT_BSP: "stm32/stm32f401-st-nucleo", RTT_TOOL_CHAIN: "sourcery-arm"}
+ - {RTT_BSP: "stm32/stm32f401-weact-blackpill", RTT_TOOL_CHAIN: "sourcery-arm"}
- {RTT_BSP: "stm32/stm32f405-smdz-breadfruit", RTT_TOOL_CHAIN: "sourcery-arm"}
- {RTT_BSP: "stm32/stm32f407-armfly-v5", RTT_TOOL_CHAIN: "sourcery-arm"}
- {RTT_BSP: "stm32/stm32f407-atk-explorer", RTT_TOOL_CHAIN: "sourcery-arm"}
diff --git a/bsp/stm32/stm32f401-weact-blackpill/.config b/bsp/stm32/stm32f401-weact-blackpill/.config
new file mode 100644
index 0000000000..473f801241
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/.config
@@ -0,0 +1,799 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# RT-Thread Configuration
+#
+
+#
+# RT-Thread Kernel
+#
+CONFIG_RT_NAME_MAX=8
+# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_SMP is not set
+CONFIG_RT_ALIGN_SIZE=4
+# CONFIG_RT_THREAD_PRIORITY_8 is not set
+CONFIG_RT_THREAD_PRIORITY_32=y
+# CONFIG_RT_THREAD_PRIORITY_256 is not set
+CONFIG_RT_THREAD_PRIORITY_MAX=32
+CONFIG_RT_TICK_PER_SECOND=1000
+CONFIG_RT_USING_OVERFLOW_CHECK=y
+CONFIG_RT_USING_HOOK=y
+CONFIG_RT_HOOK_USING_FUNC_PTR=y
+CONFIG_RT_USING_IDLE_HOOK=y
+CONFIG_RT_IDLE_HOOK_LIST_SIZE=4
+CONFIG_IDLE_THREAD_STACK_SIZE=256
+# CONFIG_RT_USING_TIMER_SOFT is not set
+
+#
+# kservice optimization
+#
+CONFIG_RT_KSERVICE_USING_STDLIB=y
+# CONFIG_RT_KSERVICE_USING_STDLIB_MEMORY is not set
+# CONFIG_RT_KSERVICE_USING_TINY_SIZE is not set
+# CONFIG_RT_USING_TINY_FFS is not set
+# CONFIG_RT_KPRINTF_USING_LONGLONG is not set
+CONFIG_RT_DEBUG=y
+CONFIG_RT_DEBUG_COLOR=y
+# CONFIG_RT_DEBUG_INIT_CONFIG is not set
+# CONFIG_RT_DEBUG_THREAD_CONFIG is not set
+# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set
+# CONFIG_RT_DEBUG_IPC_CONFIG is not set
+# CONFIG_RT_DEBUG_TIMER_CONFIG is not set
+# CONFIG_RT_DEBUG_IRQ_CONFIG is not set
+# CONFIG_RT_DEBUG_MEM_CONFIG is not set
+# CONFIG_RT_DEBUG_SLAB_CONFIG is not set
+# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set
+# CONFIG_RT_DEBUG_MODULE_CONFIG is not set
+
+#
+# Inter-Thread communication
+#
+CONFIG_RT_USING_SEMAPHORE=y
+CONFIG_RT_USING_MUTEX=y
+CONFIG_RT_USING_EVENT=y
+CONFIG_RT_USING_MAILBOX=y
+CONFIG_RT_USING_MESSAGEQUEUE=y
+# CONFIG_RT_USING_SIGNALS is not set
+
+#
+# Memory Management
+#
+CONFIG_RT_USING_MEMPOOL=y
+CONFIG_RT_USING_SMALL_MEM=y
+# CONFIG_RT_USING_SLAB is not set
+# CONFIG_RT_USING_MEMHEAP is not set
+CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y
+# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set
+# CONFIG_RT_USING_SLAB_AS_HEAP is not set
+# CONFIG_RT_USING_USERHEAP is not set
+# CONFIG_RT_USING_NOHEAP is not set
+# CONFIG_RT_USING_MEMTRACE is not set
+# CONFIG_RT_USING_HEAP_ISR is not set
+CONFIG_RT_USING_HEAP=y
+
+#
+# Kernel Device Object
+#
+CONFIG_RT_USING_DEVICE=y
+# CONFIG_RT_USING_DEVICE_OPS is not set
+# CONFIG_RT_USING_INTERRUPT_INFO is not set
+CONFIG_RT_USING_CONSOLE=y
+CONFIG_RT_CONSOLEBUF_SIZE=128
+CONFIG_RT_CONSOLE_DEVICE_NAME="uart1"
+CONFIG_RT_VER_NUM=0x50000
+CONFIG_ARCH_ARM=y
+CONFIG_RT_USING_CPU_FFS=y
+CONFIG_ARCH_ARM_CORTEX_M=y
+CONFIG_ARCH_ARM_CORTEX_M4=y
+# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set
+
+#
+# RT-Thread Components
+#
+CONFIG_RT_USING_COMPONENTS_INIT=y
+CONFIG_RT_USING_USER_MAIN=y
+CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048
+CONFIG_RT_MAIN_THREAD_PRIORITY=10
+# CONFIG_RT_USING_LEGACY is not set
+CONFIG_RT_USING_MSH=y
+CONFIG_RT_USING_FINSH=y
+CONFIG_FINSH_USING_MSH=y
+CONFIG_FINSH_THREAD_NAME="tshell"
+CONFIG_FINSH_THREAD_PRIORITY=20
+CONFIG_FINSH_THREAD_STACK_SIZE=4096
+CONFIG_FINSH_USING_HISTORY=y
+CONFIG_FINSH_HISTORY_LINES=5
+CONFIG_FINSH_USING_SYMTAB=y
+CONFIG_FINSH_CMD_SIZE=80
+CONFIG_MSH_USING_BUILT_IN_COMMANDS=y
+CONFIG_FINSH_USING_DESCRIPTION=y
+# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set
+# CONFIG_FINSH_USING_AUTH is not set
+CONFIG_FINSH_ARG_MAX=10
+# CONFIG_RT_USING_DFS is not set
+# CONFIG_RT_USING_FAL is not set
+# CONFIG_RT_USING_LWP is not set
+
+#
+# Device Drivers
+#
+CONFIG_RT_USING_DEVICE_IPC=y
+# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set
+CONFIG_RT_USING_SERIAL=y
+CONFIG_RT_USING_SERIAL_V1=y
+# CONFIG_RT_USING_SERIAL_V2 is not set
+CONFIG_RT_SERIAL_USING_DMA=y
+CONFIG_RT_SERIAL_RB_BUFSZ=64
+# CONFIG_RT_USING_CAN is not set
+# CONFIG_RT_USING_HWTIMER is not set
+# CONFIG_RT_USING_CPUTIME is not set
+# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY is not set
+CONFIG_RT_USING_PIN=y
+# CONFIG_RT_USING_ADC is not set
+# CONFIG_RT_USING_DAC is not set
+# CONFIG_RT_USING_PWM is not set
+# CONFIG_RT_USING_MTD_NOR is not set
+# CONFIG_RT_USING_MTD_NAND is not set
+# CONFIG_RT_USING_PM is not set
+# CONFIG_RT_USING_RTC is not set
+# CONFIG_RT_USING_SDIO is not set
+# CONFIG_RT_USING_SPI is not set
+# CONFIG_RT_USING_WDT is not set
+# CONFIG_RT_USING_AUDIO is not set
+# CONFIG_RT_USING_SENSOR is not set
+# CONFIG_RT_USING_TOUCH is not set
+# CONFIG_RT_USING_HWCRYPTO is not set
+# CONFIG_RT_USING_PULSE_ENCODER is not set
+# CONFIG_RT_USING_INPUT_CAPTURE is not set
+# CONFIG_RT_USING_WIFI is not set
+
+#
+# Using USB
+#
+# CONFIG_RT_USING_USB is not set
+# CONFIG_RT_USING_USB_HOST is not set
+# CONFIG_RT_USING_USB_DEVICE is not set
+
+#
+# C/C++ and POSIX layer
+#
+CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8
+
+#
+# POSIX (Portable Operating System Interface) layer
+#
+# CONFIG_RT_USING_POSIX_FS is not set
+# CONFIG_RT_USING_POSIX_DELAY is not set
+# CONFIG_RT_USING_POSIX_CLOCK is not set
+# CONFIG_RT_USING_POSIX_TIMER is not set
+# CONFIG_RT_USING_PTHREADS is not set
+# CONFIG_RT_USING_MODULE is not set
+
+#
+# Interprocess Communication (IPC)
+#
+# CONFIG_RT_USING_POSIX_PIPE is not set
+# CONFIG_RT_USING_POSIX_MESSAGE_QUEUE is not set
+# CONFIG_RT_USING_POSIX_MESSAGE_SEMAPHORE is not set
+
+#
+# Socket is in the 'Network' category
+#
+# CONFIG_RT_USING_CPLUSPLUS is not set
+
+#
+# Network
+#
+# CONFIG_RT_USING_SAL is not set
+# CONFIG_RT_USING_NETDEV is not set
+# CONFIG_RT_USING_LWIP is not set
+# CONFIG_RT_USING_AT is not set
+
+#
+# Utilities
+#
+# CONFIG_RT_USING_RYM is not set
+# CONFIG_RT_USING_ULOG is not set
+# CONFIG_RT_USING_UTEST is not set
+# CONFIG_RT_USING_VAR_EXPORT is not set
+# CONFIG_RT_USING_RT_LINK is not set
+# CONFIG_RT_USING_VBUS is not set
+
+#
+# RT-Thread Utestcases
+#
+# CONFIG_RT_USING_UTESTCASES is not set
+
+#
+# RT-Thread online packages
+#
+
+#
+# IoT - internet of things
+#
+# CONFIG_PKG_USING_LWIP is not set
+# CONFIG_PKG_USING_LORAWAN_DRIVER is not set
+# CONFIG_PKG_USING_PAHOMQTT is not set
+# CONFIG_PKG_USING_UMQTT is not set
+# CONFIG_PKG_USING_WEBCLIENT is not set
+# CONFIG_PKG_USING_WEBNET is not set
+# CONFIG_PKG_USING_MONGOOSE is not set
+# CONFIG_PKG_USING_MYMQTT is not set
+# CONFIG_PKG_USING_KAWAII_MQTT is not set
+# CONFIG_PKG_USING_BC28_MQTT is not set
+# CONFIG_PKG_USING_WEBTERMINAL is not set
+# CONFIG_PKG_USING_LIBMODBUS is not set
+# CONFIG_PKG_USING_FREEMODBUS is not set
+# CONFIG_PKG_USING_NANOPB is not set
+
+#
+# Wi-Fi
+#
+
+#
+# Marvell WiFi
+#
+# CONFIG_PKG_USING_WLANMARVELL is not set
+
+#
+# Wiced WiFi
+#
+# CONFIG_PKG_USING_WLAN_WICED is not set
+# CONFIG_PKG_USING_RW007 is not set
+# CONFIG_PKG_USING_COAP is not set
+# CONFIG_PKG_USING_NOPOLL is not set
+# CONFIG_PKG_USING_NETUTILS is not set
+# CONFIG_PKG_USING_CMUX is not set
+# CONFIG_PKG_USING_PPP_DEVICE is not set
+# CONFIG_PKG_USING_AT_DEVICE is not set
+# CONFIG_PKG_USING_ATSRV_SOCKET is not set
+# CONFIG_PKG_USING_WIZNET is not set
+# CONFIG_PKG_USING_ZB_COORDINATOR is not set
+
+#
+# IoT Cloud
+#
+# CONFIG_PKG_USING_ONENET is not set
+# CONFIG_PKG_USING_GAGENT_CLOUD is not set
+# CONFIG_PKG_USING_ALI_IOTKIT is not set
+# CONFIG_PKG_USING_AZURE is not set
+# CONFIG_PKG_USING_TENCENT_IOT_EXPLORER is not set
+# CONFIG_PKG_USING_JIOT-C-SDK is not set
+# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set
+# CONFIG_PKG_USING_JOYLINK is not set
+# CONFIG_PKG_USING_EZ_IOT_OS is not set
+# CONFIG_PKG_USING_IOTSHARP_SDK is not set
+# CONFIG_PKG_USING_NIMBLE is not set
+# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set
+# CONFIG_PKG_USING_OTA_DOWNLOADER is not set
+# CONFIG_PKG_USING_IPMSG is not set
+# CONFIG_PKG_USING_LSSDP is not set
+# CONFIG_PKG_USING_AIRKISS_OPEN is not set
+# CONFIG_PKG_USING_LIBRWS is not set
+# CONFIG_PKG_USING_TCPSERVER is not set
+# CONFIG_PKG_USING_PROTOBUF_C is not set
+# CONFIG_PKG_USING_DLT645 is not set
+# CONFIG_PKG_USING_QXWZ is not set
+# CONFIG_PKG_USING_SMTP_CLIENT is not set
+# CONFIG_PKG_USING_ABUP_FOTA is not set
+# CONFIG_PKG_USING_LIBCURL2RTT is not set
+# CONFIG_PKG_USING_CAPNP is not set
+# CONFIG_PKG_USING_AGILE_TELNET is not set
+# CONFIG_PKG_USING_NMEALIB is not set
+# CONFIG_PKG_USING_PDULIB is not set
+# CONFIG_PKG_USING_BTSTACK is not set
+# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set
+# CONFIG_PKG_USING_WAYZ_IOTKIT is not set
+# CONFIG_PKG_USING_MAVLINK is not set
+# CONFIG_PKG_USING_BSAL is not set
+# CONFIG_PKG_USING_AGILE_MODBUS is not set
+# CONFIG_PKG_USING_AGILE_FTP is not set
+# CONFIG_PKG_USING_EMBEDDEDPROTO is not set
+# CONFIG_PKG_USING_RT_LINK_HW is not set
+# CONFIG_PKG_USING_LORA_PKT_FWD is not set
+# CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set
+# CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set
+# CONFIG_PKG_USING_HM is not set
+# CONFIG_PKG_USING_SMALL_MODBUS is not set
+# CONFIG_PKG_USING_NET_SERVER is not set
+# CONFIG_PKG_USING_ZFTP is not set
+
+#
+# security packages
+#
+# CONFIG_PKG_USING_MBEDTLS is not set
+# CONFIG_PKG_USING_LIBSODIUM is not set
+# CONFIG_PKG_USING_LIBHYDROGEN is not set
+# CONFIG_PKG_USING_TINYCRYPT is not set
+# CONFIG_PKG_USING_TFM is not set
+# CONFIG_PKG_USING_YD_CRYPTO is not set
+
+#
+# language packages
+#
+
+#
+# JSON: JavaScript Object Notation, a lightweight data-interchange format
+#
+# CONFIG_PKG_USING_CJSON is not set
+# CONFIG_PKG_USING_LJSON is not set
+# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set
+# CONFIG_PKG_USING_RAPIDJSON is not set
+# CONFIG_PKG_USING_JSMN is not set
+# CONFIG_PKG_USING_AGILE_JSMN is not set
+# CONFIG_PKG_USING_PARSON is not set
+
+#
+# XML: Extensible Markup Language
+#
+# CONFIG_PKG_USING_SIMPLE_XML is not set
+# CONFIG_PKG_USING_EZXML is not set
+# CONFIG_PKG_USING_LUATOS_SOC is not set
+# CONFIG_PKG_USING_LUA is not set
+# CONFIG_PKG_USING_JERRYSCRIPT is not set
+# CONFIG_PKG_USING_MICROPYTHON is not set
+# CONFIG_PKG_USING_PIKASCRIPT is not set
+# CONFIG_PKG_USING_RTT_RUST is not set
+
+#
+# multimedia packages
+#
+
+#
+# LVGL: powerful and easy-to-use embedded GUI library
+#
+# CONFIG_PKG_USING_LVGL is not set
+# CONFIG_PKG_USING_LITTLEVGL2RTT is not set
+# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set
+# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set
+
+#
+# u8g2: a monochrome graphic library
+#
+# CONFIG_PKG_USING_U8G2_OFFICIAL is not set
+# CONFIG_PKG_USING_U8G2 is not set
+# CONFIG_PKG_USING_OPENMV is not set
+# CONFIG_PKG_USING_MUPDF is not set
+# CONFIG_PKG_USING_STEMWIN is not set
+# CONFIG_PKG_USING_WAVPLAYER is not set
+# CONFIG_PKG_USING_TJPGD is not set
+# CONFIG_PKG_USING_PDFGEN is not set
+# CONFIG_PKG_USING_HELIX is not set
+# CONFIG_PKG_USING_AZUREGUIX is not set
+# CONFIG_PKG_USING_TOUCHGFX2RTT is not set
+# CONFIG_PKG_USING_NUEMWIN is not set
+# CONFIG_PKG_USING_MP3PLAYER is not set
+# CONFIG_PKG_USING_TINYJPEG is not set
+# CONFIG_PKG_USING_UGUI is not set
+
+#
+# PainterEngine: A cross-platform graphics application framework written in C language
+#
+# CONFIG_PKG_USING_PAINTERENGINE is not set
+# CONFIG_PKG_USING_PAINTERENGINE_AUX is not set
+# CONFIG_PKG_USING_MCURSES is not set
+# CONFIG_PKG_USING_TERMBOX is not set
+# CONFIG_PKG_USING_VT100 is not set
+# CONFIG_PKG_USING_QRCODE is not set
+# CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_PKG_USING_PERSIMMON is not set
+
+#
+# tools packages
+#
+# CONFIG_PKG_USING_CMBACKTRACE is not set
+# CONFIG_PKG_USING_EASYFLASH is not set
+# CONFIG_PKG_USING_EASYLOGGER is not set
+# CONFIG_PKG_USING_SYSTEMVIEW is not set
+# CONFIG_PKG_USING_SEGGER_RTT is not set
+# CONFIG_PKG_USING_RDB is not set
+# CONFIG_PKG_USING_ULOG_EASYFLASH is not set
+# CONFIG_PKG_USING_ULOG_FILE is not set
+# CONFIG_PKG_USING_LOGMGR is not set
+# CONFIG_PKG_USING_ADBD is not set
+# CONFIG_PKG_USING_COREMARK is not set
+# CONFIG_PKG_USING_DHRYSTONE is not set
+# CONFIG_PKG_USING_MEMORYPERF is not set
+# CONFIG_PKG_USING_NR_MICRO_SHELL is not set
+# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set
+# CONFIG_PKG_USING_LUNAR_CALENDAR is not set
+# CONFIG_PKG_USING_BS8116A is not set
+# CONFIG_PKG_USING_GPS_RMC is not set
+# CONFIG_PKG_USING_URLENCODE is not set
+# CONFIG_PKG_USING_UMCN is not set
+# CONFIG_PKG_USING_LWRB2RTT is not set
+# CONFIG_PKG_USING_CPU_USAGE is not set
+# CONFIG_PKG_USING_GBK2UTF8 is not set
+# CONFIG_PKG_USING_VCONSOLE is not set
+# CONFIG_PKG_USING_KDB is not set
+# CONFIG_PKG_USING_WAMR is not set
+# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set
+# CONFIG_PKG_USING_LWLOG is not set
+# CONFIG_PKG_USING_ANV_TRACE is not set
+# CONFIG_PKG_USING_ANV_MEMLEAK is not set
+# CONFIG_PKG_USING_ANV_TESTSUIT is not set
+# CONFIG_PKG_USING_ANV_BENCH is not set
+# CONFIG_PKG_USING_DEVMEM is not set
+# CONFIG_PKG_USING_REGEX is not set
+# CONFIG_PKG_USING_MEM_SANDBOX is not set
+# CONFIG_PKG_USING_SOLAR_TERMS is not set
+# CONFIG_PKG_USING_GAN_ZHI is not set
+# CONFIG_PKG_USING_FDT is not set
+# CONFIG_PKG_USING_CBOX is not set
+# CONFIG_PKG_USING_SNOWFLAKE is not set
+# CONFIG_PKG_USING_HASH_MATCH is not set
+# CONFIG_PKG_USING_FIRE_PID_CURVE is not set
+# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set
+# CONFIG_PKG_USING_VOFA_PLUS is not set
+
+#
+# system packages
+#
+
+#
+# enhanced kernel services
+#
+# CONFIG_PKG_USING_RT_MEMCPY_CM is not set
+# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set
+# CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set
+
+#
+# acceleration: Assembly language or algorithmic acceleration packages
+#
+# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set
+# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set
+# CONFIG_PKG_USING_QFPLIB_M3 is not set
+
+#
+# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard
+#
+# CONFIG_PKG_USING_CMSIS_5 is not set
+# CONFIG_PKG_USING_CMSIS_RTOS1 is not set
+# CONFIG_PKG_USING_CMSIS_RTOS2 is not set
+
+#
+# Micrium: Micrium software products porting for RT-Thread
+#
+# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set
+# CONFIG_PKG_USING_UCOSII_WRAPPER is not set
+# CONFIG_PKG_USING_UC_CRC is not set
+# CONFIG_PKG_USING_UC_CLK is not set
+# CONFIG_PKG_USING_UC_COMMON is not set
+# CONFIG_PKG_USING_UC_MODBUS is not set
+# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set
+# CONFIG_PKG_USING_CAIRO is not set
+# CONFIG_PKG_USING_PIXMAN is not set
+# CONFIG_PKG_USING_PARTITION is not set
+# CONFIG_PKG_USING_PERF_COUNTER is not set
+# CONFIG_PKG_USING_FLASHDB is not set
+# CONFIG_PKG_USING_SQLITE is not set
+# CONFIG_PKG_USING_RTI is not set
+# CONFIG_PKG_USING_DFS_YAFFS is not set
+# CONFIG_PKG_USING_LITTLEFS is not set
+# CONFIG_PKG_USING_DFS_JFFS2 is not set
+# CONFIG_PKG_USING_DFS_UFFS is not set
+# CONFIG_PKG_USING_LWEXT4 is not set
+# CONFIG_PKG_USING_THREAD_POOL is not set
+# CONFIG_PKG_USING_ROBOTS is not set
+# CONFIG_PKG_USING_EV is not set
+# CONFIG_PKG_USING_SYSWATCH is not set
+# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set
+# CONFIG_PKG_USING_PLCCORE is not set
+# CONFIG_PKG_USING_RAMDISK is not set
+# CONFIG_PKG_USING_MININI is not set
+# CONFIG_PKG_USING_QBOOT is not set
+# CONFIG_PKG_USING_PPOOL is not set
+# CONFIG_PKG_USING_OPENAMP is not set
+# CONFIG_PKG_USING_LPM is not set
+# CONFIG_PKG_USING_TLSF is not set
+# CONFIG_PKG_USING_EVENT_RECORDER is not set
+# CONFIG_PKG_USING_ARM_2D is not set
+# CONFIG_PKG_USING_MCUBOOT is not set
+# CONFIG_PKG_USING_TINYUSB is not set
+# CONFIG_PKG_USING_CHERRYUSB is not set
+# CONFIG_PKG_USING_KMULTI_RTIMER is not set
+# CONFIG_PKG_USING_TFDB is not set
+# CONFIG_PKG_USING_QPC is not set
+# CONFIG_PKG_USING_AGILE_UPGRADE is not set
+
+#
+# peripheral libraries and drivers
+#
+# CONFIG_PKG_USING_SENSORS_DRIVERS is not set
+# CONFIG_PKG_USING_REALTEK_AMEBA is not set
+# CONFIG_PKG_USING_SHT2X is not set
+# CONFIG_PKG_USING_SHT3X is not set
+# CONFIG_PKG_USING_ADT74XX is not set
+# CONFIG_PKG_USING_AS7341 is not set
+# CONFIG_PKG_USING_STM32_SDIO is not set
+# CONFIG_PKG_USING_ESP_IDF is not set
+# CONFIG_PKG_USING_ICM20608 is not set
+# CONFIG_PKG_USING_BUTTON is not set
+# CONFIG_PKG_USING_PCF8574 is not set
+# CONFIG_PKG_USING_SX12XX is not set
+# CONFIG_PKG_USING_SIGNAL_LED is not set
+# CONFIG_PKG_USING_LEDBLINK is not set
+# CONFIG_PKG_USING_LITTLED is not set
+# CONFIG_PKG_USING_LKDGUI is not set
+# CONFIG_PKG_USING_NRF5X_SDK is not set
+# CONFIG_PKG_USING_NRFX is not set
+# CONFIG_PKG_USING_WM_LIBRARIES is not set
+
+#
+# Kendryte SDK
+#
+# CONFIG_PKG_USING_K210_SDK is not set
+# CONFIG_PKG_USING_KENDRYTE_SDK is not set
+# CONFIG_PKG_USING_INFRARED is not set
+# CONFIG_PKG_USING_MULTI_INFRARED is not set
+# CONFIG_PKG_USING_AGILE_BUTTON is not set
+# CONFIG_PKG_USING_AGILE_LED is not set
+# CONFIG_PKG_USING_AT24CXX is not set
+# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set
+# CONFIG_PKG_USING_AD7746 is not set
+# CONFIG_PKG_USING_PCA9685 is not set
+# CONFIG_PKG_USING_I2C_TOOLS is not set
+# CONFIG_PKG_USING_NRF24L01 is not set
+# CONFIG_PKG_USING_TOUCH_DRIVERS is not set
+# CONFIG_PKG_USING_MAX17048 is not set
+# CONFIG_PKG_USING_RPLIDAR is not set
+# CONFIG_PKG_USING_AS608 is not set
+# CONFIG_PKG_USING_RC522 is not set
+# CONFIG_PKG_USING_WS2812B is not set
+# CONFIG_PKG_USING_EMBARC_BSP is not set
+# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set
+# CONFIG_PKG_USING_MULTI_RTIMER is not set
+# CONFIG_PKG_USING_MAX7219 is not set
+# CONFIG_PKG_USING_BEEP is not set
+# CONFIG_PKG_USING_EASYBLINK is not set
+# CONFIG_PKG_USING_PMS_SERIES is not set
+# CONFIG_PKG_USING_CAN_YMODEM is not set
+# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set
+# CONFIG_PKG_USING_QLED is not set
+# CONFIG_PKG_USING_PAJ7620 is not set
+# CONFIG_PKG_USING_AGILE_CONSOLE is not set
+# CONFIG_PKG_USING_LD3320 is not set
+# CONFIG_PKG_USING_WK2124 is not set
+# CONFIG_PKG_USING_LY68L6400 is not set
+# CONFIG_PKG_USING_DM9051 is not set
+# CONFIG_PKG_USING_SSD1306 is not set
+# CONFIG_PKG_USING_QKEY is not set
+# CONFIG_PKG_USING_RS485 is not set
+# CONFIG_PKG_USING_RS232 is not set
+# CONFIG_PKG_USING_NES is not set
+# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set
+# CONFIG_PKG_USING_VDEVICE is not set
+# CONFIG_PKG_USING_SGM706 is not set
+# CONFIG_PKG_USING_STM32WB55_SDK is not set
+# CONFIG_PKG_USING_RDA58XX is not set
+# CONFIG_PKG_USING_LIBNFC is not set
+# CONFIG_PKG_USING_MFOC is not set
+# CONFIG_PKG_USING_TMC51XX is not set
+# CONFIG_PKG_USING_TCA9534 is not set
+# CONFIG_PKG_USING_KOBUKI is not set
+# CONFIG_PKG_USING_ROSSERIAL is not set
+# CONFIG_PKG_USING_MICRO_ROS is not set
+# CONFIG_PKG_USING_MCP23008 is not set
+# CONFIG_PKG_USING_BLUETRUM_SDK is not set
+# CONFIG_PKG_USING_MISAKA_AT24CXX is not set
+# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set
+# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set
+# CONFIG_PKG_USING_BL_MCU_SDK is not set
+# CONFIG_PKG_USING_SOFT_SERIAL is not set
+# CONFIG_PKG_USING_MB85RS16 is not set
+# CONFIG_PKG_USING_CW2015 is not set
+# CONFIG_PKG_USING_RFM300 is not set
+# CONFIG_PKG_USING_IO_INPUT_FILTER is not set
+# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set
+
+#
+# AI packages
+#
+# CONFIG_PKG_USING_LIBANN is not set
+# CONFIG_PKG_USING_NNOM is not set
+# CONFIG_PKG_USING_ONNX_BACKEND is not set
+# CONFIG_PKG_USING_ONNX_PARSER is not set
+# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set
+# CONFIG_PKG_USING_ELAPACK is not set
+# CONFIG_PKG_USING_ULAPACK is not set
+# CONFIG_PKG_USING_QUEST is not set
+# CONFIG_PKG_USING_NAXOS is not set
+
+#
+# miscellaneous packages
+#
+
+#
+# project laboratory
+#
+
+#
+# samples: kernel and components samples
+#
+# CONFIG_PKG_USING_KERNEL_SAMPLES is not set
+# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set
+# CONFIG_PKG_USING_NETWORK_SAMPLES is not set
+# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set
+
+#
+# entertainment: terminal games and other interesting software packages
+#
+# CONFIG_PKG_USING_CMATRIX is not set
+# CONFIG_PKG_USING_SL is not set
+# CONFIG_PKG_USING_CAL is not set
+# CONFIG_PKG_USING_ACLOCK is not set
+# CONFIG_PKG_USING_THREES is not set
+# CONFIG_PKG_USING_2048 is not set
+# CONFIG_PKG_USING_SNAKE is not set
+# CONFIG_PKG_USING_TETRIS is not set
+# CONFIG_PKG_USING_DONUT is not set
+# CONFIG_PKG_USING_COWSAY is not set
+# CONFIG_PKG_USING_LIBCSV is not set
+# CONFIG_PKG_USING_OPTPARSE is not set
+# CONFIG_PKG_USING_FASTLZ is not set
+# CONFIG_PKG_USING_MINILZO is not set
+# CONFIG_PKG_USING_QUICKLZ is not set
+# CONFIG_PKG_USING_LZMA is not set
+# CONFIG_PKG_USING_MULTIBUTTON is not set
+# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set
+# CONFIG_PKG_USING_CANFESTIVAL is not set
+# CONFIG_PKG_USING_ZLIB is not set
+# CONFIG_PKG_USING_MINIZIP is not set
+# CONFIG_PKG_USING_HEATSHRINK is not set
+# CONFIG_PKG_USING_DSTR is not set
+# CONFIG_PKG_USING_TINYFRAME is not set
+# CONFIG_PKG_USING_KENDRYTE_DEMO is not set
+# CONFIG_PKG_USING_DIGITALCTRL is not set
+# CONFIG_PKG_USING_UPACKER is not set
+# CONFIG_PKG_USING_UPARAM is not set
+# CONFIG_PKG_USING_HELLO is not set
+# CONFIG_PKG_USING_VI is not set
+# CONFIG_PKG_USING_KI is not set
+# CONFIG_PKG_USING_ARMv7M_DWT is not set
+# CONFIG_PKG_USING_UKAL is not set
+# CONFIG_PKG_USING_CRCLIB is not set
+# CONFIG_PKG_USING_LWGPS is not set
+# CONFIG_PKG_USING_STATE_MACHINE is not set
+# CONFIG_PKG_USING_DESIGN_PATTERN is not set
+# CONFIG_PKG_USING_CONTROLLER is not set
+# CONFIG_PKG_USING_PHASE_LOCKED_LOOP is not set
+# CONFIG_PKG_USING_MFBD is not set
+# CONFIG_PKG_USING_SLCAN2RTT is not set
+# CONFIG_PKG_USING_SOEM is not set
+# CONFIG_PKG_USING_QPARAM is not set
+
+#
+# Arduino libraries
+#
+# CONFIG_PKG_USING_RTDUINO is not set
+
+#
+# Projects
+#
+# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set
+# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set
+
+#
+# Sensors
+#
+# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set
+# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set
+# CONFIG_PKG_USING_ADAFRUIT_MSA301 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set
+
+#
+# Display
+#
+# CONFIG_PKG_USING_ARDUINO_U8G2 is not set
+
+#
+# Timing
+#
+# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set
+
+#
+# Data Processing
+#
+# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set
+# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set
+
+#
+# Data Storage
+#
+
+#
+# Communication
+#
+
+#
+# Device Control
+#
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set
+
+#
+# Other
+#
+
+#
+# Signal IO
+#
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set
+
+#
+# Uncategorized
+#
+CONFIG_SOC_FAMILY_STM32=y
+CONFIG_SOC_SERIES_STM32F4=y
+
+#
+# Hardware Drivers Config
+#
+CONFIG_SOC_STM32F401CC=y
+
+#
+# Onboard Peripheral Drivers
+#
+
+#
+# On-chip Peripheral Drivers
+#
+CONFIG_BSP_USING_GPIO=y
+CONFIG_BSP_USING_UART=y
+CONFIG_BSP_USING_UART1=y
+CONFIG_BSP_UART1_RX_USING_DMA=y
+# CONFIG_BSP_USING_RNG is not set
+# CONFIG_BSP_USING_UDID is not set
+
+#
+# Board extended module Drivers
+#
diff --git a/bsp/stm32/stm32f401-weact-blackpill/.gitignore b/bsp/stm32/stm32f401-weact-blackpill/.gitignore
new file mode 100644
index 0000000000..7221bde019
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/.gitignore
@@ -0,0 +1,42 @@
+*.pyc
+*.map
+*.dblite
+*.elf
+*.bin
+*.hex
+*.axf
+*.exe
+*.pdb
+*.idb
+*.ilk
+*.old
+build
+Debug
+documentation/html
+packages/
+*~
+*.o
+*.obj
+*.out
+*.bak
+*.dep
+*.lib
+*.i
+*.d
+.DS_Stor*
+.config 3
+.config 4
+.config 5
+Midea-X1
+*.uimg
+GPATH
+GRTAGS
+GTAGS
+.vscode
+JLinkLog.txt
+JLinkSettings.ini
+DebugConfig/
+RTE/
+settings/
+*.uvguix*
+cconfig.h
diff --git a/bsp/stm32/stm32f401-weact-blackpill/EventRecorderStub.scvd b/bsp/stm32/stm32f401-weact-blackpill/EventRecorderStub.scvd
new file mode 100644
index 0000000000..2956b29683
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/EventRecorderStub.scvd
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/bsp/stm32/stm32f401-weact-blackpill/Kconfig b/bsp/stm32/stm32f401-weact-blackpill/Kconfig
new file mode 100644
index 0000000000..8cbc7b71a8
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/Kconfig
@@ -0,0 +1,21 @@
+mainmenu "RT-Thread Configuration"
+
+config BSP_DIR
+ string
+ option env="BSP_ROOT"
+ default "."
+
+config RTT_DIR
+ string
+ option env="RTT_ROOT"
+ default "../../.."
+
+config PKGS_DIR
+ string
+ option env="PKGS_ROOT"
+ default "packages"
+
+source "$RTT_DIR/Kconfig"
+source "$PKGS_DIR/Kconfig"
+source "../libraries/Kconfig"
+source "board/Kconfig"
diff --git a/bsp/stm32/stm32f401-weact-blackpill/README.md b/bsp/stm32/stm32f401-weact-blackpill/README.md
new file mode 100644
index 0000000000..6b364526cc
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/README.md
@@ -0,0 +1,111 @@
+# BSP README 模板
+
+## 简介
+
+本文档为 stm32f401-weact-blackpill 开发板的 BSP (板级支持包) 说明。
+
+主要内容如下:
+
+- 开发板资源介绍
+- BSP 快速上手
+- 进阶使用方法
+
+通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。
+
+## 开发板介绍
+
+【此处简单介绍一下开发板】
+
+开发板外观如下图所示:
+
+
+
+该开发板常用 **板载资源** 如下:
+
+- MCU:*STM32F401CCU6*,主频 84MHz,256KB FLASH ,64KB RAM
+- 常用外设
+ - LED:2个,DS0(蓝色,PC13),PWR(红色,power LED)
+ - 按键:3个,USER, BOOT0 and RESET
+- 常用接口:USB 支持 3 种不同接口:虚拟 COM 端口、大容量存储和调试端口
+- 调试接口,标准 SWD
+
+开发板更多详细信息请参考[STM32F4x1 MiniF4 WeAct](https://github.com/WeActTC/MiniF4-STM32F4x1)。
+
+## 外设支持
+
+本 BSP 目前对外设的支持情况如下:
+
+| **片上外设** | **支持情况** | **备注** |
+| :----------------- | :----------: | :------------------------------------- |
+| GPIO | 支持 | PA0, PA1... PH1 ---> PIN: 0, 1...47 |
+| UART | 支持 | UART1 |
+| SPI | 支持 | |
+| I2C | 支持 | |
+| RTC | 支持 | 支持外部晶振和内部低速时钟 |
+| WDT | 支持 | |
+| FLASH | 支持 | 已适配 [FAL](https://github.com/RT-Thread-packages/fal) |
+| USB Device | 暂不支持 | |
+
+## 使用说明
+
+使用说明分为如下两个章节:
+
+- 快速上手
+
+ 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。
+
+- 进阶使用
+
+ 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。
+
+
+### 快速上手
+
+本 BSP 为开发者提供 MDK4、MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。
+
+#### 硬件连接
+
+使用数据线连接开发板到 PC,打开电源开关。
+
+#### 编译下载
+
+双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。
+
+> 工程默认配置使用 xxx 仿真器下载程序,在通过 xxx 连接开发板的基础上,点击下载按钮即可下载程序到开发板
+
+#### 运行结果
+
+下载程序成功之后,系统会自动运行,【这里写开发板运行起来之后的现象,如:LED 闪烁等】。
+
+连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息:
+
+```bash
+ \ | /
+- RT - Thread Operating System
+ / | \ 5.0.0 build Feb 24 2023 15:38:04
+ 2006 - 2022 Copyright by RT-Thread team
+msh >
+```
+### 进阶使用
+
+此 BSP 默认只开启了 GPIO 和 串口1 的功能,如果需使用 SD 卡、Flash 等更多高级功能,需要利用 ENV 工具对BSP 进行配置,步骤如下:
+
+1. 在 bsp 下打开 env 工具。
+
+2. 输入`menuconfig`命令配置工程,配置好之后保存退出。
+
+3. 输入`pkgs --update`命令更新软件包。
+
+4. 输入`scons --target=mdk4/mdk5/iar` 命令重新生成工程。
+
+本章节更多详细的介绍请参考 [STM32 系列 BSP 外设驱动使用教程](../docs/STM32系列BSP外设驱动使用教程.md)。
+
+## 注意事项
+
+- 暂无
+
+## 联系人信息
+
+维护人:
+
+- [Misthao](https://github.com/ZangCHSHub), 邮箱:
\ No newline at end of file
diff --git a/bsp/stm32/stm32f401-weact-blackpill/SConscript b/bsp/stm32/stm32f401-weact-blackpill/SConscript
new file mode 100644
index 0000000000..20f7689c53
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/SConscript
@@ -0,0 +1,15 @@
+# for module compiling
+import os
+Import('RTT_ROOT')
+from building import *
+
+cwd = GetCurrentDir()
+objs = []
+list = os.listdir(cwd)
+
+for d in list:
+ path = os.path.join(cwd, d)
+ if os.path.isfile(os.path.join(path, 'SConscript')):
+ objs = objs + SConscript(os.path.join(d, 'SConscript'))
+
+Return('objs')
diff --git a/bsp/stm32/stm32f401-weact-blackpill/SConstruct b/bsp/stm32/stm32f401-weact-blackpill/SConstruct
new file mode 100644
index 0000000000..cf42db1d75
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/SConstruct
@@ -0,0 +1,60 @@
+import os
+import sys
+import rtconfig
+
+if os.getenv('RTT_ROOT'):
+ RTT_ROOT = os.getenv('RTT_ROOT')
+else:
+ RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')
+
+sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
+try:
+ from building import *
+except:
+ print('Cannot found RT-Thread root directory, please check RTT_ROOT')
+ print(RTT_ROOT)
+ exit(-1)
+
+TARGET = 'rt-thread.' + rtconfig.TARGET_EXT
+
+DefaultEnvironment(tools=[])
+env = Environment(tools = ['mingw'],
+ AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
+ CC = rtconfig.CC, CFLAGS = rtconfig.CFLAGS,
+ AR = rtconfig.AR, ARFLAGS = '-rc',
+ CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,
+ LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS)
+env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
+
+if rtconfig.PLATFORM in ['iccarm']:
+ env.Replace(CCCOM = ['$CC $CFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES'])
+ env.Replace(ARFLAGS = [''])
+ env.Replace(LINKCOM = env["LINKCOM"] + ' --map rt-thread.map')
+
+Export('RTT_ROOT')
+Export('rtconfig')
+
+SDK_ROOT = os.path.abspath('./')
+
+if os.path.exists(SDK_ROOT + '/libraries'):
+ libraries_path_prefix = SDK_ROOT + '/libraries'
+else:
+ libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries'
+
+SDK_LIB = libraries_path_prefix
+Export('SDK_LIB')
+
+# prepare building environment
+objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)
+
+stm32_library = 'STM32F4xx_HAL'
+rtconfig.BSP_LIBRARY_TYPE = stm32_library
+
+# include libraries
+objs.extend(SConscript(os.path.join(libraries_path_prefix, stm32_library, 'SConscript')))
+
+# include drivers
+objs.extend(SConscript(os.path.join(libraries_path_prefix, 'HAL_Drivers', 'SConscript')))
+
+# make a building
+DoBuilding(TARGET, objs)
diff --git a/bsp/stm32/stm32f401-weact-blackpill/applications/SConscript b/bsp/stm32/stm32f401-weact-blackpill/applications/SConscript
new file mode 100644
index 0000000000..9bb9abae89
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/applications/SConscript
@@ -0,0 +1,15 @@
+from building import *
+import os
+
+cwd = GetCurrentDir()
+src = Glob('*.c')
+CPPPATH = [cwd]
+
+group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH)
+
+list = os.listdir(cwd)
+for item in list:
+ if os.path.isfile(os.path.join(cwd, item, 'SConscript')):
+ group = group + SConscript(os.path.join(item, 'SConscript'))
+
+Return('group')
diff --git a/bsp/stm32/stm32f401-weact-blackpill/applications/main.c b/bsp/stm32/stm32f401-weact-blackpill/applications/main.c
new file mode 100644
index 0000000000..5faa7145bd
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/applications/main.c
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-11-06 SummerGift first version
+ */
+
+#include
+#include
+#include
+
+/* defined the LED0 pin: PB1 */
+#define LED0_PIN GET_PIN(C, 13)
+
+int main(void)
+{
+ int count = 1;
+ /* set LED0 pin mode to output */
+ rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
+
+ while (count++)
+ {
+ rt_pin_write(LED0_PIN, PIN_HIGH);
+ rt_thread_mdelay(500);
+ rt_pin_write(LED0_PIN, PIN_LOW);
+ rt_thread_mdelay(500);
+ }
+
+ return RT_EOK;
+}
diff --git a/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/.mxproject
new file mode 100644
index 0000000000..c530319a37
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/.mxproject
@@ -0,0 +1,14 @@
+[PreviousLibFiles]
+LibFiles=Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_usart.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_bus.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_rcc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_system.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_utils.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_gpio.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dma.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dmamux.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_pwr.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_cortex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h;Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_exti.h;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ramfunc.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c;Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_exti.c;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_tim_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_uart.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_usart.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_rcc_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_bus.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_rcc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_system.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_utils.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_flash_ramfunc.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_gpio_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_gpio.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_dma.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dma.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_dmamux.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_pwr_ex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_pwr.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_cortex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_cortex.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal.h;Drivers\STM32F4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_def.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_hal_exti.h;Drivers\STM32F4xx_HAL_Driver\Inc\stm32f4xx_ll_exti.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f401xc.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h;Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_compiler.h;Drivers\CMSIS\Include\cmsis_gcc.h;Drivers\CMSIS\Include\cmsis_iccarm.h;Drivers\CMSIS\Include\cmsis_version.h;Drivers\CMSIS\Include\core_armv8mbl.h;Drivers\CMSIS\Include\core_armv8mml.h;Drivers\CMSIS\Include\core_cm0.h;Drivers\CMSIS\Include\core_cm0plus.h;Drivers\CMSIS\Include\core_cm1.h;Drivers\CMSIS\Include\core_cm23.h;Drivers\CMSIS\Include\core_cm3.h;Drivers\CMSIS\Include\core_cm33.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_cm7.h;Drivers\CMSIS\Include\core_sc000.h;Drivers\CMSIS\Include\core_sc300.h;Drivers\CMSIS\Include\mpu_armv7.h;Drivers\CMSIS\Include\mpu_armv8.h;Drivers\CMSIS\Include\tz_context.h;
+
+[PreviousUsedKeilFiles]
+SourceFiles=..\Src\main.c;..\Src\stm32f4xx_it.c;..\Src\stm32f4xx_hal_msp.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ramfunc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_exti.c;..\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c;..\\Src\system_stm32f4xx.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ramfunc.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c;..\Drivers\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_exti.c;..\Drivers\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c;..\\Src\system_stm32f4xx.c;;;
+HeaderPath=..\Drivers\STM32F4xx_HAL_Driver\Inc;..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32F4xx\Include;..\Drivers\CMSIS\Include;..\Inc;
+CDefines=USE_HAL_DRIVER;STM32F401xC;USE_HAL_DRIVER;USE_HAL_DRIVER;
+
+[PreviousGenFiles]
+HeaderPath=..\Inc
+HeaderFiles=stm32f4xx_it.h;stm32f4xx_hal_conf.h;main.h;
+SourcePath=..\Src
+SourceFiles=stm32f4xx_it.c;stm32f4xx_hal_msp.c;main.c;
+
diff --git a/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/CubeMX_Config.ioc b/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/CubeMX_Config.ioc
new file mode 100644
index 0000000000..543f926037
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/CubeMX_Config.ioc
@@ -0,0 +1,119 @@
+#MicroXplorer Configuration settings - do not modify
+File.Version=6
+GPIO.groupedBy=
+KeepUserPlacement=false
+Mcu.CPN=STM32F401CCU6
+Mcu.Family=STM32F4
+Mcu.IP0=NVIC
+Mcu.IP1=RCC
+Mcu.IP2=SYS
+Mcu.IP3=USART1
+Mcu.IPNb=4
+Mcu.Name=STM32F401C(B-C)Ux
+Mcu.Package=UFQFPN48
+Mcu.Pin0=PC14-OSC32_IN
+Mcu.Pin1=PC15-OSC32_OUT
+Mcu.Pin2=PH0 - OSC_IN
+Mcu.Pin3=PH1 - OSC_OUT
+Mcu.Pin4=PA9
+Mcu.Pin5=PA10
+Mcu.Pin6=PA13
+Mcu.Pin7=PA14
+Mcu.Pin8=VP_SYS_VS_Systick
+Mcu.PinsNb=9
+Mcu.ThirdPartyNb=0
+Mcu.UserConstants=
+Mcu.UserName=STM32F401CCUx
+MxCube.Version=6.6.1
+MxDb.Version=DB.6.0.60
+NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
+NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
+NVIC.ForceEnableDMAVector=true
+NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
+NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
+NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
+NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
+NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4
+NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
+NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false
+NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
+PA10.Mode=Asynchronous
+PA10.Signal=USART1_RX
+PA13.Mode=Serial_Wire
+PA13.Signal=SYS_JTMS-SWDIO
+PA14.Mode=Serial_Wire
+PA14.Signal=SYS_JTCK-SWCLK
+PA9.Mode=Asynchronous
+PA9.Signal=USART1_TX
+PC14-OSC32_IN.Mode=LSE-External-Oscillator
+PC14-OSC32_IN.Signal=RCC_OSC32_IN
+PC15-OSC32_OUT.Mode=LSE-External-Oscillator
+PC15-OSC32_OUT.Signal=RCC_OSC32_OUT
+PH0\ -\ OSC_IN.Mode=HSE-External-Oscillator
+PH0\ -\ OSC_IN.Signal=RCC_OSC_IN
+PH1\ -\ OSC_OUT.Mode=HSE-External-Oscillator
+PH1\ -\ OSC_OUT.Signal=RCC_OSC_OUT
+PinOutPanel.RotationAngle=0
+ProjectManager.AskForMigrate=true
+ProjectManager.BackupPrevious=false
+ProjectManager.CompilerOptimize=6
+ProjectManager.ComputerToolchain=false
+ProjectManager.CoupleFile=false
+ProjectManager.CustomerFirmwarePackage=
+ProjectManager.DefaultFWLocation=true
+ProjectManager.DeletePrevious=true
+ProjectManager.DeviceId=STM32F401CCUx
+ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.27.1
+ProjectManager.FreePins=false
+ProjectManager.HalAssertFull=false
+ProjectManager.HeapSize=0x200
+ProjectManager.KeepUserCode=true
+ProjectManager.LastFirmware=true
+ProjectManager.LibraryCopy=0
+ProjectManager.MainLocation=Src
+ProjectManager.NoMain=false
+ProjectManager.PreviousToolchain=
+ProjectManager.ProjectBuild=false
+ProjectManager.ProjectFileName=CubeMX_Config.ioc
+ProjectManager.ProjectName=CubeMX_Config
+ProjectManager.RegisterCallBack=
+ProjectManager.StackSize=0x400
+ProjectManager.TargetToolchain=MDK-ARM V5
+ProjectManager.ToolChainLocation=
+ProjectManager.UnderRoot=false
+ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_RTC_Init-RTC-false-HAL-true,4-MX_USART1_UART_Init-USART1-false-HAL-true
+RCC.48MHZClocksFreq_Value=42000000
+RCC.AHBFreq_Value=84000000
+RCC.APB1CLKDivider=RCC_HCLK_DIV2
+RCC.APB1Freq_Value=42000000
+RCC.APB1TimFreq_Value=84000000
+RCC.APB2Freq_Value=84000000
+RCC.APB2TimFreq_Value=84000000
+RCC.CortexFreq_Value=84000000
+RCC.FCLKCortexFreq_Value=84000000
+RCC.HCLKFreq_Value=84000000
+RCC.HSE_VALUE=25000000
+RCC.HSI_VALUE=16000000
+RCC.I2SClocksFreq_Value=96000000
+RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,FCLKCortexFreq_Value,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSI_VALUE,PLLCLKFreq_Value,PLLM,PLLN,PLLQCLKFreq_Value,PLLSourceVirtual,RCC_RTC_Clock_Source,RCC_RTC_Clock_SourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S
+RCC.LSI_VALUE=32000
+RCC.PLLCLKFreq_Value=84000000
+RCC.PLLM=25
+RCC.PLLN=168
+RCC.PLLQCLKFreq_Value=42000000
+RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE
+RCC.RCC_RTC_Clock_Source=RCC_RTCCLKSOURCE_LSE
+RCC.RCC_RTC_Clock_SourceVirtual=RCC_RTCCLKSOURCE_LSE
+RCC.RTCFreq_Value=32768
+RCC.RTCHSEDivFreq_Value=12500000
+RCC.SYSCLKFreq_VALUE=84000000
+RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK
+RCC.VCOI2SOutputFreq_Value=192000000
+RCC.VCOInputFreq_Value=1000000
+RCC.VCOOutputFreq_Value=168000000
+RCC.VcooutputI2S=96000000
+USART1.IPParameters=VirtualMode
+USART1.VirtualMode=VM_ASYNC
+VP_SYS_VS_Systick.Mode=SysTick
+VP_SYS_VS_Systick.Signal=SYS_VS_Systick
+board=custom
diff --git a/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Inc/main.h
new file mode 100644
index 0000000000..19c9b247cb
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Inc/main.h
@@ -0,0 +1,68 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.h
+ * @brief : Header for main.c file.
+ * This file contains the common defines of the application.
+ ******************************************************************************
+ * @attention
+ *
+ * Copyright (c) 2023 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software is licensed under terms that can be found in the LICENSE file
+ * in the root directory of this software component.
+ * If no LICENSE file comes with this software, it is provided AS-IS.
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __MAIN_H
+#define __MAIN_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f4xx_hal.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void Error_Handler(void);
+
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+/* Private defines -----------------------------------------------------------*/
+/* USER CODE BEGIN Private defines */
+
+/* USER CODE END Private defines */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __MAIN_H */
diff --git a/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h b/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h
new file mode 100644
index 0000000000..b7a43c9f5e
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h
@@ -0,0 +1,491 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32f4xx_hal_conf_template.h
+ * @author MCD Application Team
+ * @brief HAL configuration template file.
+ * This file should be copied to the application folder and renamed
+ * to stm32f4xx_hal_conf.h.
+ ******************************************************************************
+ * @attention
+ *
+ * Copyright (c) 2017 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software is licensed under terms that can be found in the LICENSE file
+ * in the root directory of this software component.
+ * If no LICENSE file comes with this software, it is provided AS-IS.
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32F4xx_HAL_CONF_H
+#define __STM32F4xx_HAL_CONF_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/* ########################## Module Selection ############################## */
+/**
+ * @brief This is the list of modules to be used in the HAL driver
+ */
+#define HAL_MODULE_ENABLED
+
+ /* #define HAL_ADC_MODULE_ENABLED */
+/* #define HAL_CRYP_MODULE_ENABLED */
+/* #define HAL_CAN_MODULE_ENABLED */
+/* #define HAL_CRC_MODULE_ENABLED */
+/* #define HAL_CAN_LEGACY_MODULE_ENABLED */
+/* #define HAL_CRYP_MODULE_ENABLED */
+/* #define HAL_DAC_MODULE_ENABLED */
+/* #define HAL_DCMI_MODULE_ENABLED */
+/* #define HAL_DMA2D_MODULE_ENABLED */
+/* #define HAL_ETH_MODULE_ENABLED */
+/* #define HAL_NAND_MODULE_ENABLED */
+/* #define HAL_NOR_MODULE_ENABLED */
+/* #define HAL_PCCARD_MODULE_ENABLED */
+/* #define HAL_SRAM_MODULE_ENABLED */
+/* #define HAL_SDRAM_MODULE_ENABLED */
+/* #define HAL_HASH_MODULE_ENABLED */
+/* #define HAL_I2C_MODULE_ENABLED */
+/* #define HAL_I2S_MODULE_ENABLED */
+/* #define HAL_IWDG_MODULE_ENABLED */
+/* #define HAL_LTDC_MODULE_ENABLED */
+/* #define HAL_RNG_MODULE_ENABLED */
+/* #define HAL_RTC_MODULE_ENABLED */
+/* #define HAL_SAI_MODULE_ENABLED */
+/* #define HAL_SD_MODULE_ENABLED */
+/* #define HAL_MMC_MODULE_ENABLED */
+/* #define HAL_SPI_MODULE_ENABLED */
+/* #define HAL_TIM_MODULE_ENABLED */
+#define HAL_UART_MODULE_ENABLED
+/* #define HAL_USART_MODULE_ENABLED */
+/* #define HAL_IRDA_MODULE_ENABLED */
+/* #define HAL_SMARTCARD_MODULE_ENABLED */
+/* #define HAL_SMBUS_MODULE_ENABLED */
+/* #define HAL_WWDG_MODULE_ENABLED */
+/* #define HAL_PCD_MODULE_ENABLED */
+/* #define HAL_HCD_MODULE_ENABLED */
+/* #define HAL_DSI_MODULE_ENABLED */
+/* #define HAL_QSPI_MODULE_ENABLED */
+/* #define HAL_QSPI_MODULE_ENABLED */
+/* #define HAL_CEC_MODULE_ENABLED */
+/* #define HAL_FMPI2C_MODULE_ENABLED */
+/* #define HAL_FMPSMBUS_MODULE_ENABLED */
+/* #define HAL_SPDIFRX_MODULE_ENABLED */
+/* #define HAL_DFSDM_MODULE_ENABLED */
+/* #define HAL_LPTIM_MODULE_ENABLED */
+#define HAL_GPIO_MODULE_ENABLED
+#define HAL_EXTI_MODULE_ENABLED
+#define HAL_DMA_MODULE_ENABLED
+#define HAL_RCC_MODULE_ENABLED
+#define HAL_FLASH_MODULE_ENABLED
+#define HAL_PWR_MODULE_ENABLED
+#define HAL_CORTEX_MODULE_ENABLED
+
+/* ########################## HSE/HSI Values adaptation ##################### */
+/**
+ * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSE is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE 25000000U /*!< Value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSE_STARTUP_TIMEOUT)
+ #define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */
+#endif /* HSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief Internal High Speed oscillator (HSI) value.
+ * This value is used by the RCC HAL module to compute the system frequency
+ * (when HSI is used as system clock source, directly or through the PLL).
+ */
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @brief Internal Low Speed oscillator (LSI) value.
+ */
+#if !defined (LSI_VALUE)
+ #define LSI_VALUE 32000U /*!< LSI Typical Value in Hz*/
+#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz
+ The real value may vary depending on the variations
+ in voltage and temperature.*/
+/**
+ * @brief External Low Speed oscillator (LSE) value.
+ */
+#if !defined (LSE_VALUE)
+ #define LSE_VALUE 32768U /*!< Value of the External Low Speed oscillator in Hz */
+#endif /* LSE_VALUE */
+
+#if !defined (LSE_STARTUP_TIMEOUT)
+ #define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */
+#endif /* LSE_STARTUP_TIMEOUT */
+
+/**
+ * @brief External clock source for I2S peripheral
+ * This value is used by the I2S HAL module to compute the I2S clock source
+ * frequency, this source is inserted directly through I2S_CKIN pad.
+ */
+#if !defined (EXTERNAL_CLOCK_VALUE)
+ #define EXTERNAL_CLOCK_VALUE 12288000U /*!< Value of the External audio frequency in Hz*/
+#endif /* EXTERNAL_CLOCK_VALUE */
+
+/* Tip: To avoid modifying this file each time you need to use different HSE,
+ === you can define the HSE value in your toolchain compiler preprocessor. */
+
+/* ########################### System Configuration ######################### */
+/**
+ * @brief This is the HAL system configuration section
+ */
+#define VDD_VALUE 3300U /*!< Value of VDD in mv */
+#define TICK_INT_PRIORITY 15U /*!< tick interrupt priority */
+#define USE_RTOS 0U
+#define PREFETCH_ENABLE 1U
+#define INSTRUCTION_CACHE_ENABLE 1U
+#define DATA_CACHE_ENABLE 1U
+
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */
+#define USE_HAL_CAN_REGISTER_CALLBACKS 0U /* CAN register callback disabled */
+#define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */
+#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U /* CRYP register callback disabled */
+#define USE_HAL_DAC_REGISTER_CALLBACKS 0U /* DAC register callback disabled */
+#define USE_HAL_DCMI_REGISTER_CALLBACKS 0U /* DCMI register callback disabled */
+#define USE_HAL_DFSDM_REGISTER_CALLBACKS 0U /* DFSDM register callback disabled */
+#define USE_HAL_DMA2D_REGISTER_CALLBACKS 0U /* DMA2D register callback disabled */
+#define USE_HAL_DSI_REGISTER_CALLBACKS 0U /* DSI register callback disabled */
+#define USE_HAL_ETH_REGISTER_CALLBACKS 0U /* ETH register callback disabled */
+#define USE_HAL_HASH_REGISTER_CALLBACKS 0U /* HASH register callback disabled */
+#define USE_HAL_HCD_REGISTER_CALLBACKS 0U /* HCD register callback disabled */
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0U /* I2C register callback disabled */
+#define USE_HAL_FMPI2C_REGISTER_CALLBACKS 0U /* FMPI2C register callback disabled */
+#define USE_HAL_FMPSMBUS_REGISTER_CALLBACKS 0U /* FMPSMBUS register callback disabled */
+#define USE_HAL_I2S_REGISTER_CALLBACKS 0U /* I2S register callback disabled */
+#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U /* IRDA register callback disabled */
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U /* LPTIM register callback disabled */
+#define USE_HAL_LTDC_REGISTER_CALLBACKS 0U /* LTDC register callback disabled */
+#define USE_HAL_MMC_REGISTER_CALLBACKS 0U /* MMC register callback disabled */
+#define USE_HAL_NAND_REGISTER_CALLBACKS 0U /* NAND register callback disabled */
+#define USE_HAL_NOR_REGISTER_CALLBACKS 0U /* NOR register callback disabled */
+#define USE_HAL_PCCARD_REGISTER_CALLBACKS 0U /* PCCARD register callback disabled */
+#define USE_HAL_PCD_REGISTER_CALLBACKS 0U /* PCD register callback disabled */
+#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U /* QSPI register callback disabled */
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0U /* RNG register callback disabled */
+#define USE_HAL_RTC_REGISTER_CALLBACKS 0U /* RTC register callback disabled */
+#define USE_HAL_SAI_REGISTER_CALLBACKS 0U /* SAI register callback disabled */
+#define USE_HAL_SD_REGISTER_CALLBACKS 0U /* SD register callback disabled */
+#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */
+#define USE_HAL_SDRAM_REGISTER_CALLBACKS 0U /* SDRAM register callback disabled */
+#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U /* SRAM register callback disabled */
+#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U /* SMBUS register callback disabled */
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0U /* SPI register callback disabled */
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0U /* TIM register callback disabled */
+#define USE_HAL_UART_REGISTER_CALLBACKS 0U /* UART register callback disabled */
+#define USE_HAL_USART_REGISTER_CALLBACKS 0U /* USART register callback disabled */
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U /* WWDG register callback disabled */
+
+/* ########################## Assert Selection ############################## */
+/**
+ * @brief Uncomment the line below to expanse the "assert_param" macro in the
+ * HAL drivers code
+ */
+/* #define USE_FULL_ASSERT 1U */
+
+/* ################## Ethernet peripheral configuration ##################### */
+
+/* Section 1 : Ethernet peripheral configuration */
+
+/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */
+#define MAC_ADDR0 2U
+#define MAC_ADDR1 0U
+#define MAC_ADDR2 0U
+#define MAC_ADDR3 0U
+#define MAC_ADDR4 0U
+#define MAC_ADDR5 0U
+
+/* Definition of the Ethernet driver buffers size and count */
+#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */
+#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */
+#define ETH_RXBUFNB 4U /* 4 Rx buffers of size ETH_RX_BUF_SIZE */
+#define ETH_TXBUFNB 4U /* 4 Tx buffers of size ETH_TX_BUF_SIZE */
+
+/* Section 2: PHY configuration section */
+
+/* DP83848_PHY_ADDRESS Address*/
+#define DP83848_PHY_ADDRESS 0x01U
+/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/
+#define PHY_RESET_DELAY 0x000000FFU
+/* PHY Configuration delay */
+#define PHY_CONFIG_DELAY 0x00000FFFU
+
+#define PHY_READ_TO 0x0000FFFFU
+#define PHY_WRITE_TO 0x0000FFFFU
+
+/* Section 3: Common PHY Registers */
+
+#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */
+#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */
+
+#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */
+#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */
+#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */
+#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */
+#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */
+#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */
+#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */
+#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */
+#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */
+#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */
+
+#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */
+#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */
+#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */
+
+/* Section 4: Extended PHY Registers */
+#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */
+
+#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */
+#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */
+
+/* ################## SPI peripheral configuration ########################## */
+
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+* Activated: CRC code is present inside driver
+* Deactivated: CRC code cleaned from driver
+*/
+
+#define USE_SPI_CRC 0U
+
+/* Includes ------------------------------------------------------------------*/
+/**
+ * @brief Include module's header file
+ */
+
+#ifdef HAL_RCC_MODULE_ENABLED
+ #include "stm32f4xx_hal_rcc.h"
+#endif /* HAL_RCC_MODULE_ENABLED */
+
+#ifdef HAL_GPIO_MODULE_ENABLED
+ #include "stm32f4xx_hal_gpio.h"
+#endif /* HAL_GPIO_MODULE_ENABLED */
+
+#ifdef HAL_EXTI_MODULE_ENABLED
+ #include "stm32f4xx_hal_exti.h"
+#endif /* HAL_EXTI_MODULE_ENABLED */
+
+#ifdef HAL_DMA_MODULE_ENABLED
+ #include "stm32f4xx_hal_dma.h"
+#endif /* HAL_DMA_MODULE_ENABLED */
+
+#ifdef HAL_CORTEX_MODULE_ENABLED
+ #include "stm32f4xx_hal_cortex.h"
+#endif /* HAL_CORTEX_MODULE_ENABLED */
+
+#ifdef HAL_ADC_MODULE_ENABLED
+ #include "stm32f4xx_hal_adc.h"
+#endif /* HAL_ADC_MODULE_ENABLED */
+
+#ifdef HAL_CAN_MODULE_ENABLED
+ #include "stm32f4xx_hal_can.h"
+#endif /* HAL_CAN_MODULE_ENABLED */
+
+#ifdef HAL_CAN_LEGACY_MODULE_ENABLED
+ #include "stm32f4xx_hal_can_legacy.h"
+#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */
+
+#ifdef HAL_CRC_MODULE_ENABLED
+ #include "stm32f4xx_hal_crc.h"
+#endif /* HAL_CRC_MODULE_ENABLED */
+
+#ifdef HAL_CRYP_MODULE_ENABLED
+ #include "stm32f4xx_hal_cryp.h"
+#endif /* HAL_CRYP_MODULE_ENABLED */
+
+#ifdef HAL_DMA2D_MODULE_ENABLED
+ #include "stm32f4xx_hal_dma2d.h"
+#endif /* HAL_DMA2D_MODULE_ENABLED */
+
+#ifdef HAL_DAC_MODULE_ENABLED
+ #include "stm32f4xx_hal_dac.h"
+#endif /* HAL_DAC_MODULE_ENABLED */
+
+#ifdef HAL_DCMI_MODULE_ENABLED
+ #include "stm32f4xx_hal_dcmi.h"
+#endif /* HAL_DCMI_MODULE_ENABLED */
+
+#ifdef HAL_ETH_MODULE_ENABLED
+ #include "stm32f4xx_hal_eth.h"
+#endif /* HAL_ETH_MODULE_ENABLED */
+
+#ifdef HAL_FLASH_MODULE_ENABLED
+ #include "stm32f4xx_hal_flash.h"
+#endif /* HAL_FLASH_MODULE_ENABLED */
+
+#ifdef HAL_SRAM_MODULE_ENABLED
+ #include "stm32f4xx_hal_sram.h"
+#endif /* HAL_SRAM_MODULE_ENABLED */
+
+#ifdef HAL_NOR_MODULE_ENABLED
+ #include "stm32f4xx_hal_nor.h"
+#endif /* HAL_NOR_MODULE_ENABLED */
+
+#ifdef HAL_NAND_MODULE_ENABLED
+ #include "stm32f4xx_hal_nand.h"
+#endif /* HAL_NAND_MODULE_ENABLED */
+
+#ifdef HAL_PCCARD_MODULE_ENABLED
+ #include "stm32f4xx_hal_pccard.h"
+#endif /* HAL_PCCARD_MODULE_ENABLED */
+
+#ifdef HAL_SDRAM_MODULE_ENABLED
+ #include "stm32f4xx_hal_sdram.h"
+#endif /* HAL_SDRAM_MODULE_ENABLED */
+
+#ifdef HAL_HASH_MODULE_ENABLED
+ #include "stm32f4xx_hal_hash.h"
+#endif /* HAL_HASH_MODULE_ENABLED */
+
+#ifdef HAL_I2C_MODULE_ENABLED
+ #include "stm32f4xx_hal_i2c.h"
+#endif /* HAL_I2C_MODULE_ENABLED */
+
+#ifdef HAL_SMBUS_MODULE_ENABLED
+ #include "stm32f4xx_hal_smbus.h"
+#endif /* HAL_SMBUS_MODULE_ENABLED */
+
+#ifdef HAL_I2S_MODULE_ENABLED
+ #include "stm32f4xx_hal_i2s.h"
+#endif /* HAL_I2S_MODULE_ENABLED */
+
+#ifdef HAL_IWDG_MODULE_ENABLED
+ #include "stm32f4xx_hal_iwdg.h"
+#endif /* HAL_IWDG_MODULE_ENABLED */
+
+#ifdef HAL_LTDC_MODULE_ENABLED
+ #include "stm32f4xx_hal_ltdc.h"
+#endif /* HAL_LTDC_MODULE_ENABLED */
+
+#ifdef HAL_PWR_MODULE_ENABLED
+ #include "stm32f4xx_hal_pwr.h"
+#endif /* HAL_PWR_MODULE_ENABLED */
+
+#ifdef HAL_RNG_MODULE_ENABLED
+ #include "stm32f4xx_hal_rng.h"
+#endif /* HAL_RNG_MODULE_ENABLED */
+
+#ifdef HAL_RTC_MODULE_ENABLED
+ #include "stm32f4xx_hal_rtc.h"
+#endif /* HAL_RTC_MODULE_ENABLED */
+
+#ifdef HAL_SAI_MODULE_ENABLED
+ #include "stm32f4xx_hal_sai.h"
+#endif /* HAL_SAI_MODULE_ENABLED */
+
+#ifdef HAL_SD_MODULE_ENABLED
+ #include "stm32f4xx_hal_sd.h"
+#endif /* HAL_SD_MODULE_ENABLED */
+
+#ifdef HAL_SPI_MODULE_ENABLED
+ #include "stm32f4xx_hal_spi.h"
+#endif /* HAL_SPI_MODULE_ENABLED */
+
+#ifdef HAL_TIM_MODULE_ENABLED
+ #include "stm32f4xx_hal_tim.h"
+#endif /* HAL_TIM_MODULE_ENABLED */
+
+#ifdef HAL_UART_MODULE_ENABLED
+ #include "stm32f4xx_hal_uart.h"
+#endif /* HAL_UART_MODULE_ENABLED */
+
+#ifdef HAL_USART_MODULE_ENABLED
+ #include "stm32f4xx_hal_usart.h"
+#endif /* HAL_USART_MODULE_ENABLED */
+
+#ifdef HAL_IRDA_MODULE_ENABLED
+ #include "stm32f4xx_hal_irda.h"
+#endif /* HAL_IRDA_MODULE_ENABLED */
+
+#ifdef HAL_SMARTCARD_MODULE_ENABLED
+ #include "stm32f4xx_hal_smartcard.h"
+#endif /* HAL_SMARTCARD_MODULE_ENABLED */
+
+#ifdef HAL_WWDG_MODULE_ENABLED
+ #include "stm32f4xx_hal_wwdg.h"
+#endif /* HAL_WWDG_MODULE_ENABLED */
+
+#ifdef HAL_PCD_MODULE_ENABLED
+ #include "stm32f4xx_hal_pcd.h"
+#endif /* HAL_PCD_MODULE_ENABLED */
+
+#ifdef HAL_HCD_MODULE_ENABLED
+ #include "stm32f4xx_hal_hcd.h"
+#endif /* HAL_HCD_MODULE_ENABLED */
+
+#ifdef HAL_DSI_MODULE_ENABLED
+ #include "stm32f4xx_hal_dsi.h"
+#endif /* HAL_DSI_MODULE_ENABLED */
+
+#ifdef HAL_QSPI_MODULE_ENABLED
+ #include "stm32f4xx_hal_qspi.h"
+#endif /* HAL_QSPI_MODULE_ENABLED */
+
+#ifdef HAL_CEC_MODULE_ENABLED
+ #include "stm32f4xx_hal_cec.h"
+#endif /* HAL_CEC_MODULE_ENABLED */
+
+#ifdef HAL_FMPI2C_MODULE_ENABLED
+ #include "stm32f4xx_hal_fmpi2c.h"
+#endif /* HAL_FMPI2C_MODULE_ENABLED */
+
+#ifdef HAL_FMPSMBUS_MODULE_ENABLED
+ #include "stm32f4xx_hal_fmpsmbus.h"
+#endif /* HAL_FMPSMBUS_MODULE_ENABLED */
+
+#ifdef HAL_SPDIFRX_MODULE_ENABLED
+ #include "stm32f4xx_hal_spdifrx.h"
+#endif /* HAL_SPDIFRX_MODULE_ENABLED */
+
+#ifdef HAL_DFSDM_MODULE_ENABLED
+ #include "stm32f4xx_hal_dfsdm.h"
+#endif /* HAL_DFSDM_MODULE_ENABLED */
+
+#ifdef HAL_LPTIM_MODULE_ENABLED
+ #include "stm32f4xx_hal_lptim.h"
+#endif /* HAL_LPTIM_MODULE_ENABLED */
+
+#ifdef HAL_MMC_MODULE_ENABLED
+ #include "stm32f4xx_hal_mmc.h"
+#endif /* HAL_MMC_MODULE_ENABLED */
+
+/* Exported macro ------------------------------------------------------------*/
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief The assert_param macro is used for function's parameters check.
+ * @param expr If expr is false, it calls assert_failed function
+ * which reports the name of the source file and the source
+ * line number of the call that failed.
+ * If expr is true, it returns no value.
+ * @retval None
+ */
+ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))
+/* Exported functions ------------------------------------------------------- */
+ void assert_failed(uint8_t* file, uint32_t line);
+#else
+ #define assert_param(expr) ((void)0U)
+#endif /* USE_FULL_ASSERT */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32F4xx_HAL_CONF_H */
diff --git a/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Inc/stm32f4xx_it.h b/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Inc/stm32f4xx_it.h
new file mode 100644
index 0000000000..37f04b46bb
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Inc/stm32f4xx_it.h
@@ -0,0 +1,66 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32f4xx_it.h
+ * @brief This file contains the headers of the interrupt handlers.
+ ******************************************************************************
+ * @attention
+ *
+ * Copyright (c) 2023 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software is licensed under terms that can be found in the LICENSE file
+ * in the root directory of this software component.
+ * If no LICENSE file comes with this software, it is provided AS-IS.
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32F4xx_IT_H
+#define __STM32F4xx_IT_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Exported types ------------------------------------------------------------*/
+/* USER CODE BEGIN ET */
+
+/* USER CODE END ET */
+
+/* Exported constants --------------------------------------------------------*/
+/* USER CODE BEGIN EC */
+
+/* USER CODE END EC */
+
+/* Exported macro ------------------------------------------------------------*/
+/* USER CODE BEGIN EM */
+
+/* USER CODE END EM */
+
+/* Exported functions prototypes ---------------------------------------------*/
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void MemManage_Handler(void);
+void BusFault_Handler(void);
+void UsageFault_Handler(void);
+void SVC_Handler(void);
+void DebugMon_Handler(void);
+void PendSV_Handler(void);
+void SysTick_Handler(void);
+/* USER CODE BEGIN EFP */
+
+/* USER CODE END EFP */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32F4xx_IT_H */
diff --git a/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Src/main.c
new file mode 100644
index 0000000000..a9acb2c5c1
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Src/main.c
@@ -0,0 +1,232 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file : main.c
+ * @brief : Main program body
+ ******************************************************************************
+ * @attention
+ *
+ * Copyright (c) 2023 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software is licensed under terms that can be found in the LICENSE file
+ * in the root directory of this software component.
+ * If no LICENSE file comes with this software, it is provided AS-IS.
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+UART_HandleTypeDef huart1;
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+void SystemClock_Config(void);
+static void MX_GPIO_Init(void);
+static void MX_USART1_UART_Init(void);
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/**
+ * @brief The application entry point.
+ * @retval int
+ */
+int main(void)
+{
+ /* USER CODE BEGIN 1 */
+
+ /* USER CODE END 1 */
+
+ /* MCU Configuration--------------------------------------------------------*/
+
+ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
+ HAL_Init();
+
+ /* USER CODE BEGIN Init */
+
+ /* USER CODE END Init */
+
+ /* Configure the system clock */
+ SystemClock_Config();
+
+ /* USER CODE BEGIN SysInit */
+
+ /* USER CODE END SysInit */
+
+ /* Initialize all configured peripherals */
+ MX_GPIO_Init();
+ MX_USART1_UART_Init();
+ /* USER CODE BEGIN 2 */
+
+ /* USER CODE END 2 */
+
+ /* Infinite loop */
+ /* USER CODE BEGIN WHILE */
+ while (1)
+ {
+ /* USER CODE END WHILE */
+
+ /* USER CODE BEGIN 3 */
+ }
+ /* USER CODE END 3 */
+}
+
+/**
+ * @brief System Clock Configuration
+ * @retval None
+ */
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_RCC_PWR_CLK_ENABLE();
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
+
+ /** Initializes the RCC Oscillators according to the specified parameters
+ * in the RCC_OscInitTypeDef structure.
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+ RCC_OscInitStruct.PLL.PLLM = 25;
+ RCC_OscInitStruct.PLL.PLLN = 168;
+ RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
+ RCC_OscInitStruct.PLL.PLLQ = 4;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ /** Initializes the CPU, AHB and APB buses clocks
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
+
+/**
+ * @brief USART1 Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_USART1_UART_Init(void)
+{
+
+ /* USER CODE BEGIN USART1_Init 0 */
+
+ /* USER CODE END USART1_Init 0 */
+
+ /* USER CODE BEGIN USART1_Init 1 */
+
+ /* USER CODE END USART1_Init 1 */
+ huart1.Instance = USART1;
+ huart1.Init.BaudRate = 115200;
+ huart1.Init.WordLength = UART_WORDLENGTH_8B;
+ huart1.Init.StopBits = UART_STOPBITS_1;
+ huart1.Init.Parity = UART_PARITY_NONE;
+ huart1.Init.Mode = UART_MODE_TX_RX;
+ huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
+ huart1.Init.OverSampling = UART_OVERSAMPLING_16;
+ if (HAL_UART_Init(&huart1) != HAL_OK)
+ {
+ Error_Handler();
+ }
+ /* USER CODE BEGIN USART1_Init 2 */
+
+ /* USER CODE END USART1_Init 2 */
+
+}
+
+/**
+ * @brief GPIO Initialization Function
+ * @param None
+ * @retval None
+ */
+static void MX_GPIO_Init(void)
+{
+
+ /* GPIO Ports Clock Enable */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOH_CLK_ENABLE();
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+
+}
+
+/* USER CODE BEGIN 4 */
+
+/* USER CODE END 4 */
+
+/**
+ * @brief This function is executed in case of error occurrence.
+ * @retval None
+ */
+void Error_Handler(void)
+{
+ /* USER CODE BEGIN Error_Handler_Debug */
+ /* User can add his own implementation to report the HAL error return state */
+ __disable_irq();
+ while (1)
+ {
+ }
+ /* USER CODE END Error_Handler_Debug */
+}
+
+#ifdef USE_FULL_ASSERT
+/**
+ * @brief Reports the name of the source file and the source line number
+ * where the assert_param error has occurred.
+ * @param file: pointer to the source file name
+ * @param line: assert_param error line source number
+ * @retval None
+ */
+void assert_failed(uint8_t *file, uint32_t line)
+{
+ /* USER CODE BEGIN 6 */
+ /* User can add his own implementation to report the file name and line number,
+ ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
+ /* USER CODE END 6 */
+}
+#endif /* USE_FULL_ASSERT */
diff --git a/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c b/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c
new file mode 100644
index 0000000000..289f2b1bce
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c
@@ -0,0 +1,146 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32f4xx_hal_msp.c
+ * @brief This file provides code for the MSP Initialization
+ * and de-Initialization codes.
+ ******************************************************************************
+ * @attention
+ *
+ * Copyright (c) 2023 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software is licensed under terms that can be found in the LICENSE file
+ * in the root directory of this software component.
+ * If no LICENSE file comes with this software, it is provided AS-IS.
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN Define */
+
+/* USER CODE END Define */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN Macro */
+
+/* USER CODE END Macro */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* External functions --------------------------------------------------------*/
+/* USER CODE BEGIN ExternalFunctions */
+
+/* USER CODE END ExternalFunctions */
+
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+/**
+ * Initializes the Global MSP.
+ */
+void HAL_MspInit(void)
+{
+ /* USER CODE BEGIN MspInit 0 */
+
+ /* USER CODE END MspInit 0 */
+
+ __HAL_RCC_SYSCFG_CLK_ENABLE();
+ __HAL_RCC_PWR_CLK_ENABLE();
+
+ /* System interrupt init*/
+
+ /* USER CODE BEGIN MspInit 1 */
+
+ /* USER CODE END MspInit 1 */
+}
+
+/**
+* @brief UART MSP Initialization
+* This function configures the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspInit(UART_HandleTypeDef* huart)
+{
+ GPIO_InitTypeDef GPIO_InitStruct = {0};
+ if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspInit 0 */
+
+ /* USER CODE END USART1_MspInit 0 */
+ /* Peripheral clock enable */
+ __HAL_RCC_USART1_CLK_ENABLE();
+
+ __HAL_RCC_GPIOA_CLK_ENABLE();
+ /**USART1 GPIO Configuration
+ PA9 ------> USART1_TX
+ PA10 ------> USART1_RX
+ */
+ GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+ GPIO_InitStruct.Alternate = GPIO_AF7_USART1;
+ HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+ /* USER CODE BEGIN USART1_MspInit 1 */
+
+ /* USER CODE END USART1_MspInit 1 */
+ }
+
+}
+
+/**
+* @brief UART MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param huart: UART handle pointer
+* @retval None
+*/
+void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
+{
+ if(huart->Instance==USART1)
+ {
+ /* USER CODE BEGIN USART1_MspDeInit 0 */
+
+ /* USER CODE END USART1_MspDeInit 0 */
+ /* Peripheral clock disable */
+ __HAL_RCC_USART1_CLK_DISABLE();
+
+ /**USART1 GPIO Configuration
+ PA9 ------> USART1_TX
+ PA10 ------> USART1_RX
+ */
+ HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
+
+ /* USER CODE BEGIN USART1_MspDeInit 1 */
+
+ /* USER CODE END USART1_MspDeInit 1 */
+ }
+
+}
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
diff --git a/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Src/stm32f4xx_it.c b/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Src/stm32f4xx_it.c
new file mode 100644
index 0000000000..1490637ae4
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Src/stm32f4xx_it.c
@@ -0,0 +1,203 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file stm32f4xx_it.c
+ * @brief Interrupt Service Routines.
+ ******************************************************************************
+ * @attention
+ *
+ * Copyright (c) 2023 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software is licensed under terms that can be found in the LICENSE file
+ * in the root directory of this software component.
+ * If no LICENSE file comes with this software, it is provided AS-IS.
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "main.h"
+#include "stm32f4xx_it.h"
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+/* USER CODE BEGIN TD */
+
+/* USER CODE END TD */
+
+/* Private define ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macro -------------------------------------------------------------*/
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private function prototypes -----------------------------------------------*/
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Private user code ---------------------------------------------------------*/
+/* USER CODE BEGIN 0 */
+
+/* USER CODE END 0 */
+
+/* External variables --------------------------------------------------------*/
+
+/* USER CODE BEGIN EV */
+
+/* USER CODE END EV */
+
+/******************************************************************************/
+/* Cortex-M4 Processor Interruption and Exception Handlers */
+/******************************************************************************/
+/**
+ * @brief This function handles Non maskable interrupt.
+ */
+void NMI_Handler(void)
+{
+ /* USER CODE BEGIN NonMaskableInt_IRQn 0 */
+
+ /* USER CODE END NonMaskableInt_IRQn 0 */
+ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
+ while (1)
+ {
+ }
+ /* USER CODE END NonMaskableInt_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Hard fault interrupt.
+ */
+void HardFault_Handler(void)
+{
+ /* USER CODE BEGIN HardFault_IRQn 0 */
+
+ /* USER CODE END HardFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_HardFault_IRQn 0 */
+ /* USER CODE END W1_HardFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Memory management fault.
+ */
+void MemManage_Handler(void)
+{
+ /* USER CODE BEGIN MemoryManagement_IRQn 0 */
+
+ /* USER CODE END MemoryManagement_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
+ /* USER CODE END W1_MemoryManagement_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Pre-fetch fault, memory access fault.
+ */
+void BusFault_Handler(void)
+{
+ /* USER CODE BEGIN BusFault_IRQn 0 */
+
+ /* USER CODE END BusFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_BusFault_IRQn 0 */
+ /* USER CODE END W1_BusFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles Undefined instruction or illegal state.
+ */
+void UsageFault_Handler(void)
+{
+ /* USER CODE BEGIN UsageFault_IRQn 0 */
+
+ /* USER CODE END UsageFault_IRQn 0 */
+ while (1)
+ {
+ /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
+ /* USER CODE END W1_UsageFault_IRQn 0 */
+ }
+}
+
+/**
+ * @brief This function handles System service call via SWI instruction.
+ */
+void SVC_Handler(void)
+{
+ /* USER CODE BEGIN SVCall_IRQn 0 */
+
+ /* USER CODE END SVCall_IRQn 0 */
+ /* USER CODE BEGIN SVCall_IRQn 1 */
+
+ /* USER CODE END SVCall_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Debug monitor.
+ */
+void DebugMon_Handler(void)
+{
+ /* USER CODE BEGIN DebugMonitor_IRQn 0 */
+
+ /* USER CODE END DebugMonitor_IRQn 0 */
+ /* USER CODE BEGIN DebugMonitor_IRQn 1 */
+
+ /* USER CODE END DebugMonitor_IRQn 1 */
+}
+
+/**
+ * @brief This function handles Pendable request for system service.
+ */
+void PendSV_Handler(void)
+{
+ /* USER CODE BEGIN PendSV_IRQn 0 */
+
+ /* USER CODE END PendSV_IRQn 0 */
+ /* USER CODE BEGIN PendSV_IRQn 1 */
+
+ /* USER CODE END PendSV_IRQn 1 */
+}
+
+/**
+ * @brief This function handles System tick timer.
+ */
+void SysTick_Handler(void)
+{
+ /* USER CODE BEGIN SysTick_IRQn 0 */
+
+ /* USER CODE END SysTick_IRQn 0 */
+ HAL_IncTick();
+ /* USER CODE BEGIN SysTick_IRQn 1 */
+
+ /* USER CODE END SysTick_IRQn 1 */
+}
+
+/******************************************************************************/
+/* STM32F4xx Peripheral Interrupt Handlers */
+/* Add here the Interrupt Handlers for the used peripherals. */
+/* For the available peripheral interrupt handler names, */
+/* please refer to the startup file (startup_stm32f4xx.s). */
+/******************************************************************************/
+
+/* USER CODE BEGIN 1 */
+
+/* USER CODE END 1 */
diff --git a/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Src/system_stm32f4xx.c b/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Src/system_stm32f4xx.c
new file mode 100644
index 0000000000..3bd40f7788
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/board/CubeMX_Config/Src/system_stm32f4xx.c
@@ -0,0 +1,747 @@
+/**
+ ******************************************************************************
+ * @file system_stm32f4xx.c
+ * @author MCD Application Team
+ * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File.
+ *
+ * This file provides two functions and one global variable to be called from
+ * user application:
+ * - SystemInit(): This function is called at startup just after reset and
+ * before branch to main program. This call is made inside
+ * the "startup_stm32f4xx.s" file.
+ *
+ * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used
+ * by the user application to setup the SysTick
+ * timer or configure other parameters.
+ *
+ * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must
+ * be called whenever the core clock is changed
+ * during program execution.
+ *
+ *
+ ******************************************************************************
+ * @attention
+ *
+ * Copyright (c) 2017 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software is licensed under terms that can be found in the LICENSE file
+ * in the root directory of this software component.
+ * If no LICENSE file comes with this software, it is provided AS-IS.
+ *
+ ******************************************************************************
+ */
+
+/** @addtogroup CMSIS
+ * @{
+ */
+
+/** @addtogroup stm32f4xx_system
+ * @{
+ */
+
+/** @addtogroup STM32F4xx_System_Private_Includes
+ * @{
+ */
+
+
+#include "stm32f4xx.h"
+
+#if !defined (HSE_VALUE)
+ #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */
+#endif /* HSE_VALUE */
+
+#if !defined (HSI_VALUE)
+ #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/
+#endif /* HSI_VALUE */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32F4xx_System_Private_TypesDefinitions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32F4xx_System_Private_Defines
+ * @{
+ */
+
+/************************* Miscellaneous Configuration ************************/
+/*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory */
+#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\
+ || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
+ || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx)
+/* #define DATA_IN_ExtSRAM */
+#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx ||\
+ STM32F412Zx || STM32F412Vx */
+
+#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
+ || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx)
+/* #define DATA_IN_ExtSDRAM */
+#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\
+ STM32F479xx */
+
+/* Note: Following vector table addresses must be defined in line with linker
+ configuration. */
+/*!< Uncomment the following line if you need to relocate the vector table
+ anywhere in Flash or Sram, else the vector table is kept at the automatic
+ remap of boot address selected */
+/* #define USER_VECT_TAB_ADDRESS */
+
+#if defined(USER_VECT_TAB_ADDRESS)
+/*!< Uncomment the following line if you need to relocate your vector Table
+ in Sram else user remap will be done in Flash. */
+/* #define VECT_TAB_SRAM */
+#if defined(VECT_TAB_SRAM)
+#define VECT_TAB_BASE_ADDRESS SRAM_BASE /*!< Vector Table base address field.
+ This value must be a multiple of 0x200. */
+#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+#else
+#define VECT_TAB_BASE_ADDRESS FLASH_BASE /*!< Vector Table base address field.
+ This value must be a multiple of 0x200. */
+#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field.
+ This value must be a multiple of 0x200. */
+#endif /* VECT_TAB_SRAM */
+#endif /* USER_VECT_TAB_ADDRESS */
+/******************************************************************************/
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32F4xx_System_Private_Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32F4xx_System_Private_Variables
+ * @{
+ */
+ /* This variable is updated in three ways:
+ 1) by calling CMSIS function SystemCoreClockUpdate()
+ 2) by calling HAL API function HAL_RCC_GetHCLKFreq()
+ 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency
+ Note: If you use this function to configure the system clock; then there
+ is no need to call the 2 first functions listed above, since SystemCoreClock
+ variable is updated automatically.
+ */
+uint32_t SystemCoreClock = 16000000;
+const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};
+const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4};
+/**
+ * @}
+ */
+
+/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes
+ * @{
+ */
+
+#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
+ static void SystemInit_ExtMemCtl(void);
+#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32F4xx_System_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief Setup the microcontroller system
+ * Initialize the FPU setting, vector table location and External memory
+ * configuration.
+ * @param None
+ * @retval None
+ */
+void SystemInit(void)
+{
+ /* FPU settings ------------------------------------------------------------*/
+ #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+ SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
+ #endif
+
+#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
+ SystemInit_ExtMemCtl();
+#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */
+
+ /* Configure the Vector Table location -------------------------------------*/
+#if defined(USER_VECT_TAB_ADDRESS)
+ SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */
+#endif /* USER_VECT_TAB_ADDRESS */
+}
+
+/**
+ * @brief Update SystemCoreClock variable according to Clock Register Values.
+ * The SystemCoreClock variable contains the core clock (HCLK), it can
+ * be used by the user application to setup the SysTick timer or configure
+ * other parameters.
+ *
+ * @note Each time the core clock (HCLK) changes, this function must be called
+ * to update SystemCoreClock variable value. Otherwise, any configuration
+ * based on this variable will be incorrect.
+ *
+ * @note - The system frequency computed by this function is not the real
+ * frequency in the chip. It is calculated based on the predefined
+ * constant and the selected clock source:
+ *
+ * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*)
+ *
+ * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**)
+ *
+ * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**)
+ * or HSI_VALUE(*) multiplied/divided by the PLL factors.
+ *
+ * (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value
+ * 16 MHz) but the real value may vary depending on the variations
+ * in voltage and temperature.
+ *
+ * (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value
+ * depends on the application requirements), user has to ensure that HSE_VALUE
+ * is same as the real frequency of the crystal used. Otherwise, this function
+ * may have wrong result.
+ *
+ * - The result of this function could be not correct when using fractional
+ * value for HSE crystal.
+ *
+ * @param None
+ * @retval None
+ */
+void SystemCoreClockUpdate(void)
+{
+ uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2;
+
+ /* Get SYSCLK source -------------------------------------------------------*/
+ tmp = RCC->CFGR & RCC_CFGR_SWS;
+
+ switch (tmp)
+ {
+ case 0x00: /* HSI used as system clock source */
+ SystemCoreClock = HSI_VALUE;
+ break;
+ case 0x04: /* HSE used as system clock source */
+ SystemCoreClock = HSE_VALUE;
+ break;
+ case 0x08: /* PLL used as system clock source */
+
+ /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N
+ SYSCLK = PLL_VCO / PLL_P
+ */
+ pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22;
+ pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM;
+
+ if (pllsource != 0)
+ {
+ /* HSE used as PLL clock source */
+ pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
+ }
+ else
+ {
+ /* HSI used as PLL clock source */
+ pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6);
+ }
+
+ pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2;
+ SystemCoreClock = pllvco/pllp;
+ break;
+ default:
+ SystemCoreClock = HSI_VALUE;
+ break;
+ }
+ /* Compute HCLK frequency --------------------------------------------------*/
+ /* Get HCLK prescaler */
+ tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)];
+ /* HCLK frequency */
+ SystemCoreClock >>= tmp;
+}
+
+#if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM)
+#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
+ || defined(STM32F469xx) || defined(STM32F479xx)
+/**
+ * @brief Setup the external memory controller.
+ * Called in startup_stm32f4xx.s before jump to main.
+ * This function configures the external memories (SRAM/SDRAM)
+ * This SRAM/SDRAM will be used as program data memory (including heap and stack).
+ * @param None
+ * @retval None
+ */
+void SystemInit_ExtMemCtl(void)
+{
+ __IO uint32_t tmp = 0x00;
+
+ register uint32_t tmpreg = 0, timeout = 0xFFFF;
+ register __IO uint32_t index;
+
+ /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface clock */
+ RCC->AHB1ENR |= 0x000001F8;
+
+ /* Delay after an RCC peripheral clock enabling */
+ tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);
+
+ /* Connect PDx pins to FMC Alternate function */
+ GPIOD->AFR[0] = 0x00CCC0CC;
+ GPIOD->AFR[1] = 0xCCCCCCCC;
+ /* Configure PDx pins in Alternate function mode */
+ GPIOD->MODER = 0xAAAA0A8A;
+ /* Configure PDx pins speed to 100 MHz */
+ GPIOD->OSPEEDR = 0xFFFF0FCF;
+ /* Configure PDx pins Output type to push-pull */
+ GPIOD->OTYPER = 0x00000000;
+ /* No pull-up, pull-down for PDx pins */
+ GPIOD->PUPDR = 0x00000000;
+
+ /* Connect PEx pins to FMC Alternate function */
+ GPIOE->AFR[0] = 0xC00CC0CC;
+ GPIOE->AFR[1] = 0xCCCCCCCC;
+ /* Configure PEx pins in Alternate function mode */
+ GPIOE->MODER = 0xAAAA828A;
+ /* Configure PEx pins speed to 100 MHz */
+ GPIOE->OSPEEDR = 0xFFFFC3CF;
+ /* Configure PEx pins Output type to push-pull */
+ GPIOE->OTYPER = 0x00000000;
+ /* No pull-up, pull-down for PEx pins */
+ GPIOE->PUPDR = 0x00000000;
+
+ /* Connect PFx pins to FMC Alternate function */
+ GPIOF->AFR[0] = 0xCCCCCCCC;
+ GPIOF->AFR[1] = 0xCCCCCCCC;
+ /* Configure PFx pins in Alternate function mode */
+ GPIOF->MODER = 0xAA800AAA;
+ /* Configure PFx pins speed to 50 MHz */
+ GPIOF->OSPEEDR = 0xAA800AAA;
+ /* Configure PFx pins Output type to push-pull */
+ GPIOF->OTYPER = 0x00000000;
+ /* No pull-up, pull-down for PFx pins */
+ GPIOF->PUPDR = 0x00000000;
+
+ /* Connect PGx pins to FMC Alternate function */
+ GPIOG->AFR[0] = 0xCCCCCCCC;
+ GPIOG->AFR[1] = 0xCCCCCCCC;
+ /* Configure PGx pins in Alternate function mode */
+ GPIOG->MODER = 0xAAAAAAAA;
+ /* Configure PGx pins speed to 50 MHz */
+ GPIOG->OSPEEDR = 0xAAAAAAAA;
+ /* Configure PGx pins Output type to push-pull */
+ GPIOG->OTYPER = 0x00000000;
+ /* No pull-up, pull-down for PGx pins */
+ GPIOG->PUPDR = 0x00000000;
+
+ /* Connect PHx pins to FMC Alternate function */
+ GPIOH->AFR[0] = 0x00C0CC00;
+ GPIOH->AFR[1] = 0xCCCCCCCC;
+ /* Configure PHx pins in Alternate function mode */
+ GPIOH->MODER = 0xAAAA08A0;
+ /* Configure PHx pins speed to 50 MHz */
+ GPIOH->OSPEEDR = 0xAAAA08A0;
+ /* Configure PHx pins Output type to push-pull */
+ GPIOH->OTYPER = 0x00000000;
+ /* No pull-up, pull-down for PHx pins */
+ GPIOH->PUPDR = 0x00000000;
+
+ /* Connect PIx pins to FMC Alternate function */
+ GPIOI->AFR[0] = 0xCCCCCCCC;
+ GPIOI->AFR[1] = 0x00000CC0;
+ /* Configure PIx pins in Alternate function mode */
+ GPIOI->MODER = 0x0028AAAA;
+ /* Configure PIx pins speed to 50 MHz */
+ GPIOI->OSPEEDR = 0x0028AAAA;
+ /* Configure PIx pins Output type to push-pull */
+ GPIOI->OTYPER = 0x00000000;
+ /* No pull-up, pull-down for PIx pins */
+ GPIOI->PUPDR = 0x00000000;
+
+/*-- FMC Configuration -------------------------------------------------------*/
+ /* Enable the FMC interface clock */
+ RCC->AHB3ENR |= 0x00000001;
+ /* Delay after an RCC peripheral clock enabling */
+ tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);
+
+ FMC_Bank5_6->SDCR[0] = 0x000019E4;
+ FMC_Bank5_6->SDTR[0] = 0x01115351;
+
+ /* SDRAM initialization sequence */
+ /* Clock enable command */
+ FMC_Bank5_6->SDCMR = 0x00000011;
+ tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
+ while((tmpreg != 0) && (timeout-- > 0))
+ {
+ tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
+ }
+
+ /* Delay */
+ for (index = 0; index<1000; index++);
+
+ /* PALL command */
+ FMC_Bank5_6->SDCMR = 0x00000012;
+ tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
+ timeout = 0xFFFF;
+ while((tmpreg != 0) && (timeout-- > 0))
+ {
+ tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
+ }
+
+ /* Auto refresh command */
+ FMC_Bank5_6->SDCMR = 0x00000073;
+ tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
+ timeout = 0xFFFF;
+ while((tmpreg != 0) && (timeout-- > 0))
+ {
+ tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
+ }
+
+ /* MRD register program */
+ FMC_Bank5_6->SDCMR = 0x00046014;
+ tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
+ timeout = 0xFFFF;
+ while((tmpreg != 0) && (timeout-- > 0))
+ {
+ tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
+ }
+
+ /* Set refresh count */
+ tmpreg = FMC_Bank5_6->SDRTR;
+ FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1));
+
+ /* Disable write protection */
+ tmpreg = FMC_Bank5_6->SDCR[0];
+ FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF);
+
+#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)
+ /* Configure and enable Bank1_SRAM2 */
+ FMC_Bank1->BTCR[2] = 0x00001011;
+ FMC_Bank1->BTCR[3] = 0x00000201;
+ FMC_Bank1E->BWTR[2] = 0x0fffffff;
+#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */
+#if defined(STM32F469xx) || defined(STM32F479xx)
+ /* Configure and enable Bank1_SRAM2 */
+ FMC_Bank1->BTCR[2] = 0x00001091;
+ FMC_Bank1->BTCR[3] = 0x00110212;
+ FMC_Bank1E->BWTR[2] = 0x0fffffff;
+#endif /* STM32F469xx || STM32F479xx */
+
+ (void)(tmp);
+}
+#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */
+#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)
+/**
+ * @brief Setup the external memory controller.
+ * Called in startup_stm32f4xx.s before jump to main.
+ * This function configures the external memories (SRAM/SDRAM)
+ * This SRAM/SDRAM will be used as program data memory (including heap and stack).
+ * @param None
+ * @retval None
+ */
+void SystemInit_ExtMemCtl(void)
+{
+ __IO uint32_t tmp = 0x00;
+#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
+ || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx)
+#if defined (DATA_IN_ExtSDRAM)
+ register uint32_t tmpreg = 0, timeout = 0xFFFF;
+ register __IO uint32_t index;
+
+#if defined(STM32F446xx)
+ /* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface
+ clock */
+ RCC->AHB1ENR |= 0x0000007D;
+#else
+ /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface
+ clock */
+ RCC->AHB1ENR |= 0x000001F8;
+#endif /* STM32F446xx */
+ /* Delay after an RCC peripheral clock enabling */
+ tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN);
+
+#if defined(STM32F446xx)
+ /* Connect PAx pins to FMC Alternate function */
+ GPIOA->AFR[0] |= 0xC0000000;
+ GPIOA->AFR[1] |= 0x00000000;
+ /* Configure PDx pins in Alternate function mode */
+ GPIOA->MODER |= 0x00008000;
+ /* Configure PDx pins speed to 50 MHz */
+ GPIOA->OSPEEDR |= 0x00008000;
+ /* Configure PDx pins Output type to push-pull */
+ GPIOA->OTYPER |= 0x00000000;
+ /* No pull-up, pull-down for PDx pins */
+ GPIOA->PUPDR |= 0x00000000;
+
+ /* Connect PCx pins to FMC Alternate function */
+ GPIOC->AFR[0] |= 0x00CC0000;
+ GPIOC->AFR[1] |= 0x00000000;
+ /* Configure PDx pins in Alternate function mode */
+ GPIOC->MODER |= 0x00000A00;
+ /* Configure PDx pins speed to 50 MHz */
+ GPIOC->OSPEEDR |= 0x00000A00;
+ /* Configure PDx pins Output type to push-pull */
+ GPIOC->OTYPER |= 0x00000000;
+ /* No pull-up, pull-down for PDx pins */
+ GPIOC->PUPDR |= 0x00000000;
+#endif /* STM32F446xx */
+
+ /* Connect PDx pins to FMC Alternate function */
+ GPIOD->AFR[0] = 0x000000CC;
+ GPIOD->AFR[1] = 0xCC000CCC;
+ /* Configure PDx pins in Alternate function mode */
+ GPIOD->MODER = 0xA02A000A;
+ /* Configure PDx pins speed to 50 MHz */
+ GPIOD->OSPEEDR = 0xA02A000A;
+ /* Configure PDx pins Output type to push-pull */
+ GPIOD->OTYPER = 0x00000000;
+ /* No pull-up, pull-down for PDx pins */
+ GPIOD->PUPDR = 0x00000000;
+
+ /* Connect PEx pins to FMC Alternate function */
+ GPIOE->AFR[0] = 0xC00000CC;
+ GPIOE->AFR[1] = 0xCCCCCCCC;
+ /* Configure PEx pins in Alternate function mode */
+ GPIOE->MODER = 0xAAAA800A;
+ /* Configure PEx pins speed to 50 MHz */
+ GPIOE->OSPEEDR = 0xAAAA800A;
+ /* Configure PEx pins Output type to push-pull */
+ GPIOE->OTYPER = 0x00000000;
+ /* No pull-up, pull-down for PEx pins */
+ GPIOE->PUPDR = 0x00000000;
+
+ /* Connect PFx pins to FMC Alternate function */
+ GPIOF->AFR[0] = 0xCCCCCCCC;
+ GPIOF->AFR[1] = 0xCCCCCCCC;
+ /* Configure PFx pins in Alternate function mode */
+ GPIOF->MODER = 0xAA800AAA;
+ /* Configure PFx pins speed to 50 MHz */
+ GPIOF->OSPEEDR = 0xAA800AAA;
+ /* Configure PFx pins Output type to push-pull */
+ GPIOF->OTYPER = 0x00000000;
+ /* No pull-up, pull-down for PFx pins */
+ GPIOF->PUPDR = 0x00000000;
+
+ /* Connect PGx pins to FMC Alternate function */
+ GPIOG->AFR[0] = 0xCCCCCCCC;
+ GPIOG->AFR[1] = 0xCCCCCCCC;
+ /* Configure PGx pins in Alternate function mode */
+ GPIOG->MODER = 0xAAAAAAAA;
+ /* Configure PGx pins speed to 50 MHz */
+ GPIOG->OSPEEDR = 0xAAAAAAAA;
+ /* Configure PGx pins Output type to push-pull */
+ GPIOG->OTYPER = 0x00000000;
+ /* No pull-up, pull-down for PGx pins */
+ GPIOG->PUPDR = 0x00000000;
+
+#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
+ || defined(STM32F469xx) || defined(STM32F479xx)
+ /* Connect PHx pins to FMC Alternate function */
+ GPIOH->AFR[0] = 0x00C0CC00;
+ GPIOH->AFR[1] = 0xCCCCCCCC;
+ /* Configure PHx pins in Alternate function mode */
+ GPIOH->MODER = 0xAAAA08A0;
+ /* Configure PHx pins speed to 50 MHz */
+ GPIOH->OSPEEDR = 0xAAAA08A0;
+ /* Configure PHx pins Output type to push-pull */
+ GPIOH->OTYPER = 0x00000000;
+ /* No pull-up, pull-down for PHx pins */
+ GPIOH->PUPDR = 0x00000000;
+
+ /* Connect PIx pins to FMC Alternate function */
+ GPIOI->AFR[0] = 0xCCCCCCCC;
+ GPIOI->AFR[1] = 0x00000CC0;
+ /* Configure PIx pins in Alternate function mode */
+ GPIOI->MODER = 0x0028AAAA;
+ /* Configure PIx pins speed to 50 MHz */
+ GPIOI->OSPEEDR = 0x0028AAAA;
+ /* Configure PIx pins Output type to push-pull */
+ GPIOI->OTYPER = 0x00000000;
+ /* No pull-up, pull-down for PIx pins */
+ GPIOI->PUPDR = 0x00000000;
+#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */
+
+/*-- FMC Configuration -------------------------------------------------------*/
+ /* Enable the FMC interface clock */
+ RCC->AHB3ENR |= 0x00000001;
+ /* Delay after an RCC peripheral clock enabling */
+ tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);
+
+ /* Configure and enable SDRAM bank1 */
+#if defined(STM32F446xx)
+ FMC_Bank5_6->SDCR[0] = 0x00001954;
+#else
+ FMC_Bank5_6->SDCR[0] = 0x000019E4;
+#endif /* STM32F446xx */
+ FMC_Bank5_6->SDTR[0] = 0x01115351;
+
+ /* SDRAM initialization sequence */
+ /* Clock enable command */
+ FMC_Bank5_6->SDCMR = 0x00000011;
+ tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
+ while((tmpreg != 0) && (timeout-- > 0))
+ {
+ tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
+ }
+
+ /* Delay */
+ for (index = 0; index<1000; index++);
+
+ /* PALL command */
+ FMC_Bank5_6->SDCMR = 0x00000012;
+ tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
+ timeout = 0xFFFF;
+ while((tmpreg != 0) && (timeout-- > 0))
+ {
+ tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
+ }
+
+ /* Auto refresh command */
+#if defined(STM32F446xx)
+ FMC_Bank5_6->SDCMR = 0x000000F3;
+#else
+ FMC_Bank5_6->SDCMR = 0x00000073;
+#endif /* STM32F446xx */
+ tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
+ timeout = 0xFFFF;
+ while((tmpreg != 0) && (timeout-- > 0))
+ {
+ tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
+ }
+
+ /* MRD register program */
+#if defined(STM32F446xx)
+ FMC_Bank5_6->SDCMR = 0x00044014;
+#else
+ FMC_Bank5_6->SDCMR = 0x00046014;
+#endif /* STM32F446xx */
+ tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
+ timeout = 0xFFFF;
+ while((tmpreg != 0) && (timeout-- > 0))
+ {
+ tmpreg = FMC_Bank5_6->SDSR & 0x00000020;
+ }
+
+ /* Set refresh count */
+ tmpreg = FMC_Bank5_6->SDRTR;
+#if defined(STM32F446xx)
+ FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1));
+#else
+ FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1));
+#endif /* STM32F446xx */
+
+ /* Disable write protection */
+ tmpreg = FMC_Bank5_6->SDCR[0];
+ FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF);
+#endif /* DATA_IN_ExtSDRAM */
+#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */
+
+#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\
+ || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\
+ || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx)
+
+#if defined(DATA_IN_ExtSRAM)
+/*-- GPIOs Configuration -----------------------------------------------------*/
+ /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */
+ RCC->AHB1ENR |= 0x00000078;
+ /* Delay after an RCC peripheral clock enabling */
+ tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN);
+
+ /* Connect PDx pins to FMC Alternate function */
+ GPIOD->AFR[0] = 0x00CCC0CC;
+ GPIOD->AFR[1] = 0xCCCCCCCC;
+ /* Configure PDx pins in Alternate function mode */
+ GPIOD->MODER = 0xAAAA0A8A;
+ /* Configure PDx pins speed to 100 MHz */
+ GPIOD->OSPEEDR = 0xFFFF0FCF;
+ /* Configure PDx pins Output type to push-pull */
+ GPIOD->OTYPER = 0x00000000;
+ /* No pull-up, pull-down for PDx pins */
+ GPIOD->PUPDR = 0x00000000;
+
+ /* Connect PEx pins to FMC Alternate function */
+ GPIOE->AFR[0] = 0xC00CC0CC;
+ GPIOE->AFR[1] = 0xCCCCCCCC;
+ /* Configure PEx pins in Alternate function mode */
+ GPIOE->MODER = 0xAAAA828A;
+ /* Configure PEx pins speed to 100 MHz */
+ GPIOE->OSPEEDR = 0xFFFFC3CF;
+ /* Configure PEx pins Output type to push-pull */
+ GPIOE->OTYPER = 0x00000000;
+ /* No pull-up, pull-down for PEx pins */
+ GPIOE->PUPDR = 0x00000000;
+
+ /* Connect PFx pins to FMC Alternate function */
+ GPIOF->AFR[0] = 0x00CCCCCC;
+ GPIOF->AFR[1] = 0xCCCC0000;
+ /* Configure PFx pins in Alternate function mode */
+ GPIOF->MODER = 0xAA000AAA;
+ /* Configure PFx pins speed to 100 MHz */
+ GPIOF->OSPEEDR = 0xFF000FFF;
+ /* Configure PFx pins Output type to push-pull */
+ GPIOF->OTYPER = 0x00000000;
+ /* No pull-up, pull-down for PFx pins */
+ GPIOF->PUPDR = 0x00000000;
+
+ /* Connect PGx pins to FMC Alternate function */
+ GPIOG->AFR[0] = 0x00CCCCCC;
+ GPIOG->AFR[1] = 0x000000C0;
+ /* Configure PGx pins in Alternate function mode */
+ GPIOG->MODER = 0x00085AAA;
+ /* Configure PGx pins speed to 100 MHz */
+ GPIOG->OSPEEDR = 0x000CAFFF;
+ /* Configure PGx pins Output type to push-pull */
+ GPIOG->OTYPER = 0x00000000;
+ /* No pull-up, pull-down for PGx pins */
+ GPIOG->PUPDR = 0x00000000;
+
+/*-- FMC/FSMC Configuration --------------------------------------------------*/
+ /* Enable the FMC/FSMC interface clock */
+ RCC->AHB3ENR |= 0x00000001;
+
+#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)
+ /* Delay after an RCC peripheral clock enabling */
+ tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);
+ /* Configure and enable Bank1_SRAM2 */
+ FMC_Bank1->BTCR[2] = 0x00001011;
+ FMC_Bank1->BTCR[3] = 0x00000201;
+ FMC_Bank1E->BWTR[2] = 0x0fffffff;
+#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */
+#if defined(STM32F469xx) || defined(STM32F479xx)
+ /* Delay after an RCC peripheral clock enabling */
+ tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN);
+ /* Configure and enable Bank1_SRAM2 */
+ FMC_Bank1->BTCR[2] = 0x00001091;
+ FMC_Bank1->BTCR[3] = 0x00110212;
+ FMC_Bank1E->BWTR[2] = 0x0fffffff;
+#endif /* STM32F469xx || STM32F479xx */
+#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\
+ || defined(STM32F412Zx) || defined(STM32F412Vx)
+ /* Delay after an RCC peripheral clock enabling */
+ tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN);
+ /* Configure and enable Bank1_SRAM2 */
+ FSMC_Bank1->BTCR[2] = 0x00001011;
+ FSMC_Bank1->BTCR[3] = 0x00000201;
+ FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF;
+#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F412Zx || STM32F412Vx */
+
+#endif /* DATA_IN_ExtSRAM */
+#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\
+ STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx */
+ (void)(tmp);
+}
+#endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
diff --git a/bsp/stm32/stm32f401-weact-blackpill/board/Kconfig b/bsp/stm32/stm32f401-weact-blackpill/board/Kconfig
new file mode 100644
index 0000000000..7e68493d4c
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/board/Kconfig
@@ -0,0 +1,44 @@
+menu "Hardware Drivers Config"
+
+config SOC_STM32F401CC
+ bool
+ select SOC_SERIES_STM32F4
+ select RT_USING_COMPONENTS_INIT
+ select RT_USING_USER_MAIN
+ default y
+
+menu "Onboard Peripheral Drivers"
+
+endmenu
+
+menu "On-chip Peripheral Drivers"
+
+ config BSP_USING_GPIO
+ bool "Enable GPIO"
+ select RT_USING_PIN
+ default y
+
+ menuconfig BSP_USING_UART
+ bool "Enable UART"
+ default y
+ select RT_USING_SERIAL
+ if BSP_USING_UART
+ config BSP_USING_UART1
+ bool "Enable UART1"
+ default y
+
+ config BSP_UART1_RX_USING_DMA
+ bool "Enable UART1 RX DMA"
+ depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA
+ default n
+ endif
+
+ source "../libraries/HAL_Drivers/Kconfig"
+
+endmenu
+
+menu "Board extended module Drivers"
+
+endmenu
+
+endmenu
diff --git a/bsp/stm32/stm32f401-weact-blackpill/board/SConscript b/bsp/stm32/stm32f401-weact-blackpill/board/SConscript
new file mode 100644
index 0000000000..73b7050dce
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/board/SConscript
@@ -0,0 +1,37 @@
+import os
+import rtconfig
+from building import *
+
+Import('SDK_LIB')
+
+cwd = GetCurrentDir()
+
+# add general drivers
+src = Split('''
+board.c
+CubeMX_Config/Src/stm32f4xx_hal_msp.c
+''')
+
+path = [cwd]
+path += [cwd + '/CubeMX_Config/Inc']
+
+startup_path_prefix = SDK_LIB
+
+if rtconfig.PLATFORM in ['gcc']:
+ src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f401xc.s']
+elif rtconfig.PLATFORM in ['armcc', 'armclang']:
+ src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f401xc.s']
+elif rtconfig.PLATFORM in ['iccarm']:
+ src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f401xc.s']
+
+# STM32F405xx) || STM32F415xx) || STM32F407xx) || STM32F417xx)
+# STM32F427xx) || STM32F437xx) || STM32F429xx) || STM32F439xx)
+# STM32F401xC) || STM32F401xE) || STM32F410Tx) || STM32F410Cx)
+# STM32F410Rx) || STM32F411xE) || STM32F446xx) || STM32F469xx)
+# STM32F479xx) || STM32F412Cx) || STM32F412Rx) || STM32F412Vx)
+# STM32F412Zx) || STM32F413xx) || STM32F423xx)
+# You can select chips from the list above
+CPPDEFINES = ['STM32F401xC']
+group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES)
+
+Return('group')
diff --git a/bsp/stm32/stm32f401-weact-blackpill/board/board.c b/bsp/stm32/stm32f401-weact-blackpill/board/board.c
new file mode 100644
index 0000000000..8e1061d2c6
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/board/board.c
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-11-06 SummerGift first version
+ */
+
+#include "board.h"
+
+void SystemClock_Config(void)
+{
+ RCC_OscInitTypeDef RCC_OscInitStruct = {0};
+ RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
+
+ /** Configure the main internal regulator output voltage
+ */
+ __HAL_RCC_PWR_CLK_ENABLE();
+ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);
+
+ /** Initializes the RCC Oscillators according to the specified parameters
+ * in the RCC_OscInitTypeDef structure.
+ */
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_ON;
+ RCC_OscInitStruct.LSIState = RCC_LSI_ON;
+ RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
+ RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
+ RCC_OscInitStruct.PLL.PLLM = 25;
+ RCC_OscInitStruct.PLL.PLLN = 168;
+ RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
+ RCC_OscInitStruct.PLL.PLLQ = 4;
+ if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
+
+ /** Initializes the CPU, AHB and APB buses clocks
+ */
+ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
+ RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
+ RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
+ RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
+ RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
+
+ if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
+ {
+ Error_Handler();
+ }
+}
diff --git a/bsp/stm32/stm32f401-weact-blackpill/board/board.h b/bsp/stm32/stm32f401-weact-blackpill/board/board.h
new file mode 100644
index 0000000000..76454062fb
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/board/board.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-11-5 SummerGift first version
+ */
+
+#ifndef __BOARD_H__
+#define __BOARD_H__
+
+#include
+#include
+#include "drv_common.h"
+#include "drv_gpio.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define STM32_FLASH_START_ADRESS ((uint32_t)0x08000000)
+#define STM32_FLASH_SIZE (256 * 1024)
+#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE))
+
+#define STM32_SRAM_SIZE 64
+#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024)
+
+#if defined(__ARMCC_VERSION)
+extern int Image$$RW_IRAM1$$ZI$$Limit;
+#define HEAP_BEGIN (&Image$$RW_IRAM1$$ZI$$Limit)
+#elif __ICCARM__
+#pragma section="CSTACK"
+#define HEAP_BEGIN (__segment_end("CSTACK"))
+#else
+extern int __bss_end;
+#define HEAP_BEGIN (&__bss_end)
+#endif
+
+#define HEAP_END STM32_SRAM_END
+
+void SystemClock_Config(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/bsp/stm32/stm32f401-weact-blackpill/board/linker_scripts/link.icf b/bsp/stm32/stm32f401-weact-blackpill/board/linker_scripts/link.icf
new file mode 100644
index 0000000000..db659fbca2
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/board/linker_scripts/link.icf
@@ -0,0 +1,28 @@
+/*###ICF### Section handled by ICF editor, don't touch! ****/
+/*-Editor annotation file-*/
+/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
+/*-Specials-*/
+define symbol __ICFEDIT_intvec_start__ = 0x08000000;
+/*-Memory Regions-*/
+define symbol __ICFEDIT_region_ROM_start__ = 0x08000000;
+define symbol __ICFEDIT_region_ROM_end__ = 0x0003FFFF;
+define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
+define symbol __ICFEDIT_region_RAM_end__ = 0x2000FFFF;
+/*-Sizes-*/
+define symbol __ICFEDIT_size_cstack__ = 0x0400;
+define symbol __ICFEDIT_size_heap__ = 0x000;
+/**** End of ICF editor section. ###ICF###*/
+
+define memory mem with size = 4G;
+define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
+define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
+
+define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
+
+initialize by copy { readwrite };
+do not initialize { section .noinit };
+
+place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
+
+place in ROM_region { readonly };
+place in RAM_region { readwrite, last block CSTACK};
diff --git a/bsp/stm32/stm32f401-weact-blackpill/board/linker_scripts/link.lds b/bsp/stm32/stm32f401-weact-blackpill/board/linker_scripts/link.lds
new file mode 100644
index 0000000000..39d98b772b
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/board/linker_scripts/link.lds
@@ -0,0 +1,157 @@
+/*
+ * linker script for STM32F4xx with GNU ld
+ * bernard.xiong 2009-10-14
+ */
+
+/* Program Entry, set to mark it as "used" and avoid gc */
+MEMORY
+{
+ ROM (rx) : ORIGIN = 0x08000000, LENGTH = 256k /* 256KB flash */
+ RAM (rw) : ORIGIN = 0x20000000, LENGTH = 64k /* 64K sram */
+}
+ENTRY(Reset_Handler)
+_system_stack_size = 0x400;
+
+SECTIONS
+{
+ .text :
+ {
+ . = ALIGN(4);
+ _stext = .;
+ KEEP(*(.isr_vector)) /* Startup code */
+
+ . = ALIGN(4);
+ *(.text) /* remaining code */
+ *(.text.*) /* remaining code */
+ *(.rodata) /* read-only data (constants) */
+ *(.rodata*)
+ *(.glue_7)
+ *(.glue_7t)
+ *(.gnu.linkonce.t*)
+
+ /* section information for finsh shell */
+ . = ALIGN(4);
+ __fsymtab_start = .;
+ KEEP(*(FSymTab))
+ __fsymtab_end = .;
+
+ . = ALIGN(4);
+ __vsymtab_start = .;
+ KEEP(*(VSymTab))
+ __vsymtab_end = .;
+
+ /* section information for initial. */
+ . = ALIGN(4);
+ __rt_init_start = .;
+ KEEP(*(SORT(.rti_fn*)))
+ __rt_init_end = .;
+
+ . = ALIGN(4);
+
+ PROVIDE(__ctors_start__ = .);
+ KEEP (*(SORT(.init_array.*)))
+ KEEP (*(.init_array))
+ PROVIDE(__ctors_end__ = .);
+
+ . = ALIGN(4);
+
+ _etext = .;
+ } > ROM = 0
+
+ /* .ARM.exidx is sorted, so has to go in its own output section. */
+ __exidx_start = .;
+ .ARM.exidx :
+ {
+ *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+
+ /* This is used by the startup in order to initialize the .data secion */
+ _sidata = .;
+ } > ROM
+ __exidx_end = .;
+
+ /* .data section which is used for initialized data */
+
+ .data : AT (_sidata)
+ {
+ . = ALIGN(4);
+ /* This is used by the startup in order to initialize the .data secion */
+ _sdata = . ;
+
+ *(.data)
+ *(.data.*)
+ *(.gnu.linkonce.d*)
+
+ PROVIDE(__dtors_start__ = .);
+ KEEP(*(SORT(.dtors.*)))
+ KEEP(*(.dtors))
+ PROVIDE(__dtors_end__ = .);
+
+ . = ALIGN(4);
+ /* This is used by the startup in order to initialize the .data secion */
+ _edata = . ;
+ } >RAM
+
+ .stack :
+ {
+ . = ALIGN(4);
+ _sstack = .;
+ . = . + _system_stack_size;
+ . = ALIGN(4);
+ _estack = .;
+ } >RAM
+
+ __bss_start = .;
+ .bss :
+ {
+ . = ALIGN(4);
+ /* This is used by the startup in order to initialize the .bss secion */
+ _sbss = .;
+
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+
+ . = ALIGN(4);
+ /* This is used by the startup in order to initialize the .bss secion */
+ _ebss = . ;
+
+ *(.bss.init)
+ } > RAM
+ __bss_end = .;
+
+ _end = .;
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ /* DWARF debug sections.
+ * Symbols in the DWARF debugging sections are relative to the beginning
+ * of the section so we begin them at 0. */
+ /* DWARF 1 */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2 */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2 */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+}
diff --git a/bsp/stm32/stm32f401-weact-blackpill/board/linker_scripts/link.sct b/bsp/stm32/stm32f401-weact-blackpill/board/linker_scripts/link.sct
new file mode 100644
index 0000000000..6e502f50b9
--- /dev/null
+++ b/bsp/stm32/stm32f401-weact-blackpill/board/linker_scripts/link.sct
@@ -0,0 +1,15 @@
+; *************************************************************
+; *** Scatter-Loading Description File generated by uVision ***
+; *************************************************************
+
+LR_IROM1 0x08000000 0x00040000 { ; load region size_region
+ ER_IROM1 0x08000000 0x00040000 { ; load address = execution address
+ *.o (RESET, +First)
+ *(InRoot$$Sections)
+ .ANY (+RO)
+ }
+ RW_IRAM1 0x20000000 0x00010000 { ; RW data
+ .ANY (+RW +ZI)
+ }
+}
+
diff --git a/bsp/stm32/stm32f401-weact-blackpill/figures/board.png b/bsp/stm32/stm32f401-weact-blackpill/figures/board.png
new file mode 100644
index 0000000000000000000000000000000000000000..8562ae6604128b239de0a6aeea03edc2bcb63e54
GIT binary patch
literal 177116
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%0AJe|Gfm;{x`U%%z
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