From cad05f7c55ff3e6b9f38a5e38602d67fcc3d7eee Mon Sep 17 00:00:00 2001 From: Vincent-VG Date: Mon, 28 Jan 2019 19:24:33 +0800 Subject: [PATCH 1/5] add stm32l476-st-nucleo --- bsp/stm32/stm32l476-st-nucleo/.config | 347 ++ bsp/stm32/stm32l476-st-nucleo/.gitignore | 42 + bsp/stm32/stm32l476-st-nucleo/Kconfig | 21 + bsp/stm32/stm32l476-st-nucleo/README.md | 108 + bsp/stm32/stm32l476-st-nucleo/SConscript | 14 + bsp/stm32/stm32l476-st-nucleo/SConstruct | 58 + .../applications/SConscript | 9 + .../stm32l476-st-nucleo/applications/main.c | 33 + .../board/CubeMX_Config/.mxproject | 13 + .../board/CubeMX_Config/CubeMX_Config.ioc | 139 + .../board/CubeMX_Config/Inc/main.h | 91 + .../CubeMX_Config/Inc/stm32l4xx_hal_conf.h | 434 +++ .../board/CubeMX_Config/Inc/stm32l4xx_it.h | 84 + .../board/CubeMX_Config/Src/main.c | 269 ++ .../CubeMX_Config/Src/stm32l4xx_hal_msp.c | 172 + .../board/CubeMX_Config/Src/stm32l4xx_it.c | 217 ++ .../CubeMX_Config/Src/system_stm32l4xx.c | 353 +++ bsp/stm32/stm32l476-st-nucleo/board/Kconfig | 45 + .../stm32l476-st-nucleo/board/SConscript | 37 + bsp/stm32/stm32l476-st-nucleo/board/board.c | 64 + bsp/stm32/stm32l476-st-nucleo/board/board.h | 41 + .../board/linker_scripts/link.icf | 33 + .../board/linker_scripts/link.lds | 144 + .../board/linker_scripts/link.sct | 15 + .../stm32l476-st-nucleo/figures/board.png | Bin 0 -> 138645 bytes bsp/stm32/stm32l476-st-nucleo/project.ewd | 2818 +++++++++++++++++ bsp/stm32/stm32l476-st-nucleo/project.ewp | 2275 +++++++++++++ bsp/stm32/stm32l476-st-nucleo/project.eww | 10 + bsp/stm32/stm32l476-st-nucleo/project.uvoptx | 1008 ++++++ bsp/stm32/stm32l476-st-nucleo/project.uvprojx | 747 +++++ bsp/stm32/stm32l476-st-nucleo/rtconfig.h | 179 ++ bsp/stm32/stm32l476-st-nucleo/rtconfig.py | 134 + bsp/stm32/stm32l476-st-nucleo/template.ewp | 2031 ++++++++++++ bsp/stm32/stm32l476-st-nucleo/template.eww | 10 + bsp/stm32/stm32l476-st-nucleo/template.uvoptx | 192 ++ .../stm32l476-st-nucleo/template.uvprojx | 395 +++ 36 files changed, 12582 insertions(+) create mode 100644 bsp/stm32/stm32l476-st-nucleo/.config create mode 100644 bsp/stm32/stm32l476-st-nucleo/.gitignore create mode 100644 bsp/stm32/stm32l476-st-nucleo/Kconfig create mode 100644 bsp/stm32/stm32l476-st-nucleo/README.md create mode 100644 bsp/stm32/stm32l476-st-nucleo/SConscript create mode 100644 bsp/stm32/stm32l476-st-nucleo/SConstruct create mode 100644 bsp/stm32/stm32l476-st-nucleo/applications/SConscript create mode 100644 bsp/stm32/stm32l476-st-nucleo/applications/main.c create mode 100644 bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/.mxproject create mode 100644 bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc create mode 100644 bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Inc/main.h create mode 100644 bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h create mode 100644 bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_it.h create mode 100644 bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Src/main.c create mode 100644 bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c create mode 100644 bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_it.c create mode 100644 bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Src/system_stm32l4xx.c create mode 100644 bsp/stm32/stm32l476-st-nucleo/board/Kconfig create mode 100644 bsp/stm32/stm32l476-st-nucleo/board/SConscript create mode 100644 bsp/stm32/stm32l476-st-nucleo/board/board.c create mode 100644 bsp/stm32/stm32l476-st-nucleo/board/board.h create mode 100644 bsp/stm32/stm32l476-st-nucleo/board/linker_scripts/link.icf create mode 100644 bsp/stm32/stm32l476-st-nucleo/board/linker_scripts/link.lds create mode 100644 bsp/stm32/stm32l476-st-nucleo/board/linker_scripts/link.sct create mode 100644 bsp/stm32/stm32l476-st-nucleo/figures/board.png create mode 100644 bsp/stm32/stm32l476-st-nucleo/project.ewd create mode 100644 bsp/stm32/stm32l476-st-nucleo/project.ewp create mode 100644 bsp/stm32/stm32l476-st-nucleo/project.eww create mode 100644 bsp/stm32/stm32l476-st-nucleo/project.uvoptx create mode 100644 bsp/stm32/stm32l476-st-nucleo/project.uvprojx create mode 100644 bsp/stm32/stm32l476-st-nucleo/rtconfig.h create mode 100644 bsp/stm32/stm32l476-st-nucleo/rtconfig.py create mode 100644 bsp/stm32/stm32l476-st-nucleo/template.ewp create mode 100644 bsp/stm32/stm32l476-st-nucleo/template.eww create mode 100644 bsp/stm32/stm32l476-st-nucleo/template.uvoptx create mode 100644 bsp/stm32/stm32l476-st-nucleo/template.uvprojx diff --git a/bsp/stm32/stm32l476-st-nucleo/.config b/bsp/stm32/stm32l476-st-nucleo/.config new file mode 100644 index 0000000000..e3e445886c --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/.config @@ -0,0 +1,347 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=4 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=1000 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDEL_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +# CONFIG_RT_USING_TIMER_SOFT is not set +CONFIG_RT_DEBUG=y +# CONFIG_RT_DEBUG_INIT_CONFIG is not set +# CONFIG_RT_DEBUG_THREAD_CONFIG is not set +# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set +# CONFIG_RT_DEBUG_IPC_CONFIG is not set +# CONFIG_RT_DEBUG_TIMER_CONFIG is not set +# CONFIG_RT_DEBUG_IRQ_CONFIG is not set +# CONFIG_RT_DEBUG_MEM_CONFIG is not set +# CONFIG_RT_DEBUG_SLAB_CONFIG is not set +# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set +# CONFIG_RT_DEBUG_MODULE_CONFIG is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +# CONFIG_RT_USING_MEMHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMTRACE is not set +CONFIG_RT_USING_HEAP=y + +# +# Kernel Device Object +# +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=256 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart2" +CONFIG_RT_VER_NUM=0x40000 +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 is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set + +# +# Using WiFi +# +# CONFIG_RT_USING_WIFI is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# POSIX layer and C standard library +# +# CONFIG_RT_USING_LIBC is not set +# CONFIG_RT_USING_PTHREADS is not set + +# +# Network +# + +# +# Socket abstraction layer +# +# CONFIG_RT_USING_SAL is not set + +# +# light weight TCP/IP stack +# +# CONFIG_RT_USING_LWIP is not set + +# +# Modbus master and slave stack +# +# CONFIG_RT_USING_MODBUS is not set + +# +# AT commands +# +# CONFIG_RT_USING_AT is not set + +# +# VBUS(Virtual Software BUS) +# +# CONFIG_RT_USING_VBUS is not set + +# +# Utilities +# +# CONFIG_RT_USING_LOGTRACE is not set +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set + +# +# ARM CMSIS +# +# CONFIG_RT_USING_CMSIS_OS is not set +# CONFIG_RT_USING_RTT_CMSIS is not set +# CONFIG_RT_USING_LWP is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_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_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 + +# +# 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 + +# +# 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 + +# +# 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 + +# +# 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 + +# +# sample package +# + +# +# 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 + +# +# example package: hello +# +# CONFIG_PKG_USING_HELLO is not set +CONFIG_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32L4=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_STM32L476RG=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 + +# +# Board extended module Drivers +# diff --git a/bsp/stm32/stm32l476-st-nucleo/.gitignore b/bsp/stm32/stm32l476-st-nucleo/.gitignore new file mode 100644 index 0000000000..7221bde019 --- /dev/null +++ b/bsp/stm32/stm32l476-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/stm32l476-st-nucleo/Kconfig b/bsp/stm32/stm32l476-st-nucleo/Kconfig new file mode 100644 index 0000000000..8cbc7b71a8 --- /dev/null +++ b/bsp/stm32/stm32l476-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/stm32l476-st-nucleo/README.md b/bsp/stm32/stm32l476-st-nucleo/README.md new file mode 100644 index 0000000000..ab8b35dd04 --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/README.md @@ -0,0 +1,108 @@ +# NUCLEO-L476RG 开发板的 BSP 说明 + +## 简介 + +本文档为 ST 官方 (64)NUCLEO-L476RG 开发板的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。 + +## 开发板介绍 + +对于 NUCLEO-L476RG,内核是 Cortex-M4,绿色的 Nucleo 标志显示了这款芯片是低功耗系列,板载 ST-LINK/V2-1 调试器/编程器,迷你尺寸,mirco USB 接口,可数的外设,Arduino™ nano 兼容的接口。 + +开发板外观如下图所示: + +![board](figures/board.png) + +该开发板常用 **板载资源** 如下: + +- MCU:STM32L476RG,主频 80MHz,1024KB FLASH ,128KB RAM(96+32)。 +- 常用外设 + - LED:3个,USB communication(LD1 双色),power LED(LD3 红色),user LED(LD2 黄绿色) + - 按键:1个,复位按键(B1)。 +- 常用接口:USB 支持 3 种不同接口:虚拟 COM 端口、大容量存储和调试端口。 +- 调试接口:板载 ST-LINK/V2-1 调试器。 + +开发板更多详细信息请参考【STMicroelectronics】 [NUCLEO-L476RG](https://www.st.com/content/st_com/en/products/evaluation-tools/product-evaluation-tools/mcu-eval-tools/stm32-mcu-eval-tools/stm32-mcu-nucleo/nucleo-l476rg.html)。 + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :----------------- | :----------: | :------------------------------------- | +| 板载 ST-LINK 转串口 | 支持 | UART2 | +| **片上外设** | **支持情况** | **备注** | +| GPIO | 支持 | | +| UART | 支持 | UART2 | +| **扩展模块** | **支持情况** | **备注** | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + + +### 快速上手 + +本 BSP 为开发者提供 MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线连接开发板到 PC,打开电源开关。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 ST-LINK 仿真器下载程序,在通过 microUSB 连接开发板的基础上,点击下载按钮即可下载程序到开发板 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,观察开发板上 LED 的运行效果,红色 LD1 和 LD3 常亮、黄绿色 LD2 会周期性闪烁。 + +USB 虚拟 COM 端口默认连接串口 2,在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + +```bash + \ | / +- RT - Thread Operating System + / | \ 4.0.0 build Jan 9 2019 + 2006 - 2018 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 版本信息,请重新选择 PC 端串口调试软件的串口号或将 BSP 中串口的 GPIO 速率调低 + +## 联系人信息 + +维护人: + +- [GW] 邮箱: \ No newline at end of file diff --git a/bsp/stm32/stm32l476-st-nucleo/SConscript b/bsp/stm32/stm32l476-st-nucleo/SConscript new file mode 100644 index 0000000000..fe0ae941ae --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/SConscript @@ -0,0 +1,14 @@ +# for module compiling +import os +Import('RTT_ROOT') + +cwd = str(Dir('#')) +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/stm32l476-st-nucleo/SConstruct b/bsp/stm32/stm32l476-st-nucleo/SConstruct new file mode 100644 index 0000000000..e1989a9d81 --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/SConstruct @@ -0,0 +1,58 @@ +import os +import sys +import rtconfig + +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') +else: + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + +sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] +try: + from building import * +except: + print('Cannot found RT-Thread root directory, please check RTT_ROOT') + print(RTT_ROOT) + exit(-1) + +TARGET = 'rt-thread.' + rtconfig.TARGET_EXT + +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM == 'iar': + env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = env["LINKCOM"] + ' --map rt-thread.map') + +Export('RTT_ROOT') +Export('rtconfig') + +SDK_ROOT = os.path.abspath('./') + +if os.path.exists(SDK_ROOT + '/libraries'): + libraries_path_prefix = SDK_ROOT + '/libraries' +else: + libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries' + +SDK_LIB = libraries_path_prefix +Export('SDK_LIB') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +stm32_library = '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/stm32l476-st-nucleo/applications/SConscript b/bsp/stm32/stm32l476-st-nucleo/applications/SConscript new file mode 100644 index 0000000000..4939638d41 --- /dev/null +++ b/bsp/stm32/stm32l476-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/stm32l476-st-nucleo/applications/main.c b/bsp/stm32/stm32l476-st-nucleo/applications/main.c new file mode 100644 index 0000000000..e92ed8da71 --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/applications/main.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift change to new framework + */ + +#include +#include +#include +#include "drv_gpio.h" +/* defined the LED0 pin: PA5 */ +#define LED0_PIN GET_PIN(A, 5) + +int main(void) +{ + int count = 1; + /* set LED0 pin mode to output */ + rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); + + while (count++) + { + rt_pin_write(LED0_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED0_PIN, PIN_LOW); + rt_thread_mdelay(500); + } + + return RT_EOK; +} diff --git a/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/.mxproject new file mode 100644 index 0000000000..e2ec14592f --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/.mxproject @@ -0,0 +1,13 @@ +[PreviousGenFiles] +HeaderPath=E:/GitHub/rt-thread/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Inc +HeaderFiles=stm32l4xx_it.h;stm32l4xx_hal_conf.h;main.h; +SourcePath=E:/GitHub/rt-thread/bsp/stm32/stm32l476-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/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/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/CMSIS/Device/ST/STM32L4xx/Include/stm32l476xx.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/arm_common_tables.h;Drivers/CMSIS/Include/arm_const_structs.h;Drivers/CMSIS/Include/arm_math.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armcc_V6.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_cmFunc.h;Drivers/CMSIS/Include/core_cmInstr.h;Drivers/CMSIS/Include/core_cmSimd.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h; + +[PreviousUsedKeilFiles] +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;../\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;../\Src/system_stm32l4xx.c;../Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;null; +HeaderPath=..\Drivers\STM32L4xx_HAL_Driver\Inc;..\Drivers\STM32L4xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32L4xx\Include;..\Drivers\CMSIS\Include;..\Inc; + diff --git a/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc b/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc new file mode 100644 index 0000000000..9ea3507785 --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc @@ -0,0 +1,139 @@ +#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=STM32L476R(C-E-G)Tx +Mcu.Package=LQFP64 +Mcu.Pin0=PC14-OSC32_IN (PC14) +Mcu.Pin1=PC15-OSC32_OUT (PC15) +Mcu.Pin2=PA2 +Mcu.Pin3=PA3 +Mcu.Pin4=PA13 (JTMS-SWDIO) +Mcu.Pin5=PA14 (JTCK-SWCLK) +Mcu.Pin6=VP_SYS_VS_Systick +Mcu.PinsNb=7 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32L476RGTx +MxCube.Version=5.0.1 +MxDb.Version=DB.5.0.1 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false +PA13\ (JTMS-SWDIO).Mode=Serial_Wire +PA13\ (JTMS-SWDIO).Signal=SYS_JTMS-SWDIO +PA14\ (JTCK-SWCLK).Mode=Serial_Wire +PA14\ (JTCK-SWCLK).Signal=SYS_JTCK-SWCLK +PA2.Mode=Asynchronous +PA2.Signal=USART2_TX +PA3.Mode=Asynchronous +PA3.Signal=USART2_RX +PC14-OSC32_IN\ (PC14).Mode=LSE-External-Oscillator +PC14-OSC32_IN\ (PC14).Signal=RCC_OSC32_IN +PC15-OSC32_OUT\ (PC15).Mode=LSE-External-Oscillator +PC15-OSC32_OUT\ (PC15).Signal=RCC_OSC32_OUT +PCC.Checker=true +PCC.Line=STM32L4x6 +PCC.MCU=STM32L476R(C-E-G)Tx +PCC.PartNumber=STM32L476RGTx +PCC.Seq0=0 +PCC.Series=STM32L4 +PCC.Temperature=25 +PCC.Vdd=null +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=STM32L476RGTx +ProjectManager.FirmwarePackage=STM32Cube FW_L4 V1.13.0 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=0 +ProjectManager.MainLocation=Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=CubeMX_Config.ioc +ProjectManager.ProjectName=CubeMX_Config +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=MDK-ARM V5 +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART2_UART_Init-USART2-false-HAL-true +RCC.ADCFreq_Value=64000000 +RCC.AHBFreq_Value=80000000 +RCC.APB1Freq_Value=80000000 +RCC.APB1TimFreq_Value=80000000 +RCC.APB2Freq_Value=80000000 +RCC.APB2TimFreq_Value=80000000 +RCC.CortexFreq_Value=80000000 +RCC.DFSDMFreq_Value=80000000 +RCC.FCLKCortexFreq_Value=80000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=80000000 +RCC.HSE_VALUE=8000000 +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,CortexFreq_Value,DFSDMFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,MSI_VALUE,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PLLSAI2PoutputFreq_Value,PLLSAI2RoutputFreq_Value,PLLSourceVirtual,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMCFreq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value,VCOSAI2OutputFreq_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.MSI_VALUE=4000000 +RCC.PLLN=10 +RCC.PLLPoutputFreq_Value=22857142.85714286 +RCC.PLLQoutputFreq_Value=80000000 +RCC.PLLRCLKFreq_Value=80000000 +RCC.PLLSAI1PoutputFreq_Value=18285714.285714287 +RCC.PLLSAI1QoutputFreq_Value=64000000 +RCC.PLLSAI1RoutputFreq_Value=64000000 +RCC.PLLSAI2PoutputFreq_Value=18285714.285714287 +RCC.PLLSAI2RoutputFreq_Value=64000000 +RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSI +RCC.PWRFreq_Value=80000000 +RCC.RNGFreq_Value=64000000 +RCC.SAI1Freq_Value=18285714.285714287 +RCC.SAI2Freq_Value=18285714.285714287 +RCC.SDMMCFreq_Value=64000000 +RCC.SWPMI1Freq_Value=80000000 +RCC.SYSCLKFreq_VALUE=80000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.UART4Freq_Value=80000000 +RCC.UART5Freq_Value=80000000 +RCC.USART1Freq_Value=80000000 +RCC.USART2Freq_Value=80000000 +RCC.USART3Freq_Value=80000000 +RCC.USBFreq_Value=64000000 +RCC.VCOInputFreq_Value=16000000 +RCC.VCOOutputFreq_Value=160000000 +RCC.VCOSAI1OutputFreq_Value=128000000 +RCC.VCOSAI2OutputFreq_Value=128000000 +USART2.IPParameters=VirtualMode-Asynchronous +USART2.VirtualMode-Asynchronous=VM_ASYNC +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +board=custom diff --git a/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Inc/main.h new file mode 100644 index 0000000000..ed53d3f84d --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Inc/main.h @@ -0,0 +1,91 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "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 -----------------------------------------------------------*/ +/* 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/stm32l476-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h b/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h new file mode 100644 index 0000000000..a5c1343621 --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h @@ -0,0 +1,434 @@ +/** + ****************************************************************************** + * @file stm32l4xx_hal_conf.h + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2019 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __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_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_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_GPIO_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)2097000U) /*!< 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)2097000U) /*!< 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 0U +#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_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_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 */ + +/* 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((char *)__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/stm32l476-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_it.h b/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_it.h new file mode 100644 index 0000000000..29156563cb --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Inc/stm32l4xx_it.h @@ -0,0 +1,84 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32l4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __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/stm32l476-st-nucleo/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Src/main.c new file mode 100644 index 0000000000..94f87b781a --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Src/main.c @@ -0,0 +1,269 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +UART_HandleTypeDef huart2; + +/* USER CODE BEGIN PV */ +/* Private variables ---------------------------------------------------------*/ + +/* 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 */ +/* Private function prototypes -----------------------------------------------*/ + +/* 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}; + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 1; + RCC_OscInitStruct.PLL.PLLN = 10; + 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(); + } + /**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(); + } + /**Configure the main internal regulator output voltage + */ + if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != 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 Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + while(1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(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/stm32l476-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c b/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c new file mode 100644 index 0000000000..ec57291c5c --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c @@ -0,0 +1,172 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : stm32l4xx_hal_msp.c + * Description : This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/** +* @brief UART MSP Initialization +* This function configures the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspInit(UART_HandleTypeDef* huart) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspInit 0 */ + + /* USER CODE END USART2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART2_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_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, GPIO_PIN_2|GPIO_PIN_3); + + /* USER CODE BEGIN USART2_MspDeInit 1 */ + + /* USER CODE END USART2_MspDeInit 1 */ + } + +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_it.c b/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_it.c new file mode 100644 index 0000000000..ab5c0b7d8e --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Src/stm32l4xx_it.c @@ -0,0 +1,217 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32l4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "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/stm32l476-st-nucleo/board/CubeMX_Config/Src/system_stm32l4xx.c b/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Src/system_stm32l4xx.c new file mode 100644 index 0000000000..c76fe45ee1 --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/board/CubeMX_Config/Src/system_stm32l4xx.c @@ -0,0 +1,353 @@ +/** + ****************************************************************************** + * @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

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup 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/stm32l476-st-nucleo/board/Kconfig b/bsp/stm32/stm32l476-st-nucleo/board/Kconfig new file mode 100644 index 0000000000..169a25a22a --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/board/Kconfig @@ -0,0 +1,45 @@ +menu "Hardware Drivers Config" + +config SOC_STM32L476RG + bool + select SOC_SERIES_STM32L4 + 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 + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/stm32/stm32l476-st-nucleo/board/SConscript b/bsp/stm32/stm32l476-st-nucleo/board/SConscript new file mode 100644 index 0000000000..80eef222ac --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/board/SConscript @@ -0,0 +1,37 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +CubeMX_Config/Src/stm32l4xx_hal_msp.c +''') + +if GetDepend(['BSP_USING_QSPI_FLASH']): + src += Glob('ports/drv_qspi_flash.c') + +if GetDepend(['BSP_USING_SDCARD']): + src += Glob('ports/sdcard_port.c') + +path = [cwd] +path += [cwd + '/CubeMX_Config/Inc'] +path += [cwd + '/ports'] + +startup_path_prefix = SDK_LIB + +if rtconfig.CROSS_TOOL == 'gcc': + src += [startup_path_prefix + '/STM32L4xx_HAL/CMSIS/Device/ST/STM32L4xx/Source/Templates/gcc/startup_stm32l476xx.s'] +elif rtconfig.CROSS_TOOL == 'keil': + src += [startup_path_prefix + '/STM32L4xx_HAL/CMSIS/Device/ST/STM32L4xx/Source/Templates/arm/startup_stm32l476xx.s'] +elif rtconfig.CROSS_TOOL == 'iar': + src += [startup_path_prefix + '/STM32L4xx_HAL/CMSIS/Device/ST/STM32L4xx/Source/Templates/iar/startup_stm32l476xx.s'] + +CPPDEFINES = ['STM32L476xx'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') diff --git a/bsp/stm32/stm32l476-st-nucleo/board/board.c b/bsp/stm32/stm32l476-st-nucleo/board/board.c new file mode 100644 index 0000000000..2d17e81340 --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/board/board.c @@ -0,0 +1,64 @@ +/* + * File : board.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2009 RT-Thread Develop Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2009-01-05 Bernard first implementation + */ + +#include + +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = 1; + RCC_OscInitStruct.PLL.PLLN = 10; + 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(); + } + /**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(); + } + /**Configure the main internal regulator output voltage + */ + if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) + { + Error_Handler(); + } +} diff --git a/bsp/stm32/stm32l476-st-nucleo/board/board.h b/bsp/stm32/stm32l476-st-nucleo/board/board.h new file mode 100644 index 0000000000..f5e2db4e1b --- /dev/null +++ b/bsp/stm32/stm32l476-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 + * 2018-11-5 SummerGift change to new framework + */ + +#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 (1024 * 1024) +#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE)) + +#define STM32_SRAM1_SIZE (96) +#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/stm32l476-st-nucleo/board/linker_scripts/link.icf b/bsp/stm32/stm32l476-st-nucleo/board/linker_scripts/link.icf new file mode 100644 index 0000000000..e5f81e2318 --- /dev/null +++ b/bsp/stm32/stm32l476-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__ = 0x080FFFFF; +define symbol __ICFEDIT_region_RAM1_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM1_end__ = 0x20017FFF; +define symbol __ICFEDIT_region_RAM2_start__ = 0x10000000; +define symbol __ICFEDIT_region_RAM2_end__ = 0x10007FFF; + +/*-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/stm32l476-st-nucleo/board/linker_scripts/link.lds b/bsp/stm32/stm32l476-st-nucleo/board/linker_scripts/link.lds new file mode 100644 index 0000000000..7edc4c6855 --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/board/linker_scripts/link.lds @@ -0,0 +1,144 @@ +/* + * linker script for STM32L4XX with GNU ld + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08000000, LENGTH = 1024k /* 1024KB flash */ + RAM1 (rw) : ORIGIN = 0x20000000, LENGTH = 96k /* 96K sram */ + RAM2 (rw) : ORIGIN = 0x10000000, LENGTH = 32k /* 32K sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x200; + +SECTIONS +{ + .text : + { + . = ALIGN(4); + _stext = .; + KEEP(*(.isr_vector)) /* Startup code */ + + . = ALIGN(4); + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + + . = ALIGN(4); + _etext = .; + } > ROM = 0 + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > ROM + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >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/stm32l476-st-nucleo/board/linker_scripts/link.sct b/bsp/stm32/stm32l476-st-nucleo/board/linker_scripts/link.sct new file mode 100644 index 0000000000..4496573e93 --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/board/linker_scripts/link.sct @@ -0,0 +1,15 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00100000 { ; load region size_region + ER_IROM1 0x08000000 0x00100000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_IRAM2 0x10000000 0x00008000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/bsp/stm32/stm32l476-st-nucleo/figures/board.png b/bsp/stm32/stm32l476-st-nucleo/figures/board.png new file mode 100644 index 0000000000000000000000000000000000000000..d0e62ebd9c46deb261b1912e88d80ef7a3d92217 GIT binary patch literal 138645 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

= zEawWNsVB91ZJ)r4+2KiUwGkZBC}%*u3GLUlb$%20NvG(SEvVj1w=+iHxddP@zCCJ` zY#Ou3yi?$J@V%yx(y=#Jk;wBeWFr^@>E5}ug&96>r=@!L#=LFP7!i>2gM;iV#lyCE zVh38H9*neL2(5#XM;}VLre_X4#bxEX=Ct(2z>v@*OKTD_R%5pexg_M&N_TecTADtY zbE{s#r@+88gqA0wDC%mKqdg1ZzL9LQHunYYBW6I3cOYKm4_@5YrMHJHiQHaN*v5Ru z{{R}m(lp7SyR~R+64DEJ_PZ$=emER|TI>Vv#t&NBa^!o5PkxO6E>~+i&rx z;PAeg1o2&kW|9(07GiKu)Yi}A-kY9IJt{qchuRhiFO;#z} zM74JNNxo~cbN>J=LYDq~Rog8>^INsmbvt)&C5kP-x0W)0TG7yHb2dk`P1x;0{{Zz; zhQ|Q=*O#}AuH(48*K$pY!S*MtFra~0KTcb zJ62s-l~nG|(|E^T^y1hVCl%(}HleCL&Y7WINXFpL_SsH3>f*X~H zi-^ktczk~e$E{4Ma>+%psoh-K62?Jb;Hb$YRUIE&O;Xt00x~6$FsHJ%1!34E5nl@# zZNv>M4~31gvJUwao)5ILv9!F9s>I88I<|P)p^gPNO(eldwvMsxA&hR3!UA!Y;-0c0 z8-dD^oc69sqmNM6r;7N7wuag^wL*SYEuGEodQ&w)Ya9^S+RR0(>M^a>*5MNzk6?Js zB~3da^YuFDuC3<`VwGQM!P-H^FzQxH>lvK`H$k{_T+W~@H0!M?H1L9H?lv;V-aVwT zIP5Bhlcd`J0Kz$Uc<3JG(&_iNBo!@;eJYhW+U=9h?_;$(jf%_mb2@p)_%{sxRc9b) zj=a~OU06YD;S+lrkF^U_xH6x-SP*lX=(YV`TU$u&t*~#em_q;^iR#}$)}_;1L~3t# zIu8(u?{8hCSoGU4A~G@I);DH+)eqdF~oH@S#0KiI8vC-MWwI&wk$={j+DQRp=$t#hv$=AI4q=?aS{3n@ONWMZL< z#4*gv43^Tt=Bs&4AQ)^9VsL)7%0XePY9HHoLfxY+soPw}kN*HI5->RYYo|?H?Qaw@ zS-2z}?Bg3a{&b}X#1xw|w2u?RZ>8ypCT6_366`=mTWcQXw4(70S;^s`8FcHP`%5v$=u| zH(rK4>!;4*b@h%+Wc~zJW|!i<4*E1P&Zxw4t=hS#a9-H)Gz6i}@Nn-9+_vqnQUW^rPyUa{SG65FVw4 zLUrvOK_>bE{{RCY<6k&=+Jg?PX#u`H+Kyo6K8kM=Xo<Gtij68eS z&w?xV{`CUh`1WdC!OVN{@yCW^7&?@HfIs0>uKaW1Nurh+FSjI!%D^e)5rf*iL+p3w z_*$Mc+w=SlM>umn#;1#(&h9&T;M7gjw!_L?$F+=ovU`#At{JWuBp$WWzL|Q8S)(`= z&gxc-hs|HRo=2gk=gjWJor?2ZW+ol>)<)JHGI+_wTXXWCrBm}HQ2R;43^qL|9l=iS z1#9?n;v0QR31)yz8f26tjQ%3Ak|t0{92(j1?W^4CF+#t2fyEcLs7JBd{7AR9L`d|w z$Ch%0u_P1Tqm$xHrdcOVHr-xT3n9VF0qf0Vr-QFpbHz-)47<(=sdXFb3h2o3E~ozh z2^?@FkVOmIpWVD`$R3?~S1EC&&k)|Nla5HQLzls~5u-RcAXh&vu|_dC$7+`DH71BW zG2+h@X(e5GJk;y=|BSJ($q=qJ!Xz&FxRxxFG7QFyaa*pY8|7+7QIb83Xqzl)NQM|@ zOx%)Nh~X+FOUqcsqzKoRowD!xJ$--w%xgZc=d(QLocB4;b{6x>+@0oCy{;sSDo3BX z$AMP1BTos@hu-e$wVpTz!b}34|0vZ@<|N8$S5o>=0q&c1`&+NIH2F9*+=oPVXiU>6|w`Acf( z(vu6Md##NQ?*pq1zgdMYm0bMy3AL52X=T%?($%2(;bF1J4Zxq#LnTL?>|=8Jz`w+E}-GJvH1IW)$3jSy4>HUQ*Up) zc_r7Y{zX`^<-p&36gCpV>}cO~T)wNH9_ORdlk}kfy36v5Vp}rUBaBt2c3B4JQy2@D zCB9nXde}$7rY`&&dhVEnO`mJ1xzVIexZ~r?%#}GO0 z2P83HW|e9gwkJoq@H1F_goU3*A?lY(P0+kMv3m=98gB&kUOV7Yhv(WHyHI4#jtN12 zojMleac|lmYpkoPANKe2JNMRF2J(z++BZ$J%-~M>y1gePN(7Pa&2fR;{20?us){Xr zTPe|pEsR4zU_<0l_F(O8!~G3++04l+dxo2wYJv-YK!!3JH&$cQDizali)TyxbA9Kq z)_+fhNJ6*7&70vzq4H+_8WAmz)DRtyeP${}vUwEQUtV?_S{FSNOfOD_oC(ru$#~ja ztHI1Yc_Lx^X}s;Bh@ejXsSig&?VqS%Pp^7A|Mt3hdeZkqT7}|vf9U4qHk;Eud1s3` zX*L&pRIgWq9#U716#xCz3M#+nH_Vwfj70TAzH$H1Gj*mty+59E^V7_3Z6m9~b?;M$ zpQf8CvPH@6qi^%3_Y!8@5p6wsn~m7@*>tsrzBdZB(qw_m?gQHL)Gj4UA;n|5HsYy% z!nlRI;q}Gt5$3V9txK7Am8k=Q)^ujn|pjDr{Z^Q zErEl**VMtf?NeWdTP;4(HFA1kZ281;S@8L8)R$>VZ;dkomaQ{;QmVwpfHG*_q~I(% z@4|b$W_NC|`eSz4ux`}QqeF8tuV=%z%J1UdN^GJ_%))KaGk(3)N9~+fr?{ax&QWhwA0t9yCmy)qbC`yTp3miK6IVlN=N$ zYGiN6h7S#Wza%yO(rxs_(DJ_oghYq4(+^1H3bs!lInLhPOLD#PzF=1Dx|#gmyn?@b zs9p0X$*w!~H5k3?(sM4WMML2~pseIr2vGiBc!f|p6{DMX_Tn$JXxWc8x}m$S5Qe7y z+tH^wyvO(GYn{c16LAXrS$DlYod@&zR*X5#)_Mkdsj&f82taQ^G|}Z(Ytq0O_>y%`9@cG%4<{PF=?b-40riGRnOnZMzzf36P)&}O@H4@ zy<<;CdHG5cyGNDwr)5*Q?k>0f?5Pm@^nAZUCGjSUBsG$k`RUKkQo^Q4zj{js_~dYW z8_`j^Ylz3pk`!;+;Eh&YQL32g+KBtcPyQG(*wEQJ{P~#kpr)8fnDxU2cjcJ`T%|8> z`Xi>3(U&$WUTI&AY;`Lp&p6qCX1+ByK4-@VV-Wskk zV&L&j1)}pM#%ici6utUYn{ua5$?;5rA6+yxg4|wJ_CS3g&8-2@TK?elX(vYFpVxL9 zU*-5K9`|02l`X`GBUtKIevA*!e!ai*igoZeAB~%n7_J34P77xW*TQmQ;0>;Ja}4W{ zC=i7!Rm2wou{Kl-SBhHtlS%O|5f|@z<;L#rw)l%uqE|1Ss}@!aMk>3u!8LK|nh&kj z9{$7R1vb4qa6A(;Ci3^WV<|!BKiD#bqDPE394if8Tkv&rl{1squhj>LUi~;89)9bb zdSPnFk;j*-OL@&7j1POC-}%q5^Ut6jiM&nEs(V4UpbQmfU~aKYN99xg0#J6nKevVw zat?!lO+tuQKe*6PCi6>9$Smf`luhwS z%3mbz9eaX7kPAusSLU!rm>tnl&Sg9L<>V+_V z47f!yW|(O!|1Ffc0Mi`UuyHkOTk(s0j+n-)cTpv^LWMa?xUKjH6gAZuKd9090~)(u zq^0?f_WTF$QF-qVb~7#?C#+7HzwP@In0Cpf8=DKLF0gHHolN@K92ys2=PLFC^8Gk5 zjCuCwm8YKSnpxnMwZx41E#{4l-=loex0j;RJI=?C-ETawq4K`$9y(M4{WT8D9v9{Z z2yLtbmo7}7b6guWQn$Rnjc_r$lt((hq|{x4&5yH1mmO8da~%fwMuJj_@3OH*quS`N zhX_JKK+*OGVSLTGk1xxEURE1zw^lWUOWS~t=1)I33`U)z?Pj4PXl}|6`sB+;|5LR+ zz`k!oKyNn)3E!C)zi+eRlRo{uMVF23@Z8YX?nChsGqsM|*%ZfLZnv`lzo7A+?&j{S z>A7fWoBNm8@0zcbZOK!IUuQKxEhBB%#rL5k^^mIU>>GRS>Lan=mo0U^$NpDPhM#9_ zRH$aDHtzECk1GBi)K+I5X&b#5dusys6s6MaX8O8i;nhHQ%|K^!qP|1rxa1lCUa07J zvkzz(Xue98P50E2**aI-V}yt`s+G~Zc}g_RE%SZEab5Bj2!a9_yOKy|d@u^>C+ zAkl>7G3AacJeEc{YhO}|GDI|k9@2v;5~WD}DJ->+?xYE(lY&k}Lu6)afgvnO7J6f!>FH`H67;uGc@?q?ni1~jPF&aVJCT08x{TNbXVj%V{9p`XUy_cL zuLLr5-;B(i$kWuGNbkD4dO|<>a;b^cL6veT$%22pY_HiV6q!;<2>M661sC1?|XZ zKYg|=JS4n8&;136ZkBp5MVzJ~XJpq&5l=`nU=rLsmN_=96r}d4gwf}J9c1)W>v8(x z!|U8!k9u97IFgzjlwXVA?_>96WB1fXW#Icm4@NN!$)Do4a?U$m=cKkuez{aU^q}#b zgP<>H$hCfaZ)>34$Q*%>a}p3GLGM&D1ZQ$PFyiO~0zm*x6Nh7ZVH!Db#SIwhbpAEa z4f64FMN<%wLv)Xk06JvUXvAt4kv1AlbAv3fcvA@<4Ib&9xjAIQg}1BYoepgU2xy4^*5D>#6rLFEi33zS?% ztvLWc26PBRm$II6GsiIzT=O+H%oi%rMGwFMIklArlNf8jV(_;Psm(ZO!yQegi<(mS zy1N-LR8Y<&uY0?=xrqZOx=79_(}$*AlVzzz6++XXtP2Gk@YJb+{0BBbY^e61moSez znoq^*m%XEjJ;AlV`l z6Y5HUk(e7Ijy_25OHpjc2S_cvF6@6gCr=E#H-PCWrpA(xCU;UpG0h6m7ClTk6OmnD z@dPT(m{`F)me?|fuf}OLLI?wLz?Z|Ip`0comP9bL#I{sZYa8_JYZO7<;}j+{Au&{j z5=JIZNb=%C4tE3^qdgegPl#OES2O%aPm$;;9!yx4%Ez~N&yD8i;O0B;@BWSS`cs-T>Xz#X1ib| zJYS9Fn@DL21(i*~eM~29rdx0n@X$O{?h0rl=}JRb_F;CNr%E?$6L|7MzzgiME4kq$CVDJAiCLbFIYT=Q`+EO zIsygFTDUU<;%$j|$eM|0{EgWxPSgJ8j_(6ZBE^tM0U7F0IF(m;m!^^hcerEZi@37t z5rGh*(Ui(70+Ka?dwiguIpd{J&_E>T8=h|(?;~zX5of^CqSi5_pE0hGj~SY016M$G zVnA)3AyW#6y+%ZU09eoqXcJ%&$RE+owdu>8ac2@rAtP1Q8TUI;Kx8OrQXbeNFr<5C zBz5E&Awq$wSzu&fhtzLjS-R9@!L+zZ3y;2oXD|wHQ5<0u%=?Df ziNwbI{?|XY9sjCBv8J=a4-42?`*FmY9ceV1dGdcM5-@pEC>clj>2S)D7)?b#n1~>n z8A?pKDMa78e-%A2LPRcXj<*bVWw#AuDI%CCb_w?^lSn}k1^z^l#lmDD>x(ulMZ9>1B~mlj3zS<5#a#P;3}C+AY<3F| z)cFz#Ki+XX3zYDESjr9_i-9*3XGFlV;S_H046YUh%~NG)7YPPA z)yo{i0>D}(-pYV^Jb4||v9$%p>_yJYMXqS=Q%}CrFAEQ6S6C9WTa*^mhxLy9XebgK zqb+=bgO}`!MLgDt^3@v1<0G{!m}F*hwYD3v;YnNu zw4K4@%5I|oei&G4(gMZ+u+Fn(E6`4mh*1zv?nD&vA@peBAN4`^zY*FhHHgT!EJcqA z%=va?gCNmEJPU?~K931lyjp3eGObFpF?vyi)-Tp}D=hKGEAIwxpRJ^3$s*;4E!zgN zdThITMt1+|%OZ(5^$rl_T$n^^G6OF9+fFb_`)L__1xf;%HWM+L!^8lE!sWa9_?`ip z7#>5!TiH)ofXyUmGzS|K!8(+RhEPDDvT6|`a+Wynifz6^ndp&=IdxPJr?kNxY{~%`C%}1 z=fN4!W=CzM1ssf`MZ#w*EkaNM32A(I*ybA$d8o&s6a&1$t+r`|h&X*U zlAD)tLno#kxe|i!^N_HM_V&0RR6Ucs%<|8v5vcIZDh((*rq{hy7um2Nc3gx=1sYw{ zM;FI2$q8O#RncH?tsGdxZ_)eF(3X%_TqWCCMbuq;7*N>PpVB-BUUS29@ob$-I#6KA z7~iY*6e0?dm+^X7=j;=pR&QmzYSTUXFfiihG@^oC#z^+7NT46l1_rAxI}Z9h$4Ja>=k`jOafR6&!tkq8<4 zU&CtWEs+8R&ptpkk$SBhmoK0hv<%TcYOPxh(e(L74w)(o*kPtP4ja|z@*-D?C1ru7 z(mHDAS%==j*~JYSf?1Y7t%Dgbd!HQ!IRcokc-1=kfIcd#te;$ENhy?C*q6NUo$~mP z58>|Yj}4)#y*3PctR&0-2h@6})2ibI z4LC;xPg;SeJJLN2?xbTB46?#pYEp#tabR@#AP9zmK3m{H#X-PC)5s|gJ}}iG)?CIX px|56ds<*o| + + 3 + + rt-thread + + ARM + + 1 + + C-SPY + 2 + + 28 + 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\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 28 + 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\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/bsp/stm32/stm32l476-st-nucleo/project.ewp b/bsp/stm32/stm32l476-st-nucleo/project.ewp new file mode 100644 index 0000000000..ec07d1e9da --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/project.ewp @@ -0,0 +1,2275 @@ + + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 29 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 29 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + cpu + + $PROJ_DIR$\..\..\..\libcpu\arm\common\backtrace.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\context_iar.S + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\components\drivers\src\completion.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\dataqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\misc\pin.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\serial\serial.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\waitqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\workqueue.c + + + + Drivers + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_common.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_gpio.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_usart.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\iar\startup_stm32l476xx.s + + + $PROJ_DIR$\board\CubeMX_Config\Src\stm32l4xx_hal_msp.c + + + + finsh + + $PROJ_DIR$\..\..\..\components\finsh\cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_file.c + + + $PROJ_DIR$\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\components\finsh\symbol.c + + + + 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 + + + + STM32_HAL + + $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_gpio.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_sram.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\CMSIS\Device\ST\STM32L4xx\Source\Templates\system_stm32l4xx.c + + + diff --git a/bsp/stm32/stm32l476-st-nucleo/project.eww b/bsp/stm32/stm32l476-st-nucleo/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/stm32/stm32l476-st-nucleo/project.uvoptx b/bsp/stm32/stm32l476-st-nucleo/project.uvoptx new file mode 100644 index 0000000000..2ea89dc602 --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/project.uvoptx @@ -0,0 +1,1008 @@ + + + + 1.0 + +

### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32L4xx_1024 -FL0100000 -FS08000000 -FP0($$Device:STM32L476RGTx$CMSIS\Flash\STM32L4xx_1024.FLM) + + + 0 + ST-LINKIII-KEIL_SWO + -U0672FF323532543457254826 -O206 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32L476RGTx$CMSIS\Flash\STM32L4xx_1024.FLM) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 0 + 0 + 2 + 10000000 + + + + + + Kernel + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + ..\..\..\src\cpu.c + cpu.c + 0 + 0 + + + 1 + 4 + 1 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 1 + 5 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 1 + 6 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 1 + 7 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 1 + 8 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 1 + 9 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 1 + 10 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 1 + 11 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 1 + 12 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler.c + scheduler.c + 0 + 0 + + + 1 + 13 + 1 + 0 + 0 + 0 + ..\..\..\src\signal.c + signal.c + 0 + 0 + + + 1 + 14 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 1 + 15 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Applications + 0 + 0 + 0 + 0 + + 2 + 16 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 3 + 17 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + board\CubeMX_Config\Src\stm32l4xx_hal_msp.c + stm32l4xx_hal_msp.c + 0 + 0 + + + 3 + 19 + 2 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\arm\startup_stm32l476xx.s + startup_stm32l476xx.s + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_common.c + drv_common.c + 0 + 0 + + + + + cpu + 0 + 0 + 0 + 0 + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\backtrace.c + backtrace.c + 0 + 0 + + + 4 + 24 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + 4 + 27 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 5 + 28 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 5 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + 5 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\completion.c + completion.c + 0 + 0 + + + 5 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\dataqueue.c + dataqueue.c + 0 + 0 + + + 5 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\pipe.c + pipe.c + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 5 + 34 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\waitqueue.c + waitqueue.c + 0 + 0 + + + 5 + 36 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\workqueue.c + workqueue.c + 0 + 0 + + + + + finsh + 0 + 0 + 0 + 0 + + 6 + 37 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 38 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\symbol.c + symbol.c + 0 + 0 + + + 6 + 39 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 6 + 40 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 41 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_cmd.c + msh_cmd.c + 0 + 0 + + + 6 + 42 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_file.c + msh_file.c + 0 + 0 + + + + + STM32_HAL + 0 + 0 + 0 + 0 + + 7 + 43 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\system_stm32l4xx.c + system_stm32l4xx.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c + stm32l4xx_hal.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_comp.c + stm32l4xx_hal_comp.c + 0 + 0 + + + 7 + 46 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c + stm32l4xx_hal_cortex.c + 0 + 0 + + + 7 + 47 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc.c + stm32l4xx_hal_crc.c + 0 + 0 + + + 7 + 48 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc_ex.c + stm32l4xx_hal_crc_ex.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp.c + stm32l4xx_hal_cryp.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp_ex.c + stm32l4xx_hal_cryp_ex.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c + stm32l4xx_hal_dma.c + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c + stm32l4xx_hal_dma_ex.c + 0 + 0 + + + 7 + 53 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_exti.c + stm32l4xx_hal_exti.c + 0 + 0 + + + 7 + 54 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c + stm32l4xx_hal_pwr.c + 0 + 0 + + + 7 + 55 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c + stm32l4xx_hal_pwr_ex.c + 0 + 0 + + + 7 + 56 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c + stm32l4xx_hal_rcc.c + 0 + 0 + + + 7 + 57 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c + stm32l4xx_hal_rcc_ex.c + 0 + 0 + + + 7 + 58 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rng.c + stm32l4xx_hal_rng.c + 0 + 0 + + + 7 + 59 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sram.c + stm32l4xx_hal_sram.c + 0 + 0 + + + 7 + 60 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c + stm32l4xx_hal_gpio.c + 0 + 0 + + + 7 + 61 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c + stm32l4xx_hal_uart.c + 0 + 0 + + + 7 + 62 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c + stm32l4xx_hal_uart_ex.c + 0 + 0 + + + 7 + 63 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart.c + stm32l4xx_hal_usart.c + 0 + 0 + + + 7 + 64 + 1 + 0 + 0 + 0 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart_ex.c + stm32l4xx_hal_usart_ex.c + 0 + 0 + + + + diff --git a/bsp/stm32/stm32l476-st-nucleo/project.uvprojx b/bsp/stm32/stm32l476-st-nucleo/project.uvprojx new file mode 100644 index 0000000000..f94b364727 --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/project.uvprojx @@ -0,0 +1,747 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32L476RGTx + STMicroelectronics + Keil.STM32L4xx_DFP.2.0.0 + http://www.keil.com/pack + IRAM(0x20000000,0x00018000) IRAM2(0x10000000,0x00008000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32L476RGTx$CMSIS\Flash\STM32L4xx_1024.FLM)) + 0 + $$Device:STM32L476RGTx$Drivers\CMSIS\Device\ST\STM32L4xx\Include\stm32l4xx.h + + + + + + + + + + $$Device:STM32L476RGTx$CMSIS\SVD\STM32L4x6.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 1 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x18000 + + + 1 + 0x8000000 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x18000 + + + 0 + 0x10000000 + 0x8000 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + USE_HAL_DRIVER, STM32L476xx + + .;..\..\..\include;.;applications;board;board\CubeMX_Config\Inc;board\ports;..\libraries\HAL_Drivers;..\libraries\HAL_Drivers\config;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m4;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\libraries\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 + + + --keep *.o(.rti_fn.*) --keep *.o(FSymTab) + + + + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + components.c + 1 + ..\..\..\src\components.c + + + cpu.c + 1 + ..\..\..\src\cpu.c + + + device.c + 1 + ..\..\..\src\device.c + + + idle.c + 1 + ..\..\..\src\idle.c + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + irq.c + 1 + ..\..\..\src\irq.c + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + mem.c + 1 + ..\..\..\src\mem.c + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + object.c + 1 + ..\..\..\src\object.c + + + scheduler.c + 1 + ..\..\..\src\scheduler.c + + + signal.c + 1 + ..\..\..\src\signal.c + + + thread.c + 1 + ..\..\..\src\thread.c + + + timer.c + 1 + ..\..\..\src\timer.c + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Drivers + + + board.c + 1 + board\board.c + + + stm32l4xx_hal_msp.c + 1 + board\CubeMX_Config\Src\stm32l4xx_hal_msp.c + + + startup_stm32l476xx.s + 2 + ..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\arm\startup_stm32l476xx.s + + + drv_gpio.c + 1 + ..\libraries\HAL_Drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\HAL_Drivers\drv_usart.c + + + drv_common.c + 1 + ..\libraries\HAL_Drivers\drv_common.c + + + + + cpu + + + backtrace.c + 1 + ..\..\..\libcpu\arm\common\backtrace.c + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m4\context_rvds.S + + + + + DeviceDrivers + + + pin.c + 1 + ..\..\..\components\drivers\misc\pin.c + + + serial.c + 1 + ..\..\..\components\drivers\serial\serial.c + + + completion.c + 1 + ..\..\..\components\drivers\src\completion.c + + + dataqueue.c + 1 + ..\..\..\components\drivers\src\dataqueue.c + + + pipe.c + 1 + ..\..\..\components\drivers\src\pipe.c + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\src\ringblk_buf.c + + + ringbuffer.c + 1 + ..\..\..\components\drivers\src\ringbuffer.c + + + waitqueue.c + 1 + ..\..\..\components\drivers\src\waitqueue.c + + + workqueue.c + 1 + ..\..\..\components\drivers\src\workqueue.c + + + + + finsh + + + shell.c + 1 + ..\..\..\components\finsh\shell.c + + + symbol.c + 1 + ..\..\..\components\finsh\symbol.c + + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + + + msh.c + 1 + ..\..\..\components\finsh\msh.c + + + msh_cmd.c + 1 + ..\..\..\components\finsh\msh_cmd.c + + + msh_file.c + 1 + ..\..\..\components\finsh\msh_file.c + + + + + STM32_HAL + + + system_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_sram.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sram.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 + + + + + + + + + + + + + +
diff --git a/bsp/stm32/stm32l476-st-nucleo/rtconfig.h b/bsp/stm32/stm32l476-st-nucleo/rtconfig.h new file mode 100644 index 0000000000..876b905ea2 --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/rtconfig.h @@ -0,0 +1,179 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* Automatically generated file; DO NOT EDIT. */ +/* RT-Thread Configuration */ + +/* RT-Thread Kernel */ + +#define RT_NAME_MAX 8 +#define RT_ALIGN_SIZE 4 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 1000 +#define RT_USING_OVERFLOW_CHECK +#define RT_USING_HOOK +#define RT_USING_IDLE_HOOK +#define RT_IDEL_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 +#define RT_DEBUG + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_HEAP + +/* Kernel Device Object */ + +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 256 +#define RT_CONSOLE_DEVICE_NAME "uart2" +#define RT_VER_NUM 0x40000 +#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 + +/* Using WiFi */ + + +/* Using USB */ + + +/* POSIX layer and C standard library */ + + +/* Network */ + +/* Socket abstraction layer */ + + +/* light weight TCP/IP stack */ + + +/* Modbus master and slave stack */ + + +/* AT commands */ + + +/* VBUS(Virtual Software BUS) */ + + +/* Utilities */ + + +/* ARM CMSIS */ + + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + + +/* Wiced WiFi */ + + +/* IoT Cloud */ + + +/* security packages */ + + +/* language packages */ + + +/* multimedia packages */ + + +/* tools packages */ + + +/* system packages */ + + +/* peripheral libraries and drivers */ + + +/* miscellaneous packages */ + + +/* sample package */ + +/* samples: kernel and components samples */ + + +/* example package: hello */ + +#define SOC_FAMILY_STM32 +#define SOC_SERIES_STM32L4 + +/* Hardware Drivers Config */ + +#define SOC_STM32L476RG + +/* 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/stm32l476-st-nucleo/rtconfig.py b/bsp/stm32/stm32l476-st-nucleo/rtconfig.py new file mode 100644 index 0000000000..d632114e2d --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/rtconfig.py @@ -0,0 +1,134 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m4' +CROSS_TOOL='gcc' + +# bsp lib config +BSP_LIBRARY_TYPE = None + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') + +# cross_tool provides the cross compiler +# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = r'C:\Users\XXYYZZ' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armcc' + EXEC_PATH = r'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iar' + EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' + +if PLATFORM == 'gcc': + # toolchains + PREFIX = 'arm-none-eabi-' + CC = PREFIX + 'gcc' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + CXX = PREFIX + 'g++' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + DEVICE = ' -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -std=c99 -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rt-thread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M4.fp ' + CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --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' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iar': + # toolchains + CC = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M4' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu Cortex-M4' + AFLAGS += ' --fpu VFPv4_sp' + AFLAGS += ' -S' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' diff --git a/bsp/stm32/stm32l476-st-nucleo/template.ewp b/bsp/stm32/stm32l476-st-nucleo/template.ewp new file mode 100644 index 0000000000..f390ad7bc1 --- /dev/null +++ b/bsp/stm32/stm32l476-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/stm32l476-st-nucleo/template.eww b/bsp/stm32/stm32l476-st-nucleo/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/stm32/stm32l476-st-nucleo/template.uvoptx b/bsp/stm32/stm32l476-st-nucleo/template.uvoptx new file mode 100644 index 0000000000..23f1113678 --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/template.uvoptx @@ -0,0 +1,192 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32L4xx_1024 -FL0100000 -FS08000000 -FP0($$Device:STM32L476RGTx$CMSIS\Flash\STM32L4xx_1024.FLM) + + + 0 + ST-LINKIII-KEIL_SWO + -U0672FF323532543457254826 -O206 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8004 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32L476RGTx$CMSIS\Flash\STM32L4xx_1024.FLM) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 0 + 0 + 2 + 10000000 + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
diff --git a/bsp/stm32/stm32l476-st-nucleo/template.uvprojx b/bsp/stm32/stm32l476-st-nucleo/template.uvprojx new file mode 100644 index 0000000000..6a5f3a9c8a --- /dev/null +++ b/bsp/stm32/stm32l476-st-nucleo/template.uvprojx @@ -0,0 +1,395 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32L476RGTx + STMicroelectronics + Keil.STM32L4xx_DFP.2.0.0 + http://www.keil.com/pack + IRAM(0x20000000,0x00018000) IRAM2(0x10000000,0x00008000) IROM(0x08000000,0x00100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32L476RGTx$CMSIS\Flash\STM32L4xx_1024.FLM)) + 0 + $$Device:STM32L476RGTx$Drivers\CMSIS\Device\ST\STM32L4xx\Include\stm32l4xx.h + + + + + + + + + + $$Device:STM32L476RGTx$CMSIS\SVD\STM32L4x6.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 1 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x18000 + + + 1 + 0x8000000 + 0x100000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x100000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x18000 + + + 0 + 0x10000000 + 0x8000 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Source Group 1 + + + + + + + + + + + +
From 1cb27129c6774e573d29cc8f1ac3e383d125e430 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Fri, 1 Feb 2019 09:43:31 +0800 Subject: [PATCH 2/5] Use bridge script for SConscript --- bsp/stm32/stm32l476-st-nucleo/SConscript | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bsp/stm32/stm32l476-st-nucleo/SConscript b/bsp/stm32/stm32l476-st-nucleo/SConscript index fe0ae941ae..c6932b3c6f 100644 --- a/bsp/stm32/stm32l476-st-nucleo/SConscript +++ b/bsp/stm32/stm32l476-st-nucleo/SConscript @@ -1,8 +1,8 @@ -# for module compiling +# RT-Thread scons bridge import os -Import('RTT_ROOT') +from building import * -cwd = str(Dir('#')) +cwd = GetCurrentDir() objs = [] list = os.listdir(cwd) From c422816ba4213f04b64b6687f20926ff71069037 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Fri, 1 Feb 2019 09:44:21 +0800 Subject: [PATCH 3/5] Remove Dir('#') --- bsp/stm32/stm32l476-st-nucleo/applications/SConscript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bsp/stm32/stm32l476-st-nucleo/applications/SConscript b/bsp/stm32/stm32l476-st-nucleo/applications/SConscript index 4939638d41..3ec48cc840 100644 --- a/bsp/stm32/stm32l476-st-nucleo/applications/SConscript +++ b/bsp/stm32/stm32l476-st-nucleo/applications/SConscript @@ -2,7 +2,7 @@ from building import * cwd = GetCurrentDir() src = Glob('*.c') -CPPPATH = [str(Dir('#')), cwd] +CPPPATH = [cwd] group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) From 08f75483de837af4a26e03eac2ffd788cbfc7cb2 Mon Sep 17 00:00:00 2001 From: Vincent-VG Date: Tue, 5 Feb 2019 09:57:38 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/stm32/stm32l476-st-nucleo/board/board.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bsp/stm32/stm32l476-st-nucleo/board/board.c b/bsp/stm32/stm32l476-st-nucleo/board/board.c index 2d17e81340..a4811b5853 100644 --- a/bsp/stm32/stm32l476-st-nucleo/board/board.c +++ b/bsp/stm32/stm32l476-st-nucleo/board/board.c @@ -9,7 +9,7 @@ * * Change Logs: * Date Author Notes - * 2009-01-05 Bernard first implementation + * 2019-02-05 gw first implementation */ #include From ef975032d2eff5a4a8c5a0e74ce2c2fb7194f3b3 Mon Sep 17 00:00:00 2001 From: Vincent-VG Date: Tue, 5 Feb 2019 10:16:46 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9board.c=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=A4=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/stm32/stm32l476-st-nucleo/board/board.c | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/bsp/stm32/stm32l476-st-nucleo/board/board.c b/bsp/stm32/stm32l476-st-nucleo/board/board.c index a4811b5853..2fc04b4e38 100644 --- a/bsp/stm32/stm32l476-st-nucleo/board/board.c +++ b/bsp/stm32/stm32l476-st-nucleo/board/board.c @@ -1,15 +1,11 @@ /* - * File : board.c - * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2009 RT-Thread Develop Team + * Copyright (c) 2006-2019, RT-Thread Development Team * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rt-thread.org/license/LICENSE + * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes - * 2019-02-05 gw first implementation + * 2019-02-05 gw first version */ #include