From 7f0dee37874d5fc9418135563654d1cd8dae961a Mon Sep 17 00:00:00 2001 From: andeyqi Date: Tue, 8 Jan 2019 21:15:13 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E7=AE=80=E4=BB=8B=EF=BC=9ANUCLEO-F446?= =?UTF-8?q?ZE=20=E5=BC=80=E5=8F=91=E6=9D=BF=20BSP=20=E9=80=82=E9=85=8D?= =?UTF-8?q?=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/stm32/stm32f446-st-nucleo/.config | 340 ++ bsp/stm32/stm32f446-st-nucleo/.gitignore | 42 + bsp/stm32/stm32f446-st-nucleo/Kconfig | 21 + bsp/stm32/stm32f446-st-nucleo/README.md | 106 + bsp/stm32/stm32f446-st-nucleo/SConscript | 14 + bsp/stm32/stm32f446-st-nucleo/SConstruct | 58 + .../applications/SConscript | 12 + .../stm32f446-st-nucleo/applications/main.c | 33 + .../board/CubeMX_Config/.mxproject | 17 + .../board/CubeMX_Config/CubeMX_Config.ioc | 138 + .../board/CubeMX_Config/Inc/main.h | 91 + .../CubeMX_Config/Inc/stm32f4xx_hal_conf.h | 451 +++ .../board/CubeMX_Config/Inc/stm32f4xx_it.h | 84 + .../board/CubeMX_Config/Src/main.c | 258 ++ .../CubeMX_Config/Src/stm32f4xx_hal_msp.c | 172 + .../board/CubeMX_Config/Src/stm32f4xx_it.c | 217 ++ bsp/stm32/stm32f446-st-nucleo/board/Kconfig | 40 + .../stm32f446-st-nucleo/board/SConscript | 30 + bsp/stm32/stm32f446-st-nucleo/board/board.c | 57 + bsp/stm32/stm32f446-st-nucleo/board/board.h | 42 + .../board/linker_scripts/link.icf | 28 + .../board/linker_scripts/link.lds | 144 + .../board/linker_scripts/link.sct | 15 + .../stm32f446-st-nucleo/figures/board.jpg | Bin 0 -> 56876 bytes bsp/stm32/stm32f446-st-nucleo/project.ewd | 2834 +++++++++++++++++ bsp/stm32/stm32f446-st-nucleo/project.ewp | 2269 +++++++++++++ bsp/stm32/stm32f446-st-nucleo/project.eww | 10 + bsp/stm32/stm32f446-st-nucleo/project.uvoptx | 997 ++++++ bsp/stm32/stm32f446-st-nucleo/project.uvprojx | 742 +++++ bsp/stm32/stm32f446-st-nucleo/rtconfig.h | 177 + bsp/stm32/stm32f446-st-nucleo/rtconfig.py | 134 + bsp/stm32/stm32f446-st-nucleo/template.ewp | 2040 ++++++++++++ bsp/stm32/stm32f446-st-nucleo/template.eww | 10 + bsp/stm32/stm32f446-st-nucleo/template.uvoptx | 182 ++ .../stm32f446-st-nucleo/template.uvprojx | 415 +++ 35 files changed, 12220 insertions(+) create mode 100644 bsp/stm32/stm32f446-st-nucleo/.config create mode 100644 bsp/stm32/stm32f446-st-nucleo/.gitignore create mode 100644 bsp/stm32/stm32f446-st-nucleo/Kconfig create mode 100644 bsp/stm32/stm32f446-st-nucleo/README.md create mode 100644 bsp/stm32/stm32f446-st-nucleo/SConscript create mode 100644 bsp/stm32/stm32f446-st-nucleo/SConstruct create mode 100644 bsp/stm32/stm32f446-st-nucleo/applications/SConscript create mode 100644 bsp/stm32/stm32f446-st-nucleo/applications/main.c create mode 100644 bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/.mxproject create mode 100644 bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc create mode 100644 bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Inc/main.h create mode 100644 bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h create mode 100644 bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_it.h create mode 100644 bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Src/main.c create mode 100644 bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c create mode 100644 bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_it.c create mode 100644 bsp/stm32/stm32f446-st-nucleo/board/Kconfig create mode 100644 bsp/stm32/stm32f446-st-nucleo/board/SConscript create mode 100644 bsp/stm32/stm32f446-st-nucleo/board/board.c create mode 100644 bsp/stm32/stm32f446-st-nucleo/board/board.h create mode 100644 bsp/stm32/stm32f446-st-nucleo/board/linker_scripts/link.icf create mode 100644 bsp/stm32/stm32f446-st-nucleo/board/linker_scripts/link.lds create mode 100644 bsp/stm32/stm32f446-st-nucleo/board/linker_scripts/link.sct create mode 100644 bsp/stm32/stm32f446-st-nucleo/figures/board.jpg create mode 100644 bsp/stm32/stm32f446-st-nucleo/project.ewd create mode 100644 bsp/stm32/stm32f446-st-nucleo/project.ewp create mode 100644 bsp/stm32/stm32f446-st-nucleo/project.eww create mode 100644 bsp/stm32/stm32f446-st-nucleo/project.uvoptx create mode 100644 bsp/stm32/stm32f446-st-nucleo/project.uvprojx create mode 100644 bsp/stm32/stm32f446-st-nucleo/rtconfig.h create mode 100644 bsp/stm32/stm32f446-st-nucleo/rtconfig.py create mode 100644 bsp/stm32/stm32f446-st-nucleo/template.ewp create mode 100644 bsp/stm32/stm32f446-st-nucleo/template.eww create mode 100644 bsp/stm32/stm32f446-st-nucleo/template.uvoptx create mode 100644 bsp/stm32/stm32f446-st-nucleo/template.uvprojx diff --git a/bsp/stm32/stm32f446-st-nucleo/.config b/bsp/stm32/stm32f446-st-nucleo/.config new file mode 100644 index 0000000000..1e648651f4 --- /dev/null +++ b/bsp/stm32/stm32f446-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=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +CONFIG_RT_VER_NUM=0x40000 +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M4=y +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 + +# +# C++ features +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Command shell +# +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_CMD_SIZE=80 +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_USING_MSH_DEFAULT=y +CONFIG_FINSH_USING_MSH_ONLY=y +CONFIG_FINSH_ARG_MAX=10 + +# +# Device virtual file system +# +# CONFIG_RT_USING_DFS is not set + +# +# Device Drivers +# +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_PIPE_BUFSZ=512 +CONFIG_RT_USING_SERIAL=y +CONFIG_RT_SERIAL_USING_DMA=y +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_MTD is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set + +# +# Using WiFi +# +# CONFIG_RT_USING_WIFI is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# POSIX layer and C standard library +# +# CONFIG_RT_USING_LIBC is not set +# CONFIG_RT_USING_PTHREADS is not set + +# +# Network +# + +# +# Socket abstraction layer +# +# CONFIG_RT_USING_SAL is not set + +# +# light weight TCP/IP stack +# +# CONFIG_RT_USING_LWIP is not set + +# +# Modbus master and slave stack +# +# CONFIG_RT_USING_MODBUS is not set + +# +# AT commands +# +# CONFIG_RT_USING_AT is not set + +# +# VBUS(Virtual Software BUS) +# +# CONFIG_RT_USING_VBUS is not set + +# +# Utilities +# +# CONFIG_RT_USING_LOGTRACE is not set +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set + +# +# ARM CMSIS +# +# CONFIG_RT_USING_CMSIS_OS is not set +# CONFIG_RT_USING_RTT_CMSIS is not set +# CONFIG_RT_USING_LWP is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_EZXML is not set +# CONFIG_PKG_USING_NANOPB is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_AT_DEVICE is not set + +# +# 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_PERSIMMON is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_FAL is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set + +# +# 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_STM32F4=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_STM32F446ZE=y + +# +# Onboard Peripheral Drivers +# + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART1=y +# CONFIG_BSP_UART1_RX_USING_DMA is not set + +# +# Board extended module Drivers +# diff --git a/bsp/stm32/stm32f446-st-nucleo/.gitignore b/bsp/stm32/stm32f446-st-nucleo/.gitignore new file mode 100644 index 0000000000..7221bde019 --- /dev/null +++ b/bsp/stm32/stm32f446-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/stm32f446-st-nucleo/Kconfig b/bsp/stm32/stm32f446-st-nucleo/Kconfig new file mode 100644 index 0000000000..d174bcc585 --- /dev/null +++ b/bsp/stm32/stm32f446-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/stm32f446-st-nucleo/README.md b/bsp/stm32/stm32f446-st-nucleo/README.md new file mode 100644 index 0000000000..e91f1ef45a --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/README.md @@ -0,0 +1,106 @@ +# NUCLEO-F446ZE 开发板 BSP 说明 + +## 简介 + +本文档为 NUCLEO-F446ZE 开发板的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。 + +## 开发板介绍 + +NUCLEO-F446ZE 是 ST 公司推出的一款针对 STM32F4 系列设计的 Cortex-M4 Nucleo-144 开发板,支持 mbed,兼容 Arduino、还带有ST Zio和 ST Morpho 扩展接口,可连接微控制器的所有周边外设。 + +开发板外观如下图所示: + +![board](figures/board.jpg) + +该开发板常用 **板载资源** 如下: + +- MCU:STM32f446ZE,主频 180MHz,512KB FLASH ,128KB RAM +- 常用外设 + - LED:3个,LED1 (绿色,PB0),LED2(蓝色,PB7),LED3(红色,PB14) +- 常用接口:USB 转串口 +- 调试接口,标准 ST-LINK/SWD + +开发板更多详细信息请参考【NUCLEO-F446ZE】 [开发板介绍](https://www.st.com/zh/evaluation-tools/nucleo-f446ze.html)。 + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :----------------- | :----------: | :------------------------------------- | +| USB 转串口 | 支持 | | +| **片上外设** | **支持情况** | **备注** | +| GPIO | 支持 | | +| UART | 支持 | UART1 | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + + +### 快速上手 + +本 BSP 为开发者提供 MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线连接开发板到 PC,通过数据线对开发板供电,下载,调试。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 ST-LINK 仿真器下载程序,在通过 ST-LINK 连接开发板的基础上,点击下载按钮即可下载程序到开发板 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,蓝色的 LED2 以 500MS 周期闪烁。 + +连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + +```bash + \ | / +- RT - Thread Operating System + / | \ 4.0.0 build Jan 7 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=mdk4/mdk5/iar` 命令重新生成工程。 + +本章节更多详细的介绍请参考 [STM32 系列 BSP 外设驱动使用教程](../docs/STM32系列BSP外设驱动使用教程.md)。 + +## 注意事项 + +- 默认终端输出设备是 UART1 + +## 联系人信息 + +维护人: + +- 邮箱: \ No newline at end of file diff --git a/bsp/stm32/stm32f446-st-nucleo/SConscript b/bsp/stm32/stm32f446-st-nucleo/SConscript new file mode 100644 index 0000000000..fe0ae941ae --- /dev/null +++ b/bsp/stm32/stm32f446-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/stm32f446-st-nucleo/SConstruct b/bsp/stm32/stm32f446-st-nucleo/SConstruct new file mode 100644 index 0000000000..c1609bf526 --- /dev/null +++ b/bsp/stm32/stm32f446-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 = ['$LINK $SOURCES $LINKFLAGS -o $TARGET --map rt-thread.map']) + +Export('RTT_ROOT') +Export('rtconfig') + +SDK_ROOT = os.path.abspath('./') + +if os.path.exists(SDK_ROOT + '/libraries'): + libraries_path_prefix = SDK_ROOT + '/libraries' +else: + libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries' + +SDK_LIB = libraries_path_prefix +Export('SDK_LIB') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +stm32_library = 'STM32F4xx_HAL' +rtconfig.BSP_LIBRARY_TYPE = stm32_library + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, stm32_library, 'SConscript'))) + +# include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'HAL_Drivers', 'SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/stm32/stm32f446-st-nucleo/applications/SConscript b/bsp/stm32/stm32f446-st-nucleo/applications/SConscript new file mode 100644 index 0000000000..6f66f7ab73 --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/applications/SConscript @@ -0,0 +1,12 @@ +import rtconfig +from building import * + +cwd = GetCurrentDir() +CPPPATH = [cwd, str(Dir('#'))] +src = Split(""" +main.c +""") + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/stm32/stm32f446-st-nucleo/applications/main.c b/bsp/stm32/stm32f446-st-nucleo/applications/main.c new file mode 100644 index 0000000000..20fa5347c0 --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/applications/main.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift change to new framework + */ + +#include +#include +#include +#include "drv_gpio.h" +/* defined the LED2 pin: PB7 */ +#define LED2_PIN GET_PIN(B, 7) + +int main(void) +{ + int count = 1; + /* set LED2 pin mode to output */ + rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT); + + while (count++) + { + rt_pin_write(LED2_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED2_PIN, PIN_LOW); + rt_thread_mdelay(500); + } + + return RT_EOK; +} diff --git a/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/.mxproject new file mode 100644 index 0000000000..83971d2ca2 --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/.mxproject @@ -0,0 +1,17 @@ +[PreviousGenFiles] +HeaderPath=Y:/rt-thread-master/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Inc +HeaderFiles=stm32f4xx_it.h;stm32f4xx_hal_conf.h;main.h; +SourcePath=Y:/rt-thread-master/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Src +SourceFiles=stm32f4xx_it.c;stm32f4xx_hal_msp.c;main.c; + +[PreviousLibFiles] +LibFiles=Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f446xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;Drivers/CMSIS/Include/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; + +[PreviousUsedIarFiles] +SourceFiles=..\Src\main.c;..\Src\stm32f4xx_it.c;..\Src\stm32f4xx_hal_msp.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;../\Src/system_stm32f4xx.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;../\Src/system_stm32f4xx.c;../Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;null; +HeaderPath=..\Drivers\STM32F4xx_HAL_Driver\Inc;..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32F4xx\Include;..\Drivers\CMSIS\Include;..\Inc; + +[PreviousUsedKeilFiles] +SourceFiles=..\Src\main.c;..\Src\stm32f4xx_it.c;..\Src\stm32f4xx_hal_msp.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;../\Src/system_stm32f4xx.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;../\Src/system_stm32f4xx.c;../Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;null; +HeaderPath=..\Drivers\STM32F4xx_HAL_Driver\Inc;..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32F4xx\Include;..\Drivers\CMSIS\Include;..\Inc; + diff --git a/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc b/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc new file mode 100644 index 0000000000..ea2f9755c5 --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc @@ -0,0 +1,138 @@ +#MicroXplorer Configuration settings - do not modify +File.Version=6 +KeepUserPlacement=false +Mcu.Family=STM32F4 +Mcu.IP0=NVIC +Mcu.IP1=RCC +Mcu.IP2=SYS +Mcu.IP3=USART1 +Mcu.IPNb=4 +Mcu.Name=STM32F446Z(C-E)Tx +Mcu.Package=LQFP144 +Mcu.Pin0=PC14-OSC32_IN +Mcu.Pin1=PC15-OSC32_OUT +Mcu.Pin2=PH0-OSC_IN +Mcu.Pin3=PH1-OSC_OUT +Mcu.Pin4=PA9 +Mcu.Pin5=PA10 +Mcu.Pin6=PA13 +Mcu.Pin7=PA14 +Mcu.Pin8=VP_SYS_VS_Systick +Mcu.PinsNb=9 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32F446ZETx +MxCube.Version=5.0.1 +MxDb.Version=DB.5.0.1 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false +PA10.Mode=Asynchronous +PA10.Signal=USART1_RX +PA13.Mode=Serial_Wire +PA13.Signal=SYS_JTMS-SWDIO +PA14.Mode=Serial_Wire +PA14.Signal=SYS_JTCK-SWCLK +PA9.Mode=Asynchronous +PA9.Signal=USART1_TX +PC14-OSC32_IN.Mode=LSE-External-Oscillator +PC14-OSC32_IN.Signal=RCC_OSC32_IN +PC15-OSC32_OUT.Mode=LSE-External-Oscillator +PC15-OSC32_OUT.Signal=RCC_OSC32_OUT +PCC.Checker=false +PCC.Line=STM32F446 +PCC.MCU=STM32F446Z(C-E)Tx +PCC.PartNumber=STM32F446ZETx +PCC.Seq0=0 +PCC.Series=STM32F4 +PCC.Temperature=25 +PCC.Vdd=null +PH0-OSC_IN.Mode=HSE-External-Oscillator +PH0-OSC_IN.Signal=RCC_OSC_IN +PH1-OSC_OUT.Mode=HSE-External-Oscillator +PH1-OSC_OUT.Signal=RCC_OSC_OUT +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32F446ZETx +ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.23.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=EWARM V8 +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true +RCC.AHBFreq_Value=180000000 +RCC.APB1CLKDivider=RCC_HCLK_DIV4 +RCC.APB1Freq_Value=45000000 +RCC.APB1TimFreq_Value=90000000 +RCC.APB2CLKDivider=RCC_HCLK_DIV2 +RCC.APB2Freq_Value=90000000 +RCC.APB2TimFreq_Value=180000000 +RCC.CECFreq_Value=32786.88524590164 +RCC.CortexFreq_Value=180000000 +RCC.FCLKCortexFreq_Value=180000000 +RCC.FMPI2C1Freq_Value=45000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=180000000 +RCC.HSE_VALUE=8000000 +RCC.I2S1Freq_Value=48000000 +RCC.I2S2Freq_Value=48000000 +RCC.IPParameters=AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CECFreq_Value,CortexFreq_Value,FCLKCortexFreq_Value,FMPI2C1Freq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,I2S1Freq_Value,I2S2Freq_Value,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLI2SPCLKFreq_Value,PLLI2SQCLKFreq_Value,PLLI2SRCLKFreq_Value,PLLI2SoutputFreq_Value,PLLM,PLLN,PLLQCLKFreq_Value,PLLRCLKFreq_Value,PLLSAIPCLKFreq_Value,PLLSAIQCLKFreq_Value,PLLSAIoutputFreq_Value,PLLSourceVirtual,PWRFreq_Value,SAIAFreq_Value,SAIBFreq_Value,SDIOFreq_Value,SPDIFRXFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,USBFreq_Value,VCOI2SInputFreq_Value,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAIInputFreq_Value,VCOSAIOutputFreq_Value +RCC.MCO2PinFreq_Value=180000000 +RCC.PLLCLKFreq_Value=180000000 +RCC.PLLI2SPCLKFreq_Value=48000000 +RCC.PLLI2SQCLKFreq_Value=48000000 +RCC.PLLI2SRCLKFreq_Value=48000000 +RCC.PLLI2SoutputFreq_Value=48000000 +RCC.PLLM=4 +RCC.PLLN=180 +RCC.PLLQCLKFreq_Value=180000000 +RCC.PLLRCLKFreq_Value=180000000 +RCC.PLLSAIPCLKFreq_Value=48000000 +RCC.PLLSAIQCLKFreq_Value=48000000 +RCC.PLLSAIoutputFreq_Value=48000000 +RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE +RCC.PWRFreq_Value=180000000 +RCC.SAIAFreq_Value=48000000 +RCC.SAIBFreq_Value=48000000 +RCC.SDIOFreq_Value=180000000 +RCC.SPDIFRXFreq_Value=180000000 +RCC.SYSCLKFreq_VALUE=180000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.USBFreq_Value=180000000 +RCC.VCOI2SInputFreq_Value=500000 +RCC.VCOI2SOutputFreq_Value=96000000 +RCC.VCOInputFreq_Value=2000000 +RCC.VCOOutputFreq_Value=360000000 +RCC.VCOSAIInputFreq_Value=500000 +RCC.VCOSAIOutputFreq_Value=96000000 +USART1.IPParameters=VirtualMode +USART1.VirtualMode=VM_ASYNC +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +board=custom diff --git a/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Inc/main.h new file mode 100644 index 0000000000..9d41187606 --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Inc/main.h @@ -0,0 +1,91 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32f4xx_hal.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h b/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h new file mode 100644 index 0000000000..15f9b6ae02 --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h @@ -0,0 +1,451 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf.h + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2019 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CONF_H +#define __STM32F4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED + +/* #define HAL_ADC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +/* #define HAL_CAN_MODULE_ENABLED */ +/* #define HAL_CRC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +/* #define HAL_DAC_MODULE_ENABLED */ +/* #define HAL_DCMI_MODULE_ENABLED */ +/* #define HAL_DMA2D_MODULE_ENABLED */ +/* #define HAL_ETH_MODULE_ENABLED */ +/* #define HAL_NAND_MODULE_ENABLED */ +/* #define HAL_NOR_MODULE_ENABLED */ +/* #define HAL_PCCARD_MODULE_ENABLED */ +/* #define HAL_SRAM_MODULE_ENABLED */ +/* #define HAL_SDRAM_MODULE_ENABLED */ +/* #define HAL_HASH_MODULE_ENABLED */ +/* #define HAL_I2C_MODULE_ENABLED */ +/* #define HAL_I2S_MODULE_ENABLED */ +/* #define HAL_IWDG_MODULE_ENABLED */ +/* #define HAL_LTDC_MODULE_ENABLED */ +/* #define HAL_RNG_MODULE_ENABLED */ +/* #define HAL_RTC_MODULE_ENABLED */ +/* #define HAL_SAI_MODULE_ENABLED */ +/* #define HAL_SD_MODULE_ENABLED */ +/* #define HAL_MMC_MODULE_ENABLED */ +/* #define HAL_SPI_MODULE_ENABLED */ +/* #define HAL_TIM_MODULE_ENABLED */ +#define HAL_UART_MODULE_ENABLED +/* #define HAL_USART_MODULE_ENABLED */ +/* #define HAL_IRDA_MODULE_ENABLED */ +/* #define HAL_SMARTCARD_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ +/* #define HAL_PCD_MODULE_ENABLED */ +/* #define HAL_HCD_MODULE_ENABLED */ +/* #define HAL_DSI_MODULE_ENABLED */ +/* #define HAL_QSPI_MODULE_ENABLED */ +/* #define HAL_QSPI_MODULE_ENABLED */ +/* #define HAL_CEC_MODULE_ENABLED */ +/* #define HAL_FMPI2C_MODULE_ENABLED */ +/* #define HAL_SPDIFRX_MODULE_ENABLED */ +/* #define HAL_DFSDM_MODULE_ENABLED */ +/* #define HAL_LPTIM_MODULE_ENABLED */ +/* #define HAL_EXTI_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature.*/ +/** + * @brief External Low Speed oscillator (LSE) value. + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) + #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 1U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 2U +#define MAC_ADDR1 0U +#define MAC_ADDR2 0U +#define MAC_ADDR3 0U +#define MAC_ADDR4 0U +#define MAC_ADDR5 0U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848_PHY_ADDRESS Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY ((uint32_t)0x000000FFU) +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU) + +#define PHY_READ_TO ((uint32_t)0x0000FFFFU) +#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU) + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ +#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */ + +#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver +* Activated: CRC code is present inside driver +* Deactivated: CRC code cleaned from driver +*/ + +#define USE_SPI_CRC 0U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32f4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED + #include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED + #include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32f4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED + #include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED + #include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32f4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_CONF_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_it.h b/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_it.h new file mode 100644 index 0000000000..7a788c296b --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_it.h @@ -0,0 +1,84 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_IT_H +#define __STM32F4xx_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Src/main.c new file mode 100644 index 0000000000..11a7826387 --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Src/main.c @@ -0,0 +1,258 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +UART_HandleTypeDef huart1; + +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_USART1_UART_Init(void); +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_USART1_UART_Init(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /**Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 4; + RCC_OscInitStruct.PLL.PLLN = 180; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /**Activate the Over-Drive mode + */ + if (HAL_PWREx_EnableOverDrive() != HAL_OK) + { + Error_Handler(); + } + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief USART1 Initialization Function + * @param None + * @retval None + */ +static void MX_USART1_UART_Init(void) +{ + + /* USER CODE BEGIN USART1_Init 0 */ + + /* USER CODE END USART1_Init 0 */ + + /* USER CODE BEGIN USART1_Init 1 */ + + /* USER CODE END USART1_Init 1 */ + huart1.Instance = USART1; + huart1.Init.BaudRate = 115200; + huart1.Init.WordLength = UART_WORDLENGTH_8B; + huart1.Init.StopBits = UART_STOPBITS_1; + huart1.Init.Parity = UART_PARITY_NONE; + huart1.Init.Mode = UART_MODE_TX_RX; + huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart1.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART1_Init 2 */ + + /* USER CODE END USART1_Init 2 */ + +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + + /* 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/stm32f446-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c b/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c new file mode 100644 index 0000000000..a299f50c87 --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c @@ -0,0 +1,172 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : stm32f4xx_hal_msp.c + * Description : This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/** +* @brief UART MSP Initialization +* This function configures the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspInit(UART_HandleTypeDef* huart) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(huart->Instance==USART1) + { + /* USER CODE BEGIN USART1_MspInit 0 */ + + /* USER CODE END USART1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN USART1_MspInit 1 */ + + /* USER CODE END USART1_MspInit 1 */ + } + +} + +/** +* @brief UART MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ + +void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) +{ + + if(huart->Instance==USART1) + { + /* USER CODE BEGIN USART1_MspDeInit 0 */ + + /* USER CODE END USART1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART1_CLK_DISABLE(); + + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); + + /* USER CODE BEGIN USART1_MspDeInit 1 */ + + /* USER CODE END USART1_MspDeInit 1 */ + } + +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_it.c b/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_it.c new file mode 100644 index 0000000000..5973f7fddb --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_it.c @@ -0,0 +1,217 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32f4xx_it.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex-M4 Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } +} + +/** + * @brief This function handles Pre-fetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVCall_IRQn 0 */ + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32F4xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file (startup_stm32f4xx.s). */ +/******************************************************************************/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f446-st-nucleo/board/Kconfig b/bsp/stm32/stm32f446-st-nucleo/board/Kconfig new file mode 100644 index 0000000000..70a73de979 --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/board/Kconfig @@ -0,0 +1,40 @@ +menu "Hardware Drivers Config" + +config SOC_STM32F446ZE + bool + select SOC_SERIES_STM32F4 + default y + +menu "Onboard Peripheral Drivers" + +endmenu + +menu "On-chip Peripheral Drivers" + + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default y + + menuconfig BSP_USING_UART + bool "Enable UART" + default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y + + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default n + endif + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/stm32/stm32f446-st-nucleo/board/SConscript b/bsp/stm32/stm32f446-st-nucleo/board/SConscript new file mode 100644 index 0000000000..71980008cb --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/board/SConscript @@ -0,0 +1,30 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +CubeMX_Config/Src/stm32f4xx_hal_msp.c +''') + +path = [cwd] +path += [cwd + '/CubeMX_Config/Inc'] + +startup_path_prefix = SDK_LIB + +if rtconfig.CROSS_TOOL == 'gcc': + src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f446xx.s'] +elif rtconfig.CROSS_TOOL == 'keil': + src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f446xx.s'] +elif rtconfig.CROSS_TOOL == 'iar': + src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f446xx.s'] + +CPPDEFINES = ['STM32F446xx'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') \ No newline at end of file diff --git a/bsp/stm32/stm32f446-st-nucleo/board/board.c b/bsp/stm32/stm32f446-st-nucleo/board/board.c new file mode 100644 index 0000000000..6e54a24ff2 --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/board/board.c @@ -0,0 +1,57 @@ +/* + * 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 + * 2019-01-08 AndeyQi first version + */ + +#include "board.h" + +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /**Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 4; + RCC_OscInitStruct.PLL.PLLN = 180; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLR = 2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /**Activate the Over-Drive mode + */ + if (HAL_PWREx_EnableOverDrive() != HAL_OK) + { + Error_Handler(); + } + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) + { + Error_Handler(); + } +} diff --git a/bsp/stm32/stm32f446-st-nucleo/board/board.h b/bsp/stm32/stm32f446-st-nucleo/board/board.h new file mode 100644 index 0000000000..bd9c494412 --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/board/board.h @@ -0,0 +1,42 @@ +/* + * 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 + * 2019-01-08 AndeyQi first version + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include +#include "drv_common.h" + +#define STM32_FLASH_START_ADRESS ((uint32_t)0x08000000) +#define STM32_FLASH_SIZE (512 * 1024) +#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE)) + +#define STM32_SRAM_SIZE 128 +#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024) + +#if defined(__CC_ARM) || defined(__CLANG_ARM) +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN (&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="CSTACK" +#define HEAP_BEGIN (__segment_end("CSTACK")) +#else +extern int __bss_end; +#define HEAP_BEGIN (&__bss_end) +#endif + +#define HEAP_END STM32_SRAM_END + +void SystemClock_Config(void); + +#endif + diff --git a/bsp/stm32/stm32f446-st-nucleo/board/linker_scripts/link.icf b/bsp/stm32/stm32f446-st-nucleo/board/linker_scripts/link.icf new file mode 100644 index 0000000000..f6b6ffd23b --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/board/linker_scripts/link.icf @@ -0,0 +1,28 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; +/*-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/stm32f446-st-nucleo/board/linker_scripts/link.lds b/bsp/stm32/stm32f446-st-nucleo/board/linker_scripts/link.lds new file mode 100644 index 0000000000..21d57b9d71 --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/board/linker_scripts/link.lds @@ -0,0 +1,144 @@ +/* + * linker script for STM32F4xx with GNU ld + * bernard.xiong 2009-10-14 + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08000000, LENGTH = 512k /* 512KB flash */ + RAM (rw) : ORIGIN = 0x20000000, LENGTH = 128k /* 128K sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x200; + +SECTIONS +{ + .text : + { + . = ALIGN(4); + _stext = .; + KEEP(*(.isr_vector)) /* Startup code */ + + . = ALIGN(4); + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + + . = ALIGN(4); + _etext = .; + } > ROM = 0 + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > ROM + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >RAM + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } >RAM + + __bss_start = .; + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + + *(.bss.init) + } > RAM + __bss_end = .; + + _end = .; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} diff --git a/bsp/stm32/stm32f446-st-nucleo/board/linker_scripts/link.sct b/bsp/stm32/stm32f446-st-nucleo/board/linker_scripts/link.sct new file mode 100644 index 0000000000..5d1e3e6c00 --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/board/linker_scripts/link.sct @@ -0,0 +1,15 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00080000 { ; load region size_region + ER_IROM1 0x08000000 0x00080000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_IRAM1 0x20000000 0x00020000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/bsp/stm32/stm32f446-st-nucleo/figures/board.jpg b/bsp/stm32/stm32f446-st-nucleo/figures/board.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ea7026c25061f3706436060684488a1ccf270601 GIT binary patch literal 56876 zcmbSy2UJtR({B(2rAm?BK~RuR=uHt25RhI2(g`7i-ixAubO9*_1d(1sq)V6HLAvzb zTS5)}#eezUJMVnwo&WbXcTaL}W_IVdJ2Q9g?B3fyw~K%WYRan002~|~z#HrbaJvMc zR`LPc0RS2r03HAUa1UFt<#rc9{=(B5;tRk5;9<{g{*vM*J9v1wNC^lyyYpMxz^rWf ztzl3BA4?YjA$~ytfQ-D4i={Qh)`Qi`)*kFE%YIPb%+3n7k!3doY6xn$DB3!JU;4S( z>iTKwS^Gh(C2iQ{K$!OI9DKle4>&k1YE?T9?B9{(D(~o%J6i9uQgf zXMek8HPU#^st9wlWd-t!@mULr2(yYy@(Teag(XCvvI+|di3tdb3J6K^35iHy4^ctZ ze-(CYclTx7Z0w|TUMT;oH|&`#`@e8`dwcVHi}1tT?6KUEk^+Ll0>Z+4SPDLOUuO?X zA3kSyj(@cA&qiL@x?8(}T|B@rXV$-sT3W$8J!ILj;{Fo{)I~$%zuNw9#|#Sn3+^A( z?jAa}|67v(mfBs<*Tq&q$JQO@>1J(#3Yn}LPF1gNTM0fPAzLv%D=|@PK3idNYe{iCYinCE zVRnJP%6MN!;IHQVADZ+J75&FWtd9OQ4}t%(kH2UCWn;F^HnQB_-12g_GXO=v9UPp$ z$G-~hUEIF~9}f@rE&)CP!QXoCKGFSq_XzJ15D=0O5)u((3&DL-G7@6azrX)B@|XQD z7xo~&M{w^i#s93_{sNHS!zsWC#l>L<+#$!oCC9mK2e1GDICrrQ=daKCSHZc1i+2|v zD-t0QmZ0hZR(xFCJ6K`w;$fW)P9XMw03P{W3O1o<_>|g~1njO3ngWhm#S*Idin;2M#d)AHnw*54q!)j z4^J;|A78)sA40>zKSo3*Bz{gxPD%X&|DK(bo0nfuSX5q7Syf&0v$n3at-YhOtGlOn zWOQtNV)D<_^wRRm>e~9o=GHd)@aXvD^bB);@fQ~k0QaA;{tMavg^L`E>kf7f@Cg3m z!nxy(t+?cPciDvSDV}K)Sh`ZO3%|QZ^*lbStmQt3hz{zZmD?~OHK*v(BlKTr|3LPi z0So#6LiS(4{x_~^05L8OcJgq^0rG(BtM8GI0srG#?0AvmCzj;yE9ezAA(qt2zdoJK zjoYkt1T{U)DH~aiG&*MT+h%x+q*S6v*ly#QagUGRQ7BE`DAYE8#=5#{G?mHs6bZ#!nD&mY6n?vmRy`Mj$%TzM)Tji$?o=NXjxvT~y|N61e%oSXC$%`316{E;=<-?xPywg2cZu!TJlQ^w&) zyxv8d&l@U7X!lOUAC~*8n1@hRTslRDm1%rYY+RSlKLtT^ROp~IZyLsy3V?d%6 zS18BV-{o_v4HYYp zE$Zz1NK$oU;^^w+4q|`+E%z<^<~fbU*;LUPGv7F^jU$cq=6aLGb?q%+F>9Xe`qREg zU+@FSA;v54xhi{@>K>PnnQ)F9Q<^n&k%K(5uEZ}PhfD`UeyOn8%ydHumg5~+{h9V^ zjQwqgv}xTn(vR)v0kr4&K+KvpGiFPNy@Uur!-4L4rMI!(`U zj~7F30i+H=zcVX6EGlYREGT_;+D-EE>cm5LGfp>^#2&>Pe&<@ovEv3%4g}O(GTj1N zTmo1wt#5`+U~M4&t}YX~suCmh0^`15L2{}X#c~N+p0$@81;8a1lx}duJUiNAw*`Hv z+JMH-63cYGJI&X)J8zqtS~G^Qj_cEW9uT{@7%+Ea!4TZSk7)2jWuE@T;QB8|aK)KH z8O-aV%|I%$ZBupB)n0_{ono;Z&>Z4`Z}bgEyf=gGufOdHfY(+t&lgsQ3B_g7aI=G=p~wagZP7=Prwl?O)CYCB=NTZ*=b~(tH(xK-^wijI^95YbN?J2 zWr!KL6mc-w_=sE`14b3@C-{H4Q~Xo)i(x3h1;A+7Y(ji_InpmY{-J%WbxifAIQ7J& z=Cp$!ow-99hR0~zP`i+}hr3S4P<5&*=+r5LD~)k>K6v32NSfvGyL}sYpW{>EH1h^{ z)l8t>^qQvQ;!($1Y_Yv> z;G^P4(YoqS4a%7XA303=M5GpQ=gWBJhW{$;d7|8NvetYuxgQvfuKk{^X+Eghit`o_(zZE$5Pm{pt%43KnP6rdB|nIcFA=Uhg6cVZ7f5?gP7I<#;<;NeWA#8y z-ZGBrO5r*O2%~YJPfjZUOMNaA!w&Iqg2O0jE}k)YaroI`xj%^51R&Z{;LXmMz*qBJJ_pXYh>7WnP~X zB1s!B-8CuVfSjvZNr@r4(#~z)yCul=UN7bTd!M7`!}aogo`8 zWbzue-+*fb{F5w9FDJ&GPyI|i%T|K;(I4h{F_J|ZBps{DV&q@Um)hj}dfvR8Ng!jA zyyBH!nrzchZ_BI{_;>}rZgdUI^$AxW-TO9z$HE`asa=quACUer#aO*|@ zW4&xQx_dk^I(@kQct*2YC@rD(ZX|QS;8z#by=cSETL5{0E}B6bv#@vzV1zK=hmSWr z@vEth-!eFQ;hZ4O{7UycfidhgQOq||700zflp1aFR!dIC+}FCBN2qZP-NXH}O^vY>Bnq^NC<=Q|gAL4w)!QWVH+DFn+ z@2fL6!~io20_E1M;Ngw}w=BvA3zxMhA*er?l-BBths~k8?ey*)5UIejN3R*XZM@FM zqAfKA-8+0e1l`?qK7(q;J$|2ZM|^-id=!YtJ*c|^UTFo?q68w=E=805dU-mH%#=hE z#HVp)6?yH2ew-7yD8ODT-vT0^ejBMwt~K?KD&%lDQ%-zoROm^nFf05#nPc){_P2$t zTR{EjUVe=+8wqWVavN8_Gwm(FoLfg%N1b-{cRPBkM$OcpiYPk1ifWRfC{?^ykwDfz%Sh}!yy*gE zFj-+LlSW@m;;uA@NRhRE#qTm7;Rg;?Z;}xkT%M?|hb9=0h^y)kayB{#l4`cAzD3^`NyaW$(OcY?0Thjh~@0s=kXPf16(G&%WGL zK7{h4GN-VzH@@^(=GjYRdX*MFCaRrg(h&Y?c&589sUMeuq#|BOnCt!`F-n2^5c%>N zj&SDlSRhh$EdYV|CQ5B;YLX?!ohUt4dY^xzHakk`^B=dPr5D}OcO7oY-SOXZC^nfh zU*PRDgj@0If6GJCmwm1rO`fgRJo0W9SMr}xH($^nR(g2EJ$9E$Tj4*gj5Qs*!L5(e z>H_oRH!L0o_%zivqrIx~W;zOa`AeP0E#LN#w9>x5qn5cO`-~xspa6JU)6tSiq;dqt0~&i_dV4IornM<4ba~IC#Z; z^(IeGP;iRR=*k}muAIE0I$AntQ%{rrfVRuZn`$coZPrk#4hcYPA{ujfrZ!g}uNoF!;bHFQT#;h<2;O`6gEaZLRg5gl;p_VN zFFsWUJv;nu`Anf-D0BXfR=xn5d+D+1T7v+tBPqYYEH5E1Xe&)u-+eK%5nH!tpnbAJz~u8v zjw_F!P^K&@DbcL4QnN2D@7jCpNaU#|5z+f%$)iE-_lX(O_|0X}Y~GVYNV6*q(+PnU%X@vcICq^INr zM0z~sY=0)&`!eG8%LsxFzp%u`0k`Et zD7$h3gK}+uA8tan2rH`)9o^vlPDpW-Tp4j2iDtvtjFzcMZ(lVWcqD@)*?z;bmRgre z$p4vAZBWzD+k1Sc2%?z=slAv(aWAS}k;eU!V}`2T0`x0TGXox6vAw|PK39=Yuzu7- zTxtDJ$vsYQNg+E?LSL^&H4f0 zzSA^2`fH{}t_?WZ@t~O4G~XoPFbeKGQNQl(WeTdsMyFxvL_Cx&{!X&unj(6u+1|VY z_EZUp<5Qfa<8!5Fqv4pZ$gb=w)$rGFTAT1!KVrd|yK*)=3~Jj3l2UKdY0MHs@o=Ii zQ?8`1zsXP*`H0O!<&B!go;o|Phs>)(cp=yj8TIp{GS$A(8GB5=1g&JJO4XGTN@FsD z1Fkfd+)2kCdsia(Q?jjG5Px$whARTE+sr=xog!t+u~qp+2+QHOwcq z5Hou7#7ER&lFYKeY|i&0(M0Wg?^Jfos!qwB%k3Z$j47(CHHh`n zo#gq^t4WGyG8di&ht9d2PZex%&q#l_OK_~MMDCI8E-WsP8iT;aD@J=ZaoXaC&NX0q z>38W##Ddw}Z=1jBPu>FT;=-j)s%uHJmRCHkV_^X#jYmyVHmP% zKyBo(7kqpKA*l_!PnY!R=d4}|Z-TxXE_7p^ISH#1D6I0og9KMu{31G_nRBQiN6t92 zSHHJOq$0e;b3}KAziwkl-DjBeCNw&B4{8Y_#|(j&1D`{|RazKz>lrs@7U6kSD`Hl= zNCoAwr>b2~6b|$;xdRmp)3^*W#M8j9BMsf~e3Fv)ho?N;<1@ zH9AU$v!k=YJRGYGHL?Uq5OAhP&R!#q)wQA*?#lmodIB+(1o|dBl;%8d z#S3}1F1K*NYw6=K8cQ=&DOc$y&5-E%hvhyc|>IF>0ZWH^s|d zGt8`iOX51wVU=X8nZuu7@7h?SIaD{gQM+S_l3=mb45Q8$sF)V|nmDbh%3Gar6H}>; z>bjz#S(J}$0OfDiiB?bgRcA|^{!u>FQDjWPSNMTU9e$hEa@iG~(c1J4lZ{?c#i*hn z=4h{cYe5*vmYbvD1a%SDXI~!*6^5%qHUo)nR#*7d8ip4;wag>OnNiak$0>;*Q;gT5 zc^|H$|51dFI<(E6%`gmbs5R0wjoDZR$@O*CO@?`DQ3FfABDU5}7$hry?(^*-^zSD< z2+4gF7522_UDups_j=3ERtlq<-f{SPU2}58K~vw@ZvP_#ooJNYg|}8p{7kU_JVb9C z;oaPpEobo?`v~1=LHr2a5t~yd5XBj#7yQU7a^@^vRpk3hpRlj53`MV&X43Iw*p+;N z%5pQgPhV@D?8$tsd+D?z%(gHzQXIEGqPm+(^@kGMrzf+5R02;S8`ngqrq`*?S*V<8 zGgo8B$rN`-uaqcTX3SOLiw}E@th%_Nyy?Wp%S~@l3$X#xE5TutO;3g!EG?l+&7}Pk zXWq%ld`_i*l(-b>bmMC!aemzYMYmG(wExYfewKkFzvJZiC34X+nPSbTQ|&G+ec$+(uz8eh=vQMD zGuD)-3|lk5|EDqLUpj1@IWe{5FjF&~ePh?4-X0{^{QF90qBy4y_{CwEU*QdHd16cF z{q9bYuAuR~W*V|9-Ph<_fPm{Qz~p@AG_*Es)}c?VFfjLg!9ib8+1T#faLoyKCuwWI zpDxg0B=^Z6k9p}_l}t%%s9Je6c%bFLBe8DJ4tVoe(es-Eb+cne_VrM+X{Z2y8-vH5IO+Q)m*r5*U1KAhI2_ikL8Aw#$rc|FWzsbg{z zdn}9+gz0)6r~TVYSi|~`*-L6mfjL(;yj{jpWytTr!eJvveQ;&^nm3b$Ku6w;$-oX` z(jLam)^3#{R!ZMsGyZr=v**d&vs$3P`I#yw0xWL(xaP8E`4%wcMmGI^@t`gBgh*C3 zQ+?DDOy9ftf|ZXE57oAQnU8nJr_0?u|57k$2pdUMG{v~*Y)u%VjZ}$sDr=5>M^y!t zx@Ua`&0o6^%;Ca&Q374J0KzMLjL71YjCBb%o({~NF5*!JsOiJZZ>x5NcJ$J6=J`mStolRU}D{dw@ryGU|{~&5O-A1!|wEd8)w5 z)KQKaj}d&OaM1S2?0NBN*Y$^|S74O)GBAgJY%IHy4qRpP0I&heHR4r8S~ z5=-H8ZSLq*`fB%Bu0M_;7W#S^pzGhoP0tuVU2`M>JI!>^>5Qai@JA9;l0?URv=9}Y^{({*@B zo$Yxp$>aEV9lajUOVcvd;L)&A;ki08`JQ6`TI$m`^h7NS^UTgfCdtX>3dS9>EWuh< zbNT4=rw=#7i9Y-Y7Sz4NmvoYUv~qo#yFdb$DvR7PPRFpYGq*m^#oCr}<`LUO%};Gy zeAyHfnn4GBLjyyO=d&y1zzDa-*^(LWMCkqu=;{QdRo)GLwzxuMtn@P{gVwW0Kf}5@bY~9r5gFaPvG^pqS;By( zHtxs~t?669a+$3i`m}L$T#!sN$mGz1xJ?q3oAyHAIQtdzB9sx{3~{gib8vooLc0^E zWpemPZ01BZbu?0CEBJ~Wd0L5%i#*As0N-$o6@rCnSV2~;+`shXu`Q)!?Hl1H1m z*IX*kW~S|Da>*@BG%LzGX~oqA|AJAda8Af^jg_9tehxEv^!D zuf8{LB2@!-Hmcy2Bw|NE!#{&rPB{0#aiPRbz@8j%X`NxOrlg9910 zaqjTXjDk(aHLEe_P@B>f>gr+s-tKGW5gDL$mO5v$*A8(4|0LT~6!Au_>@Oq{<^%;( zM~8Pk+0PrN9(p}?+?KCS^QS-bTe1k&C7B|X}})-Y!A)E z>nv>-1fb*mK6Viq9CnN~Hk>pidrv}d0lH>NuWTRD`v&q_c=zp34^&RXh>e(n12ggn zLgnq^hg7^8^|%N@?_TW`oSl*{0dK3d&9Vs@jP=1=Tv;Z8@<86W6p$V2;dstKKS zX1t*~`zabyj&%r4#tMe?fx0hAz4st{&23Nkg7^foD=IWtgfZ@?N+WN^L?fUw zuT73xq(J+T^y<&n21uQguG+BqZCo=(j}`BNA@CwgSkxs`P~Sub4ob857C?DGIon4T zYCRF`E~O>vV5Hgt=zO@az9Oxcq2#CXPL9vvMjq|inF-4VHpKT-3?)$MB}Gan69CHO zEGBWZTrH?>X65M`K)#oz+qzWZ&&o~Y29;eq3qe&c?_AV1qt-LEQXdQBoJMv;- z>8xFrW;v&cX`(^8&}4gBzq6D>J<4v5&X$xe&_}Lm{5;L_@)czM9!A3wb=cMB*Ekun zUPV-@RB(T#zUilv=)7KAn$K8)o>FhRh#<6|casJ4sG{dvfchm_xU&GVfu#`C;_qo) z_+sL0o~4$E_4%{w**^BG`V~oOz4Cm(wF;BVzO4n0sn7uLky^&5N^7d6Ko~UVED~B8 zQLEOs+yGp8l|llyJPb%7>mi&tO-avxq%-Z74{6~XOSh`)$)z>7$UW9p3YO0tv&61s z;{1n|fDi4ohgxgC4(z&yY|I=yz*Mx$Jw`Lq>rEh_-$4!Pcz#w|>}~YCGST}ks!v_A zOL^ySL_oRWACi5=eP3&qH;q4S(W7ty^hhuPI8Tu{81Lo#4XTBh-UF2%^r2N9yVDWk z6jf0l@m{+0E(*>K_4Z1+N1kjNB(v}%B4UzC5?$9-Yn7n(#fH_oZ6WE;|w1rvZ{DMh%*Cz~82c+&VaO(6sD$gh&mqjoU zcZ2h=E85W6vo~kV!|d`=zC|tn9BkFHt>LI`B>jMUcWx%Jae@DOrl$SGAaH2TG?OLZ z35uo#2~b3v47TaPS5#}LA;8Q`4rnYnHX#P;6b|gYFwDMU$7G?rJA$afZ^)VWJ7s~9 zMIB6V#kGAp-JZn5E71YRGbb2gQ@Y35mG<>)lo2H}4V@5Cxa# z@1s4v{rH&YnCFAwlI6tWoPaGEg+rt?}n)<*a3%oKhlY zkujW+`ZC(0V&)GN3tm?Xf`a^+fXA3|Ho2DyLJ=TgBh)>kP+=qDW0w$4bIskUYFen6+3+EZ51 zjW+=!vXZ#M#I@2tTw3W>X%k&?&GiV^S@B&G-Av}e9jP}NJ#6}5I^(!hH$^em3$HqBFy5@n$9hl$MBxB45crWS#%)p&T^%AE*aen=dtkp8e?m*eJv95jEKpqIzr@VeIb0~7;jhr5enr?m{z=qaR87;k{$=~*#f7&RSnp1R! zSC_X&a%M#RsG@VYQ^SuXT8`9*rd8J$veZZw!IogzkR+UBd00TuY<7y|r=`=ZENq<} zz6FF|#ku9#5_&uYZ&5cd2H9^+UXjC2pQH2Nm0mq_UDlAlWVzHt!}wCgztXt3QK?S5b5Ap0#ZJ@FZ+jVBFINO?Q%RL|Qk@%LoKplX zzzN!r_rbwaO*DdA7h%;NrZ26mkNQ&2G6?YKRLqFq_jDt_1u-Jlg;FKn|O{* z;6vk0RR{sSVgbUFj6P^I_{T|X%Hp-K#`D8_dz>LNd)6NDY-ZG; z`e!`CFVEjel=|P?_eF7cu>fuXZ?qoxXmw5lk>N|@+)cimpDT~PC9dmM(X8tf%_azS zA^hdrs)HKsm zi_CO8QV=Z73ldAL*z(v#%ywb?m;7URmowklC2E+G2(%u(;EZqhfzCN<{@f8T^1KHA zZI!8Eg9$R;>~w&6Ob{vu*ffM|HZDU2TD;){v&nGMg43ZQ(>Yp$C!p0By}J@lw5bV( z>5Gw_qXBonZ!J)8j5Sv{4Nrh0huo8^Io5d_?C(kt;O0pn2Q4rX^z)KId{-i4h^$d( z_PXRX^Gl7yo~opqAqFRin=lK3OCl!~o4?J~BpF(XxQ|FDmyqylky@Ij#@0gyV9~_1 z?09wcMs1o)Cx<}C^RG_2Md=*!Awm;ovpv&iF?*c*x&CuiStlwXSPd)4AgRJ+<=m5# z0#|@VW<_iK^q8sQ^TupH3oBB&Emppa?mK+kGmW#)yNx8jG8{jS64*UM=Vs*0i^d!y zg!y>%41bq;n`zp4e>zG%{T@QlA6}!iVYDUSUNl|l0s;*HkI6a3+ygVfJ+`emA1oPB zxGZ&=khAx{nn^rZA}#QiF3k&<0;w>{og^BoBM9Sz-RcOch(9X>W)!u6{WsU{?@qq( zbCB-%6F=9^f5cnkZEtVixcfD&x_X#}w>{O&Mlg>2?Rt{Y&nl`FX50SSAn!>21oiEkB$I~#W;-O$-#ro3zC|TRlZdb&X3*? zKqZ~oQstPe$VH>e3iKr<-q3#X$2sNRom%2kZ^@((^#$&kYN4sKJPX>OFjr`vsY#U5 zp^0Kx#50$^(2chWTMJtSOQ_eqybWUPB0;C0bXBJwVbg0=8IgO_+QSI`k|6h!-Sy@N zmf5Lq@>Tug;5mi8lk15$R7>@)+KrOi84U>4z%SUm--i8e%YPU{{*5)UaisbEeAFrz zgMUt*2hX&hulgMUWHBjxquiX6(?%QaoR#R8nq zcY9W?6D`yN)W`WN8%go2;OgE9OXOdK>cK;d@6Akh;MtzzRm3bR7B^gtCCG;#v#2)< zDvupaO5>mz)4my8uE~~VMS|__{04AWFNkOM97ybIorCXC>%x7<3>uX1bkqCgDC3|> zSC@D*;~vqr{?AQYw9W=rsxpkkD^&r~Xsj2ZEbxh24&3-CnhDsZDfV?2t(YX$&TW3Xx0At_9VDl$_xPOxBl9nB?%9*lwrjy?{wO4}=G5bDFwgA! zUpFEtuW0y6%v9Jw%LAqEtSocFcW3HnXot|=B?ZnvqR#}E5HoW@y;;Do3zn3EEpwGg zUc>afTJL7_{9)bJk+zXg-g?fY|Q=ZM|UQJ?~XFLw|_ zo8(lu7)C1-dERyEfpz^F*x+-hogwalLk3|(!xyWJUwuSFPtDB=tdm8Or>AtD?O^CH zO%}9lh)1+MJvkV^@N)@w2bTMhS-$0whDvDw^QgTqVj>6E4I+s`3XD$Jd^`PD0FxfB zKB>=moCo}7K)WtuzZQ2i1}mwM&=K$IqU$|xYwB2Fl>% z@a?YlkiuPvG7yjUrfpJIeg(Tk67vRAy!&E`U2`cu zv2gf2f`L)(){OcKXy8rU&})=nay>JDU|Q!dBp!uO5=*>%QBctSqU%=FI3>xf_;p( ztG}N8veG2=LvLPNh=6sAA9v(^*43#8s~JS8BB*TZ)o$zu#|GS_^qCwVcv2kj8K=FB`TJaZp(+(+zT`m54XP*Z*aESD|I6 zN0Jl16JWZ8aBm+`JoO1s%I&IJ{`qoOF=DuGg?mkIr3{%N$9m<1?)~xamZxc3sk3sFQj3pK6w$UhuK*n%KYdzUK+kK^blNqAr}Yp;236) z(yvmTOOKZ+S4kcGO-edGEs`FutHsye(MP`bBC)s_SP)-8Uakw5~Jvv1rsP4|FW#AOgjjzIvMM6-J1+c_#Gj z?qRp?QHt_Dc&9)?@{#m;;oK(zO=;I1^Wc?*KNW2(4`dAat9+N_sTBiV`mk9#+XN%) zFG+XsZOLL<0A|sQuI7buxrNVzSA`HR(sPuVBTdGb@Jn6HiZQxzA~VP5$ZX_zKoX|S zUkPC=Q1ukmctFG>)jb?KPxXnQfA;N9&R81C$b8Ak&w5Wv?biB7j)uj9m4fQICTRPI z?k0`p5{j;F8#t0jOX}sW`AXy@U0}Dr?{RNs@L(*8e29!tF{M#UAa_kvMod1|=RTIE z=))CM2{{M#zdRCbQ6T`Vx>_$CL^Y^>50JbJM4V;<5gl`-h1OIN($BdKW5w+$t~T*U zDA&*9P^*!fO(a1h^h0rSz^+`bf*u*{nDi!%Y?^BfoO*z!oi6 z?^S(3Ro2Fw@-%rVetc{flBZdOeLn$Tp$i6YUPNS~R9Rvys<2z}0yq#DYvr2pDlM|} zR!Dss2UxUwGm@PLS>y0#ATgPt?6+03ia--PCi0Qp&Ft94X}nk5l~Y%&jM2{{Ak0-uvLctVd9muL^M*70v@o-5e0`pKvyvBvyW*{|w>R=A zf!5+i=9l|TQ(PH*P7g(q{3McZ&x3Z>J`9$iB1DijdJXvuT=iGkA zfkaKLX(<09(LxN_7 z(5FNoM&{s(Y!#y{gFOA3Bbu|ZDv|^oNWTlMC2V}f1kR-K0O`J-0GcA0={{?`IbD5D z`{a&O1x5bY9Tg7dd_=hRSh{=34&5yPnR!!XGUC~&*47S}xEUMEi(S5u06j|cEC1mX zBDBlvVzN7Au&7aV}HCiz`WO0W@$>X9*Bu4nS=d_vu}D@@xl zoTSZ<80u@FS~$}*3S*3Ec%MF5dj(PnCT%UNNfFV+b2fBQ=5cBF1}v^L@opg0mxdx> zGKv8g(Ub5GkgS?S_uS6pdKXVb2VEK3%$KyZMy81n@yP?D^RVp_B!P_miH(1O!(VFdSNTt{y+Qp<~|Lj z-N7!y&qNC?GDA$zNz!>$ds!LGCA>#y%QB(_F=%6|y1RLblSc<5*%bK#uEoH2ZV&+5Tl{@@9AaZQAH|0(o}i#9!z+@OJXwCFQ6 zx~3zyWZ{am>(~>L0~UMsiry}bbS}r&tE^P)diIT%tSs-EQ3KF=$%0ag!>4ufb!KbA zY*~fU&$`#PX?=jUcWb-$IB+pMoAl^O-9?L;jTY>ZmP)9Hv~<)`p-X1IZ7|BSpIeoM4WOIfSak7-nP)8+A_Zf@i?o|xAFfXurIvH6Tb$Q_ZpC8nC7dg zNwYnm+?kMLsWuis@|8?H*Qd89q+LuPSiFBhcuuoSv%A8KESxpRSS%A8K#HsSFTbVi zUedcWkUjn8gq-VM{P9?I(0yy6GB~JTgL?ZR>s`z44E*vXV5^aI zsCHBP;VebgMHjqSP2mGkjy=5SQlf;=U?0A=E?$rVK|B(41Bfh&~NVGyTVCfceQzj6rkgrMVq6nw!FiIjnY zOB8B!x8T*E_$DOyzXuLJNP1nI1j@>0`zf=UevOUj@ZzveAQT)-eG6~^akmzOn+60|eYwV59yBMF@ULRyxOX*H;7 zyPsWVP#3#@$LNb1_23DqV9&1=ws5VW>qr^tEHV-c#|b1Xut45R68dRS7Jn#w%!QJSV~Hgp8CftrxS2wu_b@OsBy z)hRyyak#nx+`swfv4mVmW@Y=~Vc(ZdwZr5>rF7*n!TB2KFfvjac=J)R}qJ296cC z9ZD`CVrpm3IKg0-H1N-YCYq_B0ZM3z?XywGKF^0y>f9fz7^33JcaOZzop=AtC6F;L z`Wf!TwZ`GK6)P45#x5AeDaC2R=l__@)8*BS8xpqUq-=N^%M6svKAeda(p8RXSu5-3 zCeRkoF$9@-ZzJjq#vz^)WptliYfBCtDNo%a8*+}T;}h2EDoekn)vbA%mDkq2tzMrgx<>%3`!|Pe!m*K(T#AoxkVEynjX>*p;0B1udy79PLaidO4-O#&He7sRT$e`0QA`yfUI2#_p2C^2H-lv38RgX2R9D za=%J87=)TDhnO>GwpELn>~%*nJOP~rmd{etrP@9_I4r$a3XgYd>3MtvsoI+<{QAUg zS+}t=Pyj=9Wr@-a18?>(&T14HL7I+w zlfdIZK4=pbXRV6%1RY=QdD#c&OhpTt0DMdpNmA%8YO35(%FLh#I9qCyysJUjt=c2s zk(h3ixXZhJK;eiW>Y+b0dPuux!5Q54G(Z^@R>(NdP+!#$Ya1#3>r;8v(C0J`j(+d^ zp^Tvb3f1LWpL&8XE5cGg%`$2#5Ko?6>BKD8mLjPx5mKqEA}z0%iRDCuv-X}SKYVy@ z&2KEOm7*$FD62Ethtyt%#nr`hwUd!e^}T`TmKLUYgzr~A?Yg$w`z65?M~if2eo&1W zMX|JK4=h7XTQ#yAU(W{SraqreY&G+xbN|BjiP5zWr^9C>wAogR(Wl0=s&RsPWO&bz zJTQ+dn6EBOmoke$)^`>A4((>6_o?^jl{+e~wTX6eFKc45t;S%o_f@$`*3S-X(88KRrE7BxspL%4gc4{aK zttYxv5AOHKn#eQCFE$3eKZkobRJ+QCvom;bT*Ys?=s|dc&EQ?G`!GJPBdwrOL zyp5TKvW0iR0SoLqf_&~bL1k;m(x^DXJdqQyD{VTmLW0 z-ukb}@Bbf1Q4vuPebS{;(n?CJNDD~E2&G|+0n&_tARyhKq)Nw_0wV{L9F62;cC9Zc}aQV#! ziILT>BfW;bfj+w3mEEWBdL>yM0ytB5Y%M7i^&QF!W&lxcrr~|(Dr|T;PB^@Qw#8&SWQyj*(FY?8D zYG2W2x}?t6_EiW_-DDLH@$ov=&G0&6!`04&+U1OAOBc`jk7HXkGvQzQyV*)z3Ng_V zQYA;_=p4p32|@O7CV}1b_r?iX$yzX`BUJ+x4(M<@7Xci*;}>svv=u+7+^gE)o^CC! zzpGRCcG(-v=~rWiE?}txCtwrv3(CBUZPDy42t;?ZiPXg@GoNuDwZMyOPq7B`aM_Ej zu%$9~K{WWILQD_%2Ps#RU|MO-@Y8xGD0)84FUoXPy#uu3;40`wc$gvp$M)2wXaUmcdZ((PvZ1@s2kyziBx1j?(fUd#2YQbHT@gELHRK zz5!cBzfbeb)HInQ10kgm5m9EPX>l`F`kOk7E+(h-R-Evi7lZ}OYm!<8N9fBpSf})2 z|M%8&eCeXU2U#c3e&wju7N5xG< z3-CI<8)QEH!1Y5JcqUG&qDT-shjDGG;Z>lQFd&Q$+)~P%GWGH*;FGfFDto4z4sNiq^X$QoV}i6FdYhF5ruClzZFN&5>hVX>Mmu zMotc_+3APOqPDr^|Q^#DLUA2*J^O@{mT6%pUDt9%#nxuNdGpV|RuITL&Mk z1{tT;AIcn=lkeZh(RAgjb>ze(BYAOwN<#ciAskzYs-~31x&7CFFNi70H2=AE4a0BD zm(0~kA%}PFi8BpTg(dLKoy!o_uOoGwHXbb{75sr!a$<_}Fz#5JD!3fibRn6O1HXYZ zJQogR-g*Iyg|p+=9^ZWMBlWg$Xe;;8>Gf|mq+hO92?41?ISq$*MI79y;restn=xb- z32j93u?{H|h~wyogVtM+x%y4_Qf%_SI}B1iUm^J*JnvphPYfDOW=B=a^>)DLAkWbS5aV!NXH)#dI0107urc52-w2X*`4V|-0Ts*Fw&#)2`;Sv#+&#}P zAC(kI=%Ym<3 zQ_D^dj0M|v7#1+{kLtsTOqrkdd%IQ7MU2{f`S-YGnOl#)hyPzMdDZx^{hM_ZD6iyF zqut@+TRjiW#)4|=)X^T}-!t29@IamQuG)?Yt6W5M&&p7?;aA=PVZa?;atvKT=HW?C zYCiYqWqbB1`)T}f1d?DE0|_c$a1U-klx#sliWc<^KvDa1up6;?mGLsNP=x_DIygxB({pWQL&IFp$=G?Ow& zm;Nyu)PFxpF?tniV37G?S*DllPBaKd(k#K5+}OD*q=Dsu#(IrYuVj-$UEE4`_qW#y zOpP9z8U4C9!1{jw0=FE7SnO7%BO6@gs7So)CrVnX-A+~ zB1z)#Pb#9&sVpmlI5B~?@jcjO|C0y}$yYs7_HS#vwD>&bS3IBbt)U(%-LLqIvHCa& za$6lqNteo0s?i9+G>3JF$|MRO98VEaCbr2D;77M_Evq8Ak1RD5+N{-;MAvuqil?$L z8>NL3zei)Aum-a#e2IDnJa)%#I%ufKQ%7g`;< ziZg}FpN3!@-3=IIgbe`V@s$Rkmxx<|Sn+~K3N}>&XL4Lqg-0u14XEoS6A&iw*LH-T zHxTTtJUHLiJuIcm`RPrWUbvRlX_N318YUu`%!In6?WurHDHwEB!B{L>ySrKEpqb7O94Kh40^vVv&RwBdCK5KT|kSz|7+M!Lb>zWe@vE-68kPW^wVxNVo@ z`;WJ*ZDVm^tX)BP1Cox6uAb5O?iTb5Cu5ZC?}N-|Z-Pz(pxE zoxc0GEljr^BBl;q=nXP)8**k*@`jnx-)r^)=S4Iv1z=1eGqWbUyHF-l{N>F>7+Hdp ze(^1A`6?#o(5F+@MoL>DKlRkb<5eLt{&G5KSpa2$T8dq~;;CxCH*;c3fGyuh+cHWv zeC=|DTb5`34gCw&m2l;r;2U)W&xQRnZGJ?Olb`F1joMXMLdEejo@|7lEpvTLC)OT| z#i{}Ceb|5X&1C61mvT7I3(K+Sdx?3z6BgaV-pKGx$JJnA8;#4EF9rAf(1B(%GU(-2_CH7LXk#H{{a!s>nCQhs{Rv z=BVuyQTz*~9GxP?<6Cp%LArRQdmEUOFo$N{m2*j*O)X=-D9yPCrP`YzYbb9>P+1p# zo*T$9XtBHFc^AzmS$delJ;ZR$d}tAoyxoKy?VJTkbowiBCsw#ybxRz7*~YuR6Ruu( zXU6Kht+=vQ*Q-fml~H9@GHl8Z1i2PxxjN z>0QLscCh)j;`!Y`&0jn}jtdFd-Pj&fEdOUjZ_7qtE#G+mK;?-is`#umQy|6#L$_F=BkN z8ygC1h+%9t$&nuq@fICvH+oyGmuY3DxEPW;Rj-6OX!XmBsMLrK zoDRrx;yO+vub&$90Xtzve*8hk!LE&C0^1>n%R02>{qDQRQ>`{AxyfS`mgm@x5J)iX z!IE-B%qKhq8-B(bs*HMzwgb`3tE{IvMo&I-QNr}>;>=J4jpSq~{{)A6OlOYdDEJoo zp#qZrtyhs^#8pksi#yPBX!k!VT7fZ?^E};aA|k1LhPOTI)jc-arT{j6O=qr{ z-@fqs#L8q_`PQ@0Zk2nSRdA1j_3()I>wGSSAM~s{`a?9Sw<(X z83FR0vBKJwv;&9MJEv-XGV$AbuZ(H7@1B5W{_d5zw8!-Fu!b!~7?Uk9^%P+kIi-nr>qhvWIkE62OCsT-r7z%n`^wY!xA z5@vfFZO2xZ*YH8YzkT2FLvvu~%7+aX9%r5qT1q>!NW4~{M54jX%g!)QpJCTr@lA<< z{%fE5u%z>D>dapc81o#>SGg0H7Ma`@m?x_pC%>ibuT-fCeXi|&HXr$$lc5&{p#06+ z7vB;aw?}cgVgex9@dZ7Nzb`>cu10)d{?vUhdfW)EL!}M4FFSz)trg-xYI^K#^#?Xu zQJ#?H^TaZKgMUr*KbB+wyWZ_wW36%O#z| zq1xr0qjq9hR}oQsp;u4NaMCmBGsSJ)D>ijIO=4*Hk!1PxM6xRMlZUf1|H*w?gfQY`C|)nnnMW6o2~yi@m|yQx2le_o@yp~{I`iVM4an6KE) zEuGxm{^++YhhJU#P)nQZrO~*j>8*}Irk6J)Z}^0mZ_{*yF$S7!;(Jw9%K zL`W=%l0M5*^~h0toOEwjo++Z6^T%o7iBkjPZ|Xz-lH%ZClKz4aw=3*O;5QX1lkx-X+l{T8+wrm;dCj5BaXlCsdBq2Xu?}Jp{Jp2Pzx{FQ- z*KD!C0ydUA&5qxxXSNqPF*QujUDNp}zz~)}AA%VgOE88zF@2wz-#)<@G(*c4rZaL% z{7*uv{AUfO3Qj42A6xnV5$pROCU|840vJ6OE4zTekKmtGT^Sey)ij7}KN|fn1#@lx zQGHZ!Azt~NA_b2j_bwhMM96v`$ZmIkUW_{n!_V}_Q`#0g5pp7=`COee+BFT8ofcgq zB(BHG=rMF0Y~`#poOGf+h39B3?)I}4t?{HQ;MP-ZH?zTTV=p66Rq7SCQT60r0Otv+dp0Xzl7&BL)2cTd^bjxB=thsmQk?__ot*6 z@7nz#IftsLjX@Mk-EAKPt}>TPZ(IT`u++(l_NxsJ;j#zgNWk$1kv|{vOEo?ougASG z%|yuTKGuJ@P=cLV{xm?sqKDAglcg)md=4AW!tUW-J(vZGi_`p9^Yi7L`~-_u(l+=9ux^UQqidKh=;Lt&aONRmf_YraVJL~$ur)=M z$J)G+0^mPYQY#}R9}g1ZEZly~^fMhk&;RhMImNFhu=m5VDoG2zR%auiXx8v4UGQ}Z zG;*P>>ykE=NPT&a0lU}fiVb$#0*2ACF+CYQxbg=ov%bQ5pOrpZwti7g&f&+IF8j1?R*JQTBYtg0NY0 zJl}iBZ@_H#^afuE1lFO(T6A8`!6UW887{xpo;AkMC-PTH=WdA+V~oX%lLev6vdFGy zn@yEWWu}W+2v^v>aVE~-V7X9msNa~IOn9De4Rx=q)pUMUSWWZ-U825BlD6ktts+D( z;O3&D9EaA3HY74!J=g|CYs-7?22mg~bZZdutge?#jsKY&d=Gg@ePQwRZke*&yB}St zkz2ObKRrKMFEdF9!i^UyK3K%R7%@DEZ`5lDTc63l1$joi4^e1tL?S14m0mmKY5IX# z(y!R>tlov?e-$5T{u_+Rb1UE>x_m;af$tO`is$<6<1dO_ZvW`BQco#LoRic*Ue(!k zX1hYkLa~>o;kp2Jsyc_w#J?e_pFf9a6HVu`Bmtyx+`5Imy<@$Km!sJ_k0fO7N(8XP z*|<#XA6^uWqAf%$?U+Ob-8TnOMj2yCFhkTm*Jk&Kr)ld3-X6wgEW~PvKQz)_s3o@wz=nD~{Y${t>v2yv;k|2j*12 z11rPUpIVBm3^_UY?mNH48Gl8ceRW7?jB7Yq!c0Vc+#XHk`u<;b*_l zXM1h6S%T(Mg!P7X7n@ zIT-LgvF?&?=G$L|?Cpb6%@R`0s8Q0n@fY!xxc{ORX-vW$R+Wi`D7I}SM%=l#EJl^%1G0&s%miJayPkITSUxSNFgo<4)R-|k;HG#m5%aL|AiB0r(T=9ME1 zObc{E@;IrKpNT5&;D3)mN1R1zsXZwXaR)n#g@${~(UTNpRls8?>>Ws>51VmbDpuya z2x@}giSJ#YnN||>D|dskwIauSM{mw-2B%>gXLxP6PNSKVd53N>C5?0#C@r1mm&~z* z5#mOH^;UE4vPJ-${|64C$5cD}sc3gnj%2*w_Hr%B*uVuvraMwKhcmZjPBv~%>|FT% zKFN9fz4^||xW`|w{vR)T1NR4F#u7oigSGW(-DV#Hh{f_WlX`j7A8oi0!j z$sWu&y8z4@f88=Qpk?CLFss##b`{){wekAs+)}BVeQi-rycK)V!Zw~r)YaWsSd8r^ z+mhBx*~sb@noIezyO>Ue8=2Mabme--fLW4wuCMGg@k(qCr_1e|3s_rJUG7n%~o@#$g_CU%7C$5~`NH1Fm z40|~t6QZnYQtu{#Xs*dU$;ujf8uN+x%bs&3ToTwD<^fO4iHW(SCmRtKV-HVZrR{{! zqv6b+mRN^dzX!Rk%dZ#@{rSo@+K>|ESlNx@CZyUU% z4Z+W=b@L$hqRfub+ajPKMswFcLCvY5fy;43E{X01zR4ra%Q3{c81iX4SRy_7Ndy)7 z0ys};Mn2m_@kciSwE(_G0ZWdn^wMj?ffmXkTv(DSOS&+l3tKZFjV5 zm#$ijy5-i8O4grdduW=oc)x08cTrYt9rKWd8WEh80##o_Vmf}<=q}s1?*q*c(M#%_ zFXk;je+xygj?nP71IIw$^XoU%>xAcmK&vbptu$<8Z(D?$93OlPs(aKt8Ws1EZxXbp zy#qWS!3Oh#McB_0$vK|!-tVthXQ!*N`8Fny_fwu3798O&rAe!l#0`Z3Oz(m+QFMW2 z+|-lF!zn@1X29Xvmwb~!N^lP6{o^b}d|L zQLv1697R$2F5%#D?R?q2XA)6P(=xR6th-q|qB*a7Ygvoe_jksTa}c55Fdo;_`iaa9 z{~AQ2CTgyrQNfF8)4oDZUpyBzo77+c5IHihYtPmz1M(PC;{C375)$jbUHTUu!_*Uf#VBjWRh=^?FcnR zK&346Vz$*8wpSm)CZAJw}b$+OJ zdPhzq>uh#S#Z}PF_uHOr@XvyH3QMP-{WKBw8GflFR3#=8zt@&Ct1I5py78Bp=N_gT zJC|kV@4cXQXAm&z&Gah}ck62%x8gk(E^Q_6oQmaSWr|7?xN=ecvX@b)J0yJB`!7v} z@^vrNl`tn|<0W)r=`@0Y*~a|?Y_);eT^7)Okg}^tscIO$9@U`mo`nKsxWPWWH|JQd zb8PNzjKOEmBU^c{o)BMmjpFa8^0H&C2fz`c(n2M=0}%-4pwTK)B=TI%(868!u|MH z(<-CKz2kp0*K782_paXD!!U80;ECQDMz&is^AMkz4PS3B%8q*bn~}brjzYiBAjxEQ zEpa}79^0P76G~Y;bV}4N`1vq2*6!ocofp-|7P@|`L#c{PX=c_^cc0C+vU(Ie>jfS^ zRN*bH2w~0*pfv2a(G_aA9nEg3+^sPOAb+tKdmB<81=XfYsNnZ6T~1MlQgRX*p&T1L z_wDee*-^bw`?DMSiok$Em;IN64}D^;Cl4^p3o8d>wv%I|m06blG!Say%Sgt06Xt42 zqULdQ^V&St)}}l4Vf}}AN9jl!s`Q_MW-<-$tm1G3I>tKMt>S=^JzxN|#frGmjLyUn zRkxr5UZoeg2@-;`HIvFytoxz)V7HPzkNFX_5oz&zU`*#dpxNd1h|LKd0;n+7Q_PQ6 zJ->U}_-#ps_Yy7F(}BhT`mqm9=D(jTlvYrhW7wp3|Lp*U#0(<(k%#M4#t$>w?yFb0 zKEY|4NGG!2iqy+(NdcPUa8aZX5U*7~Z_f;@nsMUw%WP&nUEZZ~?l;Kr(QFeNwCl&k zN5^SdEgRQ;`5xBB=)_lX!q#!Zbl|)BUZ-WPJ$`$(Z23TC4WTHkvV+)zqFW8snR?y- zuY&9U-RBd=JR;r7b9QF80$c|tsoqu6{u-EUgqXm~`kO(yvW>=TG%~O;$2H|OFD>t0 z+26lqG5d zl!m!%vim2N*}9&&PUP&!Y;ELT2+s{&+5c!4P?>rX`@nn@)ew+;1ZE)1lM=s?TD8vu zut?sZ_hs&~f9u4Gv~T}LiT+nEv6?JKo!M{ie|W+W7hKk(RZ3*Zq=(%hD=>c%jD9c< za%h^^^OFplC~8an@R&kMePtvMST@0*T%a6?6BL%a$inKcPass{wtJYnn|zDn_Gd;G zHX~Td>R3-qYud$G~FEWQ(`XWin3Bzu6iB$ut z{kH;mQW2&mg-_q-qoM*!zu@**-CE{`E47A!j~H*&Mt6)3Xrapv;NFyK$MJ8wNaQh` zFqbn2^9CM&z8sNcy>Vb(qZ}19!wLKR27J1FS~QL?Z+84sj9Q=jM|GGLrpx1j?*zYMZ`ts-1!_t+zl}?!8d*7{;tUOv zSyiDUglI0u@7NPTS$J*jDA0=Y8!h3X*>HK056LYe6{MbTf$FaFgx}yJtpfce-g&2Evjfb^TM9mF~W<1IyEvygjjS*&yvo=b(q2+uZEFVu`XQy zM}@H~4XX|4l!&#xOY9C%5w#Il7H4zL9%OtuuC?#O#`fIFo9t4Qo|^Rjl(K?p?g-D4 zgU6s}wHb;H<$@>r?^7o+F*%bZ#xn|r86gK&C#N3m;K@VDIE!+Hc&5kwhpT#g^<#?x zAzMy=lVcATqnQaCb)hW_;QB6i@s&G%D|^PHeX?ACmi)FT#2Nt-EZ)Za#RbS0pnEgR zQI0zxJ2mfq{o4;1xD~<$PgeyjqU4I0?rYz1`C3SPzUQ(@+NOU~ zmh(aBGmg4&dYaV_8`DU{Q2wkkj2;9lN!r@pE^P06(_Va7zG~K(TIAHFp_BSIm>t^| zxzkdNDfF;YV7syA^Gx{)8=CEGQcgiMF<{MFN>U*^OY0Y|J+o2ON7V7_pzmp@Tit_{ zgW2(hupb~S-W9Tu`Ma_LE1P$AX{vLsmDamB1X&k;BG0+It2)n9XEw<+&@+(-X{T$B?yV9O}Z9FbYTdc-4AJ^4S1y?aqlx1PRv2j61P$q?)Y-I z4D^qx$P87yI3xATDxiDuPh)4WZE2&Pn{pJg$fE#IRAFCT651Ow_0DlQF5!E+f3R}9 zi;67gp}hFi!d6&n^O8XV%OWGhqv1H9#jm#@UEfn|X6fAIiBPu>BtiGa=96bMYw~?H zh23<`cFIrG-xo5dI_=#g-zC1>%1X24dj3MJSZaQ5-O&d!E*#;Vo{&zi$|WV1lAll8 zPlna{!MNV08&P7toh)In8{_u3`v%tpPcmQp5$dL4vSsLVRmgsGrRj& zCvzjJY8)kjeK(4Lr@!*e?IujpueO7K81gsQ;6=z{Ri?20&SIt?5{+11wm#0?A zB=O26`ff=mOsmrNgMog@vOLP+*_;XFcEq_QWl>(=SdbY>P)K9T6yOVd zSQUBL1m^rHy{Rvquc$MuZMm36zvJHE=7yz!)YGG+2X@;b6g3YcnV;wqFYx8v1lb6* z!=v8l!`Jxasn-F^wbU$D)?3~qOWt4r z(XQvs){UKq$@&P7h!S)IFGT!HlEP!=#zeDUQZ z2>BFLWig}ch$+Md=l-Lrsijw08@X|VV{Jss*mkOT^G-E@B7qyTPuqG^mpR50+`Gax zaC0lVZxmu4Jr`Jo&rsoM0mjp9DLY&;>RKK)Nmnt3fZx~LKPQO;3dLnkz0=|&&_UQM zC%R@WUzEf#RsRJHms`pVXw0VaV*@G+mSmq(vbkjQiZ5!@(wf^!p z)D0_8BJkZ~_IX<)_^>LKUNe7fpL|uD!+@=ZhoUW2X{#hl5%VWic$q2eYVy2@Wy|MD z)*XKCx9>*qBNmYz*vOxw@JvG^n5l`UiVvu4!|5N@)oF78B|tSUU--XO9qzFm*BP0$ z-RXjy-R%?ATa>k263|e{d?~w?ll=ji3%fSF);W!PIk(#{9{zTRJBADR8?}_8A~vOT z|&(#>BF=v+ij`e=GDuON9K^j%B^{lLAS9V4J$$!f^80SC_H2XHM*_YwFBT)Mp zG+f7LXsmxIiRncz?UFgbZE1@IRsZ3O0S zgI?#;>OyHWlk3+oUv`Q@xYv2*9arSa4l2^rGJeZztS zL3avJ2ElV}29mTAk4%$MQ3>bJo$ap)2IaYm7V* zyspUiU&+<9ldwM4t@EB0^Fya|Dbm^mMHsOd>6iG@jW?QAtjNz;VB^c6@YmT9ZC>hc zk5C0%k6fBaiMWz9mT>VRk0$5&!o}OEe-#o!%nuXK>HjhZFK#E|0D!GPxL8en-?h}& z*HQ~O!Wl|znT;$yH|;sUcM$3|335UVp~6+`xg&{SJa|-O@ zH|K2olE}!pEZ$UoqCuwwvw_$@s&stcj@jnU?%NPxnBev;t?n08vyVF~S5G@U93qqz zwMY&WIyQaycRdHdQk;`75zJmCTtF*$Uer`Wx6IQO3PfX(Zrlx6 zc2OAJluw)ankt#|3SqDN^8UpqQH&8L*JP5z`~_#U#@k&>pMO-(IHZ!BB#RJGF{{5; zhrxV=erdf*DHd(&iYtL5`YMQXQwjn^k#(6?1?nCP)z+nV-*?Z>4z7hBzZ`7qpczt( z#iE<+vP(sX`m-;lcj_&xSCC=>5<_*g41;MmXvuei=Cq9qnb?GcLRw1(+J$`o1}kx> z{aISqo5++cAq-gWgrqE(2b_=oRwX?&?;N)46(g#2p6HDsV9&7|+lj$_ydQ(o(oDOG zsz5YXRESiv|K(hylWYh`vh;)s8h62brc8gJ))cto8~U6j65yBYSljw@D8!ulT4jpl z6LqK(rJ1Kubs09to7mmkmUtLrlB1~jpz(D_;x{+`Ri6RfyJb{f-jN+L=agAmGAX=O zjgQwDdzY(?9P@;&OmJ8QUeEgZID!99YVrt^!%ThX+{&#Dw3!jE>D{uC-ho^{m&)|c zf$GJ>qa&pu6!kM=l!xOFqHdZ9c6f_Gerg@Rem>by3zDuU+fcB%R9878TX%CjiKIV{ z(QO{v#W&Xf#56)LfhADeM>-A>t!fF574V`5Nt@RR$bfNm{=?v?w0R}n2D#5d_au`B z0N&iaNXccKX40%?+QNZRjLqaOL;_g6anebV@!HMg)bcFadh|)s^eJ71zIIrX+4WMB z`AQg)yC3=;udFd5UozV`>~+%x?U9!kf*E-!X^Y*|RVOOKTEe>Ob}DrwW-NQQ#sHOz zXLc34hlc82`Ty6X!2g%>!b1$pmou=10>4TsdI8rKv2?hYKbWUn!eYpr;+Z zI=EWL)OUuh|J<+P=EdJRnrExVseP*2khg1HdM7PBXSDDy6c1lgOlFrpu4VV|qjc=g0pupmJRor^SSdz^QFD6(q zk49pZN`Vhei|MJ~-m`38YeOa#iVM^w;?H{y)ILIFz9UUq2w$jsk zjmUg#U0obhTi$ka^t5^6lG)m|aewn(V4NaKQt%O9w%5z9AEO=zJGR6BGg}a-1F4Tk z37`Xa;-+EzuPWx{&m&T;Y^oBlz>ye2?`YRqan47D6*-JKEuY49`HpuZip0eY+d;~+ zXj14qT-dB`hn!hUcfhbWgb7dMKNrR_k#zYTSXGA<&mP@n#b8CPNw_j3EI#C(F^DNDE}1$Ym04ZFKl zz)aF_NsjT=O}^{i5FFL231X&AlC_3kg@MGOc0bsFa#xDU z0}gG`B1!7P)*h$_WgqE`1EE}%A2xg^|NJ2gJ=rZR>|#1IIOh(`?O9|bLmJy36XvJ0 zxnMn%*~eO%@mYQ`lQH`0bL*bhlN<7b@9n6~}9JE=L)ol_j4mEvqVj8Qh}J+t4??x5c-c)}FKFh|Ek55GXlvdS+U3OD;scN_MBJ zA#Zr26|84@TE~)bbbZdu$!H!hXk9oSO^o_SH7_MD_3Nn+^+wOzjRp4RpObr~z`@+l zdt8NFn*D`a>+bL44yoj{34rS=MgG|!gZ zIK#FwUR&B=CgfMhwA8ifr=1#vPi4UN ztl`#&K+}8W;%JhgkKEHGNAp8BLea7Rq$)1cxA3|<=FZnme?vfh=lBZ&OhRGiD3LdS z)6voFvjxJ&WVNNv2C?%#nN8dsIwGZGZqV9TmY;(<jzwP)SbuI{VBTR@QBE`@4*c5GI;ObQ zIU4BHXqP4g>1q{K%;a6=`oNomB^{OaSCbW|MD0J#X+x^6eDo4Dd&@?z^e7|$dqI|p^`7@4P>tkplJH>yVkL^0zu&#UMHI*=pqMmmZA-k=o0|M$ zv-Vbb?+brua(L*d>U&_9YDWMYbOGLZ6D5Zc!`vav^*`K-kWDvh6DQI?^gTn{Ej{ya zMgi&#VzA(FX`tnUX{5|M@A5#Sb+r~2=10Jgj~N$oK`Lr=O8 zYX7yu|HNK0bU5((Nk<}2m(^{o0%@T`>_@wk=-9SeLb$yCU`@ zDRYl#QIpFO4NBAIPr|&Zjk494qu@E;Vt2Ku(idfLbD+bl(;|I*{~pqDW#lPSyAks(-^t- z1C!Q^*$I)>+i4HF(Yya2v-es8r{h5*?*=#_jEMW+!%!3;`e4Wb02m`+|=$fjbjn-S~E1 z62q@pCwvu$9izKh3pe7c8#7cOY2>M&XAZYvyI z5q@N}kj>Bi${;P>`}@$nN%Q6|BAC(U1%2$@ar&lxGcv-C?o;^hsG3Ihfc*WR zX>PU4P4}8O&&|tRHLp=8Ho@r#F*`I%tJCSajYwDU?Glyl1|PnZ#CGR3y=D{ai}{52 zTRkDsi7vMr-^{TtyA{1m?GLv!ZGOO`))T5B!C;mLH=eo2Lj^%X+OEsJnT z^;q3H9nmPF!SXjMKB*IOdi3%im29w_QiRX&c0=UK`i2=*Pf$(a9@8r=jh2yy~Tdhc`>9gKU9MF$c>kj2$bwE?+}AUO6qcMiV-ZboL~A_>XbgAS7YoA zqEOB}jhJ4&kYBb8Q_eqluj=e>-K2A-t|{Q@cnMhWLPj_y*pXTX#eoS;7xP1 zp5^v#Pj7WNT43G2l5un(k7}9cF}2%fFaurS@|y`HW0kGD74po%V)LWHdrmx|-tAff zTlidwmt-It_8A*I;0aDRP)X^h4A*3^?Py5QrA=!gZ#pTwPRaU7VBpNacgaJUM>Uda_k!c`G>U#55p7Jr70SgGDbzuK>rOS&d+yA13r^w{j9PZKpxA$} z^|LLpNxM#c+RJ-*w7g+EPq>e-rWl-i{Kw0P9#%((zuSliK$zJ09N!B_FM7yFmrDDA z$}=i6mQN^Wc$`&oqBAlcJ&r)8>kwX7JIMas*13}x;lN7uHo8||k&OEBjel7G&enWb zj>@r2m6)J(VG#vYx$u*0zehPogsgh5#09V%Crd2N8(5qxslJ^lMSDI>k+rV7)^DoF z>X2UdvnQnS16e}SeG!Y%^Zu{ExU+mn6DueCx|SMK*2j94rIt_`)=3BJcLVbrcd2=E zbsK5>*Y)i^5|@MSp#0gQHJ&!+9pM|4m~dO8bb(gWz31jgOwCRgO?%5L%d+dS91T>@ zuH9Z1pIZI|#H!Tx30@+w?`K`6ew1l#qQuG}(jIMQ>=T}|5f!UNIeTr`qmu%Ex zR9UOti~otQwbVw*Yews_GzpT|W&1f(~DPUt5x=1OByUnJ-=Qsb9EIe$? z?YYlpW8%mlm!=2h5ik7O@zoj)^5%7e3Gn-%J-3rR4$m;+p#ipX+vN7i1{-8dm#jq) zMLH@u-#~$f?*M`u=i3&_{*ID4&O>pi>zlT!b#4g2-#y-+7Q3S2MM+vjzAyGS`)Tt} zdHf7xN2pZmavEYv0t3u)w_AGF(jf~>t>d24)4yyPi=C8abUYqCNnpA6_IBReLwL_3 z>4A71Zt;%0ic++)pfQoYFyKxG_&6jZQH(HA$3`u_W{7zZe(NCbgB^msr#-zY@Vj$e z3z2G?kI?o938I}U&Q<4E!k>TO2=Ks~GoVl&sA1qn^f8u!Z zhMd(rDkitXA6Omc5dK^Cqw4bFhG6+OEGE6{$CB6|GV$mVuFJ# zJNP0rY`e4_NIH=CxQDc?rv$FJunnc4+Y6+oO1p722Ax5MOB>=+Y%ginjFA)@y2QxW_g9;|Jv= zsP0l7S#y3L`I@+K!(R} zK!(KfeTtK`9tfddQtbd#nN>srH4VcUfpP`+CS1Tb{s!w;D4EYh9K4BMjqCtl^O>wm^qc-#$nLR=@}|%KZYNgzUzh^UDMDMR_mYa`;d5(lpScv^T)&$z zoatG=+%?Ln<|hp;z^a4IuchfTgM6GIfgTas(XVsl?@n zXG(sZgjZH~@NWvB`N|`!{f|oi|FPv(+Dr3*<3)nItCxPGtsCIOBPTZRkx&B^<>-oz z0trI?Zu4=7o)~NogbxT%qWN|DK^dTwTmko`Y~tpDb)9GEotY)n_8oB`-KUyceIqy6 z3}^(9d6a-a&#eQ^#-zrnO}jdB^55KFCXRZ7X`k>5Npv1tk2V!aXD*@FI4#^^z9C9r7Vj;;pRPDs~IEI%01J_MshYXTQtJ zp83KndP7WQ*c03CPc8a|O`bxkHpk0^a7F*sOspmgL*Us!U!8eSquRH6d0XKDKOUF~ zLjG6PbIg@3STZZ=1aH6rAS)u95M#K@$)EWpjWblaj!+*>4iU%9fW+8$36B>fy=V#N zRmm)~n{b)@L*vD2r^MV*mYL<16jT3od9wbE_i@LlgtPi|;MsIGuxwFgR>7uZ;mgBw zW6=4NrwKl+S8wtJcxtV%`z>U1@=$Ea{~u-l71ZP#ZgImXDk>m~^s3UkAiau67Z8vZ zAgI(30s_*Ti1a2MsUp3E2&6!0(wm47iiF;4Afbd%|8MsG=9_sB-+ho7PQpAK@Z9&c zuC;zEswG?IUvTTI0W^b}ho;n^zC!OlI$%G+Le)nPI0_zY&G7|@S%)l~ZhlymDH8TR zcb8#yE3+n{Mn2yn0t?k5{Ykk;GaJia|6;ZTp}sJxifJ^v7L!- zYeSn__7M|>M;)4S0{n*6vSU$Ras+V&sz`w(gLfCYe}mNsMi%J0De_6!&e&(q*bQ>7 zwCes_H1yyAsV(Nt%p1^=ew*A|SYXTx#hPYPFoKd^dV~?s)Yddby?sw+mG9az{ z<->wjngYXIjuHU}$MyAwv-J~|0^AZLi*sXA+7h2=I|X1u3d{Ka!T9~AL532d#2 zpw~U|Qgs#?xU0jm!3u*(?+ooUJ3h4Pa}JOhnO=_h&1d{gmM0VVRGmiKIM0W1$#>!Q zg&cmTuMlevq{dHXspj&vOy>N~;=x^8OO)HUYps`>dGjEmKr#(Dvy`Z1bl>IYtV}ok z(E8Jd)*-zPUq20P4Mrpsfcra_z*^~5sM1~3{8ZCXhGe>dm`E?Z5dxXVZ712cC zrxpw9%t{#?v(<(m&GpS`pT1SU7Pyq`etbw~iAsk^bYw9j?bQjq5MssAsWVM&ov!#s z(kq;Talb&Gb4tz;XoQM!C?+={cNDO*ubl9vfesWbCO^pJ=WgzIwB6=Hvbeg(lR41- zPDOs6b24$64Cdc!^KkQpb@g#^r)lTzw!OtLxeZ>k5C1iyOooI0M{&WN)#u#Z{xd(C zSRx#}RH9PuRwCU~Q(DCf(4kdHN67^|=&jj znM4UshLpoc295grS$z9fpDwopb9Mjv7&y)7G++=08m4eOIYyiOF4S!`N=ye+5i^Vpc+Zm!WgsvaUqd@%NGZ6cRRXL@mI9< zvaUYwZLmPROmskKn@~4wqzkxHj2PSaS3%c=^z;UfEs|h}f_DBue;Z|<+`$jgt%BQ= zsiSUllLY{FZ&LiyUh~q>P&Fr=aiJzAnA5q!72+ra|Fk*s`@T+YcsfOm@4e?Yob$N7 zKQGVkEp#?m;h4N#nIzm9eJf%rg~Igm0Qe0WwPIW49sjI>wlT9Io#Yx*!!~-w^b?r z>R}eyMqe5_$C}UL{oVv|v~U0CN+>uKk!(B(^P!{NnmlP^{tKUT>YOq`NQBi4_|DD% z@&f!E)U zK|9BUK}K$Alx^BgpWL5?Nc6G>hVqp9%SDFrAge=YlZhO@1Z>F{19&(;!zyLmNivCV zzdMYis|H!P`3oylCyTl{@tN~?>r?sj_Dk2pgG*28sgtbrWPMr8O{@PXe92b%?-I9n zCJU$t1qhYeh)NsqiN)y5_Su(|daIF?uUkT7SQu?nXWBk6oNR$j29z~8dU(=Bi8IY> zdh@309$II7D0=mri7&jLCnByRzC$rON#>O6Oh2E0a(<*yY??E;HmN@H5Iui|b*#|4nPa$+NxMg9p0!8{P{N>C}Xxx>r zZRU(va$)Dv1V>wmAT0FI^CZB>E6t$1bRO3pdp_b_iKpttX>=3oTc@J-r6&_dUkq`C zXG_-=EyB#`()P+xGFy!>DSTFk2=1ZwIMji_H*wk)zGRWlesZ(!P>^=~zGa}~(Q@mP z-np9H?~x@S8p$eVj~3GZqS~@UEDA{0)`M5JSI%574jJ{PBTs7(!Oe3EOBiriSE@FR z=g9hvL}LoSlmkGXaKNnhRs2SNEgYp&x> zG4UR!(>6QT(|HNH*3yzmlzF|K#xgZxJX7tFv~gsTRoWk=dQMwy%ETG1S*~ZlCObM% z3E)z=`}P@j-nOUE^fxwc$h6tCHP6JLZ_eYJ?B(8^L|b&3K#x+qK~VSWSr9-x9V-+U zRQ+wA$4>mteQvmZ#MfpN%x!lha4Gl&#J zt6L*D7T)$VGXE=M_p`S&*ht=+0%}18;Q9h3;ScE!la>5A`S7*o^YLa7*hg8}oKn?0 zKJju&h(BMc`mm%R)}{1b5>9sCL4CPmzr|D87wP*HIuZj{!-)ueA74qSl~rG3SxL-} zPQJsWyYeip;1291iF3m`^v~oIU9pmb8vX|ckS8@Jy_66iVIAWH`y0!R@({!w4^bcL zAnG9bBc)rT=7L9!W@Vrky65$wE{p2vodsXWAOti%BV($o{j<{~%d+{Xv%f=hzXo+L zzwkEW2j%*E>QqW0LE{8}*1wiE>`4tKh|>0!T*#@{Cj9c*ueH;B(T@!@1G)!e>F%>) z9$vbFeekAZ*E7D_{efV!^XJ=Gk8T(pC`Z(9bn|Rt^YiwtRE3sA7=t^sz|1C-TS!6q z1SV`WleJ708LYN=9?yL*cBZ?Hw@|&6nQ7>uwY6Yms(J&@oppJWe@jiPQ_Uo`--OWS z>e3oT*(~vJ?iuq@>75{-&+|$_RwWn^h9J!>*mb`gq8}`;$UX@YRRPv2HWN`Z#oO+qvtObp8*FuPxSM_AHd6 z+pPO-#lUNF5nB`aEs^GGl91Cfp4t}w5^K%YP6LOUE-geU8~6lxh+#AoGAAEj?+_&< z;EWGB4*Yo&XzopB7bA3$hj$lV7aQHwD7d49 zGF?hLX|nsD00tt+72$G0ewlqfBWW9vg3j;T0MR|3w~Cfg8PHU|IF`7d1{G8+yi6N; zITuzDJvo|tS)TrAU27d{+S|XV_dp+8+=-+ zrr^PVtw506ZSs(}WpPSWvrt={4sjo`9lLsF;OK(%j8{?d^;07p4u^gRFVNS(-(aK@ zUrcp9C5O3X?H=?5z<8vYldr#Qe;>{1_;w~{_3JH$!{nh6lB~0}ZRpU7<}@Oy!=NCa zYpmn>quGR1&tzz5(e}baNBm`Nt_xX*&~L!QPl#Cy|N1PfaptpHv2U+e-w@bPU=c%I zi&9vIirYX3i4$P(@$LvPzreK^+-6aV`?oF8red`nO09TRx)h??X&}*=S-_WUG$}UF z(){dgt{}rbhZhtg5r+(?+QxgvKx9P$bMt`{QVx)jzRnuO8y%R5UBHQd2& zdd&lsZ0G%b#kegS@EHY7<)Bm$q(T;2HFVW%WJRHBm9XUhxPGZ2Qs#)>X4tEMIcNDH z*i*ICk@qjt+-m=?%vUGa?u3&bPfW$?PPxct+b}xJIzQumR{aSC7IdurKmNpS_y5cN zhs;2S+=EI>}}AaPWa!*Gewsv{Pci*tp}gD zcuTLH6m7FS`=@K+FLY{A!^he~!$Ft%XDpoyRyLC}I5%%DRYH3=t)dD-xoXS@HN(&62BwHmq^Yl;N%AE0LXJGzBFthBPie| z{CqI6L{{B+JOulXRQEmDGAI!OS#4_>7ne2=m$)|v%Bllwow=7JsLt`N8V-(WU8F>Q zWjK9N?G3a(w{@8pCl^_Hu-I)uFI!8&TwD`3SB)N+qrx6%dxd|?-usZ?`=g@kVPs!Z znsEjoV|f*Wj0+TKh69I=N8LxL)p|n!`FE>0hQ8Ti8a&A@1xe8AR<~ThkfZnMz}OYJ z7$B;MMvl!Gj)-I*%I*ydh+Nq!9JfG+bv$kHtnn`bJm%;>3ehiVL+rVfpR|oJ$}2K^3wZr}?`|v#2VJxdc|WyFtX3uQ zy}6b|73M{!5dk!}A#d_4$-;i9%dvM%d3a5Gv&6s|_vqB8WA-g&?Mlmqkl36FlQ*gJ zvI$SUW}iB_`)}Vqv#8j7j66ECh$L4B@vWDV!Gqn3-UiPAAj013I_=fQcbyH+zr~|f zuDxbYO9L(~HCsY*Ku;2RQrEtu)+afm>VB)rEfbc3MDlOsRc;^=Cmu!nX_tZ|(;f9$y!4 zXpY0KKJNzq-K=g?J%y_=l>LZp(H=4dTuaNb|P z8;cmS)9@%(7fszmWTdO5QR_Emo_ePy^ihWW4n@$mM;+rHsy84~7rJEAY;A5fBSn~o z{$(=TW_E{1&km&tuiU`j0yhhM_D=%I*3{->Csah|E`85YK&=oV?Ym2ccl8X1hB%LdAURU?l0}r846B5Di)qDHp?juM-Hj}!KguKg@_xy(vSHsIKM&{-A^*$t zNJL96Y$H*lc;iwtUVTZs*ZD7s$YS2QDVWyl{Pm1KyP<< zaSx{DgLO@x#xOYYn%_sCc?(e2h6?RRQ78TaVPmL)p(Mt#XHM)Pq|XcjTlLfz>X_=# zvUE)?*{FiA*37Jf_@vWXPg8fib1@&|Lj*cbQe2RVk-JR9zpcj^c-=jZ$(@hT^}#Cc z-&%hBPxLl8Dr9Xk1PK5So>Ru;(@gbz==SGO?|}fPmf%zDgWBV zdtXW|Ba}0lalzK50jOJ=(HQyb!B5BthHz0$T)Cn?E+b*O{-gK_X+h)G+R7`#AiqrH zbAP{B&D-sK{N~6sRdTZZ;rprM?lJyUh>H1nD7{$p4daN$F9D8>Xb28(dOT{vitA>|Om1UPFXVh~< zw2|X;#>D}Yj9iA)AEc^`gtdgLmL2NlUMNp(7|ktIUA5G{^g1G?*jp#IrbU*by7P%w z@V{x@+z;FML4h12vRT!ZJ9hXuEO1LU$1o>r^5krW!v-*`qY~JxT}4*}DWW;MB6$=E;Kru1cR8gQZ+c_yF8G`$q#} zQvLFLHcA+vn$63AsrCOAoUrRFr0_4cB4k`%<%k^{$eG}G zbIc3D;x!-lcWrf=gn|{gJZ^j(qWwf(-W-+pVB%@z{(p&!|0sGrqR~l+W$@07ibmJD z5A?bLEd&wu7VVa>8b1^A{R;2CQ8WnqEmBru^V2}E30&`so3iWwlManFfWx<8S9agl z3mL9hNS7NEyDM#V6MHhP+=g{y#~>LVdx2<=w`yB*B6JrB`Vc$=y$<%5kW6o|D*>_) zqx$f|urAHCuCZ|xu0(QQNt!E8oi}P2ImkoacDUWqs=I>ut15Oif=0~sBHq!(N-ISX z3=_+?j2B!nirZ}LSR~u}UvaH1qv46Lfbos#@Tj_$1?4E!B zsRb}}aFg6W7VzknK&n9yE1;aNCWst*h57|G?_dm+&qby!35P~ChGmSSpdJNpz}8Hb zVby-loEW&-wk+)F-|aRjBVJ&IwRmugeZbMI+8^+y8i~(mBaXc0fh1q+sm58$Z`e}{ zz-;8ml|M6_ls%yiUUoL8neXI;tKXJ$ka1N|;5m7rUP{I_xcx`r&P|D|_8qetc&5y& zHtXh0OQr)H!<5LbtbnqXDYB{~jqaF09klmf#kO&PfRD+N)wcO?1?a&4{rnT+Wc-8k zH=6&xS`kKu8!w-#>|o(Kap5Qrz;f`N#f9BD!-J(g3Gp)YW2Q_qq1Yfbe!~n=`XML2iHxn&taNP8K9B(#oa4@= z&f9jB{Nu|A7xKkx%g>xR0D6oNBZ7FWf@ia1)t+&;Ob>nR=dj4QkVWJ7f7#0ErgbCz z?o@abTBF7vH>El@&%cMyKj!AOp44en5IOv~T7V7+sy4bzK1oBHTNsF0gM4Pn=8PAY zNuMokUYa{HzK9mh&2=?~$n!B>^>y!I8+>(7j@r3*t|;&s!%1lsF0nF=-yp_NH=3_l z1$Q1NqvpglzZhOh$+0-zqnn74P82 zm6WbveSB{&;aQJ)U|ICL03W{IpW;^&e!i3V9-e@w3YMOS*H~B{C1)3Q6{Dw)SZW;F zFz(9gkg_2jL%GMkJ_kkb*qt}Ti^6XXdF?7$+#p!`=}9m&Z3KvT1BVO(r%^u6t+1Ur zBf7Y=VVy-lxq%j4?lgAa&PRz)uwuHbuzA=qB)t%RgGr4(Sk95$!X!qcm{@OvD8;p7 zuYXs1jiUnRWk56`U^)u|ApElYsno%Um~T%1-dq>bjA+`l$vJt~mA%{PHOuwa&Yq7x ze9w_+akO7~S3EoG?`%GvGk^Ib>Gsse%vX3F>S5Mi%G%9e3jJ9~Lj}&zeFIg=iAQN~ z2%OFAJs@Ir%*HV0rkRRts&d2B>IUad9wykkWQWPUj*RK4?_uoF5NmNFV^~dkd2-u_ z*FQH>Csxdn%cJ8G>KIouj^eSG*mFf(xl@3RS(4=|X_aE&QR-BNfI}$}K4({Ly#=n> zXS*;bl`bX6sowk>$`mX!_CM%)&}$$Vi>zJ0wlvH1U`8(@wTGc9kB~qCM&swAiU|V0 zWY5Z)mYRcthTjiv&)76rQ2yrkq!dP9<6mJDp?bxnNjcW?ABEAlPZ+)34il4F8X};d?jkzwBn>ky@*@4fXhXBW6WjW}Ep+aQtJlkSwX#B#N4oZ3=)+z|QnY zq^bIrP?M{}IDPZNullz;fA$)@^E?j2rh=-sj1j|58MC%W$X4#}j#8P9873ybP`7db zqq>drQo&Uq-ZdXc&VjFV8@0cp8Wnay-J{eNbpN&(z5HsrVn37Ex5ZSe7lM304YfIp z33lDYHX3|BvDnXtGvTS0HkQw1;NkrjnUty5I>>W-=rvODiU;e3(db8|eYjX&Y{<<^ ztS*D9SC{t_ZBMqhU)NsW0_Hu$S%)D`B8mup9V&o7JHytxym7j}U!RUWsdgXKzJN5+ zWl`~{R8MAJuaP|3Tq*y(INHdkm5SLZkwy3yf@39e3WOg z!wbCL4tZ$Qg5cstpZi4_rg12C;~30Mby6~#6KK|^SX9V0R0<=U{!NaVx~=B1)BBtM zQSb+juV%XBkDUO|Y74-JJniJZ(t8WqsT1o)_qV5jtZHj^ZvAhfq75>dLt z%oZID{rIMBeBGrSvk@QN602>>uf98NMozU=&;FY9Cb=@Dthpep<+0l5WA|^*hWvR( zn&OlnAlIcrnf6XFXWM74NX6|ziD^FG<4x#9n6*UjMiY4{*86`Gg}DF!JF$OcV0kcU zZV3@a@5*dUYBu_7*tE1I9e*A)^vq`skfnf5=I9=3N^f|l+o9&$7C~xLTecJr&T+um(AO&;OY9GaVTkM?P|;~A?SX9F9siWS250P1i^A3;vT z;=&p4*LgU-V{RVGJ3+RN+}mLj&$VA>2V3_1erTm0iFD2gckvS#v@+B?@JyJh)?>nA zW#ad=icG0~a#$3l4~)Ug-;Bi{_|2a~A?=RUA+;aY)8EAu8Rmlrm8PrRFo0^iH|SRS z&D}7b9HU(*!P%fyzj^;IsRy@eZtRBD>_705ADA8>5@A2W7E>1L+q*Z_JQi;JM*(&T z30oQiFCG;mh0!|z8Qog*ip1#1Y- z7ec(B`ORnQuK#4uic+e7Y7ut|*j3FZfV(AU{oU6s9e(DTOe(+ZH1?@b=M8mB<|sdT zTH5t9(e|Md?_D{1jnJO1S++wqsXiyMgYozeYo3N%(@13fsI~8W-{A%;DTN~yE>)8$ zG?)N2Esz57*Z#=gn`wsZLW2)qI#E5R?k-Sud>YV+)9t4z>UGa@4&mBcwzpPv}pWR=e{;Okh?I z?DG{lC{R~I1}wV*dVY+kWYaM5q{<0;WQ$O+P^MDSY(N8MtvU||c0ybe!aRle7=;9Q z$C?dC(1B$W`MIx%{&Y!?yZysE5kU-(1~p{`hV!%ZKM` z`l)=K37X+7o%Gsj;<};CWfR9Te_YAz=UP#plAnjlDzvLv{1Wxb4*dtW?bU>oC23pe zTRt(h8pHtb?c5}jGt6@O7(1=_WS_~z`>eHZOgpArz`tI4+5N!>ehxQ#pMqDVcH1(A zOERn)r)8mzFi1$C?`G}PoaZf2?9irZCL71an6aOUula%ja-!{wAICJp+)?e{+>r)+ zg=NS|{O3Y15|kM~GR>R)AgY6&apnLiC#h5y{^~Ll;?U5BIU>GAm*u-mu|?*>BWsF% z1wSE`ThB8ZSOnZ}skoAP;{Q=tMQbq)y?2L6=Q^_m`&k&Uv^+5}UeB;X4l?8=(9fWc zW#)tV;BBKgnHZ0nl{!1*ohQD&Pas20KP@-z>KbF4!HYk~pPClmISd-qodfR7omQ*H zf~T~S*{>z^E;qQ!qv4miM0Z-Rfoipo>a8I@K`gFSZ0~&3(bmF{AmU0R2K^W&ted;; zBFB<7{77=+Dqu0cC3DzeYxF|vH~+rTU**Obny)h@1@3;=-xL@>?>Mcu%=64Sa*-eo z3lz%4RmdBp2G1EjOWR8BQ>k)n{Ze@R_ju-{&&~*j@c*Y*^(C*Sw6t|C6m@>aZJpe4 z=_;&z5Sf2D1>Ty{F1Pjx+WL4g(%ar}l>r6Gp_^y6K~UER+R~ZG-2$DagZDAZDkZ|p z(lpn4nPsw;M!u->PWiN|u2{EB;#TT1ooV?Fbnu-eG2PD2gR5U2eVj=RxZWC%t0S9P zEeqQHLtNXVk249((a?S1pB+PR#Q@kE+V+tu1wni!?!T+E-g-A6-x8D6%p4>F&jncV zZD!_T`w7(__LwYVWQ4S)g6klfZ4Rq*@Me!UIcN`UXp6W6hb}(MY-|Z(xr)j35OZ5? z)Q^q$Z8bBTcd@wlzK?_cmorOkHGlw1;7fe(K^O9)cZE?iaZga7-mKVzq z(To%>sKd+t!Lm4wi@h7CpFieLbo&vzu6xV#@!>W38wodgTsWLd12ZuDL;+4Zy`u&i zU)IL)az@#G-~ILw&V86|&>R<&cG~(~85i?P;n(JC32wVkFqoaMG!?)*mkumnExh0m z!&CQ>%c;X0Y=w8U$7G=DN05)5buUwG=E}3H;Z+rUDZU)-oSLBup#Lc9<$8MXtCM5? zM!g0VuNHWrB{qc;?I%)dXUCUd67)$EGD)b!1v2k4W~JT{C$-JmFmu;PrFur<;^z1E zh*gYJJv{l9%7T&&yI#ssFQYJ&}JA_ z9bA_@;MK!}Cv(MOnE;?d~Rfx?a+Q;eT_b#c$fFFA2x0m z3uI7qs^sj=U8ZH$%-K;dRDbH43H42}mYtpLjvpN0`b+&3t4@((>l{(qOD-n@kx5Eg za$$(%P`VY%Hbp#oWW{F!zHr}_jj35S*0Xf>GPB1c{-08H|CP1K4dKDtVHN954R=9r z^94X+oVjb(wJ5u9n{Rgsp%X4dw8eCwTL14!ReFsgf3Fo?6v4I{uzke_|642W!wZg& zc^n_v96R;J`Nk@eA-`PNqI%c`?T>G5@!*a1sIq!di)+m{(~A;ldgQEf2=oqGgfbhB ziHk{((A!#V0Wu>z%C}#zs7`WqNb#h%(WP5Hqn$g%BqYCVLdE?i0oj8?3OE6S@*n(Y zKizLsA@#}hMSqTmxs?9ET5O)!s;-eZ8Os*xn>{ShD36`Wy>Vkr@0|ZTt}61Qlcq=s6=dG`;2JC4r*CQOb#~8#?c_1!B*ED^8Sd42 zCFC#B6)I0)`i_n&^z^I%1=6H#(_6dJTS=oq?}1c;gHDNYX=_M}tvt>huS?xSuYDrS zJs-iJcm;=spvgeb*e=r8$uFlNU>l;5Ku6>xdnMFj7WA?pIa__X8j20Kc;4}zzD0I= z_c3lapk>ejugat%-f`YtNeCqq_M$tvs0i@0Ki|=O-CteKwDQgxKNEI~TFCBDD+tZk zYT;Q?`~2Fcs+%KETGe;$GjC6uy>$DY^pv8u2Kkye5fBgJz3ir>c0A;3cv$ zWB1Q!`5kGxMuV#kMAtQA1%n-lfIQ}KVr40O=faoSt0LMwl>+Wmyza^t$WV+b1u49C z8*O{?=~&`1d`_0&43}$r1xQFu*G#zhMRnUYRpZ1;n@6Fh@Roo4iW!W^nN(LY!kG9a z9#U;*)#s=(F-Y6N`$hSS)K><*H4WPCiV>bYsk@DNOl)R&pDo}ISL57C+14B*D3W~S zGD2q##HG%X9Fvo%q&nUMeqa*yUbi@v4)`~T6^F&jLi^`%EowjQc6(OTz67FTTGR~f6#`<~9?^T6<$cKNFt}e@(XHsYi$-}1x=ufAe)@?k~u}syFh`9az(GLT-2PKFH zR>bo+XKA@&vN|qPs@2t-d^^t_<;|!;i}-o~%b`p2&uEQq(x7O+z%;eQ4JIRV-3_;f zYG8dH%$)Tvp3g>7OqK~J4~`v^y`%egI#GtxGRegUW1@QwR+oNFqvz98tJ@>LjaWt~>VDNykzci3Ewp9i4n*IqO8?MpvhvFI zW2Uckgn|8Pi1@|XcFaNe)0@QEMbuke7=1!%L~6B#ChyqvHpbe{s9?x+%lkHFSg1vu z+v3g(6X20sG4G6l=E8s&`)KQL?;qMV1}-SzovGc>j#8~jyv;o19n)NSMoPphe|cVd z6*|V3Srn!W?FeJUwotYKvs&g5}M4Kt!b`mJP-((gLvpqsl~T*7)0^Su*E> zE{|bcgMSX1@jd*EF2b7iI}K67ITqQDp}BPO^2;rH{$@rw2|2!_*oB;hebo#LVqKz3 zS=xlH^woMAFp+1d?DCtNyTqPA&`udM;0qurU3?ZQg7 zFw-NKMb!pAnJWo%D98ZGR+Sb{oLd3$nW&X8-KA~X_66^MJQADJ#(F+w_32eP$Doj zd-}Nigv*}9f{FScIF(Q3DAyi&Qg-V z2d}UHS-tLCArP_Y+N~--7HnL_SC}RprIdYL_4qDlhl4x20L!X9%-)V1bke>O2H7!$ zfs?6%)y84wba(xo4sJ~HNwNGjP!h`GN%Wj%w-L$Y5n8#z)}Ip4wq0yUad9hKF%3yBRYiKU?#yttPw) zfm*seJIrB(QQczw^%_w=IToI3NCYitHvph?=H$PG{KzaQgX-m`birTb^T2F`j0^*& zJ7C%#&070MtG5we`T?S&=0O5uFZy`4Oc+D{)USX9Zhlbi_#{?NQlYON81-6 zYWkyMQ9qHWvOjl3y#Rua$$_z-apWFIN*?9KGqK-wBLa~Qs2O5_Ob~yJFz(vz_l=y5 zWZ&}A&x3fM(*R#P+KZDd4?~oicDI(U$@==-h55lnNTB8afV=Ai1%Jd*{D1wdTshzVc6eF6T~Ob{!BR`pL214A;_3mrMvauxsqskTa9_OW#bKjk?b zR^v8(wj8o_P$}%}WC>oTuY^mKl((fDP>Lp+{IUUQ6`=#GDqUry5^m0}lGFV@Xxr6EFd zzw1%N`1>~H%d(c61k=6+gvFO&_C;898zX+di*Z!q(d2RbC4cAMg6U`0M?pdIy}eJx z*VAhZi>$)mB{-Ft35;g2bnL|_%aLCePyYsc*J^-@Nw>P(=oeIQf6AdVpviUYjPW@| zkdXsE1K96B6INm!3x6tM-rA&kVX;|DiiT)xD9Olj>r ztXVVz3lb6ra@l=AsvuaN=; zZ>wgC@786la(It`0fl{HdfahLXB)pJ@pJ196*INrsws=KYOhh4Z+Yw1!=q^*s#%{Y z7<4z?zRf#+ZgnCutx>NUA4U?om0NnDVas;7G?(B@Wc!o2gfn%jB z=eUDZySu~gGh$rOu6GEdB!Mke8M&v??)FaEBOdN~Rq7 z=REkr7gGTf{3C0iq%@C%&QD@C(5iY-;y$jX9j|@M6}?-2OkfO!1e>QpBGc8I&>v2W ziIFX#qGPKBdl0$T6YBkcxWZY43^k;rRrK1+V>f<32NGQaNK$=L)y*H4oZ>_?RB)p zZdU)^v zUw-vq_JZrKMTVU^Jvd3dt*|N5PI3f8L05MX5#7v%9urIR4YR_#R!J+LsmkQJzMDh> zoxw7fPaF;VxtEP1KQ^wU&u_^d=swc7=T*OvdNCu}t24`AByQOPx2L3RheTBVijPUY*ST+>cLXa#EZlM>ua#F*!A?<}s%G@L@-H#JIqlkZS?!`L75px)ahsoUE|^E@kb_Y*kI?stXv_k@hx-SD4n z6AlQm)bf$|y#eN9{$Z%MeKO&L>AxsWsu#WGEEEQQU9I>LLM~EXot0Zn@DDd$cVW8hKZ;+9x9V2%gN$;Gnx~%V zs|YJaiU>@5vFZ92g#UX)Me#Ku@TtJI1oIYAv8?pTtku>5A~Ak;KxSeT`8#CAq^0eH z7ae!LbMk%C0r_{KEa+XBWVs$`f6}~e%l;*uGm2ajeeiiG;?L`XY?&hHwxkW(dOO8s z@(=)8K59MNOVVwRlfUes!uNy*EZ>4yb1ODQi5thKr`E&A^d`+GWZYZ#8`LcEGlE@? z{s0Bw-G{D{US8?8asmP(s37URHqP+?AJ^eUaLT5tP(6B_f0R7gH*5hMnB^qrZDnfG zUUsK{(Q46SNJ>6f{iHbcuBso!%*B{0Ho%e7lXlY)J6Iw~$@x>B*z?Xc@G7_3YM|0? zdW-20|5av%|15@mHtI@BJ7zBkOX{@$eIRd@G7rbmFys=PQP}VCv3#% zxf<{VX=k)d^8-kbWeRnJeVi)&uUYg87yMk%=}HBVq`p!TV=dc@al41V5Yw z)HQY)#H`yEF>U3vZZBP? z5=t3)_X$d3x$`5o(tnBIOv#bffxU^qWy(-jO3w?C;7ftv1N|dDi%4b4cS!bRzXhs^D9j^fC_M;VYqIy&r zf0xR(dkT>@S{hwxj+8P<2gb_pVtrA628p^>0Sg=c(GOy~$BLte-qea4xTl6-ia4@)>SwB;Z1$2$|a^Pk^51;1<)Q9_~sxY{a zF<2!aAf(Dh3wbi8LErHJB_3YL9?nra_KAC6RW0h`IcF%5gcSNa(n=>&#(Rp=7Kc$ShoPDF0s z6=PJMKcd-2B4;OV_rg3F6p_vTC%(O!5}xceFLl>&cM|rT7E@0A%PwR|u<8pv!d`1> z7zhZe+qy1)kzG3D<7RoCk^>?(Fqf3~5hie1PM)ZSI@+0kU|QrVx7iG;HVLyuKmUrs zI+_A>RK5G3u`#mtA8mqLNR)&I@-+1zln<}|kL z;hL`5!f!%{DtVF3p6+8dQ*lXkGa2nlK9-6BNdlbxdBs|J`TK*#^0h89RBWjQX}WFx zeFm`NB-P?`V{j-#JwbG6`8Le$NX1u0_2CD7MbQLx8phCIak>U~&gwa_7F|!-H1K6n zhzCd31ECN6cT;8MWPh*lRGwL+wMW;|)Sa4ueJg!@cr*7LP+3Ed%bmqJ!{P;8$c;8E z9la7b?{h1EYN9SleW{S%|I8NH%U)?vkn?w@w0p~o_@_J!zse&ikdiX{X1QvOgkpL3 zK5e2|%OxxKdGv>YApxJ8Y)hG0;%CG?4rZiS{RwT+Np=3R-~2J=bUZd__M1V@{Oj~ z@U1Q@bp zQhd_p91etg(};AQzjBz}$Cs_um?n6DWlBnF;9%2r&u>6Q)|@U!=_S2MZ_k8>rdiUn zZ<>DW3!0{;r@8{<#?SQo3LknXD-aAvG!UshkFpFiiRy}+(;An%Z)tp047_By_(-J$ zI}Ln6-BP|$7ctQGP-=VkUH8{VALO(Wo;8Z^-BX~PM1;y&+6@y}olw>hoUQez`iy^* z|Gc-=!(sI)?s+y|_uR6T_~pMRy>KJUd1O5R06u*^B)#mMAsaO$JF%(DvP%Ux1g%>t zO55*NR=zPe%8|3y+c$GMPDIR+i4;hqZ_9)Uo*0?*o1L9iOLqz{qS!wdPN>~~Y%z2g zz2L+x!TK9}FM?p**$fj$loFl|xIf%|Ci=REW7y5BBSRgF;tRuND?hZAty~Er8!INT z9cYcfN>|ir&ce`R;{{5-Hw9j|E@wZo{)12MJv6h{ZR-+E9bqdSoUaIf)7AQwyr$P3 z_!AVq3I6jRg-ykQm*RbWSR)KFk3z3aPnU1|k%J0qg$Uw;b&-BT`|xuiyz^XReVaiXkJ49QB% zcaO%R;;JyiJB(%5!U|9O%i7Y1l_yi-QS4sM?fAW3;LCx#Qr@4u$6B#A1`6_qA0pEX z37^-;{+y8S;KjPgGne2A54ug$L`S_=r`1v}tI4#_hTFq3f-@Nh^Lhqak`3sl)f~Ss zp^r6|b5G&9{lOw(UO47V8HP60#606ooBaWky^*HZ*XybzUh9swwvu{aTgr-PS!L$#Y#`c2MT%>cSi(G~VS=Ve6uH%g@9v#n4Z(pmO zb|zU(*bt%(ErcN`_p8GozLH#A-8yD5FGN&suWG_zZt!Vsy4iUsj?Z_dg@=0Ya)-08 z3rv?d8HkJbF9g)18_umj!6_7)1_Y0L*P~n#-Wzj`vD${aC0yGo;3wF&1j4`C0s$Z- z9>5;+|Fm}I-%$2p10PF72qC*AtUXo$vQrJ|AG=7?o!&I$cR&rjM6s zI^p!=PMQrifkP>A5u73ski!p<+FNYnr7)V}?r)!cIJT*wWQlss^}S&(E~i;iwQh$O zkYk$tJ9p`>uh^2ZpL^wA8Fx#~Ys~PL>D;Tj$)7Cj+Z9MId2hl!Zx2F(GN^mNwCM3z zC45MkEj&`W5EBJnLRMDA9p~m))5)72r(cVyKsbjc{>*Z#znD8TdLvVP zIW3V?Q?W27^{94=^y@Qf>BVh6uUvT$HuZt|Eedby;a`9>1IaP>fvmvQKkK=#_am4r z6IwBl%OAt>jiuiAr=-FRJ7am1F>2p{jSW1+HqLAg7bl#%Q(=?$!n?K2Cu*uUV6<^> z9p}B~r}n9>```b>z|kaef^@p`5c@dF{-v}c%v)0fW|lc2I=WDp9CX;~Q)b$v1R?ze zd^8Uf8d2)EkoOXHQFVW?P3ZW-B%UrPfmS|=X=Y>Yd71BMAHakL*lmY#jU$qtwaMds z*bGT`QYTYdyNMzaRK8jXRN| zl-e)Eix+v)N66R0qe{PBghhY)=ea)cwZx6i=#U5vR2@^xaSvCBC8+g{TUbMJ)%LzojnLpbfy zKi9mU!9_V=%I0Tv(lOf1+yfv2-qXS7FDE}f@DwcaIHm85}Px}*O%5whwEZUIQPMd5YW-g-TCBwQYf*Qzhas_4{vN2W9;RyVK zYLB4ySl5yCgdY033#@R|a7&{{M0Xf?tFHKIrOH0QPD_7_t&wtw?K={rDa5ms(QGte z!-PgaHC>?&g4(1~!=z6ZSe z;leV$b27XFIITV^PA3?lM2B?ZgdWcUdKXXphy=a~uXwrCdA>-4aW%d2qn)Ya8?mq) z!=HI9%o-iK==xU7VayyJlQvngsCeaqpIM-@b9;3G-Tc`0hxt?-#a5PmL?eBgx)zSo zcrowU&@3a{vCJW9@kKR0Rfl+45+`^?a2_%h*E6fUJ)Orug=;2X)cA-~nRQO!4ZbTA zI9&occev2Sks7&T+nuM}k+{9uXyk;7^xC_`)6#U28d$wRh&VurZLS0d8eW#foMC@H zBul=X7PN7RQsrT~c;J~ArB2QqnF25OetDq6da5KlFN~Mvyp*(C3vnu4Yf0LPe}jI! zgsM3LqGi-$1NH~nz0Vun{`l70(Yl|J8Na-YjpehvX=C$;M7rxj$0ZyAX$n-1kWe4aGC^Pa zm{zV8P3DJaWJ+Zy`Knw9gy8STC;{$urBSKm~?Y=r-vOi2{ina^H8flCvi zVgmE|#8v&QxYB92NA)Iy)jzyzY{f^92cn|hYG8YcK?s4RzOc{v!ol!wp(K|r=;eyg zzJ5~cjOE&HBVnw0u(z4+UN+@``Z4UVx!F$$cD9@`4uiO%_2K47=82=@I9l<-a4ON0 zhSgp*ngl0_#{N4Jz^(f_*Yuv7+_huoHv5|mnh8jLpY0=56{5ly;cite^bZ)X56t2QfgiJ7oj&x#qQfPacZz zfT-+_2lqU4bz7bBiTSb`;f!|;_#gi6#ll(-IR!whRR>CSn~L+<&rVm zk$;$=2a)_F$ zY=occt1gO3lTk%@j8Z?AXd8uY*Be{eH7%fpxwB^>jZvAi#cLA`2>H|PGOTuz#f>h`Pl{t z_s2)V7x++BORhL9-HpEQ)^cf}(lJ#UZPD~8G{QM{ZARU=fi!fO zTR@w;bu>%^m)Q5pf{fp~teh4}cTfK|5BL^_ms4NSA9F^>hVARqR|yr!Rk}h+J^X@E-NtRq zl|VaW-J;GZKVLIm8CUuud28rF=08yJ;JU~lb@AzwMKhkMM)}!Rc1e3~O_}5y$r@FI zW*6I#?P9aU!0+oY(2bv(>=9L(V;q3wPn2MEsN@k0UCOnu_75_pw}%r!wA&|-GrQC% z$)0r+g|ps@&zA?jrR~&JoC%GnSLc|<1Qzc!G5TmFq%A6#(ntWNLt7xP!%x5ujGhv+ zOuB0Ug*?|+3_BI$?U10@>?S!<47oRCNb9ky}8O0Y?OLEb_veZjcAFW#6v73lw zm%c97MjH1zWbDIoUwD= zbM49LPTrsM99bKH>X7{$9Vw|hz2t}fagZ@$`GaO5NVb`7Fke-B5FAt08k0?~vkb_D zSg;q`f3J-Er;=4%ADG?#R8EeI*ao4ai?-+Rp4uZvdUNDeLftIF+>$oTctLX`MP>~@ z8S2vg4e%0w{_JVnDMCjp6Ip6ofe48mma!oG1`ZV0jO0@YZ6_BEQuNSDJvp>hCkeO{ zOc=V7k-#KJ@IT963DR4e5B}YA`*Fn}crId;HLR)CcY}YzFFn-luF5Q?jySOkl8p09 z-a7Rtu7UU(i zTX;Bk;c42>WWiS5TNmz~(xkyz$~;vavVA&9G^|1YSuq)wemnePD_lNj~8WK8_|su@oPFQ zL0vdV6UioAD6WU9nCFV2`z<&)4Zm|dRk#$`hjYOBn!x+uTa*}`KBC0wcX{$HumI(T zM&Wp0#`eu*6{+kJhYiUTAtRw|+l9rLSDmYRr5{k;H8MBU>Yf{p^EIycj_-9Eveu)n zZW|;kZl5I$7lGx|hx&|veY`jDfycmnLMC=o`fPq06JkCRXR$na$R47 z4HNv9U7md1`f9sROdE$N z$wqL=h0rmn%FOWXcuE}p@Wy;&JH=wx;|WX~W<}NC(O4=NP+M?`PDwi@*eP!ODw=^Q zZh)Mc^+RF};;9YCm+CuO3RN=|a&J-}PVE$mY00$E5SY+$T?`l7b)-A1HcpM!Svd4| z3xnySfg(3TLJ|A7zRXU|XB18og$%@%?YlG=MyR+SVgG);omO|-e$>f7rjTUPZlv(; zNc}J?Rx$3Yp{WMb>Q>sKS=FL-5Z*FezQ89)tq!{{$AukMyvP6UdYQMp1?4iP$y8tp zu_LHGcayNSp}6go$oLI0&-OR|nF;!^3DLl{thbHKnrQoPPQ5 z8pp@&gw4YVIKyE?9SO1pFr&k#F>eHwhSY{|3H$J&bLGuv&MGiXvkZzMOY?&U5?|M#}IzlCq1 zuOzU}Et*OAu8q#wA#V%vJSe=yDd1&N1}ew<{Sj?b=-mTnZc4fuXd+g%pG$Q~T&9E~ zZ77_rT82-;LxdTv;Ieki!&>}%rz!yruz4i7gc{`$6m%BsU#D_-QWlhHakOnwh(ZkltMV9DNaYE6Kun9$&a)qE2YMXnd+V z5qnYu(U0$f=isI~WE#c;KHmA9GMfd}SKwXw9(?m5zd3J(Qr>z)RDtPYFD29elx+Np zt)70?rcNq-!xwS4A}U*SVq~ARA1we3-NTjPb=<`-hCqjmCmjf zLC#s5w3?NhmV`4ft5u7@yoBs+70CcLC36ZZ^ZIG?xIBTc1gypfn)Plyvmz;}1V7{b z%ZO21V_E4oi-5DS68?ZF)hJ0<ugdK>=krfxjkO;2l`jlamHbs(I%>%9%_g@E z5Irfg^4Gz+83To9Q&@IJswNEk9*%Dn{nliON|~xW`U|LSd{wf#jprN39wg%gGkkLD zAE#Gm4AgM;cOM2Cl=X*XPl}wC zcH6z}&*4gfo*GQo+JM~}jDklsrKp{?e^X>9EThWivnMaWRJM9sFbO%wnxGp&=&c%7 z>EX1+v!?k&7l2XT0y@6xdVGaZ(oHLHOozwG>k0R5Iuu7=$hym;OS9IC*E`m&rM4d1 zgClv%{|mlG{Q7#=AD`(rKvH-LJ7DIWRClX(?ReY}N?`AyG!znD8TXQX^X6xRc~_2r zPe6mjLm|_+ZPMhYvTX5z0kXnzsFC}kn}?=NQ#vPCZ$MI~Lh$*&fGPF~yO2HE9XS;;yNK-u z*3L|3FI%4SzW>0fi_+xE@Ka-(%4UXn4v`?ALn}rojZVlawrG-o^NA{X+DLtzY<*JB zU2%od@WlM-k@WYXIS6EJZi+~HbAVTGvy1+${qdG!K%>@2`kHlwt{r_E>UPJR;qn)- zk{`GCtlR(OEgK)EyIQF9rK4A`9%9xIc zv0_Z$$>=dUtx#q|DMoE=R!X< z=O)F + + 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\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.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\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/bsp/stm32/stm32f446-st-nucleo/project.ewp b/bsp/stm32/stm32f446-st-nucleo/project.ewp new file mode 100644 index 0000000000..abcd814379 --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/project.ewp @@ -0,0 +1,2269 @@ + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 30 + 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 + + 30 + 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\stm32f4xx_hal_msp.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\iar\startup_stm32f446xx.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 + + + + CORTEX-M4 + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\context_iar.S + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\backtrace.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\components\drivers\misc\pin.c + + + $PROJ_DIR$\..\..\..\components\drivers\serial\serial.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\completion.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\dataqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\pipe.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringblk_buf.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringbuffer.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\waitqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\workqueue.c + + + + finsh + + $PROJ_DIR$\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\components\finsh\symbol.c + + + $PROJ_DIR$\..\..\..\components\finsh\cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_file.c + + + + STM32_HAL + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cec.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_crc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rng.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_usart.c + + + diff --git a/bsp/stm32/stm32f446-st-nucleo/project.eww b/bsp/stm32/stm32f446-st-nucleo/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/stm32/stm32f446-st-nucleo/project.uvoptx b/bsp/stm32/stm32f446-st-nucleo/project.uvoptx new file mode 100644 index 0000000000..4eb82e38ef --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/project.uvoptx @@ -0,0 +1,997 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 11 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + ST-LINKIII-KEIL_SWO + -U066EFF525750877267023326 -I0 -O206 -S1 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F446ZETx$CMSIS/Flash/STM32F4xx_512.FLM) + + + 0 + JL2CM3 + -U30000299 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F4xx_512 -FL080000 -FS08000000 -FP0($$Device:STM32F446ZETx$CMSIS/Flash/STM32F4xx_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 + + + + + 1 + 0 + 2 + 10000000 + + + + + + Kernel + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + ..\..\..\src\cpu.c + cpu.c + 0 + 0 + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 1 + 11 + 1 + 0 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 1 + 12 + 1 + 0 + 0 + 0 + 0 + ..\..\..\src\scheduler.c + scheduler.c + 0 + 0 + + + 1 + 13 + 1 + 0 + 0 + 0 + 0 + ..\..\..\src\signal.c + signal.c + 0 + 0 + + + 1 + 14 + 1 + 0 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 1 + 15 + 1 + 0 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Applications + 0 + 0 + 0 + 0 + + 2 + 16 + 1 + 0 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 3 + 17 + 1 + 0 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + 0 + board\CubeMX_Config\Src\stm32f4xx_hal_msp.c + stm32f4xx_hal_msp.c + 0 + 0 + + + 3 + 19 + 2 + 0 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm\startup_stm32f446xx.s + startup_stm32f446xx.s + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_common.c + drv_common.c + 0 + 0 + + + + + CORTEX-M4 + 0 + 0 + 0 + 0 + + 4 + 23 + 1 + 0 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + 4 + 24 + 2 + 0 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\backtrace.c + backtrace.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 4 + 27 + 1 + 0 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 5 + 28 + 1 + 0 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 5 + 29 + 1 + 0 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + 5 + 30 + 1 + 0 + 0 + 0 + 0 + ..\..\..\components\drivers\src\completion.c + completion.c + 0 + 0 + + + 5 + 31 + 1 + 0 + 0 + 0 + 0 + ..\..\..\components\drivers\src\dataqueue.c + dataqueue.c + 0 + 0 + + + 5 + 32 + 1 + 0 + 0 + 0 + 0 + ..\..\..\components\drivers\src\pipe.c + pipe.c + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 5 + 34 + 1 + 0 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + 0 + ..\..\..\components\drivers\src\waitqueue.c + waitqueue.c + 0 + 0 + + + 5 + 36 + 1 + 0 + 0 + 0 + 0 + ..\..\..\components\drivers\src\workqueue.c + workqueue.c + 0 + 0 + + + + + finsh + 0 + 0 + 0 + 0 + + 6 + 37 + 1 + 0 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 38 + 1 + 0 + 0 + 0 + 0 + ..\..\..\components\finsh\symbol.c + symbol.c + 0 + 0 + + + 6 + 39 + 1 + 0 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 6 + 40 + 1 + 0 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 41 + 1 + 0 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_cmd.c + msh_cmd.c + 0 + 0 + + + 6 + 42 + 1 + 0 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_file.c + msh_file.c + 0 + 0 + + + + + STM32_HAL + 0 + 0 + 0 + 0 + + 7 + 43 + 1 + 0 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c + system_stm32f4xx.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c + stm32f4xx_hal.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cec.c + stm32f4xx_hal_cec.c + 0 + 0 + + + 7 + 46 + 1 + 0 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c + stm32f4xx_hal_cortex.c + 0 + 0 + + + 7 + 47 + 1 + 0 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_crc.c + stm32f4xx_hal_crc.c + 0 + 0 + + + 7 + 48 + 1 + 0 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp.c + stm32f4xx_hal_cryp.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp_ex.c + stm32f4xx_hal_cryp_ex.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c + stm32f4xx_hal_dma.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c + stm32f4xx_hal_dma_ex.c + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c + stm32f4xx_hal_pwr.c + 0 + 0 + + + 7 + 53 + 1 + 0 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c + stm32f4xx_hal_pwr_ex.c + 0 + 0 + + + 7 + 54 + 1 + 0 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c + stm32f4xx_hal_rcc.c + 0 + 0 + + + 7 + 55 + 1 + 0 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c + stm32f4xx_hal_rcc_ex.c + 0 + 0 + + + 7 + 56 + 1 + 0 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rng.c + stm32f4xx_hal_rng.c + 0 + 0 + + + 7 + 57 + 1 + 0 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c + stm32f4xx_hal_gpio.c + 0 + 0 + + + 7 + 58 + 1 + 0 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c + stm32f4xx_hal_uart.c + 0 + 0 + + + 7 + 59 + 1 + 0 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_usart.c + stm32f4xx_hal_usart.c + 0 + 0 + + + +
diff --git a/bsp/stm32/stm32f446-st-nucleo/project.uvprojx b/bsp/stm32/stm32f446-st-nucleo/project.uvprojx new file mode 100644 index 0000000000..55c03a1d0c --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/project.uvprojx @@ -0,0 +1,742 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + + + STM32F446ZETx + STMicroelectronics + Keil.STM32F4xx_DFP.2.13.0 + http://www.keil.com/pack + IROM(0x08000000,0x00080000) IRAM(0x20000000,0x00020000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32F446ZETx$CMSIS/Flash/STM32F4xx_512.FLM)) + 0 + $$Device:STM32F446ZETx$Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h + + + + + + + + + + $$Device:STM32F446ZETx$CMSIS/SVD/STM32F446x.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + 11 + + + + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 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 + 0x20000 + + + 1 + 0x8000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + + + USE_HAL_DRIVER, STM32F446xx + + .;..\..\..\include;applications;.;board;board\CubeMX_Config\Inc;..\libraries\HAL_Drivers;..\libraries\HAL_Drivers\config;..\..\..\libcpu\arm\cortex-m4;..\..\..\libcpu\arm\common;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Inc;..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Include;..\libraries\STM32F4xx_HAL\CMSIS\Include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + --keep *.o(.rti_fn.*) --keep *.o(FSymTab) + + + + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + components.c + 1 + ..\..\..\src\components.c + + + cpu.c + 1 + ..\..\..\src\cpu.c + + + device.c + 1 + ..\..\..\src\device.c + + + idle.c + 1 + ..\..\..\src\idle.c + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + irq.c + 1 + ..\..\..\src\irq.c + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + mem.c + 1 + ..\..\..\src\mem.c + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + object.c + 1 + ..\..\..\src\object.c + + + scheduler.c + 1 + ..\..\..\src\scheduler.c + + + signal.c + 1 + ..\..\..\src\signal.c + + + thread.c + 1 + ..\..\..\src\thread.c + + + timer.c + 1 + ..\..\..\src\timer.c + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Drivers + + + board.c + 1 + board\board.c + + + stm32f4xx_hal_msp.c + 1 + board\CubeMX_Config\Src\stm32f4xx_hal_msp.c + + + startup_stm32f446xx.s + 2 + ..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm\startup_stm32f446xx.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 + + + + + CORTEX-M4 + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m4\context_rvds.S + + + backtrace.c + 1 + ..\..\..\libcpu\arm\common\backtrace.c + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + + + DeviceDrivers + + + pin.c + 1 + ..\..\..\components\drivers\misc\pin.c + + + serial.c + 1 + ..\..\..\components\drivers\serial\serial.c + + + completion.c + 1 + ..\..\..\components\drivers\src\completion.c + + + dataqueue.c + 1 + ..\..\..\components\drivers\src\dataqueue.c + + + pipe.c + 1 + ..\..\..\components\drivers\src\pipe.c + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\src\ringblk_buf.c + + + ringbuffer.c + 1 + ..\..\..\components\drivers\src\ringbuffer.c + + + waitqueue.c + 1 + ..\..\..\components\drivers\src\waitqueue.c + + + workqueue.c + 1 + ..\..\..\components\drivers\src\workqueue.c + + + + + finsh + + + shell.c + 1 + ..\..\..\components\finsh\shell.c + + + symbol.c + 1 + ..\..\..\components\finsh\symbol.c + + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + + + msh.c + 1 + ..\..\..\components\finsh\msh.c + + + msh_cmd.c + 1 + ..\..\..\components\finsh\msh_cmd.c + + + msh_file.c + 1 + ..\..\..\components\finsh\msh_file.c + + + + + STM32_HAL + + + system_stm32f4xx.c + 1 + ..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c + + + stm32f4xx_hal.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c + + + stm32f4xx_hal_cec.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cec.c + + + stm32f4xx_hal_cortex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c + + + stm32f4xx_hal_crc.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_crc.c + + + stm32f4xx_hal_cryp.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp.c + + + stm32f4xx_hal_cryp_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp_ex.c + + + stm32f4xx_hal_dma.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c + + + stm32f4xx_hal_dma_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c + + + stm32f4xx_hal_pwr.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c + + + stm32f4xx_hal_pwr_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c + + + stm32f4xx_hal_rcc.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c + + + stm32f4xx_hal_rcc_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c + + + stm32f4xx_hal_rng.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rng.c + + + stm32f4xx_hal_gpio.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c + + + stm32f4xx_hal_uart.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c + + + stm32f4xx_hal_usart.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_usart.c + + + + + + + +
diff --git a/bsp/stm32/stm32f446-st-nucleo/rtconfig.h b/bsp/stm32/stm32f446-st-nucleo/rtconfig.h new file mode 100644 index 0000000000..6f058fe597 --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/rtconfig.h @@ -0,0 +1,177 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* Automatically generated file; DO NOT EDIT. */ +/* RT-Thread Configuration */ + +/* RT-Thread Kernel */ + +#define RT_NAME_MAX 8 +#define RT_ALIGN_SIZE 4 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 1000 +#define RT_USING_OVERFLOW_CHECK +#define RT_USING_HOOK +#define RT_USING_IDLE_HOOK +#define RT_IDEL_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 +#define RT_DEBUG + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_HEAP + +/* Kernel Device Object */ + +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_VER_NUM 0x40000 +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M4 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_PRIORITY 10 + +/* C++ features */ + + +/* Command shell */ + +#define RT_USING_FINSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_USING_DESCRIPTION +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 4096 +#define FINSH_CMD_SIZE 80 +#define FINSH_USING_MSH +#define FINSH_USING_MSH_DEFAULT +#define FINSH_USING_MSH_ONLY +#define FINSH_ARG_MAX 10 + +/* Device virtual file system */ + + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_PIPE_BUFSZ 512 +#define RT_USING_SERIAL +#define RT_SERIAL_USING_DMA +#define RT_USING_PIN + +/* Using WiFi */ + + +/* Using USB */ + + +/* POSIX layer and C standard library */ + + +/* Network */ + +/* Socket abstraction layer */ + + +/* light weight TCP/IP stack */ + + +/* Modbus master and slave stack */ + + +/* AT commands */ + + +/* VBUS(Virtual Software BUS) */ + + +/* Utilities */ + + +/* ARM CMSIS */ + + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + + +/* Wiced WiFi */ + + +/* IoT Cloud */ + + +/* security packages */ + + +/* language packages */ + + +/* multimedia packages */ + + +/* tools packages */ + + +/* system packages */ + + +/* peripheral libraries and drivers */ + + +/* miscellaneous packages */ + + +/* sample package */ + +/* samples: kernel and components samples */ + + +/* example package: hello */ + +#define SOC_FAMILY_STM32 +#define SOC_SERIES_STM32F4 + +/* Hardware Drivers Config */ + +#define SOC_STM32F446ZE + +/* Onboard Peripheral Drivers */ + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_UART1 + +/* Board extended module Drivers */ + + +#endif diff --git a/bsp/stm32/stm32f446-st-nucleo/rtconfig.py b/bsp/stm32/stm32f446-st-nucleo/rtconfig.py new file mode 100644 index 0000000000..3241586f69 --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/rtconfig.py @@ -0,0 +1,134 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m4' +CROSS_TOOL='gcc' + +# bsp lib config +BSP_LIBRARY_TYPE = None + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') + +# cross_tool provides the cross compiler +# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = r'C:\Users\XXYYZZ' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armcc' + EXEC_PATH = r'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iar' + EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' + +if PLATFORM == 'gcc': + # toolchains + PREFIX = 'arm-none-eabi-' + CC = PREFIX + 'gcc' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + CXX = PREFIX + 'g++' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + DEVICE = ' -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -std=c99 -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rt-thread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M4.fp ' + CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' + + CFLAGS += ' -D__MICROLIB ' + AFLAGS += ' --pd "__MICROLIB SETA 1" ' + LFLAGS += ' --library_type=microlib ' + EXEC_PATH += '/ARM/ARMCC/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iar': + # toolchains + CC = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M4' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu Cortex-M4' + AFLAGS += ' --fpu VFPv4_sp' + AFLAGS += ' -S' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' diff --git a/bsp/stm32/stm32f446-st-nucleo/template.ewp b/bsp/stm32/stm32f446-st-nucleo/template.ewp new file mode 100644 index 0000000000..934a90e149 --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/template.ewp @@ -0,0 +1,2040 @@ + + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 30 + 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 + + 30 + 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/stm32f446-st-nucleo/template.eww b/bsp/stm32/stm32f446-st-nucleo/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/stm32/stm32f446-st-nucleo/template.uvoptx b/bsp/stm32/stm32f446-st-nucleo/template.uvoptx new file mode 100644 index 0000000000..102eed9e38 --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/template.uvoptx @@ -0,0 +1,182 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 11 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + ST-LINKIII-KEIL_SWO + -U066EFF525750877267023326 -I0 -O206 -S1 -C0 -A0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO7 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F446ZETx$CMSIS/Flash/STM32F4xx_512.FLM) + + + 0 + JL2CM3 + -U30000299 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F4xx_512 -FL080000 -FS08000000 -FP0($$Device:STM32F446ZETx$CMSIS/Flash/STM32F4xx_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 + + + + + 1 + 0 + 2 + 10000000 + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
diff --git a/bsp/stm32/stm32f446-st-nucleo/template.uvprojx b/bsp/stm32/stm32f446-st-nucleo/template.uvprojx new file mode 100644 index 0000000000..61b79362a8 --- /dev/null +++ b/bsp/stm32/stm32f446-st-nucleo/template.uvprojx @@ -0,0 +1,415 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + + + STM32F446ZETx + STMicroelectronics + Keil.STM32F4xx_DFP.2.13.0 + http://www.keil.com/pack + IROM(0x08000000,0x00080000) IRAM(0x20000000,0x00020000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32F446ZETx$CMSIS/Flash/STM32F4xx_512.FLM)) + 0 + $$Device:STM32F446ZETx$Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h + + + + + + + + + + $$Device:STM32F446ZETx$CMSIS/SVD/STM32F446x.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + 11 + + + + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 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 + 0x20000 + + + 1 + 0x8000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Source Group 1 + + + + + +