From bb8ea9bfb58926a36359ab58ba6191917bb5abcc Mon Sep 17 00:00:00 2001 From: sun_shine Date: Sun, 27 Jan 2019 14:01:12 +0800 Subject: [PATCH] [bsp][stm32] add stm32l053 bsp --- bsp/stm32/stm32l053-st-nucleo/.config | 340 ++ bsp/stm32/stm32l053-st-nucleo/.gitignore | 42 + bsp/stm32/stm32l053-st-nucleo/Kconfig | 21 + bsp/stm32/stm32l053-st-nucleo/README.md | 115 + bsp/stm32/stm32l053-st-nucleo/SConscript | 14 + bsp/stm32/stm32l053-st-nucleo/SConstruct | 58 + .../applications/SConscript | 11 + .../stm32l053-st-nucleo/applications/main.c | 33 + .../board/CubeMX_Config/.mxproject | 13 + .../board/CubeMX_Config/CubeMX_Config.ioc | 157 + .../board/CubeMX_Config/Inc/main.h | 88 + .../CubeMX_Config/Inc/stm32l0xx_hal_conf.h | 316 ++ .../board/CubeMX_Config/Inc/stm32l0xx_it.h | 63 + .../board/CubeMX_Config/Src/main.c | 283 ++ .../CubeMX_Config/Src/stm32l0xx_hal_msp.c | 141 + .../board/CubeMX_Config/Src/stm32l0xx_it.c | 145 + .../CubeMX_Config/Src/system_stm32l0xx.c | 285 ++ bsp/stm32/stm32l053-st-nucleo/board/Kconfig | 45 + .../stm32l053-st-nucleo/board/SConscript | 34 + bsp/stm32/stm32l053-st-nucleo/board/board.c | 69 + bsp/stm32/stm32l053-st-nucleo/board/board.h | 50 + .../board/linker_scripts/link.icf | 29 + .../board/linker_scripts/link.lds | 143 + .../board/linker_scripts/link.sct | 16 + .../stm32l053-st-nucleo/figures/board.jpg | Bin 0 -> 161179 bytes bsp/stm32/stm32l053-st-nucleo/project.ewd | 2834 +++++++++++++++++ bsp/stm32/stm32l053-st-nucleo/project.ewp | 2263 +++++++++++++ bsp/stm32/stm32l053-st-nucleo/project.eww | 10 + bsp/stm32/stm32l053-st-nucleo/project.uvoptx | 238 ++ bsp/stm32/stm32l053-st-nucleo/project.uvprojx | 820 +++++ bsp/stm32/stm32l053-st-nucleo/rtconfig.h | 179 ++ bsp/stm32/stm32l053-st-nucleo/rtconfig.py | 134 + bsp/stm32/stm32l053-st-nucleo/template.ewp | 2031 ++++++++++++ bsp/stm32/stm32l053-st-nucleo/template.eww | 10 + bsp/stm32/stm32l053-st-nucleo/template.uvoptx | 238 ++ .../stm32l053-st-nucleo/template.uvprojx | 386 +++ 36 files changed, 11654 insertions(+) create mode 100644 bsp/stm32/stm32l053-st-nucleo/.config create mode 100644 bsp/stm32/stm32l053-st-nucleo/.gitignore create mode 100644 bsp/stm32/stm32l053-st-nucleo/Kconfig create mode 100644 bsp/stm32/stm32l053-st-nucleo/README.md create mode 100644 bsp/stm32/stm32l053-st-nucleo/SConscript create mode 100644 bsp/stm32/stm32l053-st-nucleo/SConstruct create mode 100644 bsp/stm32/stm32l053-st-nucleo/applications/SConscript create mode 100644 bsp/stm32/stm32l053-st-nucleo/applications/main.c create mode 100644 bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/.mxproject create mode 100644 bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc create mode 100644 bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Inc/main.h create mode 100644 bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Inc/stm32l0xx_hal_conf.h create mode 100644 bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Inc/stm32l0xx_it.h create mode 100644 bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Src/main.c create mode 100644 bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Src/stm32l0xx_hal_msp.c create mode 100644 bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Src/stm32l0xx_it.c create mode 100644 bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Src/system_stm32l0xx.c create mode 100644 bsp/stm32/stm32l053-st-nucleo/board/Kconfig create mode 100644 bsp/stm32/stm32l053-st-nucleo/board/SConscript create mode 100644 bsp/stm32/stm32l053-st-nucleo/board/board.c create mode 100644 bsp/stm32/stm32l053-st-nucleo/board/board.h create mode 100644 bsp/stm32/stm32l053-st-nucleo/board/linker_scripts/link.icf create mode 100644 bsp/stm32/stm32l053-st-nucleo/board/linker_scripts/link.lds create mode 100644 bsp/stm32/stm32l053-st-nucleo/board/linker_scripts/link.sct create mode 100644 bsp/stm32/stm32l053-st-nucleo/figures/board.jpg create mode 100644 bsp/stm32/stm32l053-st-nucleo/project.ewd create mode 100644 bsp/stm32/stm32l053-st-nucleo/project.ewp create mode 100644 bsp/stm32/stm32l053-st-nucleo/project.eww create mode 100644 bsp/stm32/stm32l053-st-nucleo/project.uvoptx create mode 100644 bsp/stm32/stm32l053-st-nucleo/project.uvprojx create mode 100644 bsp/stm32/stm32l053-st-nucleo/rtconfig.h create mode 100644 bsp/stm32/stm32l053-st-nucleo/rtconfig.py create mode 100644 bsp/stm32/stm32l053-st-nucleo/template.ewp create mode 100644 bsp/stm32/stm32l053-st-nucleo/template.eww create mode 100644 bsp/stm32/stm32l053-st-nucleo/template.uvoptx create mode 100644 bsp/stm32/stm32l053-st-nucleo/template.uvprojx diff --git a/bsp/stm32/stm32l053-st-nucleo/.config b/bsp/stm32/stm32l053-st-nucleo/.config new file mode 100644 index 0000000000..40e3129afa --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/.config @@ -0,0 +1,340 @@ +# +# 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_M0=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=1024 +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 + +# +# 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 + +# +# system packages +# +# CONFIG_PKG_USING_GUIENGINE 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 + +# +# peripheral libraries and drivers +# +# CONFIG_PKG_USING_STM32F4_HAL is not set +# CONFIG_PKG_USING_STM32F4_DRIVERS is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_STM32_SDIO is not set + +# +# 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 + +# +# 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_STM32L0=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_STM32L053R8=y + +# +# Onboard Peripheral Drivers +# +CONFIG_BSP_USING_USB_TO_USART=y + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART2=y +# CONFIG_BSP_UART2_RX_USING_DMA is not set + +# +# Board extended module Drivers +# diff --git a/bsp/stm32/stm32l053-st-nucleo/.gitignore b/bsp/stm32/stm32l053-st-nucleo/.gitignore new file mode 100644 index 0000000000..7221bde019 --- /dev/null +++ b/bsp/stm32/stm32l053-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/stm32l053-st-nucleo/Kconfig b/bsp/stm32/stm32l053-st-nucleo/Kconfig new file mode 100644 index 0000000000..8c9d8002cf --- /dev/null +++ b/bsp/stm32/stm32l053-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/stm32l053-st-nucleo/README.md b/bsp/stm32/stm32l053-st-nucleo/README.md new file mode 100644 index 0000000000..8c34b6fb8f --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/README.md @@ -0,0 +1,115 @@ +# NUCLEO-L053R8 开发板的 BSP 说明 + +## 简介 + +本文档为ST官方 NUCLEO-L053R8 开发板的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。 + +## 开发板介绍 + +NUCLEO-L053R8 开发板是 ST 官方推出的一款基于 ARM Cortex-M0+ 内核的开发板,绿色的 Nucleo 标志显示了这款芯片是低功耗系列,板载 ST-LINK/V2-1 调试器/编程器,该开发板具有丰富的扩展接口,且与Arduino™ nano 接口兼容,可以方便验证 STM32L053R8 芯片的性能。 + +开发板外观如下图所示: + +![board](figures/board.jpg) + +该开发板常用 **板载资源** 如下: + +- MCU:STM32L053R8,主频 32MHz,64KB FLASH ,8KB RAM +- 常用外设 + - LED:3个,USB communication(LD1 双色),power LED(LD3 红色),user LED(LD2 黄色) + - 按键:1个,B1(兼具唤醒功能,PC13),B2(RESET) +- 常用接口:USB 支持 3 种不同接口:虚拟 COM 端口、大容量存储和调试端口;arduino 接口等 +- 调试接口:标准 SWD + +开发板更多详细信息请参考【STMicroelectronics】 [NUCLEO-L053R8](https://www.st.com/en/evaluation-tools/nucleo-l053r8.html)。 + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :----------------- | :----------: | :------------------------------------- | +| 板载 ST-LINK 转串口 | 支持 | | +| **片上外设** | **支持情况** | **备注** | +| GPIO | 支持 | PA0, PA1... PC15 ---> PIN: 0, 1...47 | +| UART | 支持 | UART2 | +| SPI | 暂不支持 | SPI1 即将支持 | +| I2C | 暂不支持 | 软件 I2C 即将支持 | +| RTC | 暂不支持 | 即将支持 | +| PWM | 暂不支持 | 即将支持 | +| USB Device | 暂不支持 | 即将支持 | +| IWG | 暂不支持 | 即将支持 | +| **扩展模块** | **支持情况** | **备注** | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + + +### 快速上手 + +本 BSP 为开发者提供 MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线连接开发板到 PC,打开电源开关。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 ST-LINK 仿真器下载程序,在通过 microUSB 连接开发板的基础上,点击下载按钮即可下载程序到开发板 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,观察开发板上 LED 的运行效果,红色 LD1 和 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 和 串口1 的功能,如果需使用 SD 卡、Flash 等更多高级功能,需要利用 ENV 工具对BSP 进行配置,步骤如下: + +1. 在 bsp 下打开 env 工具。 + +2. 输入`menuconfig`命令配置工程,配置好之后保存退出。 + +3. 输入`pkgs --update`命令更新软件包。 + +4. 输入`scons --target=mdk5/iar` 命令重新生成工程。 + +本章节更多详细的介绍请参考 [STM32 系列 BSP 外设驱动使用教程](../docs/STM32系列BSP外设驱动使用教程.md)。 + +## 注意事项 + +- 开机时如果不能打印 RT-Thread 版本信息,请将BSP中串口 GPIO 速率调低 +- 开机时如果不能打印 RT-Thread 版本信息,请重新选择 PC 端串口调试软件的串口号 + +## 联系人信息 + +维护人: + +- [sun_shine](https://github.com/sunshine0824), 邮箱: \ No newline at end of file diff --git a/bsp/stm32/stm32l053-st-nucleo/SConscript b/bsp/stm32/stm32l053-st-nucleo/SConscript new file mode 100644 index 0000000000..fe0ae941ae --- /dev/null +++ b/bsp/stm32/stm32l053-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/stm32l053-st-nucleo/SConstruct b/bsp/stm32/stm32l053-st-nucleo/SConstruct new file mode 100644 index 0000000000..1528fcf082 --- /dev/null +++ b/bsp/stm32/stm32l053-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 = 'STM32L0xx_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/stm32l053-st-nucleo/applications/SConscript b/bsp/stm32/stm32l053-st-nucleo/applications/SConscript new file mode 100644 index 0000000000..01eb940dfb --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/applications/SConscript @@ -0,0 +1,11 @@ +Import('RTT_ROOT') +Import('rtconfig') +from building import * + +cwd = os.path.join(str(Dir('#')), 'applications') +src = Glob('*.c') +CPPPATH = [cwd, str(Dir('#'))] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/stm32/stm32l053-st-nucleo/applications/main.c b/bsp/stm32/stm32l053-st-nucleo/applications/main.c new file mode 100644 index 0000000000..8541bd3b9f --- /dev/null +++ b/bsp/stm32/stm32l053-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 + +/* defined the LED 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/stm32l053-st-nucleo/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/.mxproject new file mode 100644 index 0000000000..1fe8f04f40 --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/.mxproject @@ -0,0 +1,13 @@ +[PreviousGenFiles] +HeaderPath=D:/rtt/rt-thread/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Inc +HeaderFiles=stm32l0xx_it.h;stm32l0xx_hal_conf.h;main.h; +SourcePath=D:/rtt/rt-thread/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Src +SourceFiles=stm32l0xx_it.c;stm32l0xx_hal_msp.c;main.c; + +[PreviousLibFiles] +LibFiles=Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_tim.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_tim_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_uart.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_uart_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_def.h;Drivers/STM32L0xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_i2c.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_i2c_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_rcc.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_rcc_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_flash_ramfunc.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_flash.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_flash_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_gpio.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_gpio_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_dma.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_dma_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_pwr.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_pwr_ex.h;Drivers/STM32L0xx_HAL_Driver/Inc/stm32l0xx_hal_cortex.h;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_tim.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_tim_ex.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_uart.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_uart_ex.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_i2c.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_i2c_ex.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_rcc.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_rcc_ex.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_flash_ramfunc.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_flash.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_flash_ex.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_gpio.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_dma.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_pwr.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_pwr_ex.c;Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_cortex.c;Drivers/CMSIS/Device/ST/STM32L0xx/Include/stm32l053xx.h;Drivers/CMSIS/Device/ST/STM32L0xx/Include/stm32l0xx.h;Drivers/CMSIS/Device/ST/STM32L0xx/Include/system_stm32l0xx.h;Drivers/CMSIS/Device/ST/STM32L0xx/Source/Templates/system_stm32l0xx.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\stm32l0xx_it.c;..\Src\stm32l0xx_hal_msp.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_tim.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_tim_ex.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_uart.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_uart_ex.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_i2c.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_i2c_ex.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_rcc.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_rcc_ex.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_flash_ramfunc.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_flash.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_flash_ex.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_gpio.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_dma.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_pwr.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_pwr_ex.c;../Drivers/STM32L0xx_HAL_Driver/Src/stm32l0xx_hal_cortex.c;../\Src/system_stm32l0xx.c;../Drivers/CMSIS/Device/ST/STM32L0xx/Source/Templates/system_stm32l0xx.c;null; +HeaderPath=..\Drivers\STM32L0xx_HAL_Driver\Inc;..\Drivers\STM32L0xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32L0xx\Include;..\Drivers\CMSIS\Include;..\Inc; + diff --git a/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc b/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc new file mode 100644 index 0000000000..73cbefbcd2 --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc @@ -0,0 +1,157 @@ +#MicroXplorer Configuration settings - do not modify +File.Version=6 +KeepUserPlacement=true +Mcu.Family=STM32L0 +Mcu.IP0=NVIC +Mcu.IP1=RCC +Mcu.IP2=SYS +Mcu.IP3=USART2 +Mcu.IPNb=4 +Mcu.Name=STM32L053R(6-8)Tx +Mcu.Package=LQFP64 +Mcu.Pin0=PC13 +Mcu.Pin1=PC14-OSC32_IN +Mcu.Pin10=VP_SYS_VS_Systick +Mcu.Pin2=PC15-OSC32_OUT +Mcu.Pin3=PH0-OSC_IN +Mcu.Pin4=PH1-OSC_OUT +Mcu.Pin5=PA2 +Mcu.Pin6=PA3 +Mcu.Pin7=PA5 +Mcu.Pin8=PA13 +Mcu.Pin9=PA14 +Mcu.PinsNb=11 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32L053R8Tx +MxCube.Version=4.27.0 +MxDb.Version=DB.4.0.270 +NVIC.HardFault_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.SVC_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.SysTick_IRQn=true\:0\:0\:true\:false\:true\:true +NVIC.USART2_IRQn=true\:0\:0\:false\:false\:true\:true +PA13.GPIOParameters=GPIO_Label +PA13.GPIO_Label=TMS +PA13.Locked=true +PA13.Mode=Serial_Wire +PA13.Signal=SYS_SWDIO +PA14.GPIOParameters=GPIO_Label +PA14.GPIO_Label=TCK +PA14.Locked=true +PA14.Mode=Serial_Wire +PA14.Signal=SYS_SWCLK +PA2.GPIOParameters=GPIO_Label +PA2.GPIO_Label=USART_TX +PA2.Locked=true +PA2.Mode=Asynchronous +PA2.Signal=USART2_TX +PA3.GPIOParameters=GPIO_Label +PA3.GPIO_Label=USART_RX +PA3.Locked=true +PA3.Mode=Asynchronous +PA3.Signal=USART2_RX +PA5.GPIOParameters=GPIO_Label +PA5.GPIO_Label=LD2 [Green Led] +PA5.Locked=true +PA5.Signal=GPIO_Output +PC13.GPIOParameters=GPIO_Label,GPIO_ModeDefaultEXTI +PC13.GPIO_Label=B1 [Blue PushButton] +PC13.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING +PC13.Locked=true +PC13.Signal=GPXTI13 +PC14-OSC32_IN.Locked=true +PC14-OSC32_IN.Mode=LSE-External-Oscillator +PC14-OSC32_IN.Signal=RCC_OSC32_IN +PC15-OSC32_OUT.Locked=true +PC15-OSC32_OUT.Mode=LSE-External-Oscillator +PC15-OSC32_OUT.Signal=RCC_OSC32_OUT +PCC.Checker=true +PCC.Line=STM32L0x3 +PCC.MCU=STM32L053R(6-8)Tx +PCC.PartNumber=STM32L053R8Tx +PCC.Seq0=0 +PCC.Series=STM32L0 +PCC.Temperature=25 +PCC.Vdd=null +PH0-OSC_IN.Locked=true +PH0-OSC_IN.Mode=HSE-External-Oscillator +PH0-OSC_IN.Signal=RCC_OSC_IN +PH1-OSC_OUT.Locked=true +PH1-OSC_OUT.Mode=HSE-External-Oscillator +PH1-OSC_OUT.Signal=RCC_OSC_OUT +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32L053R8Tx +ProjectManager.FirmwarePackage=STM32Cube FW_L0 V1.10.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.48CLKFreq_Value=32000000 +RCC.48RNGFreq_Value=32000000 +RCC.48USBFreq_Value=32000000 +RCC.AHBFreq_Value=32000000 +RCC.APB1Freq_Value=32000000 +RCC.APB1TimFreq_Value=32000000 +RCC.APB2Freq_Value=32000000 +RCC.APB2TimFreq_Value=32000000 +RCC.FCLKCortexFreq_Value=32000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=32000000 +RCC.HSE_VALUE=8000000 +RCC.HSI16_VALUE=16000000 +RCC.HSI48_VALUE=48000000 +RCC.HSI_VALUE=16000000 +RCC.I2C1Freq_Value=32000000 +RCC.IPParameters=48CLKFreq_Value,48RNGFreq_Value,48USBFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI16_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,LCDFreq_Value,LPTIMFreq_Value,LPUARTFreq_Value,LSI_VALUE,MCOPinFreq_Value,MSIClockRange,MSI_VALUE,PLLCLKFreq_Value,PLLMUL,PWRFreq_Value,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,TIMFreq_Value,TimerFreq_Value,USART1Freq_Value,USART2Freq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,WatchDogFreq_Value +RCC.LCDFreq_Value=37000 +RCC.LPTIMFreq_Value=32000000 +RCC.LPUARTFreq_Value=32000000 +RCC.LSI_VALUE=37000 +RCC.MCOPinFreq_Value=32000000 +RCC.MSIClockRange=RCC_MSIRANGE_6 +RCC.MSI_VALUE=4194000 +RCC.PLLCLKFreq_Value=32000000 +RCC.PLLMUL=RCC_PLLMUL_4 +RCC.PWRFreq_Value=32000000 +RCC.RTCFreq_Value=37000 +RCC.RTCHSEDivFreq_Value=4000000 +RCC.SYSCLKFreq_VALUE=32000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.TIMFreq_Value=32000000 +RCC.TimerFreq_Value=32000000 +RCC.USART1Freq_Value=32000000 +RCC.USART2Freq_Value=32000000 +RCC.VCOInputFreq_Value=16000000 +RCC.VCOOutputFreq_Value=64000000 +RCC.WatchDogFreq_Value=37000 +SH.GPXTI13.0=GPIO_EXTI13 +SH.GPXTI13.ConfNb=1 +USART2.IPParameters=VirtualMode-Asynchronous +USART2.VirtualMode-Asynchronous=VM_ASYNC +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +board=NUCLEO-L053R8 +boardIOC=true diff --git a/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Inc/main.h new file mode 100644 index 0000000000..54c1164c5d --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Inc/main.h @@ -0,0 +1,88 @@ +/** + ****************************************************************************** + * @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) 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 __MAIN_H__ +#define __MAIN_H__ + +/* Includes ------------------------------------------------------------------*/ + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private define ------------------------------------------------------------*/ + +#define B1_Pin GPIO_PIN_13 +#define B1_GPIO_Port GPIOC +#define USART_TX_Pin GPIO_PIN_2 +#define USART_TX_GPIO_Port GPIOA +#define USART_RX_Pin GPIO_PIN_3 +#define USART_RX_GPIO_Port GPIOA +#define LD2_Pin GPIO_PIN_5 +#define LD2_GPIO_Port GPIOA +#define TMS_Pin GPIO_PIN_13 +#define TMS_GPIO_Port GPIOA +#define TCK_Pin GPIO_PIN_14 +#define TCK_GPIO_Port GPIOA + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus + extern "C" { +#endif +void _Error_Handler(char *, int); + +#define Error_Handler() _Error_Handler(__FILE__, __LINE__) +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H__ */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Inc/stm32l0xx_hal_conf.h b/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Inc/stm32l0xx_hal_conf.h new file mode 100644 index 0000000000..c106418225 --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Inc/stm32l0xx_hal_conf.h @@ -0,0 +1,316 @@ +/** + ****************************************************************************** + * @file stm32l0xx_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 __STM32L0xx_HAL_CONF_H +#define __STM32L0xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "main.h" +/* 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_COMP_MODULE_ENABLED */ +/*#define HAL_CRC_MODULE_ENABLED */ +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_DAC_MODULE_ENABLED */ +/*#define HAL_FIREWALL_MODULE_ENABLED */ +/*#define HAL_I2S_MODULE_ENABLED */ +/*#define HAL_IWDG_MODULE_ENABLED */ +/*#define HAL_LCD_MODULE_ENABLED */ +/*#define HAL_LPTIM_MODULE_ENABLED */ +/*#define HAL_RNG_MODULE_ENABLED */ +/*#define HAL_RTC_MODULE_ENABLED */ +/*#define HAL_SPI_MODULE_ENABLED */ +/*#define HAL_TIM_MODULE_ENABLED */ +/*#define HAL_TSC_MODULE_ENABLED */ +#define HAL_UART_MODULE_ENABLED +/*#define HAL_USART_MODULE_ENABLED */ +/*#define HAL_IRDA_MODULE_ENABLED */ +/*#define HAL_SMARTCARD_MODULE_ENABLED */ +/*#define HAL_SMBUS_MODULE_ENABLED */ +/*#define HAL_WWDG_MODULE_ENABLED */ +/*#define HAL_PCD_MODULE_ENABLED */ +/*#define HAL_EXTI_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_I2C_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)4194000U) /*!< 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 for USB (HSI48) value. + */ +#if !defined (HSI48_VALUE) +#define HSI48_VALUE ((uint32_t)48000000U) /*!< Value of the Internal High Speed oscillator for USB in Hz. + The real value may vary depending on the variations + in voltage and temperature. */ +#endif /* HSI48_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)37000U) /*!< 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 /* LSE_STARTUP_TIMEOUT */ + +/* 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 PREREAD_ENABLE 1U +#define BUFFER_CACHE_DISABLE 0U + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32l0xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32l0xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32l0xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32l0xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32l0xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32l0xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED + #include "stm32l0xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32l0xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32l0xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32l0xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_FIREWALL_MODULE_ENABLED + #include "stm32l0xx_hal_firewall.h" +#endif /* HAL_FIREWALL_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32l0xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32l0xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32l0xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32l0xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LCD_MODULE_ENABLED + #include "stm32l0xx_hal_lcd.h" +#endif /* HAL_LCD_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED +#include "stm32l0xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32l0xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32l0xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32l0xx_hal_rtc.h" + +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32l0xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32l0xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_TSC_MODULE_ENABLED + #include "stm32l0xx_hal_tsc.h" +#endif /* HAL_TSC_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32l0xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32l0xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32l0xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32l0xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + #include "stm32l0xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32l0xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32l0xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L0xx_HAL_CONF_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Inc/stm32l0xx_it.h b/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Inc/stm32l0xx_it.h new file mode 100644 index 0000000000..2848729682 --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Inc/stm32l0xx_it.h @@ -0,0 +1,63 @@ +/** + ****************************************************************************** + * @file stm32l0xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * + * 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 __STM32L0xx_IT_H +#define __STM32L0xx_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l0xx_hal.h" +#include "main.h" +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ +/* Exported macro ------------------------------------------------------------*/ +/* Exported functions ------------------------------------------------------- */ + +void NMI_Handler(void); +void HardFault_Handler(void); +void SVC_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +void USART2_IRQHandler(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L0xx_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Src/main.c new file mode 100644 index 0000000000..a4a4e7e80c --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Src/main.c @@ -0,0 +1,283 @@ + +/** + ****************************************************************************** + * @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) 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. + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32l0xx_hal.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* 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 */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * + * @retval None + */ +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 */ + uint32_t hell0; +hell0 = HAL_RCC_GetPCLK1Freq(); +//printf("hell0:%d",hell0); + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + HAL_UART_Transmit(&huart2, "hello\r\n", strlen("hello\r\n"), 10); +HAL_Delay(1000); + /* 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; + RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_PeriphCLKInitTypeDef PeriphClkInit; + + /**Configure the main internal regulator output voltage + */ + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = 16; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4; + RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + /**Configure the Systick interrupt time + */ + HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); + + /**Configure the Systick + */ + HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); + + /* SysTick_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); +} + +/* USART2 init function */ +static void MX_USART2_UART_Init(void) +{ + + 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(__FILE__, __LINE__); + } + +} + +/** Configure pins as + * Analog + * Input + * Output + * EVENT_OUT + * EXTI +*/ +static void MX_GPIO_Init(void) +{ + + GPIO_InitTypeDef GPIO_InitStruct; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : B1_Pin */ + GPIO_InitStruct.Pin = B1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : LD2_Pin */ + GPIO_InitStruct.Pin = LD2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); + +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @param file: The file name as string. + * @param line: The line in file as a number. + * @retval None + */ +void _Error_Handler(char *file, int line) +{ + /* 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(uint8_t* file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Src/stm32l0xx_hal_msp.c b/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Src/stm32l0xx_hal_msp.c new file mode 100644 index 0000000000..8eb266519d --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Src/stm32l0xx_hal_msp.c @@ -0,0 +1,141 @@ +/** + ****************************************************************************** + * File Name : stm32l0xx_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) 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. + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "stm32l0xx_hal.h" +extern void _Error_Handler(char *, int); +/* 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*/ + /* SVC_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(SVC_IRQn, 0, 0); + /* PendSV_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(PendSV_IRQn, 0, 0); + /* SysTick_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +void HAL_UART_MspInit(UART_HandleTypeDef* huart) +{ + + GPIO_InitTypeDef GPIO_InitStruct; + if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspInit 0 */ + + /* USER CODE END USART2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART2_CLK_ENABLE(); + + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + GPIO_InitStruct.Pin = USART_TX_Pin|USART_RX_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF4_USART2; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USART2 interrupt Init */ + HAL_NVIC_SetPriority(USART2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(USART2_IRQn); + /* USER CODE BEGIN USART2_MspInit 1 */ + + /* USER CODE END USART2_MspInit 1 */ + } + +} + +void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) +{ + + if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspDeInit 0 */ + + /* USER CODE END USART2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART2_CLK_DISABLE(); + + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + HAL_GPIO_DeInit(GPIOA, USART_TX_Pin|USART_RX_Pin); + + /* USART2 interrupt DeInit */ + HAL_NVIC_DisableIRQ(USART2_IRQn); + /* 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/stm32l053-st-nucleo/board/CubeMX_Config/Src/stm32l0xx_it.c b/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Src/stm32l0xx_it.c new file mode 100644 index 0000000000..36686f68c9 --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Src/stm32l0xx_it.c @@ -0,0 +1,145 @@ +/** + ****************************************************************************** + * @file stm32l0xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * + * 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. + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "stm32l0xx_hal.h" +#include "stm32l0xx.h" +#include "stm32l0xx_it.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ +extern UART_HandleTypeDef huart2; + +/******************************************************************************/ +/* Cortex-M0+ 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 */ + } + /* USER CODE BEGIN HardFault_IRQn 1 */ + + /* USER CODE END HardFault_IRQn 1 */ +} + +/** +* @brief This function handles System service call via SWI instruction. +*/ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVC_IRQn 0 */ + + /* USER CODE END SVC_IRQn 0 */ + /* USER CODE BEGIN SVC_IRQn 1 */ + + /* USER CODE END SVC_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(); + HAL_SYSTICK_IRQHandler(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32L0xx 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_stm32l0xx.s). */ +/******************************************************************************/ + +/** +* @brief This function handles USART2 global interrupt / USART2 wake-up interrupt through EXTI line 26. +*/ +void USART2_IRQHandler(void) +{ + /* USER CODE BEGIN USART2_IRQn 0 */ + + /* USER CODE END USART2_IRQn 0 */ + HAL_UART_IRQHandler(&huart2); + /* USER CODE BEGIN USART2_IRQn 1 */ + + /* USER CODE END USART2_IRQn 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Src/system_stm32l0xx.c b/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Src/system_stm32l0xx.c new file mode 100644 index 0000000000..9ec790eb54 --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/board/CubeMX_Config/Src/system_stm32l0xx.c @@ -0,0 +1,285 @@ +/** + ****************************************************************************** + * @file system_stm32l0xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M0+ 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_stm32l0xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2016 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 stm32l0xx_system + * @{ + */ + +/** @addtogroup STM32L0xx_System_Private_Includes + * @{ + */ + +#include "stm32l0xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (MSI_VALUE) + #define MSI_VALUE ((uint32_t)2000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* MSI_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + + +/** + * @} + */ + +/** @addtogroup STM32L0xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L0xx_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 0x00U /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ +/** + * @} + */ + +/** @addtogroup STM32L0xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L0xx_System_Private_Variables + * @{ + */ + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = 2000000U; + 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 uint8_t PLLMulTable[9] = {3U, 4U, 6U, 8U, 12U, 16U, 24U, 32U, 48U}; + +/** + * @} + */ + +/** @addtogroup STM32L0xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L0xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system. + * @param None + * @retval None + */ +void SystemInit (void) +{ +/*!< Set MSION bit */ + RCC->CR |= (uint32_t)0x00000100U; + + /*!< Reset SW[1:0], HPRE[3:0], PPRE1[2:0], PPRE2[2:0], MCOSEL[2:0] and MCOPRE[2:0] bits */ + RCC->CFGR &= (uint32_t) 0x88FF400CU; + + /*!< Reset HSION, HSIDIVEN, HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFF6U; + + /*!< Reset HSI48ON bit */ + RCC->CRRCR &= (uint32_t)0xFFFFFFFEU; + + /*!< Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFFU; + + /*!< Reset PLLSRC, PLLMUL[3:0] and PLLDIV[1:0] bits */ + RCC->CFGR &= (uint32_t)0xFF02FFFFU; + + /*!< 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 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 as defined by the MSI range. + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32l0xx_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 stm32l0xx_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, pllmul = 0U, plldiv = 0U, pllsource = 0U, msirange = 0U; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00U: /* MSI used as system clock */ + msirange = (RCC->ICSCR & RCC_ICSCR_MSIRANGE) >> 13U; + SystemCoreClock = (32768U * (1U << (msirange + 1U))); + break; + case 0x04U: /* HSI used as system clock */ + SystemCoreClock = HSI_VALUE; + break; + case 0x08U: /* HSE used as system clock */ + SystemCoreClock = HSE_VALUE; + break; + case 0x0CU: /* PLL used as system clock */ + /* Get PLL clock source and multiplication factor ----------------------*/ + pllmul = RCC->CFGR & RCC_CFGR_PLLMUL; + plldiv = RCC->CFGR & RCC_CFGR_PLLDIV; + pllmul = PLLMulTable[(pllmul >> 18U)]; + plldiv = (plldiv >> 22U) + 1U; + + pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; + + if (pllsource == 0x00U) + { + /* HSI oscillator clock selected as PLL clock entry */ + SystemCoreClock = (((HSI_VALUE) * pllmul) / plldiv); + } + else + { + /* HSE selected as PLL clock entry */ + SystemCoreClock = (((HSE_VALUE) * pllmul) / plldiv); + } + break; + default: /* MSI used as system clock */ + msirange = (RCC->ICSCR & RCC_ICSCR_MSIRANGE) >> 13U; + SystemCoreClock = (32768U * (1U << (msirange + 1U))); + 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/stm32l053-st-nucleo/board/Kconfig b/bsp/stm32/stm32l053-st-nucleo/board/Kconfig new file mode 100644 index 0000000000..d737913f5e --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/board/Kconfig @@ -0,0 +1,45 @@ +menu "Hardware Drivers Config" + +config SOC_STM32L053R8 + bool + select SOC_SERIES_STM32L0 + default y + +menu "Onboard Peripheral Drivers" + + config BSP_USING_USB_TO_USART + bool "Enable USB TO USART (uart2)" + 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 y + + 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/stm32l053-st-nucleo/board/SConscript b/bsp/stm32/stm32l053-st-nucleo/board/SConscript new file mode 100644 index 0000000000..be166aa941 --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/board/SConscript @@ -0,0 +1,34 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +CubeMX_Config/Src/stm32l0xx_hal_msp.c +''') + +path = [cwd] +path += [cwd + '/CubeMX_Config/Inc'] + +startup_path_prefix = SDK_LIB + +if rtconfig.CROSS_TOOL == 'gcc': + src += [startup_path_prefix + '/STM32L0xx_HAL/CMSIS/Device/ST/STM32L0xx/Source/Templates/gcc/startup_stm32l053xx.s'] +elif rtconfig.CROSS_TOOL == 'keil': + src += [startup_path_prefix + '/STM32L0xx_HAL/CMSIS/Device/ST/STM32L0xx/Source/Templates/arm/startup_stm32l053xx.s'] +elif rtconfig.CROSS_TOOL == 'iar': + src += [startup_path_prefix + '/STM32L0xx_HAL/CMSIS/Device/ST/STM32L0xx/Source/Templates/iar/startup_stm32l053xx.s'] + +# STM32L052xx || STM32L053xx || STM32L062xx +# STM32L063xx || STM32L072xx || STM32L073xx +# STM32L082xx || STM32L083xx +# You can select chips from the list above +CPPDEFINES = ['STM32L053xx'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') \ No newline at end of file diff --git a/bsp/stm32/stm32l053-st-nucleo/board/board.c b/bsp/stm32/stm32l053-st-nucleo/board/board.c new file mode 100644 index 0000000000..858d59660f --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/board/board.c @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift first version + */ + +#include "board.h" + +void SystemClock_Config(void) +{ + + RCC_OscInitTypeDef RCC_OscInitStruct; + RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_PeriphCLKInitTypeDef PeriphClkInit; + + /**Configure the main internal regulator output voltage + */ + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = 16; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4; + RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + _Error_Handler(__FILE__, __LINE__); + } + + /**Configure the Systick interrupt time + */ + HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); + + /**Configure the Systick + */ + HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); + + /* SysTick_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); +} diff --git a/bsp/stm32/stm32l053-st-nucleo/board/board.h b/bsp/stm32/stm32l053-st-nucleo/board/board.h new file mode 100644 index 0000000000..c34b2fc117 --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/board/board.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift first version + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include +#include "drv_common.h" +#include "drv_gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define STM32_FLASH_START_ADRESS ((uint32_t)0x08000000) +#define STM32_FLASH_SIZE (64 * 1024) +#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE)) + +/* Internal SRAM memory size[Kbytes] <8-64>, Default: 36 */ +#define STM32_SRAM_SIZE 8 +#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024) + +#ifdef __CC_ARM +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="CSTACK" +#define HEAP_BEGIN (__segment_end("CSTACK")) +#else +extern int __bss_end; +#define HEAP_BEGIN ((void *)&__bss_end) +#endif + +#define HEAP_END STM32_SRAM_END + +void SystemClock_Config(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __BOARD_H__ */ diff --git a/bsp/stm32/stm32l053-st-nucleo/board/linker_scripts/link.icf b/bsp/stm32/stm32l053-st-nucleo/board/linker_scripts/link.icf new file mode 100644 index 0000000000..eca6799526 --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/board/linker_scripts/link.icf @@ -0,0 +1,29 @@ +/*###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__ = 0x0800FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x20001FFF; + +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x0400; +define symbol __ICFEDIT_size_heap__ = 0x0000; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, last block CSTACK}; \ No newline at end of file diff --git a/bsp/stm32/stm32l053-st-nucleo/board/linker_scripts/link.lds b/bsp/stm32/stm32l053-st-nucleo/board/linker_scripts/link.lds new file mode 100644 index 0000000000..e31508b29c --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/board/linker_scripts/link.lds @@ -0,0 +1,143 @@ +/* + * linker script for STM32L4XX with GNU ld + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08000000, LENGTH = 64k /* 64KB flash */ + RAM (rw) : ORIGIN = 0x20000000, LENGTH = 8k /* 8KB sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x200; + +SECTIONS +{ + .text : + { + . = ALIGN(4); + _stext = .; + KEEP(*(.isr_vector)) /* Startup code */ + + . = ALIGN(4); + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + + . = ALIGN(4); + _etext = .; + } > ROM = 0 + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > ROM + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } > RAM + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } > RAM + + __bss_start = .; + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + + *(.bss.init) + } > RAM + __bss_end = .; + + _end = .; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} diff --git a/bsp/stm32/stm32l053-st-nucleo/board/linker_scripts/link.sct b/bsp/stm32/stm32l053-st-nucleo/board/linker_scripts/link.sct new file mode 100644 index 0000000000..f640b976bb --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/board/linker_scripts/link.sct @@ -0,0 +1,16 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00010000 { ; load region size_region + ER_IROM1 0x08000000 0x00010000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + .ANY (+XO) + } + RW_IRAM1 0x20000000 0x00002000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/bsp/stm32/stm32l053-st-nucleo/figures/board.jpg b/bsp/stm32/stm32l053-st-nucleo/figures/board.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f5322e602d4a8945c4856c2077570de872ed59ac GIT binary patch literal 161179 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�D zryFlxbT&3m$!X|hl~<35%M!U(q!bM9vy}6I!zQ$6-^$xDlw}F+(y7nYK1ZIxw%>Rb z!$T7CwSLV-8iKOIN<{2lq4N_b5B^@3mg3+xxhvWmz>xUtQFE*973AvgU%3V_a6VlX zpMy4Zrn5Z)@p1VX0WRi!HI)S4t(~Z}v-8*4ZZxXH>gTP9dNeON)V)%e7z3Y8+>8Tm zfw{LduD`n4b7H?MVZBe&z~LT#A=8*ZCr8??3|b6TBK6L=6;Sl!Le!2;WOMZN(Q6DB zg4m}@JUY22lv~g$r1V&snaP|nf_!f{M-kIGA^1_@!pXy45H5zsiwx#+yQ5p}&nq@H zKXf#E1cJrB|5+gBCsf3VU<^B~tv(z#c-eE9=Sdy7A%3yy<+r@J1lfz7#*XAfxuEqa zusw(+Do|oU(>o@t(0wq`h_k+xUK5WSNvY+qa3bAtfx2tekgAo3-`^{HAkBVEGOlkwlRUh~`S}tjtwJgDbr)uv zueOEudeUSCH3O(VYEop)zo`~r$^XUnPR^`64c6ar`wvAh_vS8dz75Ik4Ulf!g+J|e z-iV{Gtr`G?yPQ`Z7yF2>3+u#3h~G^?5u&vL+=@^>>e8dB7fu;(@5s2{|NN_X_Q-p^DqeeQt;-6O^*HQWFRbqJ&eaVl{+ z@Ys5H-yx9uR{Z86ukN>>e1fr_9L#f;EMpJ2 z3o$x`8WEaj1)yJblN)zt`?8F!mq4oye#tIALPOlJN^=-0*`Q@)P<~4Ok&GcDA z3q-;wVM#(-?;;+5J$ngp?X&!z*elbtpx<=r@x85T5S|QhG+xe!XVZB&>OD+U3wWNc z>Dq}H&E`(2gIclOtN6&t7J-UWClr=acoS^GSo9VIj9Ia22UpjJhA&?6)lJk$JT)!; zUADMa^>=%=rV9Vvv={gItp89Y*$iE@@A(U`aLN=2JR3fxI%*Rz9$#56X}7P3+k5O$ zhmYWhM*DBs@$fY-q|D7=4bm7=%dd`~hE>}7-Wn_fvE(HijI>Hf0Y%0)=X`mOn2x(E6BPW|XE05Fn+*opz&%@BvoQ;a#DiC~^IuCii*KNaod_2{lEU z6|W%TO7Yll!QJ(l zWR(`_G)j@>A>65}57r?xMp9Ba>3-V3T$*4}qpM9MX+y9@Dc%T{q9Q`qTcHitjZNokP6Lx(vJ{8$?Mb@4b%^$u(cs2~b zKZ7paJN7QsB?d<+%j)O7*SmF}qdl-pqxq$$E;})0*g4aw^Wl7L=#_()K;wtEUT!M1 z>$E|(x2z}Z!8UhYy6Zqa-Oz^E;x54JzsoyUq__MVB%pJb<=K6t06YIZ*&ps9Il1kt5!1!1fUI`4Rd8aj+M zk!^JxyWIcLyCk#IE3RJs@_=g(|yt6d$3w7^;xFckX{&~uPtjLre?LNv8g(t0;XDOk^L5| z74)TLMgFOVEn4GD5$tXX9IPXaj(&qnY7hs#Js{JKg+5FqlZ?ksGvWpNu_78;3wTB@ zNW-aEGVUdnBq2<;5{%0KnnOc|PFsb=7>ahM^Sch>FLFnxaG_M@`wykzHfr{4ssib! zT7Td*bD9JJf^JnHX3zr{$L~W_5OGo2q-b0Q;vKYTVaY9LO-;6Y{w8K*V;NG-;bmad z8xVeoRy28)NuNgOP4^;cT)Lzv9vCjo9#vJ+%!?s2FV!>Tx|nRJ2XbSUqE40ja7@p4 zk}&x)RYWUUL!DU#n+fTkh6CE_$)}4>Cu58XT3c&L1f6`G#zYy7QWN7{c5YR-^x3T^ zH>tevhG!s(;}XNkcZT%~45-@K{bt(8^_)*xX=#f4Tu$vK-!;4p99xZY&)vF;35HOU zs>`(*xWqK4_faf7JJDI_V+@$J<9wtNLqLH2z2>@ELnDUk?quMoqm8(Fl7$!jMC*!{=SfKT zvn3tQe3*(Syo_v&IhPB4S^YtndaPBhB&jwmI$8_nqI)I|;sfpb#0lr`Xv{jFDwWZy5PZPZr{ju=!$6;5_}=5s;%tXJ&bT?FHvLg7 zphr&SU44Ym`!6^H>ZDvPfqn-)29CbRCK1>tvdY$;;Y#@c+w>ZSzqV1ipKCfhmtB_5nj0mUX{?3a* zPP&@;p-C9q&w{9Z)t%KB<{}a20(ssJK2?t0>(7-pFI+2h}G_#27s9b7= zl0W)N08XCY5I#0|_1bTX0z9t64*GWLeTt{7ZiYuU=FVa>yTON*p-wB1amj}AigqtEdAU_mx_)(osEivYS{jQ{$>7Mi|K|ou5?KsNd=veTX~E}iaAkS59K$R zMt+h;i30!`*o)NzXl%9aq09jPB_9RiS%u_f^)-5DQEFgDLW~b4O|p&TaRTZ76eEfw6ioV>e4H3kM4YoVX(x(VHteYS%N! z3hbktgXgvC?C7t*x2EQ{w=-@|;x>+__dE(R@jtc-qZ;*}`%WoFyIOQ{BO~-N>GV*o z{c}GLNg>7W;P<{8@Iid`OIxTh$FYB^TsF1jJ4_)ezp}vmEkTE(hFBe_te-`+syj26P^lc5;KtXy!H|^XrTc>-`}$HK+8OdGC32 zM}~*i?yH?oY>!LheD@BGQk8)5#~qd7UqM1(!4_*B!LFlxvxDLgPY%A3i8m;9&e$)) zrpRbsQ^`#XS|Fo8KE!Idx!tpcH|hTg()*8Ij4p+?&d>gh9GUo+YtK%1b2HsKd?)KV z(8=|`qDou%fj4p^sz2T!jBAn4!lN&frj2?cWG0e}^UjEv+Kn+yIgS@&jP?$hq`6or zX-r9tX|*IgC45yBS5{|v{H}uBY7?CyqVQvpA|5)-cg1lj6l6)6+Cq+sGS0rD@a<%$ zb%(`Ef>(1mFNp2F_>WLCMHEnXgWo?6{6ooNdK7Mz^u3ndTg!;68hI4GYYLrs`UdA> z>F5OXcBa>hJeIldl?xhUFv*22cjCpdi;FV~e4AZRGZA;^2X+hTlmv_I$KI$QS6r*S zm5dCE*7A8o!I-RK8l(6YI$BW-ntHM+1yq9tQ?Z2xMou^TY8S|<1XfZpw+VNjYH~<& zd~O5zX{kN*8Sfe)A@Vn-N2&1kEO0ZNMtursKnidH83$(*5?(5)DVK>WHnN+UT9s)| z)k>;Q_Y*HaEw7WLL_n2fJZ2!pRLj>3l(8o|zg`@60IvIfqTLS2_uDd zK!^(>E1)HB!n^@?ZU|a{`^na}W~s4>lX4nq^P}sJ5tCaJK@(&hFkdLd5)I@U?sXdL z2mf7#*?5<>`+T%R`C9Q=T`UDlYxl8(rMuhjAaeI3xjLuV(SG1Y39$du@D(aAYHNu) z3X?*BNJc%#iqhn_ctnTHd@nLKL+KPoL+GV8K|Siv&O7quWW7pCue}rBOIr<>-W}kC zNugtHI)o{fN^;L^i=P(M8dj;uYHn>?Y=Of|D~SLyy2BuU@p4_i#Fqx5mNO?&L$6 zbRpdh32U>E)kzZB`&|DK6B#`HR5#u;U;m2QsV(M;;!XZ}Z=`y6kz$25E6gWSKy7`Z z{tBOK&=fwM=;HJ)x=)9|b1hBB>LOEdz=b{UbK{zKLsw+AGOn91ll@tfv#AZq?_JH+ z(WQ(Z@2F4~cC;^|MoNNPuvVc4prGPMJ>sU;E7--lwqOsu$EI9CEkh9EB-* z?fGj72lewj19)~h<$J@x1qBAIrG*JKt;CUs)b_oJ(tvD#27Ot~k_<%+ibw$@G*Eu{ z6#HY}B1oO#caf~D#R(XF2R(X%P`ya|Pj8nAS+Kqkz3^kavwS4Kd|$j`N^Y8H#co!0w!=U?c%p3SpyoBUeCSe|sP0 z4@JbKY*K{+7uqM&ZLY6rl+@*ft-88diDOohXl5?yGn)kiL?OvktN3vv16h4G0@4~d`!A~?((g-iUlHcU>08IuD;Y1i`FX;w^%=bN zj28~2Sx^c5`$%wJkG^|KJyDIpOD{KzqTxyh$@Gd!L%jA^`?jIRS2Mde^MBm^$}m#; ztSc{^#RWhy3epL2r77%0-7@d=%zWNVU;&25c1?F5`w%vamnD;8Ig?#uHZ~Hs4&!v0 zgJ#=u`fszbU)%7h5yFJ^$ZhvU&=w6lI}nMjN6@p&$utOFF-7?#KH8Y;+qhKr{E%2} zh6%bRuMGgMT+EMis-+bwh4d+NH{A-0JlxFZS8)}Jw)=GheMzHPuN&v)v{c@1i1DR3 zYmR9E`Sp9_a*C%vt$OC_{XN`W3ucvJj9|o*)NDa%WT{q?F-=_9O;(J^uuIOLesJ+< z;ZoXZRcoSiPUj}u?IJ2ooQ$Q0+8hq`Fc?tINSIOECJfDc zAoD)!%66k&$Dt{hH16-O;;a^QY;BYgWl*)kg2opVa`D&f4n=J(Yn=4f==7Da6ecnI zJTA`4x>o4hVcQ3&>#i@dDdlNW3T6ovSQ@nPayxsBbNi6UHkLb;@j<(#8Q|-?LM6+Z zq^Ovz93f-LLyBTEYhpmB^0;(!jy#p!gT(-@ix3NipS?^y`eWUHc?5=8Or{bdN0U)^P(S#-1?n(*fs?y{* z>cFhjRY$s(Few*$gRs(hvKQ3B#KWW43l)`HsVOKgNvs$9ktYWx(@@qTewVc*@|Cy* zomq-L>BrY%(&d+8f`QlcBp%J$JpNTDie`JUzlq6=sxG-4)N7>m>^+C1w*}O|HT;aB zJ}h}?37H{$&hxzNf$K``?-?L;eAhI`1&}A%QdSjG&YhVn5#w_R{5k2~NdT zEJtLBieBsP5l;sYpX~wZ9*U|-$B4@LF}v~))Hi2 ze->oI|NZTaU_)qkP|MlY`^8f%COMdzOSG)-DIs3Fx7$D3#!E&&n`8D-5HxF%R~5 z`jY53nkou)Z-D!1ZwBu#!~wFTA3C(uaqzEwJ$(M5p!I%-UOwJ8p&IZvRxPggbqIPH zpHni8h(EO*Nr?VK@$&NA=!2aZEl>~NziFi%)Aka}?sy^pr{0E5_ScxUR6^DF9lBZq z%^1%-m-aHd%v$tcOhH8g5zyD^*pxV{%`D%A)G5Bbd|g@Mr}2@wV_BeTP|I7{V)!Cs zSlPE2*}=iOAi?-rz&FOVj6zwDsYK7ChbX386Tfzf1$5v{mmKLR6qSfOKo(2Uf=Bh{b@Rk$`3eUvdA8!^& zZ}A75Qt~Di!{QqRy@t=KE^jgB`TPRI3q-3hIy+SaB&D|N{pwuK*J_=-|7_}7A(4;dX*8?}XC^-{=XZ%5#|-xeR7bY*5qtj?!HtfpOe3@vXSqDIec zQ0#1CR5H~bCsaiET9Z(0>^YQz1s!$0T`9BuwOre#>#0FA=&MXkzt{#`830mgA&wB?oygMqbQ>1)KycZr!y`6-B*#eY;~J)_EzxEcGLG zSl}$~v%}^>aq?vM6mIO)UaPbmTM0g4NmSPFX>oM_j&XU*3$rjoDn&dYOC2iA&(-Ea zOLJ8>J1EY41$6QKm357A-%kphQRv&D>@szKm|(rqGc~i<|_ll|gzg77z zLOD-sT0(~ax`gp=t!|x#RAK#?SUiEM<|gk*SUo6wP9}g2`xeOM2{i=Ai1Z?c<*98IO}%KH^Y&k$wf0Y~ zr&Q2t#l~-)+LO&Ap!2{JsmHLWV279zm^BV?_A@+H9tbVA-Wkpbk|i+eF$2pWgO)?U zD`e-xZ_wPOjS|F*5mrz-Z1#JeSogcCKpaDGR0trhG%hYIEQ#dB`_kg#uXM2=8w;OOSploSbV;vJy@q(aef@F=9v&ckl z(FuQsd`z7)#%Lm|b!-LPrzBL<1=6AXq==#|nu?_00$t@_0Ev|Cy)po{E#lXz7uy3d zpz()jrd%Ys2Q_WTke&Az|E8ZH8{3WT*QJumhQBB&-bi2FyLa@N?+wqg0~f~hxRT^} z6+Cb&<*aCV&hwXJ4gY38vWsWCXO~Un9S6blkk>hxS}YBDr`(>2wYoMlM$0u6<>aAnOp}AX6nPT4W$Y-?pr1iU!7P@>SKN|EzxcbFrw;5a^q#bNT=-t^NKtyPcKm5H+{Xza+rExMeWHLcxo zWlWr6Yi;+DWaNCe=C8x5MxuFZp0nzDb{)rL`o_M9!NL9hl4wO@b%b0xSO|BbS@3~Docx4kJ8DB70d z?hY;PUL-*9;8I+JyOb6!4#AV;7chI1LjB` z*^!&yiYOLv68zG@f&bZD<$*8b54rx9w}PwUhTsVLkBq5ePvV#HXm~Xs69eTYl4f}R zTNi6z4VhmD4pcd3Q6c^uwwFwRxg~X!zbxFnDfNLJs$lpIxg|4~;`E=T}8u zsGF?*)3HUO)aNg2>vCQ7D7~?=m*<>l)#RhQDCIHm1OAJg=h4K3RtbM!;!X0a_p7HGHEQd7p{A%y$ zppFb-tOe{~3_(`DL~6dh}c6-O7DM4gENPI@QuOWI-DQ@_(k$x-^@*RiNW@;Pqf~)G^hWn8ff6+A&}2`}E8B z8wo8@?wf80Us42kRtkjLf^=7Y?zIqeWLb`$@PG8#i^;02LoGpVn|tz<0D@)PN$OYS0z9y=GDVEb?uIeyMv`@T#aak*13AZYKJ z!->nu8UIMAtxaDFtB^}6tIURReM@eCH+e%bN9J}_#VTt}uC6JufUhX&1Wf>H^6-JafMF?WJRKq#1 zO&G`PvxR+m_ORl1nUq?Hb6K`f@$r$GX|+dHNAf_hq~T-uZ{ix!PYytFgmG$HV2`s; z=IBPp%GLEPzQ*-B>@hTYv|ICSS|+xp_JcS(7k_yorT4|oL+U#y4!3QXb9${Y?Y@S^ znh2ri9=H!L@N6-04{3ZuJx@}lcZ2~99vzma;u>K@zTI-<5d5U2wQGG7aB&E8q28ba zyP4IriD1$4^hfmDU98~elRB^;Z=-guG#WL5EVS|*mCht-7X9K`cJSz{2I(P@dVrU` zhZ}Vy&CDk`6ylK{iZ4CmB$^mI+bj-$7xL^$8TO%Y8(%`YW_4+npsa5%R`W;2bjvLQpS!tL)mw;9arVp6-FeY_E2$yu5U3ygKHf` zm{xWlFlc1=aA4BS1TdkQDYTS8rqrP3u=DLHMVmz8g(>9^BZJZm7r2z#3Gz#T<2|n9 zdy5(oeLN93|5Z8-F#fv^DhzUa){;KD=8U%?iYUj*Z374d zU<^}raAXJ|JA37sztiw^ls{X%F&oaDzz-YOm$k+}WQu>$??}W~68SoY)}Vwep%b}T zGpAnDnxdo?kygkoMA9N;oIWQ?WLT*UiW+q zN5aaJ*l6t?z-GUtMc%}2^!N~v*zz~c>x2^J=fgNvj-L~Wbe(@I>T;oqlSVR)^EBgl zQ;_wyg`th;ID-2nzB`Rv;Xe_512X_W_?(z+kGr?ddlnHX^Jynmt{*Be0%Yqx$@U%7 zM-nJ35d3KsnIdfB$;qs8e3JFiU6{4!bU^7(uLGx#iY_h_5`Jt=u%@@Ie)`5?nZfjSgr29(aHO%O|ROO3~~f6=6l)reD<73j?yF&eJvD_i?fm4 zmWEt<#g_A3HeT2&%qRvMpc-zxB*zJK(n}r)3&dhxMp`#FoaG!&ZVBJ^&F?yIpMET_ zd7`Or{V3sO^XnFvU|`k>e=<&WG&tjo|2W+D7353WLsZ}s8JNZH=(9`f#dP}hzUf?l ziPYq=nosrDt)l?bG+hL(Q9|dywvroB0DkQG_ZV-PJOc~e_Af5x_w8LD9KJtj+}0uP>7Z~)#Qk;?1Keh^x84G^ zYv>1MnegRxb_I8Y)U|F8>72*LuCcx$QNBTmUIjv>;wV_5UdX^0?jLN|m7CmglI5Q~ z8&m!Y)$U=EuPvgKE|`f%079u2p#zmEBOHwCsffG}HG8s@+ z(+~n;9PnG_DLj=u#;A95Dr2z|ys!xn$mu_hVF)UblfH>6q`8pT4mA%}-lW<3CV|n$ zenUuBC!t1>b?UOeHC%oXPL{QvTSb7#k{UNMUmy==6$qdP0X299)SC@gRd!!#Vx^NI z-FiB8Z5vF2w1v{9={;T%&H;+PXUHj~DQS_X$GpIM8TsYtd1v6*5=3&IIFCg2ghjr# z(3_)DzW0l#G$+P@K^5R61e&p8c-*0$xE0O8jR>sds9zw-;%SW-(yi*1Q~cCxBVYn) zdQqb)i^^F*63noX3Yv6hL7_owHGTnG8F+8V@z%^DAR_~a8~_QUk-)Epc(LcV@n`D@ zZXVla0FjXbkvlPoA_f{~hG*Nh5XsZ45*pHkorkV&&Yv2S<2UsuPG&V7BIOwFXM}Tw zD>`{SEkT)1t}q;j%Vomxm8+S5Xy}v8EeVA3+zH&oMwOS%X$Y(O$>%mNZ+-@c46lj> zE@i%aCp5M0D5<;Byfc_H%b@`YeU?#A`a?Y=@x(|dO9?+G8=H!FJx zx>0WnluLYB)6Q@hwx*ozuQbAd!87)p9UbooEP1pDUH6#@jxptqvH?`&YeGSMYLHSJI(<>3>>H?WwVW+)@fWt<~sVd`Yl*-ww@bTlmw0z z=fmr2;YxOZP6bcNt0PUd_zmP`0+tNsm&BjiJft+i^8wG_EEo$f9K_k%P#rA|wm%8e zgiC__Q-8~V#s4UA*`0z*mfF~b7e|rH>rLV1j4Btm9X=I_fB|jU>vYd`Sk*~cRK5_T z*bm}}&RZ^g6KjxR@5qweRA7O^PWqguKcW1AKRrI@|5X+o^vC>vH?jYp7ycpsFPkKW zPQPFOoK6?*Y5=I27(^WswxaTDiH(M_Tb8F&Ta{*=^&EUH3|9zL!Sf>0%|}{^3PV}0 z!+}|ZB+k}JlBT`DAb1Mxnmya;A&$5Ls(ZB5A+Ry`{~cnr>JhtpO(lm7vxgOLDaNB> z*TO3&>`e2+^x(gn>kW&j*@k++w!ou6#lEcSts1tjy!XPJ%fdI$n>GlTq;Kb)^0 zclw3okNyOPD`syFRWaw*Q#0mSP%v7a}ch)lS| zS-h9<1xuf#>L)GXwnf90tUC8RZ8Q@6qLWocP2Wy29@|YYt1T%kLdbtEUhfmvEsk{I z{B(_0kV#XkTS(~J+T4;cSI&op0!lxQZZA2A*SeGj|1e{sA?E3 zZN7}*k0l{hO{tyP85&T2~O#=>j3hYY~dy$ z=X(Nj*3Qh0Ffs-`c$#Tb9(^)QG#{gU!>|~4P6bwq>ctuTA)sEsaIm<$NhbZ$ZTeHE zGeh<<*!1R{fs%&ST3DY?J_s<69RzN7TICCX#QWIksw8j@0j*+|t8LzFGmgZc*LKtU*$Y?JW>Fy* zS&%>Q(KxG#Td{0OoF2IKKH=uE=u!SPV?3{3Ojg2$m*H6*T-D>({-NLeCDXr5r=@*i z_ccUjMT*Afblul38atx~x!_H*a_kbKck9Gmg-}j_j`TkZG(4H4ky3QliTVDP8c?ex zh$X+F=(}dzGQhW?a^zr$ga3gH=eAkzGc5mOdr=vlXLf|AByM>i4MTnDodHRiKZ;tI zWZWMdagx8iYEnSc2KPNbjio*9U(nv=H{=8#DC@L8z%~6{B_(eGR6KBa_x?IGZosl( ze$R{Z=jV}OAt^IG5}ie9x3$lc_lo7e+swUa5#I0{$SkN?CW0w;gY>0hz#?+cYMiD< zBMB$PQkMw%>3lxG!`6)u>4y`PK02~!wCkZ>{gL&v{M?MwLbXvi1#T2wN)Pkj6DuCq z`!!{ToG41zLwta6&ys8lf*zOK`tw4?yD+iW**fG|`9t%ghP4Qt=4Q`QI&ft(0)egS3mj((Ufe7)21 z{){Z(yPt1_N9~E84YnT&WW@pww?-`0Mc3>!Sub}T*y7yu_wp|KI&d12YIZ7X%Sr-X zQD(CkF#)r=OQNQ|8r(>yl)!vql%4V^)#ViA_0OUb0?lI!4eBriZWrfnR0}~F&6EBH z43VOC=@e4LXYH$WZ#jQR^3(F|NKD0Pcd8dt}}FGyaF5m8!MxwXjd&Hh#>E8E4v zj<_7F4#xdXAz#VR*MOm)tfE)pohDQ10EO4vMJc6ff#{uo7BMF)%8EjZ*hW28#pheU zbttz69t6AgcKa%sP+y*#euLOJd@wC1QjN{Y`T9Ar;BCx(yj{aHPwU0nC=QZzV-XPg zTCZ<>(^}sTHGTZ=vnLP*y0|aQVg5$ z`Sy&+6h7XB><<#)Xv;&-Y_oaJTJd^F-2*F>Ky`u4)2Ibk+xA-)M|+zWW#WL)vu8UA zz_kU+1b<9o;zPUB(0#t#^}B~21y|nLJ}p=Mfmz!oD$g{4W^!0K2feDOQ{xLs!E2J& zqg1y>5q;ucOh2)H>CQRB@5WGhK9qIu9}Ei-hv)3)y>>;c0D62E4P;t8+tzy@OkPV8 z;~sq(o0(LjulT$Kw%@KS3#6pXW*-O5KlabD^xqhu+g+a2~y z02xeXwrT|2XbwZN9;<4+Jc|9?hkc5bLodOK^1>X(HhNK8$l)5rdx4@(w<jKVSaq#{)`_EvNASX}t$-6tntcvl*ckd>93nM}qPNN`Emi-Nb)1 zH=~Hs7bHlz54Aiby~(Y);`Gj#FWJnSUI?OMBJfef`h7<5xrGbbkgUI8V_&*vQb!UE zji%F#FC5#gsD)4t8A9?i%6*eRQ|kyN!&=}OH^+-Z1k!?yoV?|FX6o_@>I0myUz=VP z+9YG^Whlmqu>>B0m}iI_Fo9@Lwiz_Q<;kff;@$+je={|(M%R0hUeJHU-by-|?_%@O ztc6sK>g}(?UjmEPm7aolis7S_IIep6iOBG$<^O z7o(D~g#_(_h6R1&&}8k_@>59>6PNaY0jG-C9TBSG!q`xiH@%~vXy+K%Q+NFjjn3ha zoh$j}ncHu|w5Y=%xNgr{au3 zmMsC3OZ7_s$t!qy*#iAZ+>P*Q14yG`@J5ptyW01wPdYJ4=SdTP*5CP-n;IH3x;tA; z7WK3`Y58&@+EfZn?RTAwRivg_bF7ZUbaKam0nVmA(1RhFTkRncxQH1R)m^yvpxxt! ze{i0;z_ZKW+wtBZikB93hn!WH2UH2UVA%yE9sDL=gdxR{{gBhyVJj?5fCY$U)wQzE zpl|C``%>c?u4(DLX=M$26Z|s-jzU}<-JH*^o5J=f+78%f72a57BDS!z>-pW#>b04YM;{l zgp9dtwB2zncG;schdc-gzee_(w3X0|Ac1C?L`_x$IyPYMlJ>c4&6=RYmF{*%Bnxan z$BK(sJ9A`&Q{?I*U6;z2GxfLi(d89wII}_3F=BXIX2d7yP74KO3KGZLG63&?G&$>< z|0cqFxJF~q3YC^fobKH@@nci96QP}{E!;rfGb9LFRuiJ0 zS7UAz&pI2IYLrO-na=)>08{Sw2oxidFFZ_HT{=wfjstZr8d#;D$K^zy@ls`QTG&52I-sp^4 z(BC`DaGjDZut)1#kg0Q3N#%%-;ZEI#cEWU1RAQLl-jOr*% z)vpO4CHeBkTIH%r{F?yNLI$}xw40Y}yd_;--#TIu46y);3_)C2EKvSaksc;7Ir=yM z{KT4V2ZksP>Q2}vLkK|Ht~53Ew-oO$_ir;_W2?mQe`#}-48s&z?6OL~#1{)MWY+%` zxq6_ec(>W>)SZSNvo6NW6=4 z*`g;Ft(cyKa>BaVyd6Jo=YtZ)YT6jmzWq`@T&;+CQ0H{sRdnaL@i+;23&%FR{sa1P z{bgGpYw*5emoORk*A(GlS8rAjz3OMN#=*muAwQ90JTeOybC(tX=#~{ zH~J%E2f~9`iqIp6Kjoa%uD(rTiGAcJZ`eRWtZy(a1m{YfsjYHAi`2Y@Wt#$L(22!| zTp#?f_}N?Ui}q8pan_%{^%d}Wq*&h=XNELFL6DXrl)JDyHR~{ z0vZ#`GK0NnIIJ@Kf=wV-UG&w@U1Zl~B$eahJ8fWKDWwQ9Y*_9BFo6EuG){k^-b91&% zjENZ)ep)&KFgWY4amzyE6}|xObF_J#ZXvcB!R^ZVYdwr)^CI9vGpn4TuHcj(1rQVh9%{tb>akahe z*~le&tDB8iIeWwFc{x2qOlzZ$yS3+}4pWY?Ff=lKogo=3K^d~A#l7j)3cjCrksS83 z3k^`jDrGIvj4iC^`lKR5ShVV-h;zs}4|KlH;2Zsme;IMMY9qw1bltNctoavZ62OecuL#-3#fPh$5vlw>uBrK zg2;u!H>CQ;nK*u92(u2J#1Txm)= zaeZ5?eu~xWJe#?%GX4F(Pu9VY58WSegFQ~xBNdmBm%$Rjc@uVxKG_}6Oz_fAa8rjb z4-ivdldSR595@;oMNlV1)z8Bjz>;DGtAubFZDrha^<)PS3U3PEP9RN_+2ZJpp6e)! zGLZEC+I?}2`O*QZU}mrKa!n2HhUsF@;M$+ZshX*u7#aJZ2Ku1{#IOqMGNse=nYOu3 zbUWpj7)vxS|1PZ>_)Lfwn=Gny^*X8Tx6a(syntrrpxrMc^)ewAYX8lxd)GKjIZ8#~ zo)@w7hF?N-Nb^O}>PkSOt=57g%|z7}J?BTP#P&^EToifce-Tsi_Q226TlG9#0`ZF9O+eCm9YY4i0 zBX^jX_pK9@+o|DARlh!vaJ97|<9c<+OGnNfWTca$R3oI*k4tU0 z%W5EEu=x9}Je{3|XE((Z z+PH%rOn7!FYMk|#y&nh+v~=Vb+Xc%w#TQ~V$`vh$(VsCbjW0&bH6NpzydUJ(?xR`0 zRzGp25A9|oVaF6pL}LRXgEp{}!T~h`GEH35oAK{%>xk5;Je7ET$UyH#H@Y+DXsSR5#m0C$q2f`Lpq5Y~liMg_G>S)eVXKX2@p4pL%?4UH^d@iif5ObWFBBW=Q?+C-ikB_ z#?IoE(05M0eNR1T)3{)b2hbF3P)$M9O3!Jq5*AO7_ZTTE

;jc-LZwQQ}`GowK5UEC!rZxpm$a@`oD3qGSk*iwqKF|y^Pmnp4En>pNbku<|aK{Hs6IJPVU7Qn`T{QM#G=AR~^|* z-sJiB?$Q_BKFwFIdasD{5$ZC@WsmLP$K?*|oCk;K&azM`=Z1BQIubx1R7u})O3Z7* zCmn-aAp(^ob1$E>b5@gcm??%U{KyCtaANHuBk0oE7Awk5mlGY?R-h%Wag?V6k)emv zU`tW_L&N!aTeMU_&)yj=uq?3@dJ66&;Wcr(Cfy&hwCd;m9n}mZ)bz3CfZR>CCcS@& z#p8H{I2O#_hmfyQeC``1QjLP$1sd#!jwm0@X1no7tl-V7I0ax{}6ymU8u#kgcqnK330tb&=d2xAwaUkrAWn@d7Fs*jaW^qR+ zh{K+S%$$F3+l)!K#+$oXz6!cV@VZI>m)PR`m!YJ4t53gO_N{yav``RgMxVpZS}jZC z9NqCGb0$tZy56~or|@;y6^Lk)MoQ&RY>9CD-_+g@P~25ug?vfb-TxQ!wYbpXv{$Je=WEXqLt zANQP;L&b`T9dH$!R2q%B$OPt!L>ZfV-mR`ugSajoU<;WdObADd6N5W#NjB)qg4_p$ z@te8(EO5UPILMy0@pbG&?5`R=WBvRP{VN$Ji6$|~X#QX(SvMSRSHbqD(}LZ}frI@b zAi&mXLW8x0N*l<-jq|43ed7C)9I+*RBYW0*g6fklwSU#3+Pl@yU=cjx3 z+1732nTSl`4N;v&k`#ZN`5SbOr>s}~BXfnFDBp*NdwNtVI_JzH@!o(TdPrElf@N7E^(Nn_tyH=A=N(3~z} zf}I`b)X`XaN0y=#if@$S?WEC~Dpz$9#{FSlzfj<5ncl@_=50C#`M%GDlr z_#W@}$~_Y1*Q4titnq8mp32FJg->Dma>&@_JNfwwKyn zos*bfjaO%%EAIrnO5bSP)9%h7p2n0f4l%xUA&cQ0Dsa>2-fJCn_6QK%IohV#j@G&? z;SoX)c|jAR_E)+t*v3~_-(`a~C#RD{TbRvlcFE48MQnw2P+L*KOrc}1*OJ{gL0E%( zQlRC+b7B5{Dz1^Bp3ao1ZqHe+(n^~l(!^DhU(m@mv)@*K!HM~cz-^j0eF|eyCGV$! zLv#te-0>`47Rb8RF#{P$rGmr?%{cr!RJ1sM&noD|yl+$M;9Zx`%B>T*Ux=%KhyJ)p zd^xHE+=mpAgpUZSxtLSb4u8Tiy>pne8@A=gOMvEQ%JG_DX+iFAKIZ9(%s zWmJjyF3j*Ad);WmP|{;_W&C*(~rXZ^qkAtkzfvh?C_?z}N zTbv^zZZ-z}R7F|lxo^|}Dn-T|Hfel5Vma!ecA}vLzmH^zX)x)=@pcGx_mrpU5<*y- zS&+z3zRpfof<3e3X)C8jWPn3Q33le$*9oyxSK;DVSa%#(+{znmer0as9N1pu=*?G3 z%Iog#TtSncTyWupkGH3k`paSoWvyP>`F&yHzlEe%Dp#9*Kqj;7zlkS-56ajow;kCW zuut*&+SQ(Ez(A1A{6NN>>7*PwlR$7-nC240}rg*OehgD%%X^Mh{7JrC>Lm+p zbMBkAUq&yW0{6P^x<(Ku{B#}`7iJRw%mU|uk!>hY=6Kux$=pl}dbu@IlTeY#Wdm|3zt6yLOU1@5rEB<)u3 z{*j9v53MUkW*MruwN1KmE|(M+$K#EIBpt-0e>%Ed`|00|Exe^Ckv1B=$I{$e>e!nL z5@A>h5kpYnz56wuy^`nE=-X{qoP`?O6$nTApW2z%iamS$**P+=#*w`KwcQH9e80XH zBelLT(pAIs`i98y9!uIRsOUXUkK{iz)DxB}v?dgMeI7$M6`BbN<~T8HU&{_jN?u?0 zqWw7xUVk)*eyN>}yt<204Q6ikW;i-Z=WiK=b{_}mlXDus$R=OFipQHaoedZxC6%bw z=Msu(*ZT_bVYVxWVR1Uha(hS3y%3Ki@XhO%nsTgJwQ6!;3BkETVN7!L?tEYt59~>I zao4o}(9X<@m+7edupUY`q!=PL=r-PFuY)0@;M&S%WO$44;u{Y5-vWwt(IU0z>J180 zQZfF|A4VQKhP9e2?J|ms+57W%l!;rZ>$=a#@L2yi(r1Y7FqCC%s5*HkXtXmuM^gXteD0a8B%k$WnF@NQ3`+*~hEgeuv*R`Ay-XDBmyF=|`)>p3^FkGq%t|s%^_#F==GP6(iLAsluUN&B7}HGVf;q zp_!U$xQ&eAps!-U{8Idx*_3O!P&ZoD)t28y-_7;AB+)EXgVW(9?mlcY`;hI7Z6&0q z>t@(>Ubkau|HhZ7)5~(d0>bI`(~#(Kq7nCtRsc7${LhVMiS8AXylU%)IHG ztnk1%+G_WBR>?gZz=z&U5cW(QW?T}f>K9iPw6fD4z2h+SO$+PlZa%t#FzeUs9`4kg z1+^=}hk!`wh_OaOb(%0!t}g;iPp5_FWd%O#;*zP<%O(u3>A zSd60`EK^D;L~zc8AImM)s|b)hq(7b+k@6LOS~zEoZ48?rO`9uLdfviQ5^$buN)}H& zth;K$L^9-rGQE#g6KfbdiyCexx8Q%yq;Y{iX_sNa@p^r*#JEOwvkQp=JQiLy&!sK` ztPA7{t{GAfk#*XlNGe~fyC2-5!?|N4Q@;;oMZOhw(n7Tcaw0BgNtjd_oJ@(zE=3Y3KXCEHDVndSSyTS zPG?8mh~rq#k3s8Z%!%w-y6;^gGXT`Vo>+4YdALT|u{AnN)s6h=%{sVY6h>JA_4Kb` z{v0ISLe$T6F*K^*y1Ir~WN?4XG$Al(y$!-+kq3`Zud2`2en z+(@igoH7+^$sx(Vt|oCoV61=?k_4<`Odyx6X5OX^xn*XXazb zS+*9b6AEu_aEdbL(N6kWhG|=LpBxINF)SaX*C}WlPvWD3cI_R`p?_GF8Z$}OQ-Ao% z=)0`dcsHE}r^Q7ctMCgVs~95uyQh-qa$%q%90*BD&IrSEvKP$Rd26E3ije^8=$EZG zI~BbcVW_Rn>FI}cRApV#14mVnfWK7U?B+XniPTDgE07VluRtf)AF7`W60W=e!U&O`iJI!vtME?(u*3v zsJaWdE;8OpQYRsw^LHi^qJli*aXvnn_x#wCG%Wo)&>^Lt^By4D;rCzepzCwe_Q^z~UiR@IN%fQ{BqkZ>kqs-yHVjxTbFlipZ!#UjBVL zI?zr+{mf&2%Z%769p%kis{=mdqNxy}g4c|zIKiM<(i&tq11XWHYStzkTc$`F^tzM7 zcQAx@6Suh~Ym9w`<%?tkkb#JP$?_m?-oCzV#e6H%8G;pK{7zrx^C09<`!Ov zic={p&A94~D-}W6?!|_`Wv#yKf;GsAHxa+~RpgJ662{UuDdy`33wboH0t*no46Hhv zMf*)}fP~92YjNM!yG~^x01z&4yRkN5a}(*R{5HE}YzGzpy4Kk}^oWUnr)|ZDp!3ox zUj9?bEzEVcJ@4OQ21E8*kRD~!@eH`wBvkil6lp`WnTiLQyII?7*^*R=44U{i6~G?O zY>9tI4bx_IgeeU*R4MDZ$_yLJ^EfDl%a4mi|xZ}Vo&yAnM-=6jhe#;7u+mi=e-N4(&f zQ{G;rnVvXTu&(W&5FZj@i~!-4Dc;fQfd!x$rv3qR&E49rZ+4q6CLymh15mthk%bU~ z()I^sOn02=jMA*fe@2W2Go$}N*C{37euh8x*GMnQ7A-N;*v!NX_Dz?=OuQ|2CI_9v zI82T*QhB;2qa(knMp|mdMJC}N8g-|BuSEi*r^AI8O7bP^*cxrJ3t{mEa`A$sTJ zA|LS@t2o$G!B!>X20QPJPSY+Bi~H_D{J8Pwh{-KqWea_uk&2C)j_y@l;|}?S>kUo^ z`#{ydcPw3-*>@IM0dCF*=86{uPC3>u0*YRYSp^slG6Ds+kCTP+;r?sbK#gPOD0-?! zWGj`#eN9Qg953m+D`kY%mQst2%7jHFTOpG&p=sO`%}rPKfDY{3|45r3<|fms|SIwR2n@)Ux?|--CSs=LCX`HR%tr3ZtzBU zi}%%D^BzdePon15Rp+{FKUk_9B+9Z|(TYTFJ3Bg4Cy;5ZgO`3ug5i_JtD<3yyn+!l zVTqGe972TN&hw=_6bjzt`=MVAG!NeK>AFo-d_Ec49ruUZ1ty3%p_(kRsn1xs#0m`A z8_Dsx(?w795Xn;rFP&=qGfdM9jxq-%~Fl)f^}u*+d8H{7*r z#L_w@Ud#PdD4pPnp;x!E@#^z&hg65g0g z$80AA8`*)^Zswl9HZo?f+HOZT;m@MKP$R9>UW_R`M*KtjD)JkD$VIAZ?H?N1JF5Kx z%w;69>WFE5MXogymG(5tH8cA>dcBs;#FJ3Ck{vSGa-vhLI$8vU6wnyg-~*VOFJDxw zyLx|H-dM_jkNf9Sbs9bbt_LE-Sc2!NK3+eRXZRrr$59PV`cIrS8$gRM>gH4*fd$NcYv z6_O*pD$02GRgL=hVL2d+EeI5xwe{n&)N7or+)SpBGd#&9)!kJcX}4a-+Mc7If+)8- zXR>E_X1%6}RmQxSpgM!g*Oe9OuUgLtV@Hc5CMgGs2KVr0nxH_Nfj!NBJiHI%+WQ^< z&{~feqT;AFrIbx*XHK&|e3@gBVntreDzt2`G~Zp&*lPY7od?UMP0GbU zxUJteG5hc|DZO>Hkz5-tpfkp za?1n!{JgJq2j(0DLFFe2^UCW1l_#&lXerk_5!Y$3il_{4tRE>Tx>43{Tk=Qpf+xXl zx?5A9^Jw})i%ZR=zq$X=M!L#R)-m(u@*)DOf?IXOmy;#=6RiruHM&rBNN~ zF2pM=E}`ptM+^`MX%=~Lj*st_W}~!~+01EB$_gt-$BURRpGuESXRtAyzLQYa<3Nu< zne&gJ9z+fJ8f{I9kSl)1W7rrHDqyjHw%WreO*MKUuv4ILc0PZ{mffef6x@ppD)4eS zb-oTYzxKVXRxjUKzLmUjbJTMMPWE^P2^TPYt}2cyrVi4p)>6}KiwpGy!k)27JMIH$ z9P=8am2HE@!4H|Y4RNP5PpTHw;Bs83c{45oov}w8+MFz z4_WPdW4MpG*mgbyd)dqtQh4XB6zIj(;hR5uN>G*=l}J<3y-62WJ8WwSF)AC`b~*qs z7ix?5zJf@(k4#hDQM^tLCz%)xsR!q7?A8A~W4c{TcNojTCVZxK3)PbS@Qn7u0v`<) z!;a%pO^#j?X{OesUP`ZFKzG zy7>L2m2`@CF?!#B{&4$W=J<=bBs!nJPf(L+dPU61&OI^Vg0@@map&`Joln!|<C58L3iO zc}I)Q*j}QOXMR4|e}leVPhR`IB8hKVG~S$vtVy8foC%|Yxo&u_nrhzLR=~ubrC@jt z99$QcSlhvVR2bG#u3RQMm!$Tx!FP*w@|sNdbi!)I#xG#!CxpJ*M~-NiacIb9;V`0! zSc~~h81n}MToh77V(NZS>vesNcC^));d807NHlBYR!-&N{ucYOcIqfs zLB4-$C7v`@y!1H>^RrV2@l z*<+&6IOXJB1r!RKM748UG?v`a}C2a3va4&$AS=-iE z0VF6DRC6km`SyX`V(ZVOC|?kEOOv1lrNnu8um)$Q-Ho(UqEtn<^U10>Nv5SQleQK7 zT)xAlx_73v>mS`zX}2$L(*=cfJA*n4;wGC6eL>9hfqk!TtI)9!kx+ zO?TKD0 zjG(8eiLdoGDR9y!Ahhb~?Oa!ozH|sl;vEX($77JaE_%w#<+a0rY%1flhHjY6##i*| z%-LS#+BLc8ZF_m&BcG+MH(yhz!eRl|<1wjp3UbP7jB0ri;D&sIwVT1cyfc-kfXo3v zC3u&2P`wza@*zX?N|AD;hCtGBKSPnrZa^a5B+Y=JZI#`s(m}uDJKC#A!Fq4IDn1?B zj@KkWyXW?efA8Di8fS6MjVqKgKa*T+58NXfvB`db)A|Pe2-DUO6W-5aX05qJ^j?u^qq1zR}02i+(JNHjKO%(r}tQ|uDKADM)W3|7XeB5C_w@szUIbO1R z=Ah_raD=VXXJ@w+I;TovX2x0lPhl#Q)}{t{rIZ*wT-{7swpIMe2H+g^a6zG!2|B%L z+TE4(+?NEcO?P&aHyt-OBem$k>yKjE@|de}2?C8wbj`D0 zIC}1vS8yalvrDSp=X0>SA10cG3|IiHoBM?G%7uZ&>+6;}yDsfB!tEsz7TfB9XE7L&FioX8K%ooZPAG@Ahp`&JT-K-ADBw+MBRe5duB01sf-i zcN24(as30;^*OM^G}&*0WxH7KjK4#XQAmbtk(aMj#^hhgD*E;{#p7sfmsj&0f>o{ksYaBjJk2(x47`#ybpCvLL49UnS{o#(^DUhO zf)LAx1Gq@#n0-L5dcaDe5#Zh52xbVNG{eZ2hl>cnTAGT=D~3>T!Z=}-xR_|P3PsLV zF7XF;Zc^<__f9Gtm-iJMz=YWDMlqYh{(1GkmlUUv{(#V^|3%qb|3w|XeVd?yfFKAA z-OUh6BaL*&1Pw|vG*VI`2*}U_45f5T5Yi2Tba#iebOp^BoS7SY5o$Moup;)S-Lelpp9G70H~FaN;{Y1v7D z{|Z?yd$Dd_+Eh$Z4mDJdA;DP~%;N#+X;V>}{RS3hy-k)H4st;S2uyb|L{lb8`4QMQ zKk{eL{OR6rzvIr7(7g16#GHZ^-Vp!Cup{|uqdKv>b^lY?fm`%*&xs!EzP6SNJz|5rJm@CBl0nRE4r-V}rJpZ_js&Yb-V3sRTIZIufxRhP`q$Xj zYJ%}+y%oyww{`uI!wJ&MTwj!*s&BR6&F(Rou#?nZ>Qe=x9dchRHrdV4FDpYg2$EVp z?~$J@Z{3wL3hBIvkH8Zz&3f?Fjx*&I!K>6)c>7=j;ja3|B#K)kGRpPl{1F`Q@iDVI zPBcjTex*IV8CP<@-#kj}KW1vQ-D`E)wsAZCbC&g`*DN!m%G)iJI0;eTO*|9dpl|Cltj{(bVl(Ae+) zCy)1}*Q#t1Kl0|~Oz2xJU7qD-&x%%!W+{C&+qR}JeOb&!b5;%s*&Z}>QVO&|r!Ujr zgE}a2vT21`HHLl%Kd}&xgScylm3vjT|KPd*I)t2*r7Og*jq<#TLsd`0VI##emz2|U z(+;il4SB0jLnD1GfSqFWg(HHlcnSS_bQ|~kRac|wu}LK+0wkfm~?;t0Kj2xLQ62(|s3)fLyg=l3M$( z3ZA_}G%FJ$ncJF2K zEvOV{$L&&*SZnQ<5)+V3eb5q1_n@7#ETf>L@bXg9?wZ-|nC)*t3zIh+TtjcF-(fNm zgJN9|UOVOWa&vvD<=GiWsML6lk~OTqq0_1)YpHIC9~Z2n(Aa3R7Q7G?8+{OgVNZyt ztY#^AUc_2tDU-jZ&+!U4M%v()0$41WL0)9y`yJE-S^HClpGeX_lyUz?D_?kQul zR210}5&e;xOIEX4C_FD`BSTXya>=K_dwS&+m(2H6FnT08-I4?&Qg@bI_- zE{FpWMDBM3zaPgdo>xoNSn~=zAS(YroSMLZ3Z0g$!y%bFw#@qcZTc1U1n5Y=ebICT zI@Pu5C2e}1zVKO62K(0dwX^?vb{uO|>79%t01TN)YnIdH!b}Wv{F|#=R^K1{TstBV z`aHq2ZdrSnNi-&Y82C|?3#G|U@<|m%W+k5QB{rP_&4KRNPx@=geIoV)E`gC#Lu>hm z6aA48w0R8J8z-dIdH;iT8g@pn9P#^2g0yA4&&az*UjOC{1Q>AOHJ* zVf*GzY|e5N(`w+&4Wi zvnRQ>HZlYH*S09fqtH^x&#ZbmTMzcF9o8NuwdU7-tHsfZ1+L1oM>6yJPie{5iPri0 z0~F6~4*uS{O~6=UO2l`C+sDN=4~TRzOHVNL$2 z?A%;cKKUj8^4s?F%>#z5TZ9KWEgt#Rzn?h&W75t0(WIU0E9=j84hjf;oOHL#fTn%? zT7zW;n3Udisd(_W`a2dT&m*Ni+I{l#yvjOBC$-DLxweV)idli9OelPG>rGWz(cqSP z0PW`0b07q(^t+HzI#rw)M z+RmgHf-KF|e5y0dHRI_`@zJK>2NHyU0#3I0yvF>TsxaB3gqY9wH;`V1!*yx|#OO^U zk0Yi9%qOAQI6{uR1=H+mw`sAKAW ztovG~-23otRnKb&lA1px8#GURcKK|hSMeM_y;QNQQ?c(>PuWJa7uQk{h({Kd_@$uQ z(q>LBsG_HytdFj(R~=M*^|3Hz5(RTPGU98BJJQ5la~kR zd(^au82n~+tDcE6-9bZr83}S%1H8QfCqLLyrd9ofOR}(k=A_K+^fM-*$UX-KkVj~7{Wnp6eX!y#6&^ax?k3PzFLU|TY7x`}(NdT%g7n0;0hV6nsPYvxY+Ymc1iLJdT_QU_lFk1B^X5?^r}}_ zGxVt^FBLg)RYT4Bge)a4^cY_iR9un7he)GKBxou$i}1CVjfRuI^TU6| zcQkn(f)@ZyKQ0*DPssB?ocOKUC&NTjOFzSK3SK#RG3ykwy>-@+)4g4%*T*BfV0V_T z6TQFx%v3bOGlYa0UFJj%J|cHT`A( z;n32FI%rPR$cu`R3mPCZIKvjG_fRbP6R;;7Xa6BTl}-Ci=FNfCp?2GO=3-3z?eRl4 z($Dz0%%Mu1NZM|_#O{Fac6eQ zaB_MJ&HvNIu$X#M(7S48A=GREAEQNww7ao2s6lea+VxjliLJH#UjWtr{rmlYKO_84 zvfs(~i(@|TIa|+H)($6*z5RrT?0<^SdTpWR@3vwMnaJuogwd_v?NHyD- zXd_RTpx-vKidlgQ2Z!b?3yaJ9Qj(L$fPRnL_O0f(zGi}B&W;Qw0&{9fys0aL z@(!x>8Wr%DT!cW!2&|W5yKZiZ=Xm^ zYMMWzN8FvPy_qIh4?vZ`$V)NnY#odzUm}|im+dwME~M!<3d;M8Kn7M##_c|$I(pj6 zZv`{uKs(Mg%_Q&a3gDVFPM3WMaN~)H{M_oh#@@|U)LA`XM*2Y=w*{|GxEcf%W(9;h zJBcUU?VE=rJ&^mPpbGY-JCbX+Qs*gpm{Xb}DjO8=ecStnh$|68^h1c$5DEfw3{uza z(tgCXxr>)9~G?!$!k3v_->dQ&iBMqZubKp_s|%A|N#{jf0B;XCs)q z4_pQOa|I+b`M4vJiSV_mya8xDL-54R1LvnJc|HC#!LFhX&W$WH*3GB|zj2G&i{`)r z?AVE=&IkUVh74f88Ob7=9Qcp)a4m$f)rwX?V-aw7sa2(#Xsz85U$d02G~= z2KCE|*L|ff{Mdh-5FmTM$1+^2dm(p0@k`VBH#uj5k8WRy?R=T4oBkK}W$=iBi2}_! zY`zf&urtT-^}GR38a@@$o`FM)N!Wh=aIff%Tp=@I0b=}7{o))g(Vg_jZhKU(X7aR_ z!gDF*#KG@mnq^*zlLVq_95#bY@PfD;#yHIlgmZrkw{K00W`Z^}iBS{*1mgct{_!n+ za+Ikgo$kPzE!tS1yCD4Ko!qBQqMyo9;WUzu$WiT`{Ym@BxoLjlFaCpP8v2Cl>J~rj z`GCU0;50VInpH6_A5`bR=K&oPZMSRbldN&^Hk4;w-uyUIH}k}bQ;BDV+$1{hNd_A8 zpm{1w)E7ll_ytQ!tjsr${LNw>6_$}HiNg`Gu_Txj2ts2ne{M{WPZPuo!V)>=rul`p z+?zE+^g0f8wx|JkCVwz3rn#Gh)#t*PN8IFlti$qy=QXgk3mC4jkkD6d1 z@8la1!_)TXoqaybPRt(?flH(P%JpSsk-S2-8l-iHELlt{!~`ddamWORnb)S@w5#7R z&~S0g74va_0+i^m@D>FYfT0}Oao`_h>ftc)O)o{Z$H|AU$agQ7iIM>ssxIJ+$=o0$C713^A}p4Mt{X4_Pgp)n zF`7>2<;CP(&;LImQU#HPK`LJrRImM)4|40eO!lOBeq_6F-N`s*=aGHv@4jjt9n40z z`38O_e9TCi4oI)}nVy{Lj@H_RvyFA&uxsM))62TtXnT{A7OczryCDB&v%fk@L7rhN zmT#C&P7^+JZ=JI0<<7^R8(p;_wg z_`lE9jb|R}`tC)`$jkq};B@=zvNUX95YumWE=~HB-dSBZhc-9q!R$+L&xZe{ygPiQ z6-RASGYRi^aD9!8?@cJo@18R-G14QGU$Jp@uUBrkzg#)_;!f#F{3gN7KJDYo8q+9s zGH(<{kwP)hj2iQ`;>j*@S0|~sEWCaOG74W2=q9LYL~AGhzTrl zESDc`%eHaI_nE`IF3E(52wY3_i=wzyoTomLu{|mM*>UzgfM>YJBk*(W9dZ<*8)CYWP|aL4{TE;F3g{dY75CAU+x0MM-&yXfZ?V2o6_!x9 zrt#Gf(N7s+iddQys&xctg#Ptht={&^aS0aN3P^PZ?O|cCn&z?o zMVIV#Mn;0B0B%V}*l}m)u-*0C!hj=&l~GR_4AYb6wx8{G@d4Hnj=BuC{cdP)KiRls zy3!hfJA;z+}N(~UdqM#O||B2mSeaNlKtMv5Lsci>)7<@O{F5ECsnPoIIc-hE9Sso%~ zA3sd>pqxy6knv&K8_>^FwpF&^Kw(l7Aqs9-hq&?qVF^K`F0cU%D)ntw;mdr z;U4ql$V~RR?PR&MB`%@+smG4<+wqE@gwWHqU%TGkU%qRZaRXbR^}c3FTy^KpUy93- z+IE$;D>tC*k&M=`@k_>5#05~cq0wiQ4g7vuz?`mIoJ~N&P*9tx)w5ysx`e{gI`A4U zjs_A?_DV^j4;U=Fql?Ny``^y1%CxS#!G7q@UaU7AA?| z)O-47AGkX}TlzTz3X7#KN&*rXp5!Q*#S3xA8-IBUYN&(EGQ}6?zve6w!pA36p3*Zl zTO%V>sukUF%@b2MRCCsOy>0(v50ib9zGj9ASYd`lj8$5|j#qm4GYk6rXjyUW3d;*& zt{EYjSz$#oGj_+)i*W-3IT3Z{B{Eg{wiBB9T$1JGv}E!bTc6_(pOc*l{ET$OMA%;Y zRxZ(Vkg{l31ZyO-*4}`_@c{CaD|RZ@Y0a_TSRFI&mk<{tg?%=}T9PQsKMuMWSmq#KVO&UW?n%q9n_K4e zmOD-_lN08_n(DJ{shOF(M!vesMfwaWGf2|FE_YRKMDmCoF{!9r$4fejF@<@%;{ZWx zj~oZq09k{ z&Q&ODcP?_xPqv@A_Fny3A;9MZ=Hk3xlZ9&FVGrtjt%fN4J`4GmYyM8mq5y;LDdiDk zR~q^zz_Pw*b1FM`KALmAWQ%m>coq%Hk0na4gV95#S&$`f`|9^c4{*B%cmF%BdSEqA zjPx;}EDH$1Uns5u1LW+>2JFh$M&8fiGpt1S?-hUfdGYa26dWi1ujhyVemwc#A93FQ=YJ4*PP+WL z$thYj8%MM@QjhbnKEF_T`^K49vhFI>WPa6QD(CC-9~CS&hjJCT)>t_gi$=W(dZPl) z8m~l*vtEpC-HU#|zWSlOF^R+(I(<#<^+HsCt|KiJ%3Q8brb`C&XVR%NzsxG*`aAnw zR~S-!gGca%g~CFA zY21LX1A6nen&tc-uuSahmPf&)JfsNgYq*6#gQUJ+Vx!Mz>!?0m7R@vv;Lv2e0sZj0 z)wUhgDN3b$^f#7pFT7i?!vWNXIuzbHuDz635pb^>!ggpXGhEwPW_5hs?>Q6%3*Fb| z$S!R?;cGa8q&j+08|zMu@%u=xWPVo6d zx4jjiCB0?`#k?29Zf`K#_;PZ> z?qEvv=v;%kMsn}X(7Z)RKwEn#*IN{vwbZ-vU1_L+U=uJ!nKCU(lhj(3i%if;tKuX; zv&>nF2;Aq_2`~Nhi4WjI9AIbik^y|qh39IwUG+<@=Q3I{BzO2Ap5}@7j9Qw!MuSf} zyX_LC*YhE}3GUjjfZUEaK%A`$>!^)^p_O;*Cn5S%5BuhNOmRi| zL96p+dV?8xU;`XJCAyI*KtL)qwDL-~KxoT!rvS+RDH2StojA=2j(Qx9;>qrsD|^1$ zUY2>(*6%UgUVGX8AqQQa+vqiEf8c_3i0Cv~-C{0Gd9;v?S}4C9V_*m$-7yi~37>DR zxVqn5F8^hGR+DT}#}obli2u=a7Gk7M&G#@y9eO>{^}s^CvqYs|qC!j1fU*anwW)RZ zhIOa&@BTHkzt8SAX@`Y}`3pZPR%CUn-W%e#&~{lPhHZ3zogcK)tKeRW_zzwmil#K% zA(YD4s93#Ft&wqOZU;EnJTlIP_wbJr9trR-pNKiz6KfKgOUa34o=+Sk#ON#D1g%Yj z5ky$1yIxJe{la?id$Jb)jsUWzhTR{9aomwBfr4LnEFNa&=X}D7G@J7~=3_n_sh9ZU zMUb=Ip)FzbHbzs4*f_txID5x*t<%ynh+o3f;*IlfQoy2oYWu~VSm6>Ji zy{G)FO{yDpjb@L7g!Y<5Or>QGrM-f4-Wz^TU45}BLMK@Ml4OKS7W+^wq3|NBhVDqx zMiMA;F=+5eP=GMS=f2mqZRz-Yjl2E3dH01@P=1%&2phr9Q_MZ}*a?c}r4yWrX{ho< zjw5>I`F3sgMuE#S2QMsf(ExrBFj@Oh4X@seGl29Xin+Ho*r7#bwE-FZV6^*mWQsaN;H)t<@w*k&zGcWX3Hx*ryW-e@Cya3xSwcI8q^f1E0u{;yMFsY5XTXtSFP{8MU^FSi9H)Xjz~tC0 zk*m4{VJZJge)h`flFb(b35njt<7{QGx|O!3zd%O)$UH=AYMBv5nEq{Npkq;Geq|XF z(EzW^g+>=5F-YIUprGt`hS(yM{cB~sq~OCz-h$HOeo8$qQ{gjkv?1hmdi+up>~jyz)oQ= zJ{OtzLys9{ef<;tP}!A91f*KZO)o4!j}r<8r;G+;z7PEe&rc_F04#M*(x-(2d^8II zldDl_4?QMVOuoYP)P}44>eR2sC$FT;XNMC8-<&~`RYhcN%M>*r*}WPm_UZeFqI4lv z)(hDo)|^xt3hEuX2pFC7`DHp8V=t-9x9@ge8o7Z-C z7G;grS3@2nm7`sb`z^oUg28Um{wIvj8f2d{8ZNZJN276P61$p$0IwQE*+>gfT8fH> z71m6nR^L^*t~Ue=Tc^H>epx{uRngrhylz+8&DJ`6P5ZX9t_0FcQq22LEmlKFs;SAG* zain$so-lGUE50bGZ%1#GwLYj2Rcdl=uSQ4#E z?PEyJ;Np~n^V9o3V&?+SkY2X9xN{+8Ezq2zBSc_Z;6@l5M$Z%4GY>mo%@N17cWflL zj^`4|QKRLeHrCuF+lO{fOJ{n-pIOc{d86Rvy2Z)enscvAYV~AlPz`*m%ogMRO zeoKh|33-%td>DiJ4uYJX1Mtu}>|BS+>3zaaX=o`xl?nvS)fl4V%62CZ3!8RxnCm#*BOdjd}zBZ?et8|HXJ zPv8eYU2s-(#`Bb*qtZ9$6+E)6+zu9xlg3k$16ZuK$6S`4zl==BWjxj<(@W|yx<9~F zPX(5H%Et?1Df_7(nCo!#GECMfDZ4kHT3D^fh8;UjExusq(eq&u!Nf9!3#{y94PB!h zrOVUNzj#A@%j|Y`#;>4z%QkDw1*yxK3?u%%tLdWd7`S|~SY6W>bgTdM@Je9jkC^cA~gMu9SrlA!T9=v4yfJJF0X5OiLh^p7%~{#+c6uX=eMe=Hk2i>YQvv&E}G9 z3_`;jJ!z*#sP2T*K@{dK@J2rv&?Lc(6f(xey_&S@=TyfOcokQ3@sTKxzAyD-sG`&) z$k}1_bX!fS>9ODyGJ&rLmvw2x_HJH4e2v}tMEL(oR*5bI$&~Sac6A{>R_dKljT1Kz4+;L z5Qbe1om`L>u3Hr0J&#{sotfQsiqLZQzkb4qj~+ge%kDPn7^c;r55>dkZ@f|2_GLMO zTSX+w2V+~7se?5he>kj+bU#&|vtabFtqFerxOsQEp8hAtSSe2@yX4u*LcEm&8T73{ z)7zBT!(ytQ{4rxOYE5{-{kz?y1E=SbM}l(!W{?MBKOdWIVRh`uflf0|<0V@kHmwSE z)D&rPP1ThR6=CRZzAUvyx=p%SKruY6&)xnB~>~_&Lt*wLC-H>4E z!GL`*En~wAQ=vhFxRoY9OzPvP!oI!6QU+wgX2grU?p&zP)QpA*&#C9g-(RD$*RxK( zHnxq;vGjELn!UbRRQQ?cX2bwnogk1l*6vNc`*rOo9jzxLg&J(lS59e=Mdjf!CgX-K zgm^vgMVRUIb=b|4_jU``W7?rn|8mSzs6tW$kR7RLVHS@lB7h)@?im%fhIcv+@)$u+ zTBm0~volrVqWpuSh4hk(l6TdO(O=_}b2&t!;$eiz&VV7lc}zcu@bMWYY-4hj*ur3eh& z0Y8QTWOQ!uhcBW;thE{`{o!Y00|TUtz~Qf%<)x z!Xy`upwIEonXaUp(Fb;^4tv~M_I1fvBLm?SE^k7F?Z37|rj#sDPdtS-LQNwRHSoxe z+2zXRb%i=-QrWn?OKki5WR1{c;j864G0ybjZgu6bEXcWi(Noaf&0*Dz;BIMY+V4e|1Szp|*a}DEvMD--t=_iWbnSEr1dMGz($)B4eg(j9=&? zz-{K&5XpvjnS2wFab&fV+M{I^KQisx!8S2>4D2bR*lOH`(pj4}<~plUyE)Tej>eYy zC1z!E!^(?}xe^uH&LzKdH%4PaW+@F1&OS)Ih)iY*5zR)jE>d=)h_~%6_cM%MB*jqA zyid%{b^R75c%5Rz$`&TSao6eI-vFz9Cy$mnSxG$X^`sL?%UVD;LaaEpD9P52P4qG| z@FkflxSl-8{JD>IiHu~H!BE&(%MV*D57bREVDLng&8IRSA0W#{U1=3&*B>0WKr!Cov*U4nH*Iag=? zD09_3t(^ zlr(TUx}WXa%{Gs1D1lNbYA{jlQ2p_z0#G{i={&vqTGg`fmU*ZCbF2TBN8_^Hw5lj_ z+S8nshJ@n!BBiu4=DQzt?#mAlmOKx*7V>1x;K7l%--8|i?9%p#Lb$emjgO)>jE>Rrp9Qy9`IGBXd|WoPNr25wI?mJB8v+bh-Mfa$ z&k&P}4Bn8y%!yqlq>tZkSyVAxm8W@SDlzE2SSZuqyM7knVe{ zySHyW82;rgwfi-E)todO^d>h~9`c(juz9g39Z`@Z1xH+;^ zx?Gs*MhoZ0*3yMEC<-yFu|-!BSr?$cY#Aeee=S$9;Q3;L-MiOP9E$YY{mpC=6tHf( zdu9fw&(5%S554+SRZ!XWre|`>QOZhxV9-|AjI_bpg_T)1OGen@;!UTh{if{GqJ2KU~fOv+10LPeCT63i3i0hSel3%?UE)Z|z;%w6FYh z9k5tGGLR97BQ|rB4$75(KOOrYJjL<(`H34pb*}7tD?tI2$Rb>_e+R`^<7>brD$gA% zC*gZ^`Afryw3L2wVw6Bti$kKG3tryv=DjOhbM6=zx#pAzsi4<_0=f#Q#o4ys&Bc^% z!(XN&AW)TUHRa2$dz;4MkMg1QlDmo$JX6a}7}9!=$A2J%wWbsOGzz*%5CC4RfzJ5j zAtLsU0p1spteRv3l2;+j)=0^G(RZP_VJH`q!2c@br!?N%C25nRgQdE{560A?#nZ>X z?hGK2kh#`n{}cJauTsp=(<4%V$9Y~|V}kzuf~okbm1}FGP|%OfQFq~ir5q2d#XA2J z0YF@7<bH;iPYl}i+T(N{GFC<*rINg5=;Gd!<#jbh zerPfaepS=`YE<-Tq~$ls4idnwioSx|mhf}V)PL8Ymi!JQy2~)<_Y;n% zd1Q5;k5}uPUM$F0#dpuS>&++TqlSL4BLmUb){Opde5h}P`om!hFn+9;UxA+0l18zg zU*?JDq5m@T+|M{~`LtT?3*vl#Vs^Z&HG1lD9|GW@R~{j?HWB}H>|O59?=W-mFGdg2 zyd?N|Qer@8WPWr)hp>#Z^3PWX9<}-v#VcUf%zI863vOi-13e9$wC_K>#WVjB@=~WY z#S^N$JqglPlbtafeh$yt-_K9f{JEcBmS0?08eWun^XV-$(udK8^gAQJt3-hpC z9JSg{dXuY%ViZ#Y7kW4V`*EYkzok^RRA|HF43vFqI!o0)^WUnav77@zzdGmS|0d?HpgV#7>#vJu)s$ zt9YxM{a_~l(1v9ckh9Jow_*X3AYI7T-8E5+Dh`R#p48H45!3lRhAXP9G|7C#-qUB4 zBh4GM2z)^X8~?#e3tS>Lv)Z^?Q)^Z4hQ@N*6;s`6ZS>h!IYL2BXV2X z`6aJxej^(=n=c%lz2g933SUsTBOlX$_o7|X)2pt!`lF3|@COz;{MdAzW(RXoqL}>y zA-1z^_cxq^edV+j%j0rm6RX`sc821~)DOItlKl9}j1#!CBOkOINx7aR^e-~zcKWG^ z8XBYyGknl{G({wm*;GiK*#;r0cK#1u^d{efp5(KZXKvDsUmZqAek1*P(3fb% z4X)IlYC)J5S1+e##w)%j_XYQOc$awiA7)tD%gW|CwZu4t79k-u^%)-%B_J2LHJO?r z!D#sPxXHm*hvF3rXp7}r`N+xVC1gEC*i&`v zXm#lFm%FymeB(|(#9ih~91CSEFdwyY)fzR;c0-dg>wWeJA(3cLH`-+LOR+gPeQwI# zHY4M>k*=@Uion+Y^%{Es`y~ez1b}^aU`SY9g6t=K`zKzw_~Vc4*>LI-LZCs`#SII5 z{UZO+YH!{~sHLnvnDfo9f9W?y*|(=d@?8tEPo1w%HV&mF*L=$SPueSlk9zxK#_Z4y zyQ0<5j+Bx_j-HrnuHSaSH605%4$IHkbI(tZQkvTY=`(Q7Ps_%Vg+$O&b!7lE`_7#f zXX|a;Co{We2x8DH@=R0#^)HroJaS%-_ab9I7p%PJS~>D)nqa`85QV;Od#{;=Hqq0k z-x4m~x-Ze^cTH93TgbLlH?;tXC^bBpWl+zsf!m6nHzbG77XMm?eypyKor=lgW!u4l zIL#rOAS{Vf_Qju^ok`*IHVv;gx%Ov;N+>)uR@TrE-`Mo4A>QTTe#zgjVF0yrgRObv zkdVIaEV6M8c$xcb7F-=$oa!acub@U*V?5o#`cNkbCW=p(n`6eJ#b|o#+8XKNsAmbk%_msw!M|A>PhW;033i-U|* zs}CeE^w_WTjQCm2VBFj}=WpM9d$=f8?JpRZTQxo3a`pd5N%y}wF8(*-I$g#*dA0h6 zwT+dV2LyyGT|2e2Jztgh&gpLB6Le_h_$WY)ydO>`%i_4a-&5h=1^rgu>u=+RF8x$U zT7LJ)p=xinL4b*wo2f(B2V2X5=0oEM9keQFs=8))3|$eX*LUD~m~MBUr{OKfxY z3SwWy2_;&2U8mL2G)pcE>#U~weZQ?`-^sJcLvPd-C>*qS#PlFzTV2i`x z!pVL%D)u6FPUG!!yle;4_w{f77^tdrDm<=E;%$)$QjdOBGdt_H_@vGaUre{jW!|z- zz18_cB+M00?O%$x@}jCeI8W{=@5m41jzDI?Z-C9mw@rRpt(Bah&@k=oKHn; za=LZwvH8v@EkPHE2%^`uf*$Zqn3iIsdTfN#zY_U)fMoK3kigmRHG^R^Fo>sh`o_+` za<3}8b&Kb*e5*iqZpar;kjd6X;5;${32@5=RW*if;ds!|GH_+ic7iZNsBsSxmYs#4 zpgjFaby^TW(u|9+JWr7}Puj<$<@_MNZ;(i-x%oNDzx(E~IQmH{NIM%`k1w9ji{1OP zbCw;qA=Mur1AbGm)chXt?~vEVUHIylw3LdusoH|WdSrO>dTwoh^vmB@DrC0Zttkfw znc}t>IKQZ2SIIt#P*PLZ_(AxbSlO=76s1A2y6!%&Joke(VTA^|{x*cV(C z&IPA>d{DE*G_x@f6G6WdxAA7_(CKP( z<8P#66=Px)KQud+se(y5v^A1)pgWZ~x~!mY8tqV4thwb=%(&Nd*Iv5wgt_}z>Pbe* zl&tYU-~mEK-7;czN^@r+Swdt#G`9!rm=>`+jbF$PS?GP?n6@uQ$AS;oDDh50wqg{VhWaj`)n1$Gqd-}cJY0(>g)K)S) z$&t}X`u_J>z~BitV%NSGcanL4uWLps)N=5!<#qmltX~xwfSZ=?b9!o?VS36$Bn?^E z3IHOvX#L4^0(6z?E=$eP7;4BqfL6mnN^p@0D$C|$rPztZm2o;5d2;Iy4-Q2w)c9-s zf&;!bj4Y-SYNJ3p91iM2E}Ru8gh`1;BU!3vyJIu_fKS*dyAwq3-+dC$D3YM!1rpIZEvdO`IEDQxL+ydbe0 zz-Rzpr~X6Y+)yFBO@F&sBhV<2Tjnusf)lyipW2nKc-iK{k)?sDwASf$GlvAy?*yfU zvT+!f+mY^bU2`@~;4Vic6E#eW1srRqz!Y6TAAz9x)9^b*?-A%RR9gh_i13kN1hAqH z_1*X;+(5Z8Fl6JPqGEC8i-u|wX0*N<_@moiWNJc3mwz|kOoYtp!78aWZEUrKaR_icoc$L>9obxoX z-4Y~PXzr-O(|IyicW)B&<&FeFVjT0IZ>Xz??YfBMhXNTivgK5v_JlbJoYTQ|9M;fn zENtH57DYP4+&||>A;hf*u%Dq*E6EF;)ZtBeGj!ZjGSqAINc_E1IwlC7NqsyAW!kHE zmu*;vxjS~=51LM`+3J7^9fh1k69jFW{9{w%yG_~8(yt_Xmi2mP>wDG&4gad=p(2^U zB)TzdqIloJv+aF)^y13V)x&~co_y?aPiWO$_)It&R(a@A9h4p7ry%w0_w1tHc#G87 zL?pdlV~sa>3ThYcj!=zN6~7oVQPS{V`u)VUp%%Hi$%p?WT<-Y*aa&^gH z%5plQn)G^aK|QvazgX-B&VTm$S+5_p33=>?{s*sV-DeYf=nYsFcZBi7q!b<>yYLna zPC)w;3zD7zaEnU>!t?-xDVY_Rd6AM>c5Ig`@xXCLL>r-5A|LkcJ#PPk{u7kC*51`9 zV^aC6by_aZk6Rv~Yr4c$Fk~OL>GJH^9;US0$X;~HcAqPY6#Yog2qK`Op<87J(W8!8 z4*k;J)zaFT+P!p~VL8T+;yq*IB1EbmE1Q!JT*6<{8?UU$*-CF%nHV$kiTxMjfZ_#Q zwExIxWr*x;2=l$is`o`_pyx^3n7bQtc=+gJ`G|6xb<&@($Se8+ZUmp|4`FUGqPG@qVPoz zMG?rm@nBhb(^~surCCI}xk;??crkttk~8+(!H?J266_u969Y+$%bP^pvoo!BCU>I4 z>(uEPj`o+7%F+`*_bfd$FE7A##y#fzU@Sjd1QA<2g)+eSsn};PrXW94NhB1LOU*Xd z@kOS*0`mi*%&HS1?1?=P#^+sry;og(U&;BmGfUo+m3%z^rlsFO_-FUYkfkc!O5)R6 ziImb929EwM`+<{3gYRhu$JO+Rv@jO{`k-w12VZziB?OB$!=U$h!j)DATRYa@)(`uR zJ{o4Iwl(WkD|>}ynBY@|RA{S{Ivc;_GEuo}7_n6G{rUk&!;xvFXQiuDs>PMJX@~yc zU`!VrSIg(GPFVK0kna#<=b+PqRgEXZQJ~|kX0>SkK0J#0>b&4-^D9YlIB9We< z#j%{O$LyF_?Driufh5^M5G?>bpqJkoEiPiIJ~2w?y!=V-1xzuM*+ib@`-q?P%2hB) zO=%~-kuLCD_EmvHg{8Y5&tuQyC2E9mdQObb_oTwEg9re&*mLDQryl>DT871Hndp~x zsiQyKF+cbKYBE50w|m`+L@Le4#F>{;z9)oiqR?1rlDiwX%sVao{X8-(ePvue6{PbEZsSc%h6jLfw#c zF%GE_EL(i*`Cej5f(028Mx~|09*DM=4HvlvxNy!Ks-s!#K9o57D16V2y!<{ z5|)b^R!s3k+a^#`uY97t2S^-y zArXHxaMS@&!9S0VFs_;o1CA^Z7# z%MB0PdY6Ji{SkrMe1Q%7wXoxIX3MpDq}CB+u(h!<8-*cJIUYrf;~*zErUWf+3~;Ah zsk+Ey>A$?i@h()-?i8b*rwk7Z4A4yao9popz(LwSJ#lmN?Xbn3M0F{_@)3tthooUyzbi zggJ%*Flh85HFIb#RZG48ow6?!Ay)ssAtt1n5|nU%-2Zm|EZW_CrT3=x^xVvsWLdXv zwx_b2Kg}amXIa4>-r(h^<0#+6aW_$Iuc>KI5*{5(Wo%Yb1wgTl$=`P3H*nnE-{jAA z4{jR2{I-|Rh!_D68$9sXrEI6IfTa-9;=4i9sB6!X4#TeA`N6E_`!#UjET@_KAK=H; zKLC>)MU_`K@wLq_ISB>&G!x2)U9!Wyn7G-t(Qp0bxg&>%qdG zoQA{%gLknBgM)B*Q0EZ0whKL>94cXa#!uaqnr(Avf9lD!Gb{ecM361wcGV`5C+|5y zK!CwGFW6O9E+R&|zJHV)X%_f@FR=FC9ijhQTAG;XxQz7&=Ua3tFUJ^}wC7$?wDV27 z$HxxisjNWqtuVNjY;P&(4k)@eP~*-&LMRo9ZCy7)Sm{y#C`-(ni-=;z0m258iC?f8 zpRqx-vHy!Ko+pk+3eovKcLG;Y$-N5-JwMw-&%T+#))VkgbpwO1-wk>i zcotR}-%#P0c|n7rEufGe7eA>gT6o z5vDv~9mQFI>k240e8#0vr!=ykAQmInj`gRM^s6rlvGE)>@EiWB__Lh5S{P2ZZSIrh z7)4y(Ur{gGrLlcyf*2WtFRyNL1ES?6JYD>w8I!8Rw?+Yc;Zt;z57rOnikX|55ESVUgOdLG6;9dWPV}_t?jA8(49u)=&Dz~ z<~JwigLvHtp=?yq>w4Akt2{_3=tqqF6k$A(-*;~IFxFZXvX`5$pQc*YWxm_d-||@8 zGD!3#ua6eku*dlv-}5cjOF-Ll~#5)##a>Lcd`Fwuz6P!YgDVW(Ia z!Id=QZbR}rS)mt?mJ`Dl<`a%ear*u&pLb51wg2Fo$(a7ta1!j8MQ7HQYt$Vzz6-v=28Q^pp{FniE#*{QYjpcOPLvyE=O zY>znITi>=W^Vc`Sn>ZnF@Tb+3XMfuD>ahhHM+#1F2Ik9;9QO?MoG*jLtc5Zp$Nsp4jUhr(1>+&{%p6+4sSba3#KIdY zMmcQ(9;tn2@-Mbp%Zgg%UvzxkZORIw!f;ALcw;ei6V8q0No6b(54<|YgyuP{Ecq;{ zb1iUFQy+M**Yxugt(T(U0ipsqsmk09W7Kn_`r7;ua3tLmoG`^?!E_jlEyt zycSm91^R1S)z^XMzdiDf=1tCt@FM3t7Y|kQX0{+I-N_PXh2uQ@#TF}S;AoO9O-uwcWT;eeq%IbZ?I5SfQvXcA)s5tyqUq$Mekp1s4;g5hmD}C; zq$Y}ANIwS8Hlw;>Li}j?UcNRvzw24zgb`7;8RBDNbMC`OB5k?5vZ7oQHhM|yXh#&g zMgZOHn&sh-<1!?quA$vO6$P>v!U7W8zveO;iu?Z>Ykq2IA1WQ<97AIELSwEQmJ~YM z8=(MWqDB3P?EgI)QB&FCZ62d*XbogDqJRdeQ8qw9ks$ZrpxHnV(6Z|y4QpIDq;$2Q z$vV8H8aQcuEq^3Ey$}l1DbsW@?eJq#{82u*e*@%D?rbjh>^}>L4If7;yVK*hVXz$6 zQrov0rKP$c2ZNfsa@L&=VmrLoAF|9FQneK2cDu~|gdHnsSWR2`($Y`}hyIjCoH$^u zjUZ+a^?%;nQWQB8{`CkVppuy9>L;+AE3!r+6@|kez*~|COZidxf5K;w5>|zT6Bv_Fz1H5iq-+<>mb6&~~i6o~7G>X9Y5m594q6vU)~dTpf<6OV6&@ zQg`2!Qr+Xe=D;8B)ZN(?qevwGg)w!0b;yF+6@>>14Rv+ZpfAPDOH#ml+48}MDpJ3( zE6XWo3tzVwmlH9C)+RBH8jH4EjA~G$mkgy*fR2(8Ik(odxVjRJ?Qy}R7M%QkSy8r> zf@x&Z#5q=%{<>3V7ajA~?$`k*33UY*4p5+B1Dk%fx7dW5pM==Jwz=EjY5i{q>~Ap$ zR-Qxu(PdHk9=AGm-$wdrw*OVPJj0#PSp4 zTBR`>k)pD^vSw;73wH{Ekgukys;tiAV)7zKwx8SBdJu!dts|cu>8|~PGCmiRjR^*K zIjEz%xxHJwJ7icUj_2YV4MHo@85aKnk1_!Un+?bbg9ce){l~hy z+89n9FWh%Yj!`E45g;p|1U=SDKvP}=)riG#UaDSEQJ8`O3&OBT+?N5-?{j1@Fxq~* z6{kvH`>jA>22P>B8>^t*!f+&s6xO^% z+o|$MPFWlnS2l%VcO+Pw&PT%;d~1N27)qE**r%?6V4DpqH(x5ps!}jnA!UBd zO6bWFA=W#DhJ^7{p}$m;T>Ob2`?_x4F^Zr9Ty9YeF8U$Gr2dzx3g=54{<49s^-1}T zZa;>(G*Ts?7WKX&KfLf|nPZ(O-u&+tVRIHb7YmMzlc+J9c+_t|Sa-(bvTCI1PEfVTQyQ19#DS?XK4J9{ z4M&oT+>mrN)12n21BmPDS0PYEL6S)B1Yf-S3YSQ@_*UKr)A*gahL8YT?nS*LRUqsu z!WdLYIAu0NQ;0z%g$NP8zckFuj8+U*uggaOuw{BWov5Xu1IyQ5zpA0BaN@vI$MC!} zHOOhNuzz`pm64uv;3<{_37@kqb27k)2Rj87ILHyvJCg{O2wZoy=uGt!8 zMli0X%`R@L5G*MShnPPsk9oD873s)(yh}13+>-5V6DJ~BNYx~uDfm|1eB|rsu(|RI z?SDz~c$37YvqaQT=DKP>Ou?0%F9+$~E2^p<-?@hLT`-e)s7N$rQs-o+=49_BceG0w zwcf#y?zyost@M2p;vM6^p-N^2qD36lWhijc;L)n zDFH>C?)Gg&ZhQavTHEQ6=T?v+;SwpQcj7`h7H)mg!i!X-J`PDzI;JL!u`*DVPLD*{ zUUOkavx=0*Ceh%s#5QEI5j6ZvGx5qgU#?H zASdt;-l#!d@v;G!j)Vlua}RmL0(_cOKEa<7+;|nSCpWetpQEq8T0TicR-%KQx)skjD zhlFK7ssQ*55lOH-wetw|yj(dZ1M^@o0ICS&3?QKXgBq#g^_=jAzn-B#$*a2GW03iR zSX5e$-#!`V8%rCx#*ZnK^O*=VtfD>>x|b2&hPl2b>gxC>ZkJTG^EzG27AY+Jg>`)3 z4!TU`AK;4S+<4uCCuO-U%PF3KqLFL73GN4cBnfH&{{8Gf0IJ_L-N&tg*+0M$DFnfE z9<=@saK>}#_0I7q+AR8lR+M|K<_G@|@RM`o{V?cdak*z_IuPa`U`x?H=xuLP^gaId z@ny;nQd+4LFntmK5qh@$|9|2CgR8V8*OM{b+g2Qh{mfQ7Fn&gu@pU6XieTzH$md#p z013*+$^u9Xg6|@;eE+ScdmFF__#5*NK>k*?5I_5;SMnqS5@4Vy%EvJ4IY{A2>W zES2SzL+(nJ6JDn$?s4xGOF5*eXx9sOZG6_!`S0~c1rJXE%>4Z5Y%Akgg_a{yEiwWC zWx%m#&53sXQINsms*u}yUn8#cu=3M$yn13>iE@_T>T|S1)0QX7+}5LQwudY?Cv#%! zM|3{<%%7+Q!cYkT%~$E!(*G*1{NEAnq;(EUJni|0w|WbM<5{0ZJ&x2Evy4W(A1o(N zh9lYhCK#^@%HU}tph3dv4hmI4h>i#Zked@D_aop;$r?Le{R7f{QUB4h#O~o*$&6?a zO{$gh&1GodGsY7YB$=Zp{J-?LE#m?`7<)Nu8OM9k#c>&XH_*i)zS~*qi>nCTnEge+ zT<~GRT3Z`Napme=J_MjrN-Aq(EwaX!WqrV?2$&NmUf{Ipn2R(A6|T=3a+<2_-`~HY zy@VT|wmp`NWybT!HhUeekACxF-5Q;{R3JoJEgH7uz`>X|uXDacW>v-06}b#4iEFO^ zep<#zQ&L`9US6D-!$232qvwc+8)9a|cQQsG3j>9OSyh}83I$ytuz+42aViN;m`oVr z3$JpmQXfROmKG<#rzUiP2@R2z9%1=$Zrqu?eBqJCg`J$BwO=nNX|q>4?f6zi(2V`% z{UUawW4Jm8GW<16zFj)xh?E2-*uVrT8Dcv}hU0p@;=V-VydsnhGEQ+t{Lv(H6PuMl z0D!@g42e|GKvq&6dPQ!$W?7>yLrofVT(=4+u}kqPc`GC4#bPrg#`d+>0q9kYp&wg< zq9n3ywHZ-sYlH%$82)*ypro&CPOX#P@9Q zOI_9+A9(D#8r(f0T}j#&v;--1%LRhz&<*4{UnZkse#c`-s958y8%g{6GexV>$WTLX z{V2(7bku^QpTti1giM5ABNv~zV9;G*xp=YJ02+rlIA-HFbl>|{(!m}zbrDU4gYiCwTTI#c!Q%EB$(#l^R1J#VW_;@y|cjA05_9F|M&59in6X4WrZa)1` zPxaKHF^iqn-|X~iw(~Z(o?Q%;gH;M><*tG9PU;gUur!8 z^W(j$m$UNz$gz^AR(B=+Ljb`Bj6Y(f5JrR=LfY@Zqf><1!ngfj_L@41EIOrOwVo`@ z&aJ4Ss8q?#=kh{6F+yWp)%fMs2^cd9IsPdaKWbm=af9HX80{M|cqN~hQ8a0Id8?TN zgnS%Ye#KvuK=BNX{6MaouR?{RNgv++8*h6UJHEALRCU32pjN!Nm^|?-;XsiBplOiN zM`xIZ3~OY-RMm_~b}A%?y}$s2-W`%s=pS-i+F!0Yd$aP|WBm{((7@Mt=8`m)*-NNY z!X?;Jn^D=#M3zxpXlq}Ef(zutPENsTPUOV00 zebN2a8sC=z)GDeVZL(N6CFRFcmq$MVang^*&JM447aB;EBMHiUP~uh>(S|j`#gqh> zkGG)9oiN?1vV|0#bnPsK(Q^t`H1h`Tp60Z#%#2!1I{tb%>(z3|l(RmD&OBj%^(6)^ zAJ_#=nbkGkE{va+yYe11g4W$@H>tE04H$M)iqzLac##W*+v76nt5wsmW`QSYFiS(> zv6Sq9Oe}SUmwEpC~SE3mdl9^i4Y^edQ3}lv( z5j{h2z%)Rp^t?xrucRr5Ld8y!iWmaaYskCwo*hA&Q}RCM(>{M(JGkwr2UIrWixKTtX8 zXi*QlwuHO+n~w{^SpKx3QpOfUVM||YD#+`|ZwcGp7ce`DEp@{O`!udKjTxkQ+L7m# zd!qgxJmazGi{U{^+RzI^3yN@Ee0u5GdpT*jKOD$)ak0Ulkz<(2sxApZ{z=@Z$Ecu? z=^N1rbWa*gaZi#NmmH$jlo{hzDSegu^5*A44MN1VrnX2?7KaHzE2I2D+IU>g#8gJ_ z9}m4Sq=i6nGm?*N$&Hk6cAaAF&Jrw%A*K~=LvFC?k$J{Rn7MppEZQ<%HRI!aHm5bB zj5Wqp=_1jdBjHqx?y46_{VvjD;$cbo1KGoY4h(uWx|6gv^`f;iEs@cOjx7d<wD+mEsut=&>Ck<%orrUbg=;;u?{}h%`RHTsta&Q~}&P{uSZXRiu$)AmQ=g5F+ zg5m(EdH;Bzpp?<5XT)FOlN0q`|D4*yEG>%B4}#T&@;)KMLY=WK3WM>`6fAVnwz^I6 zQCKA@DKp(M@3|->k&C_u*c`nOy`pIsk`UbM2*!6eFKhm(e>NP%(Hv8u9p0t-F<)=l zqL-%>gAXH}efA9sWL=U|Iq;Amv!;||CpAvfbZy_=w6ESDWmguW5W-Q)Tm^y5X)Me! z&3$9HiD4|7pT;f&B%TG!*eE108JE#{J7q6-@m;D4=dvZ$Y~Y}nfT|ObZ7P3AESyJC zhGoXV#^D!0D^M1Eb~%rXE3p((Rq%BhXO4`nRL~{0jf%+0LGtxpEy=WPzWEtNztEY) zHLl-_YxW`Xce%YeC`uTo)AtCO-G|w7b^I!D^y6qKs(2`1KdS{x4~U#RRqqN+nSz7+ zvQu4FT3cv?aT=4OA1)P45x3`8Yrl>x7`repEkr5X?gi*iT=16QQP$uB;E$;xS|UZ+ zXe@T}E#rYCqGGXdFn(6oFI+AtV_QLm2bWVe0;Wf&L0yjvn>brUGRrxwH%_2nnBh%)SUB-Y{r0-lLe8vau!=N;Y~ zACIES{wCx3l)JK0LS$01TJ~qEw!2)`K#g7AQUe<8ouW`D4=Z(hu)XG3MpQFNR%0De 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

2f*dB47zH+$n_z3H2nuC{oeKuFjr#o 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 + + 3 + + rt-thread + + ARM + + 1 + + C-SPY + 2 + + 29 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\IARProbe\IarProbePlugin.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 29 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 6 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\IARProbe\IarProbePlugin.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/bsp/stm32/stm32l053-st-nucleo/project.ewp b/bsp/stm32/stm32l053-st-nucleo/project.ewp new file mode 100644 index 0000000000..27d1d56b3a --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/project.ewp @@ -0,0 +1,2263 @@ + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 29 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 29 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Kernel + + $PROJ_DIR$\..\..\..\src\clock.c + + + $PROJ_DIR$\..\..\..\src\components.c + + + $PROJ_DIR$\..\..\..\src\cpu.c + + + $PROJ_DIR$\..\..\..\src\device.c + + + $PROJ_DIR$\..\..\..\src\idle.c + + + $PROJ_DIR$\..\..\..\src\ipc.c + + + $PROJ_DIR$\..\..\..\src\irq.c + + + $PROJ_DIR$\..\..\..\src\kservice.c + + + $PROJ_DIR$\..\..\..\src\mem.c + + + $PROJ_DIR$\..\..\..\src\mempool.c + + + $PROJ_DIR$\..\..\..\src\object.c + + + $PROJ_DIR$\..\..\..\src\scheduler.c + + + $PROJ_DIR$\..\..\..\src\signal.c + + + $PROJ_DIR$\..\..\..\src\thread.c + + + $PROJ_DIR$\..\..\..\src\timer.c + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + Drivers + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\board\CubeMX_Config\Src\stm32l0xx_hal_msp.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\CMSIS\Device\ST\STM32L0xx\Source\Templates\iar\startup_stm32l053xx.s + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_gpio.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_usart.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_common.c + + + + cpu + + $PROJ_DIR$\..\..\..\libcpu\arm\common\backtrace.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m0\cpuport.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m0\context_iar.S + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\components\drivers\misc\pin.c + + + $PROJ_DIR$\..\..\..\components\drivers\serial\serial.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\completion.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\dataqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\pipe.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringblk_buf.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringbuffer.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\waitqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\workqueue.c + + + + finsh + + $PROJ_DIR$\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\components\finsh\symbol.c + + + $PROJ_DIR$\..\..\..\components\finsh\cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_file.c + + + + STM32_HAL + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\CMSIS\Device\ST\STM32L0xx\Source\Templates\system_stm32l0xx.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_comp.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_cortex.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_crc.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_crc_ex.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_cryp.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_cryp_ex.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_dma.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_pwr.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_pwr_ex.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_rcc.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_rcc_ex.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_rng.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_gpio.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_uart.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_uart_ex.c + + + $PROJ_DIR$\..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_usart.c + + + diff --git a/bsp/stm32/stm32l053-st-nucleo/project.eww b/bsp/stm32/stm32l053-st-nucleo/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/stm32/stm32l053-st-nucleo/project.uvoptx b/bsp/stm32/stm32l053-st-nucleo/project.uvoptx new file mode 100644 index 0000000000..00829e4fb0 --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/project.uvoptx @@ -0,0 +1,238 @@ + + + + 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 + User Manual (STM32L053-Discovery) + D:\Keil_v5\ARM\PACK\Keil\STM32L0xx_DFP\1.6.0\Boards\ST\STM32L053-Discovery\Documents\DM00118944.pdf + + + 1 + Data Brief (STM32L053-Discovery) + D:\Keil_v5\ARM\PACK\Keil\STM32L0xx_DFP\1.6.0\Boards\ST\STM32L053-Discovery\Documents\DM00122138.pdf + + + 2 + Schematics (STM32L053-Discovery) + D:\Keil_v5\ARM\PACK\Keil\STM32L0xx_DFP\1.6.0\Boards\ST\STM32L053-Discovery\Documents\MB1143.pdf + + + 3 + User Manual (NUCLEO-L053R8) + D:\Keil_v5\ARM\PACK\Keil\STM32NUCLEO_BSP\1.6.0\Documents\DM00105823.pdf + + + 4 + Overview (NUCLEO-L053R8) + D:\Keil_v5\ARM\PACK\Keil\STM32NUCLEO_BSP\1.6.0\Documents\DM00105918.pdf + + + 5 + Getting started (NUCLEO-L053R8) + D:\Keil_v5\ARM\PACK\Keil\STM32NUCLEO_BSP\1.6.0\Documents\DM00105928.pdf + + + 6 + Schematics (NUCLEO-L053R8) + D:\Keil_v5\ARM\PACK\Keil\STM32NUCLEO_BSP\1.6.0\Documents\MB1136.pdf + + + 7 + Quick Start Guide (NUCLEO-L053R8) + D:\Keil_v5\ARM\PACK\Keil\STM32NUCLEO_BSP\1.6.0\Documents\STM32L053-NUCLEO_QSG.pdf + + + 8 + STM32 Nucleo board (NUCLEO-L053R8) + http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1847/PF260001 + + + 9 + STM32L053-Discovery Web Page (STM32L053-Discovery) + http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1848/PF260319 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 11 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + ST-LINKIII-KEIL_SWO + -U066FFF495355878281224644 -O206 -S0 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(0BC11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$Flash\STM32L0xx_64.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32L0xx_64 -FL010000 -FS08000000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) + + + 0 + JL2CM3 + -U -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L475VETx$CMSIS\Flash\STM32L4xx_512.FLM) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + + + 0 + + 1 + 0 + 2 + 10000000 + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + + diff --git a/bsp/stm32/stm32l053-st-nucleo/project.uvprojx b/bsp/stm32/stm32l053-st-nucleo/project.uvprojx new file mode 100644 index 0000000000..1d4b14ec41 --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/project.uvprojx @@ -0,0 +1,820 @@ + + + 2.1 +
### uVision Project, (C) Keil Software
+ + + rt-thread + 0x4 + ARM-ADS + 5060300::V5.06 update 3 (build 300)::ARMCC + + + STM32L053R8Tx + STMicroelectronics + Keil.STM32L0xx_DFP.1.6.0 + http://www.keil.com/pack/ + IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM)) + 0 + $$Device:STM32L053R8Tx$Drivers\CMSIS\Device\ST\STM32L0xx\Include\stm32l0xx.h + + + + + + + + + + $$Device:STM32L053R8Tx$CMSIS\SVD\STM32L053x.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 1 + 1 + 1 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP-MPU + DARMCM1.DLL + -pCM0+ + SARMCM3.DLL + -MPU + TARMCM1.DLL + -pCM0+ + + + + 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-M0+" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x2000 + + + 1 + 0x8000000 + 0x10000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x10000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x2000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + STM32L053xx, USE_HAL_DRIVER + + .;..\..\..\include;applications;.;board;board\CubeMX_Config\Inc;..\libraries\HAL_Drivers;..\libraries\HAL_Drivers\config;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m0;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Inc;..\libraries\STM32L0xx_HAL\CMSIS\Device\ST\STM32L0xx\Include;..\libraries\STM32L0xx_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 + + + + + stm32l0xx_hal_msp.c + 1 + board\CubeMX_Config\Src\stm32l0xx_hal_msp.c + + + + + startup_stm32l053xx.s + 2 + ..\libraries\STM32L0xx_HAL\CMSIS\Device\ST\STM32L0xx\Source\Templates\arm\startup_stm32l053xx.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-m0\cpuport.c + + + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m0\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_stm32l0xx.c + 1 + ..\libraries\STM32L0xx_HAL\CMSIS\Device\ST\STM32L0xx\Source\Templates\system_stm32l0xx.c + + + + + stm32l0xx_hal.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal.c + + + + + stm32l0xx_hal_comp.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_comp.c + + + + + stm32l0xx_hal_cortex.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_cortex.c + + + + + stm32l0xx_hal_crc.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_crc.c + + + + + stm32l0xx_hal_crc_ex.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_crc_ex.c + + + + + stm32l0xx_hal_cryp.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_cryp.c + + + + + stm32l0xx_hal_cryp_ex.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_cryp_ex.c + + + + + stm32l0xx_hal_dma.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_dma.c + + + + + stm32l0xx_hal_pwr.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_pwr.c + + + + + stm32l0xx_hal_pwr_ex.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_pwr_ex.c + + + + + stm32l0xx_hal_rcc.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_rcc.c + + + + + stm32l0xx_hal_rcc_ex.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_rcc_ex.c + + + + + stm32l0xx_hal_rng.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_rng.c + + + + + stm32l0xx_hal_gpio.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_gpio.c + + + + + stm32l0xx_hal_uart.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_uart.c + + + + + stm32l0xx_hal_uart_ex.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_uart_ex.c + + + + + stm32l0xx_hal_usart.c + 1 + ..\libraries\STM32L0xx_HAL\STM32L0xx_HAL_Driver\Src\stm32l0xx_hal_usart.c + + + + + + +
diff --git a/bsp/stm32/stm32l053-st-nucleo/rtconfig.h b/bsp/stm32/stm32l053-st-nucleo/rtconfig.h new file mode 100644 index 0000000000..89f211e824 --- /dev/null +++ b/bsp/stm32/stm32l053-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_M0 + +/* 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 1024 +#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_STM32L0 + +/* Hardware Drivers Config */ + +#define SOC_STM32L053R8 + +/* Onboard Peripheral Drivers */ + +#define BSP_USING_USB_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/stm32l053-st-nucleo/rtconfig.py b/bsp/stm32/stm32l053-st-nucleo/rtconfig.py new file mode 100644 index 0000000000..7c5cbfea7f --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/rtconfig.py @@ -0,0 +1,134 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m0' +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-m0plus -mthumb -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-M0 ' + CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' + + CFLAGS += ' -D__MICROLIB ' + AFLAGS += ' --pd "__MICROLIB SETA 1" ' + LFLAGS += ' --library_type=microlib ' + EXEC_PATH += '/ARM/ARMCC/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iar': + # toolchains + CC = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M0' + CFLAGS += ' -e' + CFLAGS += ' --fpu=None' + 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-M0' + AFLAGS += ' --fpu None' + 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/stm32l053-st-nucleo/template.ewp b/bsp/stm32/stm32l053-st-nucleo/template.ewp new file mode 100644 index 0000000000..f390ad7bc1 --- /dev/null +++ b/bsp/stm32/stm32l053-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/stm32l053-st-nucleo/template.eww b/bsp/stm32/stm32l053-st-nucleo/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/stm32/stm32l053-st-nucleo/template.uvoptx b/bsp/stm32/stm32l053-st-nucleo/template.uvoptx new file mode 100644 index 0000000000..00829e4fb0 --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/template.uvoptx @@ -0,0 +1,238 @@ + + + + 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 + User Manual (STM32L053-Discovery) + D:\Keil_v5\ARM\PACK\Keil\STM32L0xx_DFP\1.6.0\Boards\ST\STM32L053-Discovery\Documents\DM00118944.pdf + + + 1 + Data Brief (STM32L053-Discovery) + D:\Keil_v5\ARM\PACK\Keil\STM32L0xx_DFP\1.6.0\Boards\ST\STM32L053-Discovery\Documents\DM00122138.pdf + + + 2 + Schematics (STM32L053-Discovery) + D:\Keil_v5\ARM\PACK\Keil\STM32L0xx_DFP\1.6.0\Boards\ST\STM32L053-Discovery\Documents\MB1143.pdf + + + 3 + User Manual (NUCLEO-L053R8) + D:\Keil_v5\ARM\PACK\Keil\STM32NUCLEO_BSP\1.6.0\Documents\DM00105823.pdf + + + 4 + Overview (NUCLEO-L053R8) + D:\Keil_v5\ARM\PACK\Keil\STM32NUCLEO_BSP\1.6.0\Documents\DM00105918.pdf + + + 5 + Getting started (NUCLEO-L053R8) + D:\Keil_v5\ARM\PACK\Keil\STM32NUCLEO_BSP\1.6.0\Documents\DM00105928.pdf + + + 6 + Schematics (NUCLEO-L053R8) + D:\Keil_v5\ARM\PACK\Keil\STM32NUCLEO_BSP\1.6.0\Documents\MB1136.pdf + + + 7 + Quick Start Guide (NUCLEO-L053R8) + D:\Keil_v5\ARM\PACK\Keil\STM32NUCLEO_BSP\1.6.0\Documents\STM32L053-NUCLEO_QSG.pdf + + + 8 + STM32 Nucleo board (NUCLEO-L053R8) + http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1847/PF260001 + + + 9 + STM32L053-Discovery Web Page (STM32L053-Discovery) + http://www.st.com/web/catalog/tools/FM116/SC959/SS1532/LN1848/PF260319 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 11 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + ST-LINKIII-KEIL_SWO + -U066FFF495355878281224644 -O206 -S0 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(0BC11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$Flash\STM32L0xx_64.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32L0xx_64 -FL010000 -FS08000000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM) + + + 0 + JL2CM3 + -U -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L475VETx$CMSIS\Flash\STM32L4xx_512.FLM) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + + + 0 + + 1 + 0 + 2 + 10000000 + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
diff --git a/bsp/stm32/stm32l053-st-nucleo/template.uvprojx b/bsp/stm32/stm32l053-st-nucleo/template.uvprojx new file mode 100644 index 0000000000..a55fde5e8a --- /dev/null +++ b/bsp/stm32/stm32l053-st-nucleo/template.uvprojx @@ -0,0 +1,386 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060300::V5.06 update 3 (build 300)::ARMCC + + + STM32L053R8Tx + STMicroelectronics + Keil.STM32L0xx_DFP.1.6.0 + http://www.keil.com/pack/ + IRAM(0x20000000,0x00002000) IROM(0x08000000,0x00010000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L0xx_64 -FS08000000 -FL010000 -FP0($$Device:STM32L053R8Tx$CMSIS\Flash\STM32L0xx_64.FLM)) + 0 + $$Device:STM32L053R8Tx$Drivers\CMSIS\Device\ST\STM32L0xx\Include\stm32l0xx.h + + + + + + + + + + $$Device:STM32L053R8Tx$CMSIS\SVD\STM32L053x.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 1 + 1 + 1 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP-MPU + DARMCM1.DLL + -pCM0+ + SARMCM3.DLL + -MPU + TARMCM1.DLL + -pCM0+ + + + + 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-M0+" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x2000 + + + 1 + 0x8000000 + 0x10000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x10000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x2000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Source Group 1 + + + + + +
-- GitLab