From 8671e706b5e54efd7eb4fa2212c95df08b0285c4 Mon Sep 17 00:00:00 2001 From: shaoguoji <752147916@qq.com> Date: Thu, 7 Mar 2019 15:43:08 +0800 Subject: [PATCH] =?UTF-8?q?[bsp]=E6=B7=BB=E5=8A=A0=20stm32f401-st-nucleo?= =?UTF-8?q?=20=E5=BC=80=E5=8F=91=E6=9D=BF=20BSP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/stm32/stm32f401-st-nucleo/.config | 398 +++ bsp/stm32/stm32f401-st-nucleo/.gitignore | 42 + bsp/stm32/stm32f401-st-nucleo/Kconfig | 21 + bsp/stm32/stm32f401-st-nucleo/README.md | 119 + bsp/stm32/stm32f401-st-nucleo/SConscript | 15 + bsp/stm32/stm32f401-st-nucleo/SConstruct | 58 + .../applications/SConscript | 12 + .../stm32f401-st-nucleo/applications/main.c | 33 + .../board/CubeMX_Config/.mxproject | 17 + .../board/CubeMX_Config/CubeMX_Config.ioc | 140 + .../board/CubeMX_Config/Inc/main.h | 91 + .../CubeMX_Config/Inc/stm32f4xx_hal_conf.h | 451 +++ .../board/CubeMX_Config/Inc/stm32f4xx_it.h | 84 + .../board/CubeMX_Config/Src/main.c | 298 ++ .../CubeMX_Config/Src/stm32f4xx_hal_msp.c | 236 ++ .../board/CubeMX_Config/Src/stm32f4xx_it.c | 218 ++ .../CubeMX_Config/Src/system_stm32f4xx.c | 761 +++++ bsp/stm32/stm32f401-st-nucleo/board/Kconfig | 78 + .../stm32f401-st-nucleo/board/SConscript | 37 + bsp/stm32/stm32f401-st-nucleo/board/board.c | 50 + bsp/stm32/stm32f401-st-nucleo/board/board.h | 50 + .../board/linker_scripts/link.icf | 28 + .../board/linker_scripts/link.lds | 144 + .../board/linker_scripts/link.sct | 15 + .../stm32f401-st-nucleo/figures/board.jpg | Bin 0 -> 164823 bytes bsp/stm32/stm32f401-st-nucleo/project.ewd | 2834 +++++++++++++++++ bsp/stm32/stm32f401-st-nucleo/project.ewp | 2410 ++++++++++++++ bsp/stm32/stm32f401-st-nucleo/project.eww | 10 + bsp/stm32/stm32f401-st-nucleo/project.uvoptx | 953 ++++++ bsp/stm32/stm32f401-st-nucleo/project.uvprojx | 722 +++++ bsp/stm32/stm32f401-st-nucleo/rtconfig.h | 184 ++ bsp/stm32/stm32f401-st-nucleo/rtconfig.py | 134 + bsp/stm32/stm32f401-st-nucleo/template.ewp | 2031 ++++++++++++ bsp/stm32/stm32f401-st-nucleo/template.eww | 10 + bsp/stm32/stm32f401-st-nucleo/template.uvopt | 162 + bsp/stm32/stm32f401-st-nucleo/template.uvoptx | 197 ++ .../stm32f401-st-nucleo/template.uvprojx | 395 +++ 37 files changed, 13438 insertions(+) create mode 100644 bsp/stm32/stm32f401-st-nucleo/.config create mode 100644 bsp/stm32/stm32f401-st-nucleo/.gitignore create mode 100644 bsp/stm32/stm32f401-st-nucleo/Kconfig create mode 100644 bsp/stm32/stm32f401-st-nucleo/README.md create mode 100644 bsp/stm32/stm32f401-st-nucleo/SConscript create mode 100644 bsp/stm32/stm32f401-st-nucleo/SConstruct create mode 100644 bsp/stm32/stm32f401-st-nucleo/applications/SConscript create mode 100644 bsp/stm32/stm32f401-st-nucleo/applications/main.c create mode 100644 bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/.mxproject create mode 100644 bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc create mode 100644 bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Inc/main.h create mode 100644 bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h create mode 100644 bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_it.h create mode 100644 bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/main.c create mode 100644 bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c create mode 100644 bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_it.c create mode 100644 bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/system_stm32f4xx.c create mode 100644 bsp/stm32/stm32f401-st-nucleo/board/Kconfig create mode 100644 bsp/stm32/stm32f401-st-nucleo/board/SConscript create mode 100644 bsp/stm32/stm32f401-st-nucleo/board/board.c create mode 100644 bsp/stm32/stm32f401-st-nucleo/board/board.h create mode 100644 bsp/stm32/stm32f401-st-nucleo/board/linker_scripts/link.icf create mode 100644 bsp/stm32/stm32f401-st-nucleo/board/linker_scripts/link.lds create mode 100644 bsp/stm32/stm32f401-st-nucleo/board/linker_scripts/link.sct create mode 100644 bsp/stm32/stm32f401-st-nucleo/figures/board.jpg create mode 100644 bsp/stm32/stm32f401-st-nucleo/project.ewd create mode 100644 bsp/stm32/stm32f401-st-nucleo/project.ewp create mode 100644 bsp/stm32/stm32f401-st-nucleo/project.eww create mode 100644 bsp/stm32/stm32f401-st-nucleo/project.uvoptx create mode 100644 bsp/stm32/stm32f401-st-nucleo/project.uvprojx create mode 100644 bsp/stm32/stm32f401-st-nucleo/rtconfig.h create mode 100644 bsp/stm32/stm32f401-st-nucleo/rtconfig.py create mode 100644 bsp/stm32/stm32f401-st-nucleo/template.ewp create mode 100644 bsp/stm32/stm32f401-st-nucleo/template.eww create mode 100644 bsp/stm32/stm32f401-st-nucleo/template.uvopt create mode 100644 bsp/stm32/stm32f401-st-nucleo/template.uvoptx create mode 100644 bsp/stm32/stm32f401-st-nucleo/template.uvprojx diff --git a/bsp/stm32/stm32f401-st-nucleo/.config b/bsp/stm32/stm32f401-st-nucleo/.config new file mode 100644 index 0000000000..4f355c8e27 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/.config @@ -0,0 +1,398 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# 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_USING_IDLE_HOOK=y +CONFIG_RT_IDEL_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +# CONFIG_RT_USING_TIMER_SOFT is not set +CONFIG_RT_DEBUG=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_MEMHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMTRACE 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="uart2" +CONFIG_RT_VER_NUM=0x40001 +CONFIG_ARCH_ARM=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 + +# +# C++ features +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Command shell +# +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_CMD_SIZE=80 +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_USING_MSH_DEFAULT=y +CONFIG_FINSH_USING_MSH_ONLY=y +CONFIG_FINSH_ARG_MAX=10 + +# +# Device virtual file system +# +# CONFIG_RT_USING_DFS is not set + +# +# Device Drivers +# +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_PIPE_BUFSZ=512 +CONFIG_RT_USING_SERIAL=y +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_PIN=y +# CONFIG_RT_USING_ADC 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_MTD 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 + +# +# Using WiFi +# +# CONFIG_RT_USING_WIFI is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# POSIX layer and C standard library +# +# CONFIG_RT_USING_LIBC is not set +# CONFIG_RT_USING_PTHREADS is not set + +# +# Network +# + +# +# Socket abstraction layer +# +# CONFIG_RT_USING_SAL is not set + +# +# light weight TCP/IP stack +# +# CONFIG_RT_USING_LWIP is not set + +# +# Modbus master and slave stack +# +# CONFIG_RT_USING_MODBUS is not set + +# +# AT commands +# +# CONFIG_RT_USING_AT is not set + +# +# VBUS(Virtual Software BUS) +# +# CONFIG_RT_USING_VBUS is not set + +# +# Utilities +# +# CONFIG_RT_USING_LOGTRACE is not set +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set + +# +# ARM CMSIS +# +# CONFIG_RT_USING_CMSIS_OS is not set +# CONFIG_RT_USING_RTT_CMSIS is not set +# CONFIG_RT_USING_LWP is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_PAHOMQTT 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_WEBTERMINAL is not set +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_EZXML 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_AT_DEVICE is not set +# CONFIG_PKG_USING_WIZNET 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_IOTKIT is not set +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_libsodium is not set +# CONFIG_PKG_USING_TINYCRYPT is not set + +# +# language packages +# +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set + +# +# multimedia packages +# +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF 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_RDB is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_ADBD is not set + +# +# system packages +# +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_PERSIMMON is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_FAL is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_CMSIS is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set + +# +# peripheral libraries and drivers +# + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_U8G2 is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set + +# +# miscellaneous packages +# +# 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_MULTIBUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB 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 + +# +# 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 +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set + +# +# Privated Packages of RealThread +# +# CONFIG_PKG_USING_CODEC is not set +# CONFIG_PKG_USING_PLAYER is not set +# CONFIG_PKG_USING_PERSIMMON_SRC is not set + +# +# Network Utilities +# +# CONFIG_PKG_USING_WICED is not set +# CONFIG_PKG_USING_CLOUDSDK is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_POWER_MANAGER is not set +# CONFIG_PKG_USING_RT_OTA is not set +# CONFIG_PKG_USING_RDBD_SRC is not set +# CONFIG_PKG_USING_RTINSIGHT is not set +# CONFIG_PKG_USING_SMARTCONFIG is not set + +# +# rtpkgs online packages +# +# CONFIG_PKG_USING_CSTRING is not set +# CONFIG_PKG_USING_ARGPARSE is not set +# CONFIG_PKG_USING_LIBBMPREAD is not set +# CONFIG_PKG_USING_LIBUTILS is not set +# CONFIG_PKG_USING_SAM is not set +# CONFIG_PKG_USING_LIBCALLBACK is not set +# CONFIG_PKG_USING_Z_EVENT is not set +# CONFIG_PKG_USING_LIBSTM32HAL is not set +CONFIG_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32F4=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_STM32F401RE=y + +# +# Onboard Peripheral Drivers +# + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART2=y +# CONFIG_BSP_UART2_RX_USING_DMA is not set + +# +# Board extended module Drivers +# diff --git a/bsp/stm32/stm32f401-st-nucleo/.gitignore b/bsp/stm32/stm32f401-st-nucleo/.gitignore new file mode 100644 index 0000000000..7221bde019 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/.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-st-nucleo/Kconfig b/bsp/stm32/stm32f401-st-nucleo/Kconfig new file mode 100644 index 0000000000..8cbc7b71a8 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/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-st-nucleo/README.md b/bsp/stm32/stm32f401-st-nucleo/README.md new file mode 100644 index 0000000000..8aca89df31 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/README.md @@ -0,0 +1,119 @@ +# STM32F401 Nucleo-64 开发板 BSP 说明 + +## 简介 + +本文档为 STM32F401 Nucleo-64 开发板的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。 + +## 开发板介绍 + +STM32 Nucleo-64 是 ST 官方推出的开发板,搭载 STM32F401RE 芯片,基于 ARM Cortex-M4 内核,最高主频 84 MHz,具有丰富的板载资源,可以充分发挥 STM32F401RE 的芯片性能。 + +开发板外观如下图所示: + +![board](figures/board.jpg) + +STM32F401 Nucleo-64 开发板常用 **板载资源** 如下: + +- MCU:STM32F401RET6,主频 84MHz,512KB FLASH ,96KB RAM +- 常用外设 + - LED:3 个,USB communication (LD1), user LED (LD2), power LED (LD3) 。 + - 按键:2 个,USER and RESET 。 +- 常用接口:USB 转串口、Arduino Uno 和 ST morpho 两类扩展接口 +- 调试接口:板载 ST-LINK/V2-1 调试器。 + +快速入门:[Getting started with STM32 Nucleo board software development tools](https://www.st.com/resource/en/user_manual/dm00105928.pdf) + +原理图下载:[STM32 Nucleo (64 pins) schematics](https://www.st.com/resource/en/schematic_pack/nucleo_64pins_sch.zip) + +*更多相关信息资料见 ST 官网详情页:[STM32 Nucleo-64 development board with STM32F401RE MCU](https://www.st.com/zh/evaluation-tools/nucleo-f401re.html)* + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **片上外设** | **支持情况** | **备注** | +| :------------ | :----------: | :-----------------------------------: | +| GPIO | 支持 | PA0, PA1... PH1 ---> PIN: 0, 1...63 | +| UART | 支持 | UART2 | +| SPI | 支持 | SPI1 | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + + +### 快速上手 + +本 BSP 为开发者提供 MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用 Type-A to Mini-B 线连接开发板和 PC 供电,红色 LED LD3 (PWR) 和 LD1 (COM) 会点亮。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 ST-LINK 下载程序,点击下载按钮即可下载程序到开发板。 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,观察开发板上 LED 的运行效果,红色 LD3 和 LD1 常亮、绿色 LD2 会周期性闪烁。 + +USB 虚拟 COM 端口默认连接串口 2,在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + +```bash + \ | / +- RT - Thread Operating System + / | \ 4.0.1 build Mar 7 2019 + 2006 - 2019 Copyright by rt-thread team +msh > +``` +### 进阶使用 + +此 BSP 默认只开启了 GPIO 和 串口 2 的功能,更多高级功能需要利用 ENV 工具对 BSP 进行配置,步骤如下: + +1. 在 BSP 下打开 env 工具。 + +2. 输入 `menuconfig` 命令配置工程,配置好之后保存退出。 + +3. 输入 `pkgs --update` 命令更新软件包。 + +4. 输入 `scons --target=mdk4/mdk5/iar` 命令重新生成工程。 + +本章节更多详细的介绍请参考 [STM32 系列 BSP 外设驱动使用教程](../docs/STM32 系列 BSP 外设驱动使用教程. md)。 + +## 注意事项 + +关于 pin 序号规则,与旧 bsp 使用封装管脚序号不同,在新的 stm32 bsp 框架中,统一采用顺序编号的方式,对 GPIO 驱动进行管理,在移植旧 bsp 时特别要注意这点。 + +pin 序号与引脚名对应关系如下表: + +| STM32 引脚名 | 管脚序号 pin | +|--------------|--------------| +| PA0 - PA15 | 0 - 15 | +| PB0 - PB15 | 16 - 31 | +| PC0 - PC15 | 32 - 47 | +| PD0 - ... | 48 - ... | + +## 联系人信息 + +维护人: + +- [shaoguoji](https://github.com/shaoguoji) ,邮箱:<752147916@qq.com> \ No newline at end of file diff --git a/bsp/stm32/stm32f401-st-nucleo/SConscript b/bsp/stm32/stm32f401-st-nucleo/SConscript new file mode 100644 index 0000000000..20f7689c53 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/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-st-nucleo/SConstruct b/bsp/stm32/stm32f401-st-nucleo/SConstruct new file mode 100644 index 0000000000..1101c708bd --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/SConstruct @@ -0,0 +1,58 @@ +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 + +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM == 'iar': + env.Replace(CCCOM = ['$CC $CCFLAGS $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-st-nucleo/applications/SConscript b/bsp/stm32/stm32f401-st-nucleo/applications/SConscript new file mode 100644 index 0000000000..6f66f7ab73 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/applications/SConscript @@ -0,0 +1,12 @@ +import rtconfig +from building import * + +cwd = GetCurrentDir() +CPPPATH = [cwd, str(Dir('#'))] +src = Split(""" +main.c +""") + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/stm32/stm32f401-st-nucleo/applications/main.c b/bsp/stm32/stm32f401-st-nucleo/applications/main.c new file mode 100644 index 0000000000..86c4508d12 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/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(A, 5) + +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-st-nucleo/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/.mxproject new file mode 100644 index 0000000000..31022a65df --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/.mxproject @@ -0,0 +1,17 @@ +[PreviousGenFiles] +HeaderPath=D:/rt-thread/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Inc +HeaderFiles=stm32f4xx_it.h;stm32f4xx_hal_conf.h;main.h; +SourcePath=D:/rt-thread/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src +SourceFiles=stm32f4xx_it.c;stm32f4xx_hal_msp.c;main.c; + +[PreviousLibFiles] +LibFiles=Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h;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_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.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_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.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_hal_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/Src/stm32f4xx_hal_spi.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/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h;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_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.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_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.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_hal_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/CMSIS/Device/ST/STM32F4xx/Include/stm32f401xe.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; + +[PreviousUsedIarFiles] +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;../\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;../\Src/system_stm32f4xx.c;../Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;D:/rt-thread/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config//EWARM/startup_stm32f401xe.s; +HeaderPath=..\Drivers\STM32F4xx_HAL_Driver\Inc;..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32F4xx\Include;..\Drivers\CMSIS\Include;..\Inc; + +[PreviousUsedKeilFiles] +SourceFiles=..\Src\main.c;..\Src\stm32f4xx_it.c;..\Src\stm32f4xx_hal_msp.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.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;../\Src/system_stm32f4xx.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.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;../\Src/system_stm32f4xx.c;../Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;null; +HeaderPath=..\Drivers\STM32F4xx_HAL_Driver\Inc;..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32F4xx\Include;..\Drivers\CMSIS\Include;..\Inc; + diff --git a/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc b/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc new file mode 100644 index 0000000000..e04e99534f --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc @@ -0,0 +1,140 @@ +#MicroXplorer Configuration settings - do not modify +File.Version=6 +KeepUserPlacement=false +Mcu.Family=STM32F4 +Mcu.IP0=NVIC +Mcu.IP1=RCC +Mcu.IP2=SPI1 +Mcu.IP3=SYS +Mcu.IP4=USART2 +Mcu.IPNb=5 +Mcu.Name=STM32F401R(D-E)Tx +Mcu.Package=LQFP64 +Mcu.Pin0=PC14-OSC32_IN +Mcu.Pin1=PC15-OSC32_OUT +Mcu.Pin10=PA14 +Mcu.Pin11=VP_SYS_VS_Systick +Mcu.Pin2=PH0 - OSC_IN +Mcu.Pin3=PH1 - OSC_OUT +Mcu.Pin4=PA2 +Mcu.Pin5=PA3 +Mcu.Pin6=PA5 +Mcu.Pin7=PA6 +Mcu.Pin8=PA7 +Mcu.Pin9=PA13 +Mcu.PinsNb=12 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32F401RETx +MxCube.Version=5.1.0 +MxDb.Version=DB.5.0.10 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false\:true +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false +PA13.Mode=Serial_Wire +PA13.Signal=SYS_JTMS-SWDIO +PA14.Mode=Serial_Wire +PA14.Signal=SYS_JTCK-SWCLK +PA2.GPIOParameters=GPIO_Speed +PA2.GPIO_Speed=GPIO_SPEED_FREQ_LOW +PA2.Mode=Asynchronous +PA2.Signal=USART2_TX +PA3.GPIOParameters=GPIO_Speed +PA3.GPIO_Speed=GPIO_SPEED_FREQ_LOW +PA3.Mode=Asynchronous +PA3.Signal=USART2_RX +PA5.Locked=true +PA5.Mode=Full_Duplex_Master +PA5.Signal=SPI1_SCK +PA6.Mode=Full_Duplex_Master +PA6.Signal=SPI1_MISO +PA7.Mode=Full_Duplex_Master +PA7.Signal=SPI1_MOSI +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 +PCC.Checker=false +PCC.Line=STM32F401 +PCC.MCU=STM32F401R(D-E)Tx +PCC.PartNumber=STM32F401RETx +PCC.Seq0=0 +PCC.Series=STM32F4 +PCC.Temperature=25 +PCC.Vdd=null +PH0\ -\ OSC_IN.Mode=HSE-External-Clock-Source +PH0\ -\ OSC_IN.Signal=RCC_OSC_IN +PH1\ -\ OSC_OUT.Mode=HSE-External-Clock-Source +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=STM32F401RETx +ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.24.0 +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.StackSize=0x400 +ProjectManager.TargetToolchain=MDK-ARM V5 +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART2_UART_Init-USART2-false-HAL-true,4-MX_SPI1_Init-SPI1-false-HAL-true +RCC.48MHZClocksFreq_Value=84000000 +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=8000000 +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,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLN,PLLP,PLLQCLKFreq_Value,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S +RCC.LSI_VALUE=32000 +RCC.MCO2PinFreq_Value=84000000 +RCC.PLLCLKFreq_Value=84000000 +RCC.PLLN=336 +RCC.PLLP=RCC_PLLP_DIV4 +RCC.PLLQCLKFreq_Value=84000000 +RCC.RTCFreq_Value=32000 +RCC.RTCHSEDivFreq_Value=4000000 +RCC.SYSCLKFreq_VALUE=84000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.VCOI2SOutputFreq_Value=192000000 +RCC.VCOInputFreq_Value=1000000 +RCC.VCOOutputFreq_Value=336000000 +RCC.VcooutputI2S=96000000 +SPI1.Direction=SPI_DIRECTION_2LINES +SPI1.IPParameters=VirtualType,Mode,Direction +SPI1.Mode=SPI_MODE_MASTER +SPI1.VirtualType=VM_MASTER +USART2.IPParameters=VirtualMode +USART2.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-st-nucleo/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Inc/main.h new file mode 100644 index 0000000000..9d41187606 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Inc/main.h @@ -0,0 +1,91 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* 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 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h b/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h new file mode 100644 index 0000000000..4bf4d537cb --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h @@ -0,0 +1,451 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf.h + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2019 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* 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_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_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_SPDIFRX_MODULE_ENABLED */ +/* #define HAL_DFSDM_MODULE_ENABLED */ +/* #define HAL_LPTIM_MODULE_ENABLED */ +/* #define HAL_EXTI_MODULE_ENABLED */ +#define HAL_GPIO_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 ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)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 ((uint32_t)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 ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)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 ((uint32_t)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 ((uint32_t)3300U) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 1U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +/* ########################## 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 ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)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 ((uint32_t)0x000000FFU) +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU) + +#define PHY_READ_TO ((uint32_t)0x0000FFFFU) +#define PHY_WRITE_TO ((uint32_t)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_EXTI_MODULE_ENABLED + #include "stm32f4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_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_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_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_MMC_MODULE_ENABLED + #include "stm32f4xx_hal_mmc.h" +#endif /* HAL_MMC_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_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 */ + +/* 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 */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_it.h b/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_it.h new file mode 100644 index 0000000000..7a788c296b --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_it.h @@ -0,0 +1,84 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* 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 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/main.c new file mode 100644 index 0000000000..6a63b72eaa --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/main.c @@ -0,0 +1,298 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* 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 ---------------------------------------------------------*/ +SPI_HandleTypeDef hspi1; + +UART_HandleTypeDef huart2; + +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_USART2_UART_Init(void); +static void MX_SPI1_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_USART2_UART_Init(); + MX_SPI1_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 */ + HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); + HAL_Delay(500); + + HAL_UART_Transmit(&huart2, "Hello World!\r\n", sizeof("Hello World\r\n"), 0xFFFF); + } + /* 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 CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + RCC_OscInitStruct.PLL.PLLQ = 4; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses 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 SPI1 Initialization Function + * @param None + * @retval None + */ +static void MX_SPI1_Init(void) +{ + + /* USER CODE BEGIN SPI1_Init 0 */ + + /* USER CODE END SPI1_Init 0 */ + + /* USER CODE BEGIN SPI1_Init 1 */ + + /* USER CODE END SPI1_Init 1 */ + /* SPI1 parameter configuration*/ + hspi1.Instance = SPI1; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_8BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.NSS = SPI_NSS_SOFT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 10; + if (HAL_SPI_Init(&hspi1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI1_Init 2 */ + + /* USER CODE END SPI1_Init 2 */ + +} + +/** + * @brief USART2 Initialization Function + * @param None + * @retval None + */ +static void MX_USART2_UART_Init(void) +{ + + /* USER CODE BEGIN USART2_Init 0 */ + + /* USER CODE END USART2_Init 0 */ + + /* USER CODE BEGIN USART2_Init 1 */ + + /* USER CODE END USART2_Init 1 */ + huart2.Instance = USART2; + huart2.Init.BaudRate = 115200; + huart2.Init.WordLength = UART_WORDLENGTH_8B; + huart2.Init.StopBits = UART_STOPBITS_1; + huart2.Init.Parity = UART_PARITY_NONE; + huart2.Init.Mode = UART_MODE_TX_RX; + huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart2.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART2_Init 2 */ + + /* USER CODE END USART2_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 */ + + /* 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, + tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c b/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c new file mode 100644 index 0000000000..62e369862b --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c @@ -0,0 +1,236 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : stm32f4xx_hal_msp.c + * Description : This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* 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 SPI MSP Initialization +* This function configures the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspInit 0 */ + + /* USER CODE END SPI1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SPI1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**SPI1 GPIO Configuration + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI1_MspInit 1 */ + + /* USER CODE END SPI1_MspInit 1 */ + } + +} + +/** +* @brief SPI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) +{ + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspDeInit 0 */ + + /* USER CODE END SPI1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI1_CLK_DISABLE(); + + /**SPI1 GPIO Configuration + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); + + /* USER CODE BEGIN SPI1_MspDeInit 1 */ + + /* USER CODE END SPI1_MspDeInit 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==USART2) + { + /* USER CODE BEGIN USART2_MspInit 0 */ + + /* USER CODE END USART2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART2_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF7_USART2; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN USART2_MspInit 1 */ + + /* USER CODE END USART2_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==USART2) + { + /* USER CODE BEGIN USART2_MspDeInit 0 */ + + /* USER CODE END USART2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART2_CLK_DISABLE(); + + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3); + + /* USER CODE BEGIN USART2_MspDeInit 1 */ + + /* USER CODE END USART2_MspDeInit 1 */ + } + +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_it.c b/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_it.c new file mode 100644 index 0000000000..4f557bc4a3 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_it.c @@ -0,0 +1,218 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* 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 */ + + /* 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 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/system_stm32f4xx.c b/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/system_stm32f4xx.c new file mode 100644 index 0000000000..3303f969d9 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/board/CubeMX_Config/Src/system_stm32f4xx.c @@ -0,0 +1,761 @@ +/** + ****************************************************************************** + * @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 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/** @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 */ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ + +/** + * @} + */ + +/** @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 + /* Reset the RCC clock configuration to the default reset state ------------*/ + /* Set HSION bit */ + RCC->CR |= (uint32_t)0x00000001; + + /* Reset CFGR register */ + RCC->CFGR = 0x00000000; + + /* Reset HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFFF; + + /* Reset PLLCFGR register */ + RCC->PLLCFGR = 0x24003010; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /* Disable all interrupts */ + RCC->CIR = 0x00000000; + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + SystemInit_ExtMemCtl(); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @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; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ + FMC_Bank5_6->SDCMR = 0x00000073; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ + FMC_Bank5_6->SDCMR = 0x00046014; + 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; + 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 */ + 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 */ + 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 */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f401-st-nucleo/board/Kconfig b/bsp/stm32/stm32f401-st-nucleo/board/Kconfig new file mode 100644 index 0000000000..707f4531a3 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/board/Kconfig @@ -0,0 +1,78 @@ +menu "Hardware Drivers Config" + +config SOC_STM32F401RE + bool + select SOC_SERIES_STM32F4 + 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_UART2 + bool "Enable UART2" + default y + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n + + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n + endif + + menuconfig BSP_USING_I2C1 + bool "Enable I2C1 BUS (software simulation)" + default n + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + if BSP_USING_I2C1 + config BSP_I2C1_SCL_PIN + int "i2c1 scl pin number" + range 1 216 + default 15 + config BSP_I2C1_SDA_PIN + int "I2C1 sda pin number" + range 1 216 + default 16 + endif + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/stm32/stm32f401-st-nucleo/board/SConscript b/bsp/stm32/stm32f401-st-nucleo/board/SConscript new file mode 100644 index 0000000000..02b591f9a8 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/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.CROSS_TOOL == 'gcc': + src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f401xe.s'] +elif rtconfig.CROSS_TOOL == 'keil': + src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f401xe.s'] +elif rtconfig.CROSS_TOOL == 'iar': + src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f401xe.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 = ['STM32F401xE'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') diff --git a/bsp/stm32/stm32f401-st-nucleo/board/board.c b/bsp/stm32/stm32f401-st-nucleo/board/board.c new file mode 100644 index 0000000000..942d080c5b --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/board/board.c @@ -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-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 CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 16; + RCC_OscInitStruct.PLL.PLLN = 336; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4; + RCC_OscInitStruct.PLL.PLLQ = 4; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses 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-st-nucleo/board/board.h b/bsp/stm32/stm32f401-st-nucleo/board/board.h new file mode 100644 index 0000000000..4c6f84d170 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/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 (512 * 1024) +#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE)) + +#define STM32_SRAM_SIZE 96 +#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024) + +#if defined(__CC_ARM) || defined(__CLANG_ARM) +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-st-nucleo/board/linker_scripts/link.icf b/bsp/stm32/stm32f401-st-nucleo/board/linker_scripts/link.icf new file mode 100644 index 0000000000..5df7d0fc88 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/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__ = 0x0807FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x20017FFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x0400; +define symbol __ICFEDIT_size_heap__ = 0x0000; +/**** 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-st-nucleo/board/linker_scripts/link.lds b/bsp/stm32/stm32f401-st-nucleo/board/linker_scripts/link.lds new file mode 100644 index 0000000000..1f90f36d0c --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/board/linker_scripts/link.lds @@ -0,0 +1,144 @@ +/* + * 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 = 512k /* 1024KB flash */ + RAM (rw) : ORIGIN = 0x20000000, LENGTH = 96k /* 128K sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x200; + +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); + _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*) + + . = 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-st-nucleo/board/linker_scripts/link.sct b/bsp/stm32/stm32f401-st-nucleo/board/linker_scripts/link.sct new file mode 100644 index 0000000000..6afcafa346 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/board/linker_scripts/link.sct @@ -0,0 +1,15 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00080000 { ; load region size_region + ER_IROM1 0x08000000 0x00080000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_IRAM1 0x20000000 0x00018000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/bsp/stm32/stm32f401-st-nucleo/figures/board.jpg b/bsp/stm32/stm32f401-st-nucleo/figures/board.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ff1e19eb5e5219cee3baa18bed23549292a1ce03 GIT binary patch literal 164823 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%0DsiE4Vk~<`z9?~G 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 z�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 Hv+%zF*}M*) literal 0 HcmV?d00001 diff --git a/bsp/stm32/stm32f401-st-nucleo/project.ewd b/bsp/stm32/stm32f401-st-nucleo/project.ewd new file mode 100644 index 0000000000..e94c83ed06 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/project.ewd @@ -0,0 +1,2834 @@ + + + 3 + + rt-thread + + ARM + + 1 + + C-SPY + 2 + + 29 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\IARProbe\IarProbePlugin.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 29 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 6 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\IARProbe\IarProbePlugin.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/bsp/stm32/stm32f401-st-nucleo/project.ewp b/bsp/stm32/stm32f401-st-nucleo/project.ewp new file mode 100644 index 0000000000..db4161a4b3 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/project.ewp @@ -0,0 +1,2410 @@ + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 29 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 29 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + Drivers + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\board\CubeMX_Config\Src\stm32f4xx_hal_msp.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\iar\startup_stm32f407xx.s + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_gpio.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_usart.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_common.c + + + + Kernel + + $PROJ_DIR$\..\..\..\src\clock.c + + + $PROJ_DIR$\..\..\..\src\components.c + + + $PROJ_DIR$\..\..\..\src\device.c + + + $PROJ_DIR$\..\..\..\src\idle.c + + + $PROJ_DIR$\..\..\..\src\ipc.c + + + $PROJ_DIR$\..\..\..\src\irq.c + + + $PROJ_DIR$\..\..\..\src\kservice.c + + + $PROJ_DIR$\..\..\..\src\mem.c + + + $PROJ_DIR$\..\..\..\src\mempool.c + + + $PROJ_DIR$\..\..\..\src\object.c + + + $PROJ_DIR$\..\..\..\src\scheduler.c + + + $PROJ_DIR$\..\..\..\src\signal.c + + + $PROJ_DIR$\..\..\..\src\thread.c + + + $PROJ_DIR$\..\..\..\src\timer.c + + + + CORTEX-M4 + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\context_iar.S + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\backtrace.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\components\drivers\misc\pin.c + + + $PROJ_DIR$\..\..\..\components\drivers\serial\serial.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\completion.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\dataqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\pipe.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringblk_buf.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringbuffer.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\waitqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\workqueue.c + + + + finsh + + $PROJ_DIR$\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\components\finsh\symbol.c + + + $PROJ_DIR$\..\..\..\components\finsh\cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_file.c + + + + STM32_HAL + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_can.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cec.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_crc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dac.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dac_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dcmi.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dcmi_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dfsdm.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma2d.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dsi.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_eth.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ramfunc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_fmpi2c.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_fmpi2c_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_hash.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_hash_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_hcd.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2s.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2s_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_irda.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_iwdg.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_lptim.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_ltdc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_ltdc_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_nand.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_nor.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pccard.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_qspi.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rng.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rtc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rtc_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sai.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sai_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sd.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sdram.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_smartcard.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_spdifrx.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_spi.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sram.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_usart.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_wwdg.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_fmc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_fsmc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_sdmmc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_usb.c + + + diff --git a/bsp/stm32/stm32f401-st-nucleo/project.eww b/bsp/stm32/stm32f401-st-nucleo/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/stm32/stm32f401-st-nucleo/project.uvoptx b/bsp/stm32/stm32f401-st-nucleo/project.uvoptx new file mode 100644 index 0000000000..b4e4745fbb --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/project.uvoptx @@ -0,0 +1,953 @@ + + + + 1.0 + +

### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + ST-LINKIII-KEIL_SWO + -U066AFF504955857567151228 -O206 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F401RETx$CMSIS\Flash\STM32F4xx_512.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F4xx_512 -FL080000 -FS08000000 -FP0($$Device:STM32F401RETx$CMSIS\Flash\STM32F4xx_512.FLM) + + + 0 + JL2CM3 + -U30000299 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 0 + 0 + 2 + 10000000 + + + + + + Kernel + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + ..\..\..\src\cpu.c + cpu.c + 0 + 0 + + + 1 + 4 + 1 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 1 + 5 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 1 + 6 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 1 + 7 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 1 + 8 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 1 + 9 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 1 + 10 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 1 + 11 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 1 + 12 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler.c + scheduler.c + 0 + 0 + + + 1 + 13 + 1 + 0 + 0 + 0 + ..\..\..\src\signal.c + signal.c + 0 + 0 + + + 1 + 14 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 1 + 15 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Applications + 0 + 0 + 0 + 0 + + 2 + 16 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 3 + 17 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + board\CubeMX_Config\Src\stm32f4xx_hal_msp.c + stm32f4xx_hal_msp.c + 0 + 0 + + + 3 + 19 + 2 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm\startup_stm32f401xe.s + startup_stm32f401xe.s + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_common.c + drv_common.c + 0 + 0 + + + + + cpu + 0 + 0 + 0 + 0 + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\backtrace.c + backtrace.c + 0 + 0 + + + 4 + 24 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + 4 + 27 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 5 + 28 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 5 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + 5 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\completion.c + completion.c + 0 + 0 + + + 5 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\dataqueue.c + dataqueue.c + 0 + 0 + + + 5 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\pipe.c + pipe.c + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 5 + 34 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\waitqueue.c + waitqueue.c + 0 + 0 + + + 5 + 36 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\workqueue.c + workqueue.c + 0 + 0 + + + + + finsh + 0 + 0 + 0 + 0 + + 6 + 37 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 38 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\symbol.c + symbol.c + 0 + 0 + + + 6 + 39 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 6 + 40 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 41 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_cmd.c + msh_cmd.c + 0 + 0 + + + 6 + 42 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_file.c + msh_file.c + 0 + 0 + + + + + STM32_HAL + 0 + 0 + 0 + 0 + + 7 + 43 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c + system_stm32f4xx.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c + stm32f4xx_hal.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cec.c + stm32f4xx_hal_cec.c + 0 + 0 + + + 7 + 46 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c + stm32f4xx_hal_cortex.c + 0 + 0 + + + 7 + 47 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_crc.c + stm32f4xx_hal_crc.c + 0 + 0 + + + 7 + 48 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp.c + stm32f4xx_hal_cryp.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp_ex.c + stm32f4xx_hal_cryp_ex.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c + stm32f4xx_hal_dma.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c + stm32f4xx_hal_dma_ex.c + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c + stm32f4xx_hal_pwr.c + 0 + 0 + + + 7 + 53 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c + stm32f4xx_hal_pwr_ex.c + 0 + 0 + + + 7 + 54 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c + stm32f4xx_hal_rcc.c + 0 + 0 + + + 7 + 55 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c + stm32f4xx_hal_rcc_ex.c + 0 + 0 + + + 7 + 56 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rng.c + stm32f4xx_hal_rng.c + 0 + 0 + + + 7 + 57 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c + stm32f4xx_hal_gpio.c + 0 + 0 + + + 7 + 58 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c + stm32f4xx_hal_uart.c + 0 + 0 + + + 7 + 59 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_usart.c + stm32f4xx_hal_usart.c + 0 + 0 + + + + diff --git a/bsp/stm32/stm32f401-st-nucleo/project.uvprojx b/bsp/stm32/stm32f401-st-nucleo/project.uvprojx new file mode 100644 index 0000000000..c6ba36b698 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/project.uvprojx @@ -0,0 +1,722 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32F401RETx + STMicroelectronics + Keil.STM32F4xx_DFP.2.13.0 + http://www.keil.com/pack + IRAM(0x20000000,0x00018000) IROM(0x08000000,0x00080000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32F401RETx$CMSIS\Flash\STM32F4xx_512.FLM)) + 0 + $$Device:STM32F401RETx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h + + + + + + + + + + $$Device:STM32F401RETx$CMSIS\SVD\STM32F401xE.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x18000 + + + 1 + 0x8000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x18000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + STM32F401xE, USE_HAL_DRIVER + + .;..\..\..\include;applications;.;board;board\CubeMX_Config\Inc;..\libraries\HAL_Drivers;..\libraries\HAL_Drivers\config;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m4;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Inc;..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Include;..\libraries\STM32F4xx_HAL\CMSIS\Include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + --keep *.o(.rti_fn.*) --keep *.o(FSymTab) + + + + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + components.c + 1 + ..\..\..\src\components.c + + + cpu.c + 1 + ..\..\..\src\cpu.c + + + device.c + 1 + ..\..\..\src\device.c + + + idle.c + 1 + ..\..\..\src\idle.c + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + irq.c + 1 + ..\..\..\src\irq.c + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + mem.c + 1 + ..\..\..\src\mem.c + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + object.c + 1 + ..\..\..\src\object.c + + + scheduler.c + 1 + ..\..\..\src\scheduler.c + + + signal.c + 1 + ..\..\..\src\signal.c + + + thread.c + 1 + ..\..\..\src\thread.c + + + timer.c + 1 + ..\..\..\src\timer.c + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Drivers + + + board.c + 1 + board\board.c + + + stm32f4xx_hal_msp.c + 1 + board\CubeMX_Config\Src\stm32f4xx_hal_msp.c + + + startup_stm32f401xe.s + 2 + ..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm\startup_stm32f401xe.s + + + drv_gpio.c + 1 + ..\libraries\HAL_Drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\HAL_Drivers\drv_usart.c + + + drv_common.c + 1 + ..\libraries\HAL_Drivers\drv_common.c + + + + + cpu + + + backtrace.c + 1 + ..\..\..\libcpu\arm\common\backtrace.c + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m4\context_rvds.S + + + + + DeviceDrivers + + + pin.c + 1 + ..\..\..\components\drivers\misc\pin.c + + + serial.c + 1 + ..\..\..\components\drivers\serial\serial.c + + + completion.c + 1 + ..\..\..\components\drivers\src\completion.c + + + dataqueue.c + 1 + ..\..\..\components\drivers\src\dataqueue.c + + + pipe.c + 1 + ..\..\..\components\drivers\src\pipe.c + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\src\ringblk_buf.c + + + ringbuffer.c + 1 + ..\..\..\components\drivers\src\ringbuffer.c + + + waitqueue.c + 1 + ..\..\..\components\drivers\src\waitqueue.c + + + workqueue.c + 1 + ..\..\..\components\drivers\src\workqueue.c + + + + + finsh + + + shell.c + 1 + ..\..\..\components\finsh\shell.c + + + symbol.c + 1 + ..\..\..\components\finsh\symbol.c + + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + + + msh.c + 1 + ..\..\..\components\finsh\msh.c + + + msh_cmd.c + 1 + ..\..\..\components\finsh\msh_cmd.c + + + msh_file.c + 1 + ..\..\..\components\finsh\msh_file.c + + + + + STM32_HAL + + + system_stm32f4xx.c + 1 + ..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c + + + stm32f4xx_hal.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c + + + stm32f4xx_hal_cec.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cec.c + + + stm32f4xx_hal_cortex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c + + + stm32f4xx_hal_crc.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_crc.c + + + stm32f4xx_hal_cryp.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp.c + + + stm32f4xx_hal_cryp_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp_ex.c + + + stm32f4xx_hal_dma.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c + + + stm32f4xx_hal_dma_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c + + + stm32f4xx_hal_pwr.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c + + + stm32f4xx_hal_pwr_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c + + + stm32f4xx_hal_rcc.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c + + + stm32f4xx_hal_rcc_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c + + + stm32f4xx_hal_rng.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rng.c + + + stm32f4xx_hal_gpio.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c + + + stm32f4xx_hal_uart.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c + + + stm32f4xx_hal_usart.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_usart.c + + + + + + + + + + + + + +
diff --git a/bsp/stm32/stm32f401-st-nucleo/rtconfig.h b/bsp/stm32/stm32f401-st-nucleo/rtconfig.h new file mode 100644 index 0000000000..1873a910fe --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/rtconfig.h @@ -0,0 +1,184 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* Automatically generated file; DO NOT EDIT. */ +/* RT-Thread Configuration */ + +/* RT-Thread Kernel */ + +#define RT_NAME_MAX 8 +#define RT_ALIGN_SIZE 4 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 1000 +#define RT_USING_OVERFLOW_CHECK +#define RT_USING_HOOK +#define RT_USING_IDLE_HOOK +#define RT_IDEL_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 +#define RT_DEBUG + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_HEAP + +/* Kernel Device Object */ + +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart2" +#define RT_VER_NUM 0x40001 +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M4 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_PRIORITY 10 + +/* C++ features */ + + +/* Command shell */ + +#define RT_USING_FINSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_USING_DESCRIPTION +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 4096 +#define FINSH_CMD_SIZE 80 +#define FINSH_USING_MSH +#define FINSH_USING_MSH_DEFAULT +#define FINSH_USING_MSH_ONLY +#define FINSH_ARG_MAX 10 + +/* Device virtual file system */ + + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_PIPE_BUFSZ 512 +#define RT_USING_SERIAL +#define RT_SERIAL_USING_DMA +#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_PIN + +/* Using WiFi */ + + +/* Using USB */ + + +/* POSIX layer and C standard library */ + + +/* Network */ + +/* Socket abstraction layer */ + + +/* light weight TCP/IP stack */ + + +/* Modbus master and slave stack */ + + +/* AT commands */ + + +/* VBUS(Virtual Software BUS) */ + + +/* Utilities */ + + +/* ARM CMSIS */ + + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + + +/* Wiced WiFi */ + + +/* IoT Cloud */ + + +/* security packages */ + + +/* language packages */ + + +/* multimedia packages */ + + +/* tools packages */ + + +/* system packages */ + + +/* peripheral libraries and drivers */ + +/* sensors drivers */ + + +/* miscellaneous packages */ + + +/* samples: kernel and components samples */ + + +/* Privated Packages of RealThread */ + + +/* Network Utilities */ + + +/* rtpkgs online packages */ + +#define SOC_FAMILY_STM32 +#define SOC_SERIES_STM32F4 + +/* Hardware Drivers Config */ + +#define SOC_STM32F401RE + +/* Onboard Peripheral Drivers */ + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_UART2 + +/* Board extended module Drivers */ + + +#endif diff --git a/bsp/stm32/stm32f401-st-nucleo/rtconfig.py b/bsp/stm32/stm32f401-st-nucleo/rtconfig.py new file mode 100644 index 0000000000..3241586f69 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/rtconfig.py @@ -0,0 +1,134 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m4' +CROSS_TOOL='gcc' + +# bsp lib config +BSP_LIBRARY_TYPE = None + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') + +# cross_tool provides the cross compiler +# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = r'C:\Users\XXYYZZ' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armcc' + EXEC_PATH = r'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iar' + EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' + +if PLATFORM == 'gcc': + # toolchains + PREFIX = 'arm-none-eabi-' + CC = PREFIX + 'gcc' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + CXX = PREFIX + 'g++' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + DEVICE = ' -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -std=c99 -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rt-thread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M4.fp ' + CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' + + CFLAGS += ' -D__MICROLIB ' + AFLAGS += ' --pd "__MICROLIB SETA 1" ' + LFLAGS += ' --library_type=microlib ' + EXEC_PATH += '/ARM/ARMCC/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iar': + # toolchains + CC = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M4' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu Cortex-M4' + AFLAGS += ' --fpu VFPv4_sp' + AFLAGS += ' -S' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' diff --git a/bsp/stm32/stm32f401-st-nucleo/template.ewp b/bsp/stm32/stm32f401-st-nucleo/template.ewp new file mode 100644 index 0000000000..21c66ca0d0 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/template.ewp @@ -0,0 +1,2031 @@ + + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 29 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 29 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + diff --git a/bsp/stm32/stm32f401-st-nucleo/template.eww b/bsp/stm32/stm32f401-st-nucleo/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/stm32/stm32f401-st-nucleo/template.uvopt b/bsp/stm32/stm32f401-st-nucleo/template.uvopt new file mode 100644 index 0000000000..b53d69d5df --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/template.uvopt @@ -0,0 +1,162 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 255 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 6 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + JL2CM3 + -U30000299 -O207 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 + + + 0 + UL2CM3 + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + +
diff --git a/bsp/stm32/stm32f401-st-nucleo/template.uvoptx b/bsp/stm32/stm32f401-st-nucleo/template.uvoptx new file mode 100644 index 0000000000..2cb5e3fde0 --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/template.uvoptx @@ -0,0 +1,197 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + ST-LINKIII-KEIL_SWO + -U066AFF504955857567151228 -O206 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F401RETx$CMSIS\Flash\STM32F4xx_512.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F4xx_512 -FL080000 -FS08000000 -FP0($$Device:STM32F401RETx$CMSIS\Flash\STM32F4xx_512.FLM) + + + 0 + JL2CM3 + -U30000299 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 0 + 0 + 2 + 10000000 + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
diff --git a/bsp/stm32/stm32f401-st-nucleo/template.uvprojx b/bsp/stm32/stm32f401-st-nucleo/template.uvprojx new file mode 100644 index 0000000000..33821766ea --- /dev/null +++ b/bsp/stm32/stm32f401-st-nucleo/template.uvprojx @@ -0,0 +1,395 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32F401RETx + STMicroelectronics + Keil.STM32F4xx_DFP.2.13.0 + http://www.keil.com/pack + IRAM(0x20000000,0x00018000) IROM(0x08000000,0x00080000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32F401RETx$CMSIS\Flash\STM32F4xx_512.FLM)) + 0 + $$Device:STM32F401RETx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h + + + + + + + + + + $$Device:STM32F401RETx$CMSIS\SVD\STM32F401xE.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x18000 + + + 1 + 0x8000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x18000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Source Group 1 + + + + + + + + + + + +