From ae724e447f951a1406f3dab75ffe84fc4a29072d Mon Sep 17 00:00:00 2001 From: luhuadong Date: Fri, 24 Apr 2020 02:46:01 +0800 Subject: [PATCH] [BSP] Add stm32l412-st-nucleo BSP --- bsp/stm32/stm32l412-st-nucleo/.config | 357 +++ bsp/stm32/stm32l412-st-nucleo/.gitignore | 42 + bsp/stm32/stm32l412-st-nucleo/Kconfig | 21 + bsp/stm32/stm32l412-st-nucleo/README.md | 116 + bsp/stm32/stm32l412-st-nucleo/SConscript | 15 + bsp/stm32/stm32l412-st-nucleo/SConstruct | 60 + .../applications/SConscript | 9 + .../stm32l412-st-nucleo/applications/main.c | 33 + .../board/CubeMX_Config/.mxproject | 14 + .../board/CubeMX_Config/CubeMX_Config.ioc | 201 ++ .../board/CubeMX_Config/Inc/main.h | 95 + .../CubeMX_Config/Inc/stm32l4xx_hal_conf.h | 450 +++ .../board/CubeMX_Config/Inc/stm32l4xx_it.h | 69 + .../board/CubeMX_Config/Src/main.c | 280 ++ .../CubeMX_Config/Src/stm32l4xx_hal_msp.c | 149 + .../board/CubeMX_Config/Src/stm32l4xx_it.c | 203 ++ .../CubeMX_Config/Src/system_stm32l4xx.c | 337 ++ bsp/stm32/stm32l412-st-nucleo/board/Kconfig | 74 + .../stm32l412-st-nucleo/board/SConscript | 39 + bsp/stm32/stm32l412-st-nucleo/board/board.c | 87 + bsp/stm32/stm32l412-st-nucleo/board/board.h | 41 + .../board/linker_scripts/link.icf | 33 + .../board/linker_scripts/link.lds | 158 + .../board/linker_scripts/link.sct | 15 + .../stm32l412-st-nucleo/figures/board.jpg | Bin 0 -> 91973 bytes bsp/stm32/stm32l412-st-nucleo/project.ewd | 2834 +++++++++++++++++ bsp/stm32/stm32l412-st-nucleo/project.ewp | 2329 ++++++++++++++ bsp/stm32/stm32l412-st-nucleo/project.eww | 10 + bsp/stm32/stm32l412-st-nucleo/project.uvoptx | 186 ++ bsp/stm32/stm32l412-st-nucleo/project.uvprojx | 893 ++++++ bsp/stm32/stm32l412-st-nucleo/rtconfig.h | 178 ++ bsp/stm32/stm32l412-st-nucleo/rtconfig.py | 144 + bsp/stm32/stm32l412-st-nucleo/template.ewp | 2031 ++++++++++++ bsp/stm32/stm32l412-st-nucleo/template.eww | 10 + bsp/stm32/stm32l412-st-nucleo/template.uvoptx | 186 ++ .../stm32l412-st-nucleo/template.uvprojx | 386 +++ 36 files changed, 12085 insertions(+) create mode 100644 bsp/stm32/stm32l412-st-nucleo/.config create mode 100644 bsp/stm32/stm32l412-st-nucleo/.gitignore create mode 100644 bsp/stm32/stm32l412-st-nucleo/Kconfig create mode 100644 bsp/stm32/stm32l412-st-nucleo/README.md create mode 100644 bsp/stm32/stm32l412-st-nucleo/SConscript create mode 100644 bsp/stm32/stm32l412-st-nucleo/SConstruct create mode 100644 bsp/stm32/stm32l412-st-nucleo/applications/SConscript create mode 100644 bsp/stm32/stm32l412-st-nucleo/applications/main.c create mode 100644 bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/.mxproject create mode 100644 bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc create mode 100644 bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Inc/main.h create mode 100644 bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h create mode 100644 bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_it.h create mode 100644 bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Src/main.c create mode 100644 bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c create mode 100644 bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_it.c create mode 100644 bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Src/system_stm32l4xx.c create mode 100644 bsp/stm32/stm32l412-st-nucleo/board/Kconfig create mode 100644 bsp/stm32/stm32l412-st-nucleo/board/SConscript create mode 100644 bsp/stm32/stm32l412-st-nucleo/board/board.c create mode 100644 bsp/stm32/stm32l412-st-nucleo/board/board.h create mode 100644 bsp/stm32/stm32l412-st-nucleo/board/linker_scripts/link.icf create mode 100644 bsp/stm32/stm32l412-st-nucleo/board/linker_scripts/link.lds create mode 100644 bsp/stm32/stm32l412-st-nucleo/board/linker_scripts/link.sct create mode 100644 bsp/stm32/stm32l412-st-nucleo/figures/board.jpg create mode 100644 bsp/stm32/stm32l412-st-nucleo/project.ewd create mode 100644 bsp/stm32/stm32l412-st-nucleo/project.ewp create mode 100644 bsp/stm32/stm32l412-st-nucleo/project.eww create mode 100644 bsp/stm32/stm32l412-st-nucleo/project.uvoptx create mode 100644 bsp/stm32/stm32l412-st-nucleo/project.uvprojx create mode 100644 bsp/stm32/stm32l412-st-nucleo/rtconfig.h create mode 100644 bsp/stm32/stm32l412-st-nucleo/rtconfig.py create mode 100644 bsp/stm32/stm32l412-st-nucleo/template.ewp create mode 100644 bsp/stm32/stm32l412-st-nucleo/template.eww create mode 100644 bsp/stm32/stm32l412-st-nucleo/template.uvoptx create mode 100644 bsp/stm32/stm32l412-st-nucleo/template.uvprojx diff --git a/bsp/stm32/stm32l412-st-nucleo/.config b/bsp/stm32/stm32l412-st-nucleo/.config new file mode 100644 index 0000000000..ed539bf2a8 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/.config @@ -0,0 +1,357 @@ +# +# 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_IDLE_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_COLOR=y +# CONFIG_RT_DEBUG_INIT_CONFIG is not set +# CONFIG_RT_DEBUG_THREAD_CONFIG is not set +# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set +# CONFIG_RT_DEBUG_IPC_CONFIG is not set +# CONFIG_RT_DEBUG_TIMER_CONFIG is not set +# CONFIG_RT_DEBUG_IRQ_CONFIG is not set +# CONFIG_RT_DEBUG_MEM_CONFIG is not set +# CONFIG_RT_DEBUG_SLAB_CONFIG is not set +# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set +# CONFIG_RT_DEBUG_MODULE_CONFIG is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +# CONFIG_RT_USING_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=256 +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_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=y +# CONFIG_RT_USING_SOFT_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +CONFIG_RT_USING_WDT=y +# CONFIG_RT_USING_AUDIO 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=y +# 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 + +# +# 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 +# +# 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_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 +CONFIG_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32L4=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_STM32L432KC=y + +# +# Onboard Peripheral Drivers +# +CONFIG_BSP_USING_STLINK_TO_USART=y + +# +# 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 +# CONFIG_BSP_USING_ON_CHIP_FLASH is not set +# CONFIG_BSP_USING_ONCHIP_RTC is not set +# CONFIG_BSP_USING_WDT is not set + +# +# Board extended module Drivers +# diff --git a/bsp/stm32/stm32l412-st-nucleo/.gitignore b/bsp/stm32/stm32l412-st-nucleo/.gitignore new file mode 100644 index 0000000000..7221bde019 --- /dev/null +++ b/bsp/stm32/stm32l412-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/stm32l412-st-nucleo/Kconfig b/bsp/stm32/stm32l412-st-nucleo/Kconfig new file mode 100644 index 0000000000..8cbc7b71a8 --- /dev/null +++ b/bsp/stm32/stm32l412-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/stm32l412-st-nucleo/README.md b/bsp/stm32/stm32l412-st-nucleo/README.md new file mode 100644 index 0000000000..73b83e6fee --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/README.md @@ -0,0 +1,116 @@ +# NUCLEO32-L412 开发板 BSP 说明 + +## 简介 + +本文档为ST官方 NUCLEO32-L412 开发板的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。 + +## 开发板介绍 + +对于 NUCLEO32-L412,内核是 Cortex-M4,绿色的 Nucleo 标志显示了这款芯片是低功耗系列,板载 ST-LINK/V2-1 调试器/编程器,迷你尺寸,mirco USB 接口,可数的外设,Arduino™ nano 兼容的接口。 + +开发板外观如下图所示: + +![board](figures/board.jpg) + +该开发板常用 **板载资源** 如下: + +- MCU:STM32L412RBT6P,主频 80MHz,128KB FLASH ,40KB RAM。 +- 常用外设 + - LED:4个,LD1(COM 双色),LD2(5V_USB 红色),LD3(5V_PWR 绿色),LD4(USER 绿色) + - 按键:2个,用户按键(B1),复位按键(B2) +- 常用接口:USB 支持 3 种不同接口:虚拟 COM 端口、大容量存储和调试端口。 +- 调试接口:板载 ST-LINK/V2-1 调试器。 + +开发板更多详细信息请参考【STMicroelectronics】 [NUCLEO-L412RB-P](https://www.st.com/content/st_com/en/products/evaluation-tools/product-evaluation-tools/mcu-mpu-eval-tools/stm32-mcu-mpu-eval-tools/stm32-nucleo-boards/nucleo-l412rb-p.html)。 + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :----------------- | :----------: | :------------------------------------- | +| 板载 ST-LINK 转串口 | 支持 | UART2 | +| **片上外设** | **支持情况** | **备注** | +| GPIO | 支持 | PA0, PA1... PC15 ---> PIN: 0, 1...47 | +| UART | 支持 | UART2 | +| SPI | 暂不支持 | SPI1 即将支持 | +| I2C | 暂不支持 | 软件 I2C 即将支持 | +| RTC | 支持 | 支持外部晶振和内部低速时钟 | +| PWM | 暂不支持 | 即将支持 | +| USB Device | 暂不支持 | 即将支持 | +| IWG | 支持 | 独立看门狗,未开启窗口模式 | +| **扩展模块** | **支持情况** | **备注** | + + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + + +### 快速上手 + +本 BSP 为开发者提供 MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线连接开发板到 PC,打开电源开关。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 ST-LINK 仿真器下载程序,在通过 microUSB 连接开发板的基础上,点击下载按钮即可下载程序到开发板 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,观察开发板上 LED 的运行效果,红色 LD1 和 LD2 常亮、黄色色 LD3 会周期性闪烁。 + +USB 虚拟 COM 端口默认连接串口 2,在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + +```bash + \ | / +- RT - Thread Operating System + / | \ 4.0.0 build Jan 9 2020 + 2006 - 2020 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)。 + +## 注意事项 + +- 开机时如果不能打印 RT-Thread 版本信息,请将BSP中串口 GPIO 速率调低 +- 开机时如果不能打印 RT-Thread 版本信息,请重新选择 PC 端串口调试软件的串口号 + +## 联系人信息 + +维护人: + +- [luhuadong](https://github.com/luhuadong), 邮箱: \ No newline at end of file diff --git a/bsp/stm32/stm32l412-st-nucleo/SConscript b/bsp/stm32/stm32l412-st-nucleo/SConscript new file mode 100644 index 0000000000..20f7689c53 --- /dev/null +++ b/bsp/stm32/stm32l412-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/stm32l412-st-nucleo/SConstruct b/bsp/stm32/stm32l412-st-nucleo/SConstruct new file mode 100644 index 0000000000..c4b3facad7 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/SConstruct @@ -0,0 +1,60 @@ +import os +import sys +import rtconfig + +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') +else: + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + +sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] +try: + from building import * +except: + print('Cannot found RT-Thread root directory, please check RTT_ROOT') + print(RTT_ROOT) + exit(-1) + +TARGET = 'rt-thread.' + rtconfig.TARGET_EXT + +DefaultEnvironment(tools=[]) +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM == '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 = 'STM32L4xx_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/stm32l412-st-nucleo/applications/SConscript b/bsp/stm32/stm32l412-st-nucleo/applications/SConscript new file mode 100644 index 0000000000..4939638d41 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/applications/SConscript @@ -0,0 +1,9 @@ +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [str(Dir('#')), cwd] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/stm32/stm32l412-st-nucleo/applications/main.c b/bsp/stm32/stm32l412-st-nucleo/applications/main.c new file mode 100644 index 0000000000..ad5174ccb7 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/applications/main.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2006-2020, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-24 luhuadong first version + */ + +#include +#include +#include + +/* defined the LED0 pin: PB3 */ +#define LED0_PIN GET_PIN(B, 3) + +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/stm32l412-st-nucleo/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/.mxproject new file mode 100644 index 0000000000..2bfa20ea63 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/.mxproject @@ -0,0 +1,14 @@ +[PreviousGenFiles] +HeaderPath=/home/rudy/workspace_hd/Projects/rt-thread/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Inc +HeaderFiles=stm32l4xx_it.h;stm32l4xx_hal_conf.h;main.h; +SourcePath=/home/rudy/workspace_hd/Projects/rt-thread/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Src +SourceFiles=stm32l4xx_it.c;stm32l4xx_hal_msp.c;main.c; + +[PreviousLibFiles] +LibFiles=Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l412xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/system_stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/core_cm1.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/core_armv8mml.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm23.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/cmsis_iccarm.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/mpu_armv7.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/cmsis_compiler.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/cmsis_version.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_armv8mbl.h;Drivers/CMSIS/Include/tz_context.h;Drivers/CMSIS/Include/core_cm33.h;Drivers/CMSIS/Include/mpu_armv8.h; + +[PreviousUsedIarFiles] +SourceFiles=../Src/main.c;../Src/stm32l4xx_it.c;../Src/stm32l4xx_hal_msp.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;..//Src/system_stm32l4xx.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;..//Src/system_stm32l4xx.c;../Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;; +HeaderPath=../Drivers/STM32L4xx_HAL_Driver/Inc;../Drivers/STM32L4xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32L4xx/Include;../Drivers/CMSIS/Include;../Inc; +CDefines=USE_HAL_DRIVER;STM32L412xx;USE_HAL_DRIVER;USE_HAL_DRIVER; + diff --git a/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc b/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc new file mode 100644 index 0000000000..4727ba50c3 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc @@ -0,0 +1,201 @@ +#MicroXplorer Configuration settings - do not modify +File.Version=6 +KeepUserPlacement=false +Mcu.Family=STM32L4 +Mcu.IP0=NVIC +Mcu.IP1=RCC +Mcu.IP2=SYS +Mcu.IP3=USART2 +Mcu.IPNb=4 +Mcu.Name=STM32L412RBTxP +Mcu.Package=LQFP64 +Mcu.Pin0=PC13 +Mcu.Pin1=PC14-OSC32_IN (PC14) +Mcu.Pin10=PA7 +Mcu.Pin11=PB13 +Mcu.Pin12=PA13 (JTMS/SWDIO) +Mcu.Pin13=PA14 (JTCK/SWCLK) +Mcu.Pin14=PB3 (JTDO/TRACESWO) +Mcu.Pin15=VP_SYS_VS_Systick +Mcu.Pin2=PC15-OSC32_OUT (PC15) +Mcu.Pin3=PH0-OSC_IN (PH0) +Mcu.Pin4=PH1-OSC_OUT (PH1) +Mcu.Pin5=PA2 +Mcu.Pin6=PA3 +Mcu.Pin7=PA4 +Mcu.Pin8=PA5 +Mcu.Pin9=PA6 +Mcu.PinsNb=16 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32L412RBTxP +MxCube.Version=5.5.0 +MxDb.Version=DB.5.0.50 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:true\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:true\:false +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:true\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:true\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:true\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:true\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:true\:false +NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:true\:true +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:true\:false +PA13\ (JTMS/SWDIO).GPIOParameters=GPIO_Label +PA13\ (JTMS/SWDIO).GPIO_Label=TMS +PA13\ (JTMS/SWDIO).Locked=true +PA13\ (JTMS/SWDIO).Mode=Serial_Wire +PA13\ (JTMS/SWDIO).Signal=SYS_JTMS-SWDIO +PA14\ (JTCK/SWCLK).GPIOParameters=GPIO_Label +PA14\ (JTCK/SWCLK).GPIO_Label=TCK +PA14\ (JTCK/SWCLK).Locked=true +PA14\ (JTCK/SWCLK).Mode=Serial_Wire +PA14\ (JTCK/SWCLK).Signal=SYS_JTCK-SWCLK +PA2.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label +PA2.GPIO_Label=USART_TX +PA2.GPIO_PuPd=GPIO_NOPULL +PA2.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PA2.Locked=true +PA2.Mode=Asynchronous +PA2.Signal=USART2_TX +PA3.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label +PA3.GPIO_Label=USART_RX +PA3.GPIO_PuPd=GPIO_NOPULL +PA3.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PA3.Locked=true +PA3.Mode=Asynchronous +PA3.Signal=USART2_RX +PA4.GPIOParameters=GPIO_Label +PA4.GPIO_Label=SMPS_EN [ADP5301ACBZ_VEN] +PA4.Locked=true +PA4.Signal=GPIO_Output +PA5.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultOutputPP +PA5.GPIO_Label=SMPS_V1 +PA5.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_PP +PA5.GPIO_PuPd=GPIO_NOPULL +PA5.GPIO_Speed=GPIO_SPEED_FREQ_LOW +PA5.Locked=true +PA5.Signal=GPIO_Output +PA6.GPIOParameters=GPIO_PuPd,GPIO_Label +PA6.GPIO_Label=SMPS_PG [ADP5301ACBZ_OUTOK] +PA6.GPIO_PuPd=GPIO_PULLUP +PA6.Locked=true +PA6.Signal=GPIO_Input +PA7.GPIOParameters=GPIO_Label +PA7.GPIO_Label=SMPS_SW [TS3A44159PWR_IN1_2] +PA7.Locked=true +PA7.Signal=GPIO_Output +PB13.GPIOParameters=GPIO_Label +PB13.GPIO_Label=LD4 [green Led] +PB13.Locked=true +PB13.Signal=GPIO_Output +PB3\ (JTDO/TRACESWO).GPIOParameters=GPIO_Label +PB3\ (JTDO/TRACESWO).GPIO_Label=SWO +PB3\ (JTDO/TRACESWO).Locked=true +PB3\ (JTDO/TRACESWO).Signal=SYS_JTDO-SWO +PC13.GPIOParameters=GPIO_PuPd,GPIO_Label,GPIO_ModeDefaultEXTI +PC13.GPIO_Label=B1 [Blue PushButton] +PC13.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING +PC13.GPIO_PuPd=GPIO_NOPULL +PC13.Locked=true +PC13.Signal=GPXTI13 +PC14-OSC32_IN\ (PC14).Locked=true +PC14-OSC32_IN\ (PC14).Mode=LSE-External-Oscillator +PC14-OSC32_IN\ (PC14).Signal=RCC_OSC32_IN +PC15-OSC32_OUT\ (PC15).Locked=true +PC15-OSC32_OUT\ (PC15).Mode=LSE-External-Oscillator +PC15-OSC32_OUT\ (PC15).Signal=RCC_OSC32_OUT +PCC.Checker=false +PCC.Line=STM32L4x2 +PCC.MCU=STM32L412RBTxP +PCC.PartNumber=STM32L412RBTxP +PCC.Seq0=0 +PCC.Series=STM32L4 +PCC.Temperature=25 +PCC.Vdd=3.0 +PH0-OSC_IN\ (PH0).GPIOParameters=GPIO_Label +PH0-OSC_IN\ (PH0).GPIO_Label=MCO +PH0-OSC_IN\ (PH0).Locked=true +PH0-OSC_IN\ (PH0).Mode=HSE-External-Clock-Source +PH0-OSC_IN\ (PH0).Signal=RCC_OSC_IN +PH1-OSC_OUT\ (PH1).Locked=true +PH1-OSC_OUT\ (PH1).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=STM32L412RBTxP +ProjectManager.FirmwarePackage=STM32Cube FW_L4 V1.15.1 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=0 +ProjectManager.MainLocation=Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=CubeMX_Config.ioc +ProjectManager.ProjectName=CubeMX_Config +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=EWARM V8.32 +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort= +RCC.ADCFreq_Value=80000000 +RCC.AHBFreq_Value=80000000 +RCC.APB1Freq_Value=80000000 +RCC.APB1TimFreq_Value=80000000 +RCC.APB2Freq_Value=80000000 +RCC.APB2TimFreq_Value=80000000 +RCC.CRSFreq_Value=48000000 +RCC.CortexFreq_Value=80000000 +RCC.FCLKCortexFreq_Value=80000000 +RCC.FLatency=FLASH_LATENCY_4 +RCC.FamilyName=M +RCC.HCLKFreq_Value=80000000 +RCC.HSE_VALUE=8000000 +RCC.HSI48_VALUE=48000000 +RCC.HSICalibrationValue=16 +RCC.HSI_VALUE=16000000 +RCC.I2C1Freq_Value=80000000 +RCC.I2C2Freq_Value=80000000 +RCC.I2C3Freq_Value=80000000 +RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CRSFreq_Value,CortexFreq_Value,FCLKCortexFreq_Value,FLatency,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSICalibrationValue,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,MSIAutoCalibration,MSI_VALUE,PLLN,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PREFETCH_ENABLE,PWRFreq_Value,RNGFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value +RCC.LPTIM1Freq_Value=80000000 +RCC.LPTIM2Freq_Value=80000000 +RCC.LPUART1Freq_Value=80000000 +RCC.LSCOPinFreq_Value=32000 +RCC.LSI_VALUE=32000 +RCC.MCO1PinFreq_Value=80000000 +RCC.MSIAutoCalibration=DISABLED +RCC.MSI_VALUE=4000000 +RCC.PLLN=40 +RCC.PLLQoutputFreq_Value=80000000 +RCC.PLLRCLKFreq_Value=80000000 +RCC.PREFETCH_ENABLE=1 +RCC.PWRFreq_Value=80000000 +RCC.RNGFreq_Value=4000000 +RCC.SYSCLKFreq_VALUE=80000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.USART1Freq_Value=80000000 +RCC.USART2Freq_Value=80000000 +RCC.USART3Freq_Value=80000000 +RCC.USBFreq_Value=4000000 +RCC.VCOInputFreq_Value=4000000 +RCC.VCOOutputFreq_Value=160000000 +SH.GPXTI13.0=GPIO_EXTI13 +SH.GPXTI13.ConfNb=1 +USART2.IPParameters=VirtualMode-Asynchronous +USART2.VirtualMode-Asynchronous=VM_ASYNC +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +board=NUCLEO-L412RB-P +boardIOC=true diff --git a/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Inc/main.h new file mode 100644 index 0000000000..b6a62ec316 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Inc/main.h @@ -0,0 +1,95 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l4xx_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 -----------------------------------------------------------*/ +#define B1_Pin GPIO_PIN_13 +#define B1_GPIO_Port GPIOC +#define MCO_Pin GPIO_PIN_0 +#define MCO_GPIO_Port GPIOH +#define USART_TX_Pin GPIO_PIN_2 +#define USART_TX_GPIO_Port GPIOA +#define USART_RX_Pin GPIO_PIN_3 +#define USART_RX_GPIO_Port GPIOA +#define SMPS_EN_Pin GPIO_PIN_4 +#define SMPS_EN_GPIO_Port GPIOA +#define SMPS_V1_Pin GPIO_PIN_5 +#define SMPS_V1_GPIO_Port GPIOA +#define SMPS_PG_Pin GPIO_PIN_6 +#define SMPS_PG_GPIO_Port GPIOA +#define SMPS_SW_Pin GPIO_PIN_7 +#define SMPS_SW_GPIO_Port GPIOA +#define LD4_Pin GPIO_PIN_13 +#define LD4_GPIO_Port GPIOB +#define TMS_Pin GPIO_PIN_13 +#define TMS_GPIO_Port GPIOA +#define TCK_Pin GPIO_PIN_14 +#define TCK_GPIO_Port GPIOA +#define SWO_Pin GPIO_PIN_3 +#define SWO_GPIO_Port GPIOB +/* 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/stm32l412-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h b/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h new file mode 100644 index 0000000000..b944963fc2 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h @@ -0,0 +1,450 @@ +/** + ****************************************************************************** + * @file stm32l4xx_hal_conf.h + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2020 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 __STM32L4xx_HAL_CONF_H +#define __STM32L4xx_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_COMP_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_DFSDM_MODULE_ENABLED */ +/*#define HAL_DSI_MODULE_ENABLED */ +/*#define HAL_FIREWALL_MODULE_ENABLED */ +/*#define HAL_GFXMMU_MODULE_ENABLED */ +/*#define HAL_HCD_MODULE_ENABLED */ +/*#define HAL_HASH_MODULE_ENABLED */ +/*#define HAL_I2S_MODULE_ENABLED */ +/*#define HAL_IRDA_MODULE_ENABLED */ +/*#define HAL_IWDG_MODULE_ENABLED */ +/*#define HAL_LTDC_MODULE_ENABLED */ +/*#define HAL_LCD_MODULE_ENABLED */ +/*#define HAL_LPTIM_MODULE_ENABLED */ +/*#define HAL_MMC_MODULE_ENABLED */ +/*#define HAL_NAND_MODULE_ENABLED */ +/*#define HAL_NOR_MODULE_ENABLED */ +/*#define HAL_OPAMP_MODULE_ENABLED */ +/*#define HAL_OSPI_MODULE_ENABLED */ +/*#define HAL_OSPI_MODULE_ENABLED */ +/*#define HAL_PCD_MODULE_ENABLED */ +/*#define HAL_PKA_MODULE_ENABLED */ +/*#define HAL_QSPI_MODULE_ENABLED */ +/*#define HAL_QSPI_MODULE_ENABLED */ +/*#define HAL_RNG_MODULE_ENABLED */ +/*#define HAL_RTC_MODULE_ENABLED */ +/*#define HAL_SAI_MODULE_ENABLED */ +/*#define HAL_SD_MODULE_ENABLED */ +/*#define HAL_SMBUS_MODULE_ENABLED */ +/*#define HAL_SMARTCARD_MODULE_ENABLED */ +/*#define HAL_SPI_MODULE_ENABLED */ +/*#define HAL_SRAM_MODULE_ENABLED */ +/*#define HAL_SWPMI_MODULE_ENABLED */ +/*#define HAL_TIM_MODULE_ENABLED */ +/*#define HAL_TSC_MODULE_ENABLED */ +#define HAL_UART_MODULE_ENABLED +/*#define HAL_USART_MODULE_ENABLED */ +/*#define HAL_WWDG_MODULE_ENABLED */ +/*#define HAL_EXTI_MODULE_ENABLED */ +/*#define HAL_PSSI_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_I2C_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 + +/* ########################## Oscillator 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 Multiple Speed oscillator (MSI) default value. + * This value is the default MSI range value after Reset. + */ +#if !defined (MSI_VALUE) + #define MSI_VALUE ((uint32_t)4000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* MSI_VALUE */ +/** + * @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 High Speed oscillator (HSI48) value for USB FS, SDMMC and RNG. + * This internal oscillator is mainly dedicated to provide a high precision clock to + * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. + * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency + * which is subject to manufacturing process variations. + */ +#if !defined (HSI48_VALUE) + #define HSI48_VALUE ((uint32_t)48000000U) /*!< Value of the Internal High Speed oscillator for USB FS/SDMMC/RNG in Hz. + The real value my vary depending on manufacturing process variations.*/ +#endif /* HSI48_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. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External 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 /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for SAI1 peripheral + * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source + * frequency. + */ +#if !defined (EXTERNAL_SAI1_CLOCK_VALUE) + #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)48000U) /*!< Value of the SAI1 External clock source in Hz*/ +#endif /* EXTERNAL_SAI1_CLOCK_VALUE */ + +/** + * @brief External clock source for SAI2 peripheral + * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source + * frequency. + */ +#if !defined (EXTERNAL_SAI2_CLOCK_VALUE) + #define EXTERNAL_SAI2_CLOCK_VALUE ((uint32_t)48000U) /*!< Value of the SAI2 External clock source in Hz*/ +#endif /* EXTERNAL_SAI2_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 */ + +/* ################## 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 "stm32l4xx_hal_rcc.h" + #include "stm32l4xx_hal_rcc_ex.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32l4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32l4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32l4xx_hal_dma.h" + #include "stm32l4xx_hal_dma_ex.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32l4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32l4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32l4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32l4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED + #include "stm32l4xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32l4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32l4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32l4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32l4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32l4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32l4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_FIREWALL_MODULE_ENABLED + #include "stm32l4xx_hal_firewall.h" +#endif /* HAL_FIREWALL_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32l4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32l4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32l4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32l4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32l4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32l4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32l4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32l4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LCD_MODULE_ENABLED + #include "stm32l4xx_hal_lcd.h" +#endif /* HAL_LCD_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32l4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32l4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_OPAMP_MODULE_ENABLED + #include "stm32l4xx_hal_opamp.h" +#endif /* HAL_OPAMP_MODULE_ENABLED */ + +#ifdef HAL_OSPI_MODULE_ENABLED + #include "stm32l4xx_hal_ospi.h" +#endif /* HAL_OSPI_MODULE_ENABLED */ + +#ifdef HAL_PKA_MODULE_ENABLED + #include "stm32l4xx_hal_pka.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32l4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32l4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32l4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32l4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32l4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32l4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + #include "stm32l4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32l4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_SWPMI_MODULE_ENABLED + #include "stm32l4xx_hal_swpmi.h" +#endif /* HAL_SWPMI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32l4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_TSC_MODULE_ENABLED + #include "stm32l4xx_hal_tsc.h" +#endif /* HAL_TSC_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32l4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32l4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32l4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32l4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32l4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32l4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32l4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_GFXMMU_MODULE_ENABLED + #include "stm32l4xx_hal_gfxmmu.h" +#endif /* HAL_GFXMMU_MODULE_ENABLED */ + +#ifdef HAL_PSSI_MODULE_ENABLED + #include "stm32l4xx_hal_pssi.h" +#endif /* HAL_PSSI_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(char *file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L4xx_HAL_CONF_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_it.h b/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_it.h new file mode 100644 index 0000000000..1bedbf684d --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_it.h @@ -0,0 +1,69 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32l4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32L4xx_IT_H +#define __STM32L4xx_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 /* __STM32L4xx_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Src/main.c new file mode 100644 index 0000000000..ce0385a5af --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Src/main.c @@ -0,0 +1,280 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +UART_HandleTypeDef 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); +/* 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(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + + /** Configure the main internal regulator output voltage + */ + if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI; + RCC_OscInitStruct.MSIState = RCC_MSI_ON; + RCC_OscInitStruct.MSICalibrationValue = 0; + RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI; + RCC_OscInitStruct.PLL.PLLM = 1; + RCC_OscInitStruct.PLL.PLLN = 40; + RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; + RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; + 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_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @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; + huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + 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_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOA, SMPS_EN_Pin|SMPS_V1_Pin|SMPS_SW_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD4_GPIO_Port, LD4_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : B1_Pin */ + GPIO_InitStruct.Pin = B1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pins : SMPS_EN_Pin SMPS_V1_Pin SMPS_SW_Pin */ + GPIO_InitStruct.Pin = SMPS_EN_Pin|SMPS_V1_Pin|SMPS_SW_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /*Configure GPIO pin : SMPS_PG_Pin */ + GPIO_InitStruct.Pin = SMPS_PG_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_PULLUP; + HAL_GPIO_Init(SMPS_PG_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : LD4_Pin */ + GPIO_InitStruct.Pin = LD4_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LD4_GPIO_Port, &GPIO_InitStruct); + +} + +/* 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(char *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/stm32l412-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c b/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c new file mode 100644 index 0000000000..4e7628b29c --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c @@ -0,0 +1,149 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : stm32l4xx_hal_msp.c + * Description : This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/** +* @brief UART MSP Initialization +* This function configures the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspInit(UART_HandleTypeDef* huart) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(huart->Instance==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 = USART_TX_Pin|USART_RX_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_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, USART_TX_Pin|USART_RX_Pin); + + /* 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/stm32l412-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_it.c b/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_it.c new file mode 100644 index 0000000000..8f827e4821 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_it.c @@ -0,0 +1,203 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32l4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32l4xx_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 Prefetch 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 */ +} + +/******************************************************************************/ +/* STM32L4xx 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_stm32l4xx.s). */ +/******************************************************************************/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Src/system_stm32l4xx.c b/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Src/system_stm32l4xx.c new file mode 100644 index 0000000000..26bd517974 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/board/CubeMX_Config/Src/system_stm32l4xx.c @@ -0,0 +1,337 @@ +/** + ****************************************************************************** + * @file system_stm32l4xx.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_stm32l4xx.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. + * + * After each device reset the MSI (4 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32l4xx.s" file, to + * configure the system clock before to branch to main program. + * + * This file configures the system clock as follows: + *============================================================================= + *----------------------------------------------------------------------------- + * System Clock source | MSI + *----------------------------------------------------------------------------- + * SYSCLK(Hz) | 4000000 + *----------------------------------------------------------------------------- + * HCLK(Hz) | 4000000 + *----------------------------------------------------------------------------- + * AHB Prescaler | 1 + *----------------------------------------------------------------------------- + * APB1 Prescaler | 1 + *----------------------------------------------------------------------------- + * APB2 Prescaler | 1 + *----------------------------------------------------------------------------- + * PLL_M | 1 + *----------------------------------------------------------------------------- + * PLL_N | 8 + *----------------------------------------------------------------------------- + * PLL_P | 7 + *----------------------------------------------------------------------------- + * PLL_Q | 2 + *----------------------------------------------------------------------------- + * PLL_R | 2 + *----------------------------------------------------------------------------- + * PLLSAI1_P | NA + *----------------------------------------------------------------------------- + * PLLSAI1_Q | NA + *----------------------------------------------------------------------------- + * PLLSAI1_R | NA + *----------------------------------------------------------------------------- + * PLLSAI2_P | NA + *----------------------------------------------------------------------------- + * PLLSAI2_Q | NA + *----------------------------------------------------------------------------- + * PLLSAI2_R | NA + *----------------------------------------------------------------------------- + * Require 48MHz for USB OTG FS, | Disabled + * SDIO and RNG clock | + *----------------------------------------------------------------------------- + *============================================================================= + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32l4xx_system + * @{ + */ + +/** @addtogroup STM32L4xx_System_Private_Includes + * @{ + */ + +#include "stm32l4xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (MSI_VALUE) + #define MSI_VALUE 4000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* MSI_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/*!< 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 STM32L4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Variables + * @{ + */ + /* The SystemCoreClock 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 = 4000000U; + + const uint8_t AHBPrescTable[16] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U, 6U, 7U, 8U, 9U}; + const uint8_t APBPrescTable[8] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U}; + const uint32_t MSIRangeTable[12] = {100000U, 200000U, 400000U, 800000U, 1000000U, 2000000U, \ + 4000000U, 8000000U, 16000000U, 24000000U, 32000000U, 48000000U}; +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system. + * @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 MSION bit */ + RCC->CR |= RCC_CR_MSION; + + /* Reset CFGR register */ + RCC->CFGR = 0x00000000U; + + /* Reset HSEON, CSSON , HSION, and PLLON bits */ + RCC->CR &= 0xEAF6FFFFU; + + /* Reset PLLCFGR register */ + RCC->PLLCFGR = 0x00001000U; + + /* Reset HSEBYP bit */ + RCC->CR &= 0xFFFBFFFFU; + + /* Disable all interrupts */ + RCC->CIER = 0x00000000U; + + /* 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 MSI, SystemCoreClock will contain the MSI_VALUE(*) + * + * - 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(*) or MSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) MSI_VALUE is a constant defined in stm32l4xx_hal.h file (default value + * 4 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSI_VALUE is a constant defined in stm32l4xx_hal.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 stm32l4xx_hal.h file (default value + * 8 MHz), 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 = 0U, msirange = 0U, pllvco = 0U, pllr = 2U, pllsource = 0U, pllm = 2U; + + /* Get MSI Range frequency--------------------------------------------------*/ + if((RCC->CR & RCC_CR_MSIRGSEL) == RESET) + { /* MSISRANGE from RCC_CSR applies */ + msirange = (RCC->CSR & RCC_CSR_MSISRANGE) >> 8U; + } + else + { /* MSIRANGE from RCC_CR applies */ + msirange = (RCC->CR & RCC_CR_MSIRANGE) >> 4U; + } + /*MSI frequency range in HZ*/ + msirange = MSIRangeTable[msirange]; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) + { + case 0x00: /* MSI used as system clock source */ + SystemCoreClock = msirange; + break; + + case 0x04: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + + case 0x08: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + + case 0x0C: /* PLL used as system clock source */ + /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN + SYSCLK = PLL_VCO / PLLR + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> 4U) + 1U ; + + switch (pllsource) + { + case 0x02: /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm); + break; + + case 0x03: /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm); + break; + + default: /* MSI used as PLL clock source */ + pllvco = (msirange / pllm); + break; + } + pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 8U); + pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 25U) + 1U) * 2U; + SystemCoreClock = pllvco/pllr; + break; + + default: + SystemCoreClock = msirange; + break; + } + /* Compute HCLK clock frequency --------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4U)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l412-st-nucleo/board/Kconfig b/bsp/stm32/stm32l412-st-nucleo/board/Kconfig new file mode 100644 index 0000000000..181be78e77 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/board/Kconfig @@ -0,0 +1,74 @@ +menu "Hardware Drivers Config" + +config SOC_STM32L432KC + bool + select SOC_SERIES_STM32L4 + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y + +menu "Onboard Peripheral Drivers" + config BSP_USING_STLINK_TO_USART + bool "Enable STLINK TO USART (uart2)" + select BSP_USING_UART + select BSP_USING_UART2 + default y +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 n + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + endif + + config BSP_USING_ON_CHIP_FLASH + bool "Enable on-chip FLASH" + default n + + menuconfig BSP_USING_ONCHIP_RTC + bool "Enable RTC" + select RT_USING_RTC + select RT_USING_LIBC + default n + if BSP_USING_ONCHIP_RTC + choice + prompt "Select clock source" + default BSP_RTC_USING_LSE + + config BSP_RTC_USING_LSE + bool "RTC USING LSE" + + config BSP_RTC_USING_LSI + bool "RTC USING LSI" + endchoice + endif + + config BSP_USING_WDT + bool "Enable Watchdog Timer" + select RT_USING_WDT + default n + source "../libraries/HAL_Drivers/Kconfig" + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/stm32/stm32l412-st-nucleo/board/SConscript b/bsp/stm32/stm32l412-st-nucleo/board/SConscript new file mode 100644 index 0000000000..6c39045b35 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/board/SConscript @@ -0,0 +1,39 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +CubeMX_Config/Src/stm32l4xx_hal_msp.c +''') + +path = [cwd] +path += [cwd + '/CubeMX_Config/Inc'] + +startup_path_prefix = SDK_LIB + +if rtconfig.CROSS_TOOL == 'gcc': + src += [startup_path_prefix + '/STM32L4xx_HAL/CMSIS/Device/ST/STM32L4xx/Source/Templates/gcc/startup_stm32l412xx.s'] +elif rtconfig.CROSS_TOOL == 'keil': + src += [startup_path_prefix + '/STM32L4xx_HAL/CMSIS/Device/ST/STM32L4xx/Source/Templates/arm/startup_stm32l412xx.s'] +elif rtconfig.CROSS_TOOL == 'iar': + src += [startup_path_prefix + '/STM32L4xx_HAL/CMSIS/Device/ST/STM32L4xx/Source/Templates/iar/startup_stm32l412xx.s'] + +# STM32L412xx || STM32L422xx || STM32L431xx +# STM32L432xx || STM32L433xx || STM32L442xx +# STM32L443xx || STM32L451xx || STM32L452xx +# STM32L462xx || STM32L471xx || STM32L475xx +# STM32L476xx || STM32L485xx || STM32L486xx +# STM32L496xx || STM32L4A6xx || STM32L4R5xx +# STM32L4R7xx || STM32L4R9xx || STM32L4S5xx +# STM32L4S7xx || STM32L4S9xx +# You can select chips from the list above +CPPDEFINES = ['STM32L412xx'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') diff --git a/bsp/stm32/stm32l412-st-nucleo/board/board.c b/bsp/stm32/stm32l412-st-nucleo/board/board.c new file mode 100644 index 0000000000..f1896c3dc5 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/board/board.c @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-24 luhuadong first version + */ + +#include "board.h" + +void SystemClock_Config(void) +{ + + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_PeriphCLKInitTypeDef PeriphClkInit; + + /**Configure LSE Drive Capability + */ + HAL_PWR_EnableBkUpAccess(); + + __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW); + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE|RCC_OSCILLATORTYPE_MSI; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + RCC_OscInitStruct.MSIState = RCC_MSI_ON; + RCC_OscInitStruct.MSICalibrationValue = 0; + RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI; + RCC_OscInitStruct.PLL.PLLM = 1; + RCC_OscInitStruct.PLL.PLLN = 16; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7; + RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; + RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + /**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_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + /**Configure the main internal regulator output voltage + */ + if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + /**Configure the Systick interrupt time + */ + HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); + + /**Configure the Systick + */ + HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); + + /**Enable MSI Auto calibration + */ + HAL_RCCEx_EnableMSIPLLMode(); + + /* SysTick_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); +} diff --git a/bsp/stm32/stm32l412-st-nucleo/board/board.h b/bsp/stm32/stm32l412-st-nucleo/board/board.h new file mode 100644 index 0000000000..e88c9168b4 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/board/board.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-04-24 luhuadong 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 (128 * 1024) +#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE)) + +#define STM32_SRAM1_SIZE (32) +#define STM32_SRAM1_START (0x20000000) +#define STM32_SRAM1_END (STM32_SRAM1_START + STM32_SRAM1_SIZE * 1024) + +#define HEAP_BEGIN STM32_SRAM1_START +#define HEAP_END STM32_SRAM1_END + +void SystemClock_Config(void); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/bsp/stm32/stm32l412-st-nucleo/board/linker_scripts/link.icf b/bsp/stm32/stm32l412-st-nucleo/board/linker_scripts/link.icf new file mode 100644 index 0000000000..1d95e70851 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/board/linker_scripts/link.icf @@ -0,0 +1,33 @@ +/*###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__ = 0x0803FFFF; +define symbol __ICFEDIT_region_RAM1_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM1_end__ = 0x2000BFFF; +define symbol __ICFEDIT_region_RAM2_start__ = 0x10000000; +define symbol __ICFEDIT_region_RAM2_end__ = 0x10003FFF; + +/*-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 RAM1_region = mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__]; +define region RAM2_region = mem:[from __ICFEDIT_region_RAM2_start__ to __ICFEDIT_region_RAM2_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 RAM1_region { section .sram }; +place in RAM2_region { readwrite, last block CSTACK}; diff --git a/bsp/stm32/stm32l412-st-nucleo/board/linker_scripts/link.lds b/bsp/stm32/stm32l412-st-nucleo/board/linker_scripts/link.lds new file mode 100644 index 0000000000..a20112b7ef --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/board/linker_scripts/link.lds @@ -0,0 +1,158 @@ +/* + * linker script for STM32L4XX with GNU ld + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08000000, LENGTH = 256k /* 256KB flash */ + RAM1 (rw) : ORIGIN = 0x20000000, LENGTH = 48k /* 48K sram */ + RAM2 (rw) : ORIGIN = 0x10000000, LENGTH = 16k /* 16K 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); + + PROVIDE(__ctors_start__ = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE(__ctors_end__ = .); + + . = ALIGN(4); + + _etext = .; + } > ROM = 0 + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > ROM + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + + PROVIDE(__dtors_start__ = .); + KEEP(*(SORT(.dtors.*))) + KEEP(*(.dtors)) + PROVIDE(__dtors_end__ = .); + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >RAM2 + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } >RAM2 + + __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) + } > RAM2 + __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/stm32l412-st-nucleo/board/linker_scripts/link.sct b/bsp/stm32/stm32l412-st-nucleo/board/linker_scripts/link.sct new file mode 100644 index 0000000000..ed86f920e0 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/board/linker_scripts/link.sct @@ -0,0 +1,15 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00040000 { ; load region size_region + ER_IROM1 0x08000000 0x00040000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_IRAM2 0x10000000 0x00004000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/bsp/stm32/stm32l412-st-nucleo/figures/board.jpg b/bsp/stm32/stm32l412-st-nucleo/figures/board.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e21bbd934302a4c79c173094eb931c2855e442ce GIT binary patch literal 91973 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≶IAKh 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 BFpU5J literal 0 HcmV?d00001 diff --git a/bsp/stm32/stm32l412-st-nucleo/project.ewd b/bsp/stm32/stm32l412-st-nucleo/project.ewd new file mode 100644 index 0000000000..4b27053590 --- /dev/null +++ b/bsp/stm32/stm32l412-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/stm32l412-st-nucleo/project.ewp b/bsp/stm32/stm32l412-st-nucleo/project.ewp new file mode 100644 index 0000000000..79cb2f4c71 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/project.ewp @@ -0,0 +1,2329 @@ + + 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 + + + + + Kernel + + $PROJ_DIR$\..\..\..\src\clock.c + + + $PROJ_DIR$\..\..\..\src\components.c + + + $PROJ_DIR$\..\..\..\src\cpu.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 + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + Drivers + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\board\CubeMX_Config\Src\stm32l4xx_hal_msp.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\iar\startup_stm32l432xx.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 + + + + cpu + + $PROJ_DIR$\..\..\..\libcpu\arm\common\backtrace.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\context_iar.S + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\components\drivers\misc\pin.c + + + $PROJ_DIR$\..\..\..\components\drivers\rtc\rtc.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 + + + $PROJ_DIR$\..\..\..\components\drivers\watchdog\watchdog.c + + + + finsh + + $PROJ_DIR$\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\components\finsh\cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh.c + + + + libc + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\time.c + + + + dlib + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\environ.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\libc.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\rmtx.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\stdio.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_close.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_lseek.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_mem.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_open.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_read.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_remove.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_write.c + + + + STM32_HAL + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\system_stm32l4xx.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_comp.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_exti.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rng.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rtc.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rtc_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_iwdg.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_wwdg.c + + + diff --git a/bsp/stm32/stm32l412-st-nucleo/project.eww b/bsp/stm32/stm32l412-st-nucleo/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/stm32/stm32l412-st-nucleo/project.uvoptx b/bsp/stm32/stm32l412-st-nucleo/project.uvoptx new file mode 100644 index 0000000000..d18ee55260 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/project.uvoptx @@ -0,0 +1,186 @@ + + + + 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 + 5 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + ST-LINKIII-KEIL_SWO + -U066AFF534854845187093307 -O206 -S0 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_256 -FS08000000 -FL040000 -FP0($$Device:STM32L432KCUx$CMSIS\Flash\STM32L4xx_256.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32L4xx_256 -FL040000 -FS08000000 -FP0($$Device:STM32L432KCUx$CMSIS\Flash\STM32L4xx_256.FLM) + + + 0 + JL2CM3 + -U -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L475VETx$CMSIS\Flash\STM32L4xx_512.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 + + 1 + 0 + 2 + 10000000 + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
diff --git a/bsp/stm32/stm32l412-st-nucleo/project.uvprojx b/bsp/stm32/stm32l412-st-nucleo/project.uvprojx new file mode 100644 index 0000000000..85d9948d49 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/project.uvprojx @@ -0,0 +1,893 @@ + + + 2.1 +
### uVision Project, (C) Keil Software
+ + + rt-thread + 0x4 + ARM-ADS + 5060300::V5.06 update 3 (build 300)::ARMCC + + + STM32L432KCUx + STMicroelectronics + Keil.STM32L4xx_DFP.2.0.0 + http://www.keil.com/pack + IRAM(0x20000000,0x0000C000) IRAM2(0x10000000,0x00004000) IROM(0x08000000,0x00040000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_256 -FS08000000 -FL040000 -FP0($$Device:STM32L432KCUx$CMSIS\Flash\STM32L4xx_256.FLM)) + 0 + $$Device:STM32L432KCUx$Drivers\CMSIS\Device\ST\STM32L4xx\Include\stm32l4xx.h + + + + + + + + + + $$Device:STM32L432KCUx$CMSIS\SVD\STM32L4x2.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 1 + 1 + 1 + .\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 + 1 + 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 + 0xc000 + + + 1 + 0x8000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x10000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + USE_HAL_DRIVER, STM32L432xx, RT_USING_ARM_LIBC + + .;..\..\..\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\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\..\..\components\libc\compilers\armlibc;..\..\..\components\libc\compilers\common;..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Inc;..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Include;..\libraries\STM32L4xx_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 + + + + + + + + + + + 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 + + + + + stm32l4xx_hal_msp.c + 1 + board\CubeMX_Config\Src\stm32l4xx_hal_msp.c + + + + + startup_stm32l432xx.s + 2 + ..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\arm\startup_stm32l432xx.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 + + + + + rtc.c + 1 + ..\..\..\components\drivers\rtc\rtc.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 + + + + + watchdog.c + 1 + ..\..\..\components\drivers\watchdog\watchdog.c + + + + + finsh + + + shell.c + 1 + ..\..\..\components\finsh\shell.c + + + + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + + + + + msh.c + 1 + ..\..\..\components\finsh\msh.c + + + + + libc + + + libc.c + 1 + ..\..\..\components\libc\compilers\armlibc\libc.c + + + + + mem_std.c + 1 + ..\..\..\components\libc\compilers\armlibc\mem_std.c + + + + + stubs.c + 1 + ..\..\..\components\libc\compilers\armlibc\stubs.c + + + + + time.c + 1 + ..\..\..\components\libc\compilers\common\time.c + + + + + STM32_HAL + + + system_stm32l4xx.c + 1 + ..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\system_stm32l4xx.c + + + + + stm32l4xx_hal.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c + + + + + stm32l4xx_hal_comp.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_comp.c + + + + + stm32l4xx_hal_cortex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c + + + + + stm32l4xx_hal_crc.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc.c + + + + + stm32l4xx_hal_crc_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc_ex.c + + + + + stm32l4xx_hal_cryp.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp.c + + + + + stm32l4xx_hal_cryp_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp_ex.c + + + + + stm32l4xx_hal_dma.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c + + + + + stm32l4xx_hal_dma_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c + + + + + stm32l4xx_hal_exti.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_exti.c + + + + + stm32l4xx_hal_pwr.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c + + + + + stm32l4xx_hal_pwr_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c + + + + + stm32l4xx_hal_rcc.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c + + + + + stm32l4xx_hal_rcc_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c + + + + + stm32l4xx_hal_rng.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rng.c + + + + + stm32l4xx_hal_gpio.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c + + + + + stm32l4xx_hal_uart.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c + + + + + stm32l4xx_hal_uart_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c + + + + + stm32l4xx_hal_usart.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart.c + + + + + stm32l4xx_hal_usart_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart_ex.c + + + + + stm32l4xx_hal_rtc.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rtc.c + + + + + stm32l4xx_hal_rtc_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rtc_ex.c + + + + + stm32l4xx_hal_iwdg.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_iwdg.c + + + + + stm32l4xx_hal_wwdg.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_wwdg.c + + + + + + +
diff --git a/bsp/stm32/stm32l412-st-nucleo/rtconfig.h b/bsp/stm32/stm32l412-st-nucleo/rtconfig.h new file mode 100644 index 0000000000..f5182e5999 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/rtconfig.h @@ -0,0 +1,178 @@ +#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_IDLE_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 +#define RT_DEBUG +#define RT_DEBUG_COLOR + +/* 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 256 +#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_USING_PIN +#define RT_USING_RTC +#define RT_USING_WDT + +/* Using WiFi */ + + +/* Using USB */ + + +/* POSIX layer and C standard library */ + +#define RT_USING_LIBC + +/* 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 */ + + +/* miscellaneous packages */ + + +/* samples: kernel and components samples */ + +#define SOC_FAMILY_STM32 +#define SOC_SERIES_STM32L4 + +/* Hardware Drivers Config */ + +#define SOC_STM32L432KC + +/* Onboard Peripheral Drivers */ + +#define BSP_USING_STLINK_TO_USART + +/* 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/stm32l412-st-nucleo/rtconfig.py b/bsp/stm32/stm32l412-st-nucleo/rtconfig.py new file mode 100644 index 0000000000..ab166e687d --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/rtconfig.py @@ -0,0 +1,144 @@ +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' + EXEC_PATH = r'/home/rudy/opt/gcc-arm-none-eabi-7-2017-q4-major/bin/' +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 + ' -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' + + CXXFLAGS = CFLAGS + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + CXX = '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 + ' --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict --scatter "board\linker_scripts\link.sct"' + 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' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iar': + # toolchains + CC = 'iccarm' + CXX = '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' + + CXXFLAGS = CFLAGS + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' diff --git a/bsp/stm32/stm32l412-st-nucleo/template.ewp b/bsp/stm32/stm32l412-st-nucleo/template.ewp new file mode 100644 index 0000000000..f390ad7bc1 --- /dev/null +++ b/bsp/stm32/stm32l412-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/stm32l412-st-nucleo/template.eww b/bsp/stm32/stm32l412-st-nucleo/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/stm32/stm32l412-st-nucleo/template.uvoptx b/bsp/stm32/stm32l412-st-nucleo/template.uvoptx new file mode 100644 index 0000000000..d18ee55260 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/template.uvoptx @@ -0,0 +1,186 @@ + + + + 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 + 5 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + ST-LINKIII-KEIL_SWO + -U066AFF534854845187093307 -O206 -S0 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_256 -FS08000000 -FL040000 -FP0($$Device:STM32L432KCUx$CMSIS\Flash\STM32L4xx_256.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32L4xx_256 -FL040000 -FS08000000 -FP0($$Device:STM32L432KCUx$CMSIS\Flash\STM32L4xx_256.FLM) + + + 0 + JL2CM3 + -U -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L475VETx$CMSIS\Flash\STM32L4xx_512.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 + + 1 + 0 + 2 + 10000000 + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
diff --git a/bsp/stm32/stm32l412-st-nucleo/template.uvprojx b/bsp/stm32/stm32l412-st-nucleo/template.uvprojx new file mode 100644 index 0000000000..01e792faf7 --- /dev/null +++ b/bsp/stm32/stm32l412-st-nucleo/template.uvprojx @@ -0,0 +1,386 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060300::V5.06 update 3 (build 300)::ARMCC + + + STM32L432KCUx + STMicroelectronics + Keil.STM32L4xx_DFP.2.0.0 + http://www.keil.com/pack + IRAM(0x20000000,0x0000C000) IRAM2(0x10000000,0x00004000) IROM(0x08000000,0x00040000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_256 -FS08000000 -FL040000 -FP0($$Device:STM32L432KCUx$CMSIS\Flash\STM32L4xx_256.FLM)) + 0 + $$Device:STM32L432KCUx$Drivers\CMSIS\Device\ST\STM32L4xx\Include\stm32l4xx.h + + + + + + + + + + $$Device:STM32L432KCUx$CMSIS\SVD\STM32L4x2.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 1 + 1 + 1 + .\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 + 1 + 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 + 0xc000 + + + 1 + 0x8000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x10000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 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 + + + + + +