From f857e8b21c45cff3736f595681c7caeca47680bb Mon Sep 17 00:00:00 2001 From: lhxzui Date: Thu, 23 May 2019 18:33:24 +0800 Subject: [PATCH] 1.add bsp stm32f103-ufun. --- bsp/stm32/stm32f103-ufun/.config | 374 +++ bsp/stm32/stm32f103-ufun/.gitignore | 42 + bsp/stm32/stm32f103-ufun/Kconfig | 22 + bsp/stm32/stm32f103-ufun/README.md | 127 + bsp/stm32/stm32f103-ufun/SConscript | 15 + bsp/stm32/stm32f103-ufun/SConstruct | 59 + .../stm32f103-ufun/applications/SConscript | 11 + bsp/stm32/stm32f103-ufun/applications/main.c | 33 + .../board/CubeMX_Config/.mxproject | 19 + .../board/CubeMX_Config/CubeMX_Config.ioc | 119 + .../board/CubeMX_Config/Inc/main.h | 91 + .../CubeMX_Config/Inc/stm32f1xx_hal_conf.h | 370 ++ .../board/CubeMX_Config/Inc/stm32f1xx_it.h | 84 + .../board/CubeMX_Config/Src/main.c | 253 ++ .../CubeMX_Config/Src/stm32f1xx_hal_msp.c | 172 + .../board/CubeMX_Config/Src/stm32f1xx_it.c | 218 ++ .../CubeMX_Config/Src/system_stm32f1xx.c | 448 +++ bsp/stm32/stm32f103-ufun/board/Kconfig | 78 + bsp/stm32/stm32f103-ufun/board/SConscript | 35 + bsp/stm32/stm32f103-ufun/board/board.c | 44 + bsp/stm32/stm32f103-ufun/board/board.h | 50 + .../board/linker_scripts/link.icf | 28 + .../board/linker_scripts/link.lds | 156 + .../board/linker_scripts/link.sct | 15 + bsp/stm32/stm32f103-ufun/figures/board.jpg | Bin 0 -> 167232 bytes bsp/stm32/stm32f103-ufun/project.ewd | 2966 +++++++++++++++++ bsp/stm32/stm32f103-ufun/project.ewp | 2294 +++++++++++++ bsp/stm32/stm32f103-ufun/project.eww | 10 + bsp/stm32/stm32f103-ufun/project.uvopt | 1131 +++++++ bsp/stm32/stm32f103-ufun/project.uvoptx | 912 +++++ bsp/stm32/stm32f103-ufun/project.uvproj | 724 ++++ bsp/stm32/stm32f103-ufun/project.uvprojx | 707 ++++ bsp/stm32/stm32f103-ufun/rtconfig.h | 173 + bsp/stm32/stm32f103-ufun/rtconfig.py | 143 + bsp/stm32/stm32f103-ufun/template.ewp | 2074 ++++++++++++ bsp/stm32/stm32f103-ufun/template.eww | 10 + bsp/stm32/stm32f103-ufun/template.uvopt | 179 + bsp/stm32/stm32f103-ufun/template.uvoptx | 192 ++ bsp/stm32/stm32f103-ufun/template.uvproj | 407 +++ bsp/stm32/stm32f103-ufun/template.uvprojx | 395 +++ 40 files changed, 15180 insertions(+) create mode 100644 bsp/stm32/stm32f103-ufun/.config create mode 100644 bsp/stm32/stm32f103-ufun/.gitignore create mode 100644 bsp/stm32/stm32f103-ufun/Kconfig create mode 100644 bsp/stm32/stm32f103-ufun/README.md create mode 100644 bsp/stm32/stm32f103-ufun/SConscript create mode 100644 bsp/stm32/stm32f103-ufun/SConstruct create mode 100644 bsp/stm32/stm32f103-ufun/applications/SConscript create mode 100644 bsp/stm32/stm32f103-ufun/applications/main.c create mode 100644 bsp/stm32/stm32f103-ufun/board/CubeMX_Config/.mxproject create mode 100644 bsp/stm32/stm32f103-ufun/board/CubeMX_Config/CubeMX_Config.ioc create mode 100644 bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Inc/main.h create mode 100644 bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Inc/stm32f1xx_hal_conf.h create mode 100644 bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Inc/stm32f1xx_it.h create mode 100644 bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Src/main.c create mode 100644 bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Src/stm32f1xx_hal_msp.c create mode 100644 bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Src/stm32f1xx_it.c create mode 100644 bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Src/system_stm32f1xx.c create mode 100644 bsp/stm32/stm32f103-ufun/board/Kconfig create mode 100644 bsp/stm32/stm32f103-ufun/board/SConscript create mode 100644 bsp/stm32/stm32f103-ufun/board/board.c create mode 100644 bsp/stm32/stm32f103-ufun/board/board.h create mode 100644 bsp/stm32/stm32f103-ufun/board/linker_scripts/link.icf create mode 100644 bsp/stm32/stm32f103-ufun/board/linker_scripts/link.lds create mode 100644 bsp/stm32/stm32f103-ufun/board/linker_scripts/link.sct create mode 100644 bsp/stm32/stm32f103-ufun/figures/board.jpg create mode 100644 bsp/stm32/stm32f103-ufun/project.ewd create mode 100644 bsp/stm32/stm32f103-ufun/project.ewp create mode 100644 bsp/stm32/stm32f103-ufun/project.eww create mode 100644 bsp/stm32/stm32f103-ufun/project.uvopt create mode 100644 bsp/stm32/stm32f103-ufun/project.uvoptx create mode 100644 bsp/stm32/stm32f103-ufun/project.uvproj create mode 100644 bsp/stm32/stm32f103-ufun/project.uvprojx create mode 100644 bsp/stm32/stm32f103-ufun/rtconfig.h create mode 100644 bsp/stm32/stm32f103-ufun/rtconfig.py create mode 100644 bsp/stm32/stm32f103-ufun/template.ewp create mode 100644 bsp/stm32/stm32f103-ufun/template.eww create mode 100644 bsp/stm32/stm32f103-ufun/template.uvopt create mode 100644 bsp/stm32/stm32f103-ufun/template.uvoptx create mode 100644 bsp/stm32/stm32f103-ufun/template.uvproj create mode 100644 bsp/stm32/stm32f103-ufun/template.uvprojx diff --git a/bsp/stm32/stm32f103-ufun/.config b/bsp/stm32/stm32f103-ufun/.config new file mode 100644 index 0000000000..ea87651e7f --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/.config @@ -0,0 +1,374 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# 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_COLOR=y +# CONFIG_RT_DEBUG_INIT_CONFIG is not set +# CONFIG_RT_DEBUG_THREAD_CONFIG is not set +# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set +# CONFIG_RT_DEBUG_IPC_CONFIG is not set +# CONFIG_RT_DEBUG_TIMER_CONFIG is not set +# CONFIG_RT_DEBUG_IRQ_CONFIG is not set +# CONFIG_RT_DEBUG_MEM_CONFIG is not set +# CONFIG_RT_DEBUG_SLAB_CONFIG is not set +# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set +# CONFIG_RT_DEBUG_MODULE_CONFIG is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +# CONFIG_RT_USING_MEMHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMTRACE is not set +CONFIG_RT_USING_HEAP=y + +# +# Kernel Device Object +# +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +CONFIG_RT_VER_NUM=0x40002 +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M3=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_SYSTEM_WORKQUEUE is not set +CONFIG_RT_USING_SERIAL=y +# CONFIG_RT_SERIAL_USING_DMA is not set +CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_MTD is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set +# CONFIG_RT_USING_SENSOR is not set + +# +# Using WiFi +# +# CONFIG_RT_USING_WIFI is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# POSIX layer and C standard library +# +# CONFIG_RT_USING_LIBC is not set +# CONFIG_RT_USING_PTHREADS is not set + +# +# Network +# + +# +# Socket abstraction layer +# +# CONFIG_RT_USING_SAL is not set + +# +# Network interface device +# +# CONFIG_RT_USING_NETDEV 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_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set +# CONFIG_RT_USING_LWP is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_LIBMODBUS is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_EZXML is not set +# CONFIG_PKG_USING_NANOPB is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_RW007 is not set +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set +# CONFIG_PKG_USING_WIZNET is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set +# CONFIG_PKG_USING_TENCENT_IOTKIT is not set +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN 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 +# CONFIG_PKG_USING_STEMWIN is not set + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_ADBD is not set + +# +# system packages +# +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_FAL is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_CMSIS is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_THREAD_POOL is not set + +# +# peripheral libraries and drivers +# +# CONFIG_PKG_USING_SENSORS_DRIVERS is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_U8G2 is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_WM_LIBRARIES is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set + +# +# miscellaneous packages +# +# CONFIG_PKG_USING_LIBCSV is not set +# CONFIG_PKG_USING_OPTPARSE is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_NNOM is not set +CONFIG_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32F1=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_STM32F103RC=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_USING_SPI is not set +# CONFIG_BSP_USING_I2C1 is not set + +# +# Board extended module Drivers +# diff --git a/bsp/stm32/stm32f103-ufun/.gitignore b/bsp/stm32/stm32f103-ufun/.gitignore new file mode 100644 index 0000000000..7221bde019 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/.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/stm32f103-ufun/Kconfig b/bsp/stm32/stm32f103-ufun/Kconfig new file mode 100644 index 0000000000..7a400db91f --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/Kconfig @@ -0,0 +1,22 @@ +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/stm32f103-ufun/README.md b/bsp/stm32/stm32f103-ufun/README.md new file mode 100644 index 0000000000..c0a62b316d --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/README.md @@ -0,0 +1,127 @@ +# BSP README 模板 + +## 简介 + +本文档为 ufun 开发板的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。 + +## 开发板介绍 + +板载资源比较丰富。 +正面有Micro SD 卡槽,usb接口(供电、ISP下载、USB转串口),LED3,触摸按键控制芯片(TTP224N-BSB),CH340 USB 转串口芯片。 +背面有电源开关,BOOT配置拨码开关,蜂鸣器,RGB LED,RTC超级电容,复位按键,触摸按键,SWD调试接口。 +主控MCU STM32F103RCT6,LQFP64封装。 +扩展板, 通过 miniPCIe 来进行连接。 + +开发板外观如下图所示: + +![board](figures/board.jpg) + +该开发板常用 **板载资源** 如下: + +- MCU:STM32F103RCT6,主频 72MHz,256KB FLASH ,48KB RAM +- 外部 RAM:无 +- 外部 FLASH:无 +- 常用外设 + - LED:2个,LED3(红色,PA3),LED1(RGB,PA1,PA2,PA0) + - 按键:5个,K1(复位),上下左右4个触摸按键 +- 常用接口:USB 转串口、SD 卡接口等 +- 调试接口,标准 SWD + +开发板更多详细信息请参考【ufun】 [ufun开发板介绍]链接https://forum.mianbaoban.cn/topic/70846_1_1.html。 + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :----------------- | :----------: | :------------------------------------| +| USB 转串口 | 支持 | | +| SPI Flash | 暂不支持 | | +| 以太网 | 暂不支持 | | +| SD卡 | 暂不支持 | | +| CAN | 暂不支持 | | +| **片上外设** | **支持情况** | **备注** | +| GPIO | 支持 | PA0, PA1... PK15 ---> PIN: 0, 1...64 | +| UART | 支持 | UART1 | +| SPI | 暂不支持 | | +| I2C | 暂不支持 | | +| SDIO | 暂不支持 | | +| RTC | 暂不支持 | | +| PWM | 暂不支持 | | +| USB Device | 暂不支持 | | +| USB Host | 暂不支持 | | +| IWG | 暂不支持 | | +| **扩展模块** | **支持情况** | **备注** | +| xxx 模块 | 支持 | | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + + +### 快速上手 + +本 BSP 为开发者提供 MDK4、MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线连接开发板到 PC,打开电源开关。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 xxx 仿真器下载程序,在通过 xxx 连接开发板的基础上,点击下载按钮即可下载程序到开发板 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,【这里写开发板运行起来之后的现象,如:LED 闪烁等】。 + +连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + + + \ | / +- RT - Thread Operating System + / | \ 4.0.2 build May 23 2019 + 2006 - 2019 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)。 + +## 注意事项 + +- xxx + +## 联系人信息 + +维护人: + +- [rfq](https://github.com/lhxzui), 邮箱: \ No newline at end of file diff --git a/bsp/stm32/stm32f103-ufun/SConscript b/bsp/stm32/stm32f103-ufun/SConscript new file mode 100644 index 0000000000..20f7689c53 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/SConscript @@ -0,0 +1,15 @@ +# for module compiling +import os +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +Return('objs') diff --git a/bsp/stm32/stm32f103-ufun/SConstruct b/bsp/stm32/stm32f103-ufun/SConstruct new file mode 100644 index 0000000000..27b5e7fccc --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/SConstruct @@ -0,0 +1,59 @@ +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', + CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM == 'iar': + env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = env["LINKCOM"] + ' --map rt-thread.map') + +Export('RTT_ROOT') +Export('rtconfig') + +SDK_ROOT = os.path.abspath('./') + +if os.path.exists(SDK_ROOT + '/libraries'): + libraries_path_prefix = SDK_ROOT + '/libraries' +else: + libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries' + +SDK_LIB = libraries_path_prefix +Export('SDK_LIB') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +stm32_library = 'STM32F1xx_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/stm32f103-ufun/applications/SConscript b/bsp/stm32/stm32f103-ufun/applications/SConscript new file mode 100644 index 0000000000..04f04dd543 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/applications/SConscript @@ -0,0 +1,11 @@ +Import('RTT_ROOT') +Import('rtconfig') +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [cwd, str(Dir('#'))] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/stm32/stm32f103-ufun/applications/main.c b/bsp/stm32/stm32f103-ufun/applications/main.c new file mode 100644 index 0000000000..737c362b23 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/applications/main.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift first version + */ + +#include +#include +#include + +/* defined the LED3 pin: PA3 */ +#define LED3_PIN GET_PIN(A, 3) + +int main(void) +{ + int count = 1; + /* set LED0 pin mode to output */ + rt_pin_mode(LED3_PIN, PIN_MODE_OUTPUT); + + while (count++) + { + rt_pin_write(LED3_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED3_PIN, PIN_LOW); + rt_thread_mdelay(500); + } + + return RT_EOK; +} diff --git a/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/.mxproject new file mode 100644 index 0000000000..7c22131e98 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/.mxproject @@ -0,0 +1,19 @@ +[PreviousGenFiles] +HeaderPath=F:/program/rt-thread/rt-thread/bsp/stm32/stm32f103RCT6-ufun/board/CubeMX_Config/Inc +HeaderFiles=stm32f1xx_it.h;stm32f1xx_hal_conf.h;main.h; +SourcePath=F:/program/rt-thread/rt-thread/bsp/stm32/stm32f103RCT6-ufun/board/CubeMX_Config/Src +SourceFiles=stm32f1xx_it.c;stm32f1xx_hal_msp.c;main.c; + +[PreviousLibFiles] +LibFiles=Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h;Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h;Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xe.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/system_stm32f1xx.h;Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/system_stm32f1xx.c;Drivers/CMSIS/Include/arm_common_tables.h;Drivers/CMSIS/Include/arm_const_structs.h;Drivers/CMSIS/Include/arm_math.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armcc_V6.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_cmFunc.h;Drivers/CMSIS/Include/core_cmInstr.h;Drivers/CMSIS/Include/core_cmSimd.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h; + +[PreviousUsedKeilFiles] +SourceFiles=..\Src\main.c;..\Src\stm32f1xx_it.c;..\Src\stm32f1xx_hal_msp.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../\Src/system_stm32f1xx.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../\Src/system_stm32f1xx.c;../Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/system_stm32f1xx.c;null; +HeaderPath=..\Drivers\STM32F1xx_HAL_Driver\Inc;..\Drivers\STM32F1xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32F1xx\Include;..\Drivers\CMSIS\Include;..\Inc; +CDefines=USE_HAL_DRIVER;STM32F103xE; + +[PreviousUsedIarFiles] +SourceFiles=..\Src\main.c;..\Src\stm32f1xx_it.c;..\Src\stm32f1xx_hal_msp.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../\Src/system_stm32f1xx.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../\Src/system_stm32f1xx.c;../Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/system_stm32f1xx.c;null; +HeaderPath=..\Drivers\STM32F1xx_HAL_Driver\Inc;..\Drivers\STM32F1xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32F1xx\Include;..\Drivers\CMSIS\Include;..\Inc; +CDefines=USE_HAL_DRIVER;STM32F103xE; + diff --git a/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/CubeMX_Config.ioc b/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/CubeMX_Config.ioc new file mode 100644 index 0000000000..5d7129b08d --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/CubeMX_Config.ioc @@ -0,0 +1,119 @@ +#MicroXplorer Configuration settings - do not modify +File.Version=6 +KeepUserPlacement=false +Mcu.Family=STM32F1 +Mcu.IP0=NVIC +Mcu.IP1=RCC +Mcu.IP2=SYS +Mcu.IP3=USART1 +Mcu.IPNb=4 +Mcu.Name=STM32F103R(C-D-E)Tx +Mcu.Package=LQFP64 +Mcu.Pin0=PC14-OSC32_IN +Mcu.Pin1=PC15-OSC32_OUT +Mcu.Pin2=PD0-OSC_IN +Mcu.Pin3=PD1-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=STM32F103RCTx +MxCube.Version=5.2.0 +MxDb.Version=DB.5.0.20 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false\:true +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false +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=STM32F103 +PCC.MCU=STM32F103R(C-D-E)Tx +PCC.PartNumber=STM32F103RCTx +PCC.Seq0=0 +PCC.Series=STM32F1 +PCC.Temperature=25 +PCC.Vdd=3.3 +PD0-OSC_IN.Mode=HSE-External-Oscillator +PD0-OSC_IN.Signal=RCC_OSC_IN +PD1-OSC_OUT.Mode=HSE-External-Oscillator +PD1-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=STM32F103RCTx +ProjectManager.FirmwarePackage=STM32Cube FW_F1 V1.7.0 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=0 +ProjectManager.MainLocation=Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=CubeMX_Config.ioc +ProjectManager.ProjectName=CubeMX_Config +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=MDK-ARM V5 +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true +RCC.ADCFreqValue=36000000 +RCC.AHBFreq_Value=72000000 +RCC.APB1CLKDivider=RCC_HCLK_DIV2 +RCC.APB1Freq_Value=36000000 +RCC.APB1TimFreq_Value=72000000 +RCC.APB2Freq_Value=72000000 +RCC.APB2TimFreq_Value=72000000 +RCC.FCLKCortexFreq_Value=72000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=72000000 +RCC.HSE_VALUE=12000000 +RCC.I2S2Freq_Value=72000000 +RCC.I2S3Freq_Value=72000000 +RCC.IPParameters=ADCFreqValue,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,I2S2Freq_Value,I2S3Freq_Value,MCOFreq_Value,PLLCLKFreq_Value,PLLMCOFreq_Value,PLLMUL,PLLSourceVirtual,SDIOFreq_Value,SDIOHCLKDiv2FreqValue,SYSCLKFreq_VALUE,SYSCLKSource,TimSysFreq_Value,USBFreq_Value,VCOOutput2Freq_Value +RCC.MCOFreq_Value=72000000 +RCC.PLLCLKFreq_Value=72000000 +RCC.PLLMCOFreq_Value=36000000 +RCC.PLLMUL=RCC_PLL_MUL6 +RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE +RCC.SDIOFreq_Value=72000000 +RCC.SDIOHCLKDiv2FreqValue=36000000 +RCC.SYSCLKFreq_VALUE=72000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.TimSysFreq_Value=72000000 +RCC.USBFreq_Value=72000000 +RCC.VCOOutput2Freq_Value=12000000 +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/stm32f103-ufun/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Inc/main.h new file mode 100644 index 0000000000..d956854a25 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/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 "stm32f1xx_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/stm32f103-ufun/board/CubeMX_Config/Inc/stm32f1xx_hal_conf.h b/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Inc/stm32f1xx_hal_conf.h new file mode 100644 index 0000000000..a73bfac831 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Inc/stm32f1xx_hal_conf.h @@ -0,0 +1,370 @@ +/** + ****************************************************************************** + * @file stm32f1xx_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 __STM32F1xx_HAL_CONF_H +#define __STM32F1xx_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_CEC_MODULE_ENABLED */ +/*#define HAL_CORTEX_MODULE_ENABLED */ +/*#define HAL_CRC_MODULE_ENABLED */ +/*#define HAL_DAC_MODULE_ENABLED */ +/*#define HAL_DMA_MODULE_ENABLED */ +/*#define HAL_ETH_MODULE_ENABLED */ +/*#define HAL_FLASH_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +/*#define HAL_I2C_MODULE_ENABLED */ +/*#define HAL_I2S_MODULE_ENABLED */ +/*#define HAL_IRDA_MODULE_ENABLED */ +/*#define HAL_IWDG_MODULE_ENABLED */ +/*#define HAL_NOR_MODULE_ENABLED */ +/*#define HAL_NAND_MODULE_ENABLED */ +/*#define HAL_PCCARD_MODULE_ENABLED */ +/*#define HAL_PCD_MODULE_ENABLED */ +/*#define HAL_HCD_MODULE_ENABLED */ +/*#define HAL_PWR_MODULE_ENABLED */ +/*#define HAL_RCC_MODULE_ENABLED */ +/*#define HAL_RTC_MODULE_ENABLED */ +/*#define HAL_SD_MODULE_ENABLED */ +/*#define HAL_MMC_MODULE_ENABLED */ +/*#define HAL_SDRAM_MODULE_ENABLED */ +/*#define HAL_SMARTCARD_MODULE_ENABLED */ +/*#define HAL_SPI_MODULE_ENABLED */ +/*#define HAL_SRAM_MODULE_ENABLED */ +/*#define HAL_TIM_MODULE_ENABLED */ +#define HAL_UART_MODULE_ENABLED +/*#define HAL_USART_MODULE_ENABLED */ +/*#define HAL_WWDG_MODULE_ENABLED */ +/*#define HAL_EXTI_MODULE_ENABLED */ + +#define HAL_CORTEX_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_GPIO_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED + +/* ########################## Oscillator Values adaptation ####################*/ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)12000000) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)100) /*!< 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)8000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE 40000U /*!< LSI Typical Value in Hz */ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature. */ + +/** + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768) /*!< Value of the External oscillator in Hz*/ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE ((uint32_t)3300) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)0) /*!< tick interrupt priority (lowest by default) */ +#define USE_RTOS 0 +#define PREFETCH_ENABLE 1 + +/* ########################## 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 2 +#define MAC_ADDR1 0 +#define MAC_ADDR2 0 +#define MAC_ADDR3 0 +#define MAC_ADDR4 0 +#define MAC_ADDR5 0 + +/* 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)8) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)4) /* 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)0x000000FF) +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFF) + +#define PHY_READ_TO ((uint32_t)0x0000FFFF) +#define PHY_WRITE_TO ((uint32_t)0x0000FFFF) + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x00) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x01) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002) /*!< 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 */ + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32f1xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32f1xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32f1xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32f1xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED + #include "stm32f1xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32f1xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32f1xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32f1xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32f1xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32f1xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32f1xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32f1xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32f1xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32f1xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32f1xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32f1xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32f1xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32f1xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32f1xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED + #include "stm32f1xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32f1xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32f1xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32f1xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32f1xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32f1xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32f1xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32f1xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32f1xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32f1xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32f1xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32f1xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32f1xx_hal_hcd.h" +#endif /* HAL_HCD_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 /* __STM32F1xx_HAL_CONF_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Inc/stm32f1xx_it.h b/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Inc/stm32f1xx_it.h new file mode 100644 index 0000000000..180f309a88 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Inc/stm32f1xx_it.h @@ -0,0 +1,84 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f1xx_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 __STM32F1xx_IT_H +#define __STM32F1xx_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 /* __STM32F1xx_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Src/main.c new file mode 100644 index 0000000000..42ae29975a --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Src/main.c @@ -0,0 +1,253 @@ +/* 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 */ +/* Private variables ---------------------------------------------------------*/ + +/* 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 */ +/* Private function prototypes -----------------------------------------------*/ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_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}; + + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief 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_GPIOD_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + while(1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(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/stm32f103-ufun/board/CubeMX_Config/Src/stm32f1xx_hal_msp.c b/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Src/stm32f1xx_hal_msp.c new file mode 100644 index 0000000000..aa65038fc5 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Src/stm32f1xx_hal_msp.c @@ -0,0 +1,172 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : stm32f1xx_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_AFIO_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /** NOJTAG: JTAG-DP Disabled and SW-DP Enabled + */ + __HAL_AFIO_REMAP_SWJ_NOJTAG(); + + /* 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_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_INPUT; + GPIO_InitStruct.Pull = GPIO_NOPULL; + 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/stm32f103-ufun/board/CubeMX_Config/Src/stm32f1xx_it.c b/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Src/stm32f1xx_it.c new file mode 100644 index 0000000000..52e28dd82d --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Src/stm32f1xx_it.c @@ -0,0 +1,218 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f1xx_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 "stm32f1xx_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-M3 Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } +} + +/** + * @brief This function handles Prefetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVCall_IRQn 0 */ + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32F1xx 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_stm32f1xx.s). */ +/******************************************************************************/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Src/system_stm32f1xx.c b/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Src/system_stm32f1xx.c new file mode 100644 index 0000000000..af3759a3b6 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/board/CubeMX_Config/Src/system_stm32f1xx.c @@ -0,0 +1,448 @@ +/** + ****************************************************************************** + * @file system_stm32f1xx.c + * @author MCD Application Team + * @version V4.2.0 + * @date 31-March-2017 + * @brief CMSIS Cortex-M3 Device Peripheral Access Layer System Source File. + * + * 1. This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): Setups the system clock (System clock source, PLL Multiplier + * factors, AHB/APBx prescalers and Flash settings). + * This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f1xx_xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * 2. After each device reset the HSI (8 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32f1xx_xx.s" file, to + * configure the system clock before to branch to main program. + * + * 4. The default value of HSE crystal is set to 8 MHz (or 25 MHz, depending on + * the product used), refer to "HSE_VALUE". + * When HSE is used as system clock source, directly or through PLL, and you + * are using different crystal you have to adapt the HSE value to your own + * configuration. + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f1xx_system + * @{ + */ + +/** @addtogroup STM32F1xx_System_Private_Includes + * @{ + */ + +#include "stm32f1xx.h" + +/** + * @} + */ + +/** @addtogroup STM32F1xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F1xx_System_Private_Defines + * @{ + */ + +#if !defined (HSE_VALUE) + #define HSE_VALUE 8000000U /*!< Default value of the External oscillator in Hz. + This value can be provided and adapted by the user application. */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE 8000000U /*!< Default value of the Internal oscillator in Hz. + This value can be provided and adapted by the user application. */ +#endif /* HSI_VALUE */ + +/*!< Uncomment the following line if you need to use external SRAM */ +#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG) +/* #define DATA_IN_ExtSRAM */ +#endif /* STM32F100xE || STM32F101xE || STM32F101xG || STM32F103xE || STM32F103xG */ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ + + +/** + * @} + */ + +/** @addtogroup STM32F1xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F1xx_System_Private_Variables + * @{ + */ + +/******************************************************************************* +* Clock Definitions +*******************************************************************************/ +#if defined(STM32F100xB) ||defined(STM32F100xE) + uint32_t SystemCoreClock = 24000000U; /*!< System Clock Frequency (Core Clock) */ +#else /*!< HSI Selected as System Clock source */ + uint32_t SystemCoreClock = 72000000U; /*!< System Clock Frequency (Core Clock) */ +#endif + +const uint8_t AHBPrescTable[16U] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; +const uint8_t APBPrescTable[8U] = {0, 0, 0, 0, 1, 2, 3, 4}; + +/** + * @} + */ + +/** @addtogroup STM32F1xx_System_Private_FunctionPrototypes + * @{ + */ + +#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG) +#ifdef DATA_IN_ExtSRAM + static void SystemInit_ExtMemCtl(void); +#endif /* DATA_IN_ExtSRAM */ +#endif /* STM32F100xE || STM32F101xE || STM32F101xG || STM32F103xE || STM32F103xG */ + +/** + * @} + */ + +/** @addtogroup STM32F1xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the Embedded Flash Interface, the PLL and update the + * SystemCoreClock variable. + * @note This function should be used only after reset. + * @param None + * @retval None + */ +void SystemInit (void) +{ + /* Reset the RCC clock configuration to the default reset state(for debug purpose) */ + /* Set HSION bit */ + RCC->CR |= 0x00000001U; + + /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */ +#if !defined(STM32F105xC) && !defined(STM32F107xC) + RCC->CFGR &= 0xF8FF0000U; +#else + RCC->CFGR &= 0xF0FF0000U; +#endif /* STM32F105xC */ + + /* Reset HSEON, CSSON and PLLON bits */ + RCC->CR &= 0xFEF6FFFFU; + + /* Reset HSEBYP bit */ + RCC->CR &= 0xFFFBFFFFU; + + /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */ + RCC->CFGR &= 0xFF80FFFFU; + +#if defined(STM32F105xC) || defined(STM32F107xC) + /* Reset PLL2ON and PLL3ON bits */ + RCC->CR &= 0xEBFFFFFFU; + + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x00FF0000U; + + /* Reset CFGR2 register */ + RCC->CFGR2 = 0x00000000U; +#elif defined(STM32F100xB) || defined(STM32F100xE) + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x009F0000U; + + /* Reset CFGR2 register */ + RCC->CFGR2 = 0x00000000U; +#else + /* Disable all interrupts and clear pending bits */ + RCC->CIR = 0x009F0000U; +#endif /* STM32F105xC */ + +#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG) + #ifdef DATA_IN_ExtSRAM + SystemInit_ExtMemCtl(); + #endif /* DATA_IN_ExtSRAM */ +#endif + +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f1xx.h file (default value + * 8 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f1xx.h file (default value + * 8 MHz or 25 MHz, depending on the product used), user has to ensure + * that HSE_VALUE is same as the real frequency of the crystal used. + * Otherwise, this function may have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * @param None + * @retval None + */ +void SystemCoreClockUpdate (void) +{ + uint32_t tmp = 0U, pllmull = 0U, pllsource = 0U; + +#if defined(STM32F105xC) || defined(STM32F107xC) + uint32_t prediv1source = 0U, prediv1factor = 0U, prediv2factor = 0U, pll2mull = 0U; +#endif /* STM32F105xC */ + +#if defined(STM32F100xB) || defined(STM32F100xE) + uint32_t prediv1factor = 0U; +#endif /* STM32F100xB or STM32F100xE */ + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00U: /* HSI used as system clock */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04U: /* HSE used as system clock */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08U: /* PLL used as system clock */ + + /* Get PLL clock source and multiplication factor ----------------------*/ + pllmull = RCC->CFGR & RCC_CFGR_PLLMULL; + pllsource = RCC->CFGR & RCC_CFGR_PLLSRC; + +#if !defined(STM32F105xC) && !defined(STM32F107xC) + pllmull = ( pllmull >> 18U) + 2U; + + if (pllsource == 0x00U) + { + /* HSI oscillator clock divided by 2 selected as PLL clock entry */ + SystemCoreClock = (HSI_VALUE >> 1U) * pllmull; + } + else + { + #if defined(STM32F100xB) || defined(STM32F100xE) + prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1U; + /* HSE oscillator clock selected as PREDIV1 clock entry */ + SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull; + #else + /* HSE selected as PLL clock entry */ + if ((RCC->CFGR & RCC_CFGR_PLLXTPRE) != (uint32_t)RESET) + {/* HSE oscillator clock divided by 2 */ + SystemCoreClock = (HSE_VALUE >> 1U) * pllmull; + } + else + { + SystemCoreClock = HSE_VALUE * pllmull; + } + #endif + } +#else + pllmull = pllmull >> 18U; + + if (pllmull != 0x0DU) + { + pllmull += 2U; + } + else + { /* PLL multiplication factor = PLL input clock * 6.5 */ + pllmull = 13U / 2U; + } + + if (pllsource == 0x00U) + { + /* HSI oscillator clock divided by 2 selected as PLL clock entry */ + SystemCoreClock = (HSI_VALUE >> 1U) * pllmull; + } + else + {/* PREDIV1 selected as PLL clock entry */ + + /* Get PREDIV1 clock source and division factor */ + prediv1source = RCC->CFGR2 & RCC_CFGR2_PREDIV1SRC; + prediv1factor = (RCC->CFGR2 & RCC_CFGR2_PREDIV1) + 1U; + + if (prediv1source == 0U) + { + /* HSE oscillator clock selected as PREDIV1 clock entry */ + SystemCoreClock = (HSE_VALUE / prediv1factor) * pllmull; + } + else + {/* PLL2 clock selected as PREDIV1 clock entry */ + + /* Get PREDIV2 division factor and PLL2 multiplication factor */ + prediv2factor = ((RCC->CFGR2 & RCC_CFGR2_PREDIV2) >> 4U) + 1U; + pll2mull = ((RCC->CFGR2 & RCC_CFGR2_PLL2MUL) >> 8U) + 2U; + SystemCoreClock = (((HSE_VALUE / prediv2factor) * pll2mull) / prediv1factor) * pllmull; + } + } +#endif /* STM32F105xC */ + break; + + default: + SystemCoreClock = HSI_VALUE; + break; + } + + /* Compute HCLK clock frequency ----------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4U)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; +} + +#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG) +/** + * @brief Setup the external memory controller. Called in startup_stm32f1xx.s + * before jump to __main + * @param None + * @retval None + */ +#ifdef DATA_IN_ExtSRAM +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f1xx_xx.s/.c before jump to main. + * This function configures the external SRAM mounted on STM3210E-EVAL + * board (STM32 High density devices). This SRAM will be used as program + * data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmpreg; + /*!< FSMC Bank1 NOR/SRAM3 is used for the STM3210E-EVAL, if another Bank is + required, then adjust the Register Addresses */ + + /* Enable FSMC clock */ + RCC->AHBENR = 0x00000114U; + + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->AHBENR, RCC_AHBENR_FSMCEN); + + /* Enable GPIOD, GPIOE, GPIOF and GPIOG clocks */ + RCC->APB2ENR = 0x000001E0U; + + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_IOPDEN); + + (void)(tmpreg); + +/* --------------- SRAM Data lines, NOE and NWE configuration ---------------*/ +/*---------------- SRAM Address lines configuration -------------------------*/ +/*---------------- NOE and NWE configuration --------------------------------*/ +/*---------------- NE3 configuration ----------------------------------------*/ +/*---------------- NBL0, NBL1 configuration ---------------------------------*/ + + GPIOD->CRL = 0x44BB44BBU; + GPIOD->CRH = 0xBBBBBBBBU; + + GPIOE->CRL = 0xB44444BBU; + GPIOE->CRH = 0xBBBBBBBBU; + + GPIOF->CRL = 0x44BBBBBBU; + GPIOF->CRH = 0xBBBB4444U; + + GPIOG->CRL = 0x44BBBBBBU; + GPIOG->CRH = 0x444B4B44U; + +/*---------------- FSMC Configuration ---------------------------------------*/ +/*---------------- Enable FSMC Bank1_SRAM Bank ------------------------------*/ + + FSMC_Bank1->BTCR[4U] = 0x00001091U; + FSMC_Bank1->BTCR[5U] = 0x00110212U; +} +#endif /* DATA_IN_ExtSRAM */ +#endif /* STM32F100xE || STM32F101xE || STM32F101xG || STM32F103xE || STM32F103xG */ + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f103-ufun/board/Kconfig b/bsp/stm32/stm32f103-ufun/board/Kconfig new file mode 100644 index 0000000000..1dd60c1469 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/board/Kconfig @@ -0,0 +1,78 @@ +menu "Hardware Drivers Config" + +config SOC_STM32F103RC + bool + select SOC_SERIES_STM32F1 + 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 + + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n + + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n + endif + + menuconfig BSP_USING_I2C1 + bool "Enable I2C1 BUS (software simulation)" + default n + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + if BSP_USING_I2C1 + config BSP_I2C1_SCL_PIN + int "i2c1 scl pin number" + range 1 216 + default 15 + config BSP_I2C1_SDA_PIN + int "I2C1 sda pin number" + range 1 216 + default 16 + endif + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/stm32/stm32f103-ufun/board/SConscript b/bsp/stm32/stm32f103-ufun/board/SConscript new file mode 100644 index 0000000000..0f7ccb024c --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/board/SConscript @@ -0,0 +1,35 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +CubeMX_Config/Src/stm32f1xx_hal_msp.c +''') + +path = [cwd] +path += [cwd + '/CubeMX_Config/Inc'] + +startup_path_prefix = SDK_LIB + +if rtconfig.CROSS_TOOL == 'gcc': + src += [startup_path_prefix + '/STM32F1xx_HAL/CMSIS/Device/ST/STM32F1xx/Source/Templates/gcc/startup_stm32f103xe.s'] +elif rtconfig.CROSS_TOOL == 'keil': + src += [startup_path_prefix + '/STM32F1xx_HAL/CMSIS/Device/ST/STM32F1xx/Source/Templates/arm/startup_stm32f103xe.s'] +elif rtconfig.CROSS_TOOL == 'iar': + src += [startup_path_prefix + '/STM32F1xx_HAL/CMSIS/Device/ST/STM32F1xx/Source/Templates/iar/startup_stm32f103xe.s'] + +# STM32F100xB || STM32F100xE || STM32F101x6 +# STM32F101xB || STM32F101xE || STM32F101xG +# STM32F102x6 || STM32F102xB || STM32F103x6 +# STM32F103xB || STM32F103xE || STM32F103xG +# STM32F105xC || STM32F107xC) +# You can select chips from the list above +CPPDEFINES = ['STM32F103xE'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) +Return('group') diff --git a/bsp/stm32/stm32f103-ufun/board/board.c b/bsp/stm32/stm32f103-ufun/board/board.c new file mode 100644 index 0000000000..4df20fbd48 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/board/board.c @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift first version + */ + +#include "board.h" + +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} diff --git a/bsp/stm32/stm32f103-ufun/board/board.h b/bsp/stm32/stm32f103-ufun/board/board.h new file mode 100644 index 0000000000..8c0aa1d769 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/board/board.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-5 SummerGift first version + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include +#include "drv_common.h" +#include "drv_gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define STM32_FLASH_START_ADRESS ((uint32_t)0x08000000) +#define STM32_FLASH_SIZE (256 * 1024) +#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE)) + +/* Internal SRAM memory size[Kbytes] <8-64>, Default: 64*/ +#define STM32_SRAM_SIZE 48 +#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 ((void *)&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="CSTACK" +#define HEAP_BEGIN (__segment_end("CSTACK")) +#else +extern int __bss_end; +#define HEAP_BEGIN ((void *)&__bss_end) +#endif + +#define HEAP_END STM32_SRAM_END + +void SystemClock_Config(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __BOARD_H__ */ diff --git a/bsp/stm32/stm32f103-ufun/board/linker_scripts/link.icf b/bsp/stm32/stm32f103-ufun/board/linker_scripts/link.icf new file mode 100644 index 0000000000..97c7f7f1df --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/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__ = 0x0803FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x2000BFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x0400; +define symbol __ICFEDIT_size_heap__ = 0x0000; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, last block CSTACK}; diff --git a/bsp/stm32/stm32f103-ufun/board/linker_scripts/link.lds b/bsp/stm32/stm32f103-ufun/board/linker_scripts/link.lds new file mode 100644 index 0000000000..6561a78d3e --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/board/linker_scripts/link.lds @@ -0,0 +1,156 @@ +/* + * linker script for STM32F10x with GNU ld + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08000000, LENGTH = 256k /* 256KB flash */ + RAM (rw) : ORIGIN = 0x20000000, LENGTH = 48k /* 48K sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x200; + +SECTIONS +{ + .text : + { + . = ALIGN(4); + _stext = .; + KEEP(*(.isr_vector)) /* Startup code */ + + . = ALIGN(4); + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + + . = ALIGN(4); + + PROVIDE(__ctors_start__ = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE(__ctors_end__ = .); + + . = ALIGN(4); + + _etext = .; + } > ROM = 0 + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > ROM + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + PROVIDE(__dtors_start__ = .); + KEEP(*(SORT(.dtors.*))) + KEEP(*(.dtors)) + PROVIDE(__dtors_end__ = .); + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >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/stm32f103-ufun/board/linker_scripts/link.sct b/bsp/stm32/stm32f103-ufun/board/linker_scripts/link.sct new file mode 100644 index 0000000000..99f1f72a75 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/board/linker_scripts/link.sct @@ -0,0 +1,15 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00040000 { ; load region size_region + ER_IROM1 0x08000000 0x00040000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_IRAM1 0x20000000 0x0000C000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/bsp/stm32/stm32f103-ufun/figures/board.jpg b/bsp/stm32/stm32f103-ufun/figures/board.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ff81dd47efb41a8cd241182eee62749ecb04f4ae GIT binary patch literal 167232 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

i3oJgYX^yq8uW&VpIM# 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 z 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 M;r~M!Kpl<$4`!)hasU7T literal 0 HcmV?d00001 diff --git a/bsp/stm32/stm32f103-ufun/project.ewd b/bsp/stm32/stm32f103-ufun/project.ewd new file mode 100644 index 0000000000..440d1292be --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/project.ewd @@ -0,0 +1,2966 @@ + + + 3 + + rt-thread + + ARM + + 1 + + C-SPY + 2 + + 30 + 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 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 1 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 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\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8BE.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 + + 30 + 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 + + + + + + + + + + NULINK_ID + 2 + + 0 + 1 + 0 + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 6 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 8 + 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\FreeRtos\FreeRtosArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\HWRTOSplugin\HWRTOSplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin2.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SMX\smxAwareIarArm8BE.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/stm32f103-ufun/project.ewp b/bsp/stm32/stm32f103-ufun/project.ewp new file mode 100644 index 0000000000..2e6f275607 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/project.ewp @@ -0,0 +1,2294 @@ + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 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\stm32f1xx_hal_msp.c + + + $PROJ_DIR$\..\libraries\STM32F1xx_HAL\CMSIS\Device\ST\STM32F1xx\Source\Templates\iar\startup_stm32f103xe.s + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_gpio.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_usart.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_common.c + + + + cpu + + $PROJ_DIR$\..\..\..\libcpu\arm\common\backtrace.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m3\cpuport.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m3\context_iar.S + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\components\drivers\misc\pin.c + + + $PROJ_DIR$\..\..\..\components\drivers\serial\serial.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\completion.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\dataqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\pipe.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringblk_buf.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringbuffer.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\waitqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\workqueue.c + + + + finsh + + $PROJ_DIR$\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\components\finsh\symbol.c + + + $PROJ_DIR$\..\..\..\components\finsh\cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_file.c + + + + STM32_HAL + + $PROJ_DIR$\..\libraries\STM32F1xx_HAL\CMSIS\Device\ST\STM32F1xx\Source\Templates\system_stm32f1xx.c + + + $PROJ_DIR$\..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_dma.c + + + $PROJ_DIR$\..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cortex.c + + + $PROJ_DIR$\..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_crc.c + + + $PROJ_DIR$\..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pwr.c + + + $PROJ_DIR$\..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc.c + + + $PROJ_DIR$\..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc_ex.c + + + $PROJ_DIR$\..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal.c + + + $PROJ_DIR$\..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cec.c + + + $PROJ_DIR$\..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_sram.c + + + $PROJ_DIR$\..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio.c + + + $PROJ_DIR$\..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio_ex.c + + + $PROJ_DIR$\..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_uart.c + + + $PROJ_DIR$\..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_usart.c + + + diff --git a/bsp/stm32/stm32f103-ufun/project.eww b/bsp/stm32/stm32f103-ufun/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/stm32/stm32f103-ufun/project.uvopt b/bsp/stm32/stm32f103-ufun/project.uvopt new file mode 100644 index 0000000000..1deab6fd87 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/project.uvopt @@ -0,0 +1,1131 @@ + + + + 1.0 + +

### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Reference Manual + DATASHTS\ST\STM32F10xxx.PDF + + + 1 + Technical Reference Manual + datashts\arm\cortex_m3\r1p1\DDI0337E_CORTEX_M3_R1P1_TRM.PDF + + + 2 + Generic User Guide + datashts\arm\cortex_m3\r2p1\DUI0552A_CORTEX_M3_DGUG.PDF + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 6 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + JL2CM3 + -U777479148 -O78 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8008 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F10x_CL -FS08000000 -FL040000 + + + 0 + UL2CM3 + UL2CM3(-O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FN1 -FC800 -FD20000000 -FF0STM32F10x_512 -FL040000 -FS08000000 + + + + + 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 + + + + + + + + Kernel + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\src\cpu.c + cpu.c + 0 + 0 + + + 1 + 4 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 1 + 5 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 1 + 6 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 1 + 7 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 1 + 8 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 1 + 9 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 1 + 10 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 1 + 11 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 1 + 12 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\src\scheduler.c + scheduler.c + 0 + 0 + + + 1 + 13 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\src\signal.c + signal.c + 0 + 0 + + + 1 + 14 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 1 + 15 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Applications + 0 + 0 + 0 + 0 + + 2 + 16 + 1 + 1 + 0 + 33 + 0 + 3 + 16 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 3 + 17 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + board\CubeMX_Config\Src\stm32f1xx_hal_msp.c + stm32f1xx_hal_msp.c + 0 + 0 + + + 3 + 19 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm\startup_stm32f103xe.s + startup_stm32f103xe.s + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_common.c + drv_common.c + 0 + 0 + + + + + cpu + 0 + 0 + 0 + 0 + + 4 + 23 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\backtrace.c + backtrace.c + 0 + 0 + + + 4 + 24 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m3\cpuport.c + cpuport.c + 0 + 0 + + + 4 + 27 + 2 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m3\context_rvds.S + context_rvds.S + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 5 + 28 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 5 + 29 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + 5 + 30 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\components\drivers\src\completion.c + completion.c + 0 + 0 + + + 5 + 31 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\components\drivers\src\dataqueue.c + dataqueue.c + 0 + 0 + + + 5 + 32 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\components\drivers\src\pipe.c + pipe.c + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 5 + 34 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\components\drivers\src\waitqueue.c + waitqueue.c + 0 + 0 + + + 5 + 36 + 1 + 0 + 0 + 0 + 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 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 38 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\components\finsh\symbol.c + symbol.c + 0 + 0 + + + 6 + 39 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 6 + 40 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 41 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_cmd.c + msh_cmd.c + 0 + 0 + + + 6 + 42 + 1 + 0 + 0 + 0 + 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 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\CMSIS\Device\ST\STM32F1xx\Source\Templates\system_stm32f1xx.c + system_stm32f1xx.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_dma.c + stm32f1xx_hal_dma.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cortex.c + stm32f1xx_hal_cortex.c + 0 + 0 + + + 7 + 46 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_crc.c + stm32f1xx_hal_crc.c + 0 + 0 + + + 7 + 47 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pwr.c + stm32f1xx_hal_pwr.c + 0 + 0 + + + 7 + 48 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc.c + stm32f1xx_hal_rcc.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc_ex.c + stm32f1xx_hal_rcc_ex.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal.c + stm32f1xx_hal.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cec.c + stm32f1xx_hal_cec.c + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_sram.c + stm32f1xx_hal_sram.c + 0 + 0 + + + 7 + 53 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio.c + stm32f1xx_hal_gpio.c + 0 + 0 + + + 7 + 54 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio_ex.c + stm32f1xx_hal_gpio_ex.c + 0 + 0 + + + 7 + 55 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_uart.c + stm32f1xx_hal_uart.c + 0 + 0 + + + 7 + 56 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_usart.c + stm32f1xx_hal_usart.c + 0 + 0 + + + + diff --git a/bsp/stm32/stm32f103-ufun/project.uvoptx b/bsp/stm32/stm32f103-ufun/project.uvoptx new file mode 100644 index 0000000000..5a49339e7c --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/project.uvoptx @@ -0,0 +1,912 @@ + + + + 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 + + + 1 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F10x_512 -FL080000 -FS08000000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_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 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_CL -FS08000000 -FL040000 + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 0 + 0 + 2 + 10000000 + + + + + + Kernel + 0 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 1 + 2 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 1 + 3 + 1 + 0 + 0 + 0 + ..\..\..\src\cpu.c + cpu.c + 0 + 0 + + + 1 + 4 + 1 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 1 + 5 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 1 + 6 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 1 + 7 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 1 + 8 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 1 + 9 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 1 + 10 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 1 + 11 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 1 + 12 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler.c + scheduler.c + 0 + 0 + + + 1 + 13 + 1 + 0 + 0 + 0 + ..\..\..\src\signal.c + signal.c + 0 + 0 + + + 1 + 14 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 1 + 15 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Applications + 1 + 0 + 0 + 0 + + 2 + 16 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 3 + 17 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + board\CubeMX_Config\Src\stm32f1xx_hal_msp.c + stm32f1xx_hal_msp.c + 0 + 0 + + + 3 + 19 + 2 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm\startup_stm32f103xe.s + startup_stm32f103xe.s + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_common.c + drv_common.c + 0 + 0 + + + + + cpu + 0 + 0 + 0 + 0 + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\backtrace.c + backtrace.c + 0 + 0 + + + 4 + 24 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m3\cpuport.c + cpuport.c + 0 + 0 + + + 4 + 27 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m3\context_rvds.S + context_rvds.S + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 5 + 28 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 5 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + 5 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\completion.c + completion.c + 0 + 0 + + + 5 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\dataqueue.c + dataqueue.c + 0 + 0 + + + 5 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\pipe.c + pipe.c + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 5 + 34 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\waitqueue.c + waitqueue.c + 0 + 0 + + + 5 + 36 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\workqueue.c + workqueue.c + 0 + 0 + + + + + finsh + 0 + 0 + 0 + 0 + + 6 + 37 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 38 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\symbol.c + symbol.c + 0 + 0 + + + 6 + 39 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 6 + 40 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 41 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_cmd.c + msh_cmd.c + 0 + 0 + + + 6 + 42 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_file.c + msh_file.c + 0 + 0 + + + + + STM32_HAL + 0 + 0 + 0 + 0 + + 7 + 43 + 1 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\CMSIS\Device\ST\STM32F1xx\Source\Templates\system_stm32f1xx.c + system_stm32f1xx.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_dma.c + stm32f1xx_hal_dma.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cortex.c + stm32f1xx_hal_cortex.c + 0 + 0 + + + 7 + 46 + 1 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_crc.c + stm32f1xx_hal_crc.c + 0 + 0 + + + 7 + 47 + 1 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pwr.c + stm32f1xx_hal_pwr.c + 0 + 0 + + + 7 + 48 + 1 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc.c + stm32f1xx_hal_rcc.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc_ex.c + stm32f1xx_hal_rcc_ex.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal.c + stm32f1xx_hal.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cec.c + stm32f1xx_hal_cec.c + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_sram.c + stm32f1xx_hal_sram.c + 0 + 0 + + + 7 + 53 + 1 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio.c + stm32f1xx_hal_gpio.c + 0 + 0 + + + 7 + 54 + 1 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio_ex.c + stm32f1xx_hal_gpio_ex.c + 0 + 0 + + + 7 + 55 + 1 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_uart.c + stm32f1xx_hal_uart.c + 0 + 0 + + + 7 + 56 + 1 + 0 + 0 + 0 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_usart.c + stm32f1xx_hal_usart.c + 0 + 0 + + + +
diff --git a/bsp/stm32/stm32f103-ufun/project.uvproj b/bsp/stm32/stm32f103-ufun/project.uvproj new file mode 100644 index 0000000000..a1324a548f --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/project.uvproj @@ -0,0 +1,724 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + + + STM32F103RC + STMicroelectronics + IRAM(0x20000000-0x2000BFFF) IROM(0x8000000-0x803FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3") + + "STARTUP\ST\STM32F10x\startup_stm32f10x_hd.s" ("STM32 High Density Line Startup Code") + UL2CM3(-O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_512 -FS08000000 -FL040000) + 4230 + stm32f10x.h + + + + + + + + + + SFD\ST\STM32F1xx\STM32F103xx.sfr + 0 + 0 + + + + ST\STM32F10x\ + ST\STM32F10x\ + + 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 + + + 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 + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 0 + + 0 + 6 + + + + + + + + + + + + + + Segger\JL2CM3.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-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 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 + 0xc000 + + + 1 + 0x8000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0xc000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + + + USE_HAL_DRIVER, STM32F103xE + + .;..\..\..\include;applications;.;board;board\CubeMX_Config\Inc;..\libraries\HAL_Drivers;..\libraries\HAL_Drivers\config;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m3;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\libraries\STM32F1xx_HAL\CMSIS\Device\ST\STM32F1xx\Include;..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Inc;..\libraries\STM32F1xx_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 + + + + + + + + + + + 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 + + + stm32f1xx_hal_msp.c + 1 + board\CubeMX_Config\Src\stm32f1xx_hal_msp.c + + + startup_stm32f103xe.s + 2 + ..\libraries\STM32F1xx_HAL\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm\startup_stm32f103xe.s + + + drv_gpio.c + 1 + ..\libraries\HAL_Drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\HAL_Drivers\drv_usart.c + + + drv_common.c + 1 + ..\libraries\HAL_Drivers\drv_common.c + + + + + cpu + + + backtrace.c + 1 + ..\..\..\libcpu\arm\common\backtrace.c + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m3\cpuport.c + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m3\context_rvds.S + + + + + DeviceDrivers + + + pin.c + 1 + ..\..\..\components\drivers\misc\pin.c + + + serial.c + 1 + ..\..\..\components\drivers\serial\serial.c + + + completion.c + 1 + ..\..\..\components\drivers\src\completion.c + + + dataqueue.c + 1 + ..\..\..\components\drivers\src\dataqueue.c + + + pipe.c + 1 + ..\..\..\components\drivers\src\pipe.c + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\src\ringblk_buf.c + + + ringbuffer.c + 1 + ..\..\..\components\drivers\src\ringbuffer.c + + + waitqueue.c + 1 + ..\..\..\components\drivers\src\waitqueue.c + + + workqueue.c + 1 + ..\..\..\components\drivers\src\workqueue.c + + + + + finsh + + + shell.c + 1 + ..\..\..\components\finsh\shell.c + + + symbol.c + 1 + ..\..\..\components\finsh\symbol.c + + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + + + msh.c + 1 + ..\..\..\components\finsh\msh.c + + + msh_cmd.c + 1 + ..\..\..\components\finsh\msh_cmd.c + + + msh_file.c + 1 + ..\..\..\components\finsh\msh_file.c + + + + + STM32_HAL + + + system_stm32f1xx.c + 1 + ..\libraries\STM32F1xx_HAL\CMSIS\Device\ST\STM32F1xx\Source\Templates\system_stm32f1xx.c + + + stm32f1xx_hal_dma.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_dma.c + + + stm32f1xx_hal_cortex.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cortex.c + + + stm32f1xx_hal_crc.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_crc.c + + + stm32f1xx_hal_pwr.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pwr.c + + + stm32f1xx_hal_rcc.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc.c + + + stm32f1xx_hal_rcc_ex.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc_ex.c + + + stm32f1xx_hal.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal.c + + + stm32f1xx_hal_cec.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cec.c + + + stm32f1xx_hal_sram.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_sram.c + + + stm32f1xx_hal_gpio.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio.c + + + stm32f1xx_hal_gpio_ex.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio_ex.c + + + stm32f1xx_hal_uart.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_uart.c + + + stm32f1xx_hal_usart.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_usart.c + + + + + + + +
diff --git a/bsp/stm32/stm32f103-ufun/project.uvprojx b/bsp/stm32/stm32f103-ufun/project.uvprojx new file mode 100644 index 0000000000..3d06a59cee --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/project.uvprojx @@ -0,0 +1,707 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32F103RC + STMicroelectronics + Keil.STM32F1xx_DFP.2.3.0 + http://www.keil.com/pack/ + IRAM(0x20000000,0x0000C000) IROM(0x08000000,0x00040000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512 -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM)) + 4230 + $$Device:STM32F103RC$Device\Include\stm32f10x.h + + + + + + + + + + $$Device:STM32F103RC$SVD\STM32F103xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0xc000 + + + 1 + 0x8000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0xc000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + USE_HAL_DRIVER, STM32F103xE + + .;..\..\..\include;applications;.;board;board\CubeMX_Config\Inc;..\libraries\HAL_Drivers;..\libraries\HAL_Drivers\config;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m3;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\libraries\STM32F1xx_HAL\CMSIS\Device\ST\STM32F1xx\Include;..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Inc;..\libraries\STM32F1xx_HAL\CMSIS\Include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + components.c + 1 + ..\..\..\src\components.c + + + cpu.c + 1 + ..\..\..\src\cpu.c + + + device.c + 1 + ..\..\..\src\device.c + + + idle.c + 1 + ..\..\..\src\idle.c + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + irq.c + 1 + ..\..\..\src\irq.c + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + mem.c + 1 + ..\..\..\src\mem.c + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + object.c + 1 + ..\..\..\src\object.c + + + scheduler.c + 1 + ..\..\..\src\scheduler.c + + + signal.c + 1 + ..\..\..\src\signal.c + + + thread.c + 1 + ..\..\..\src\thread.c + + + timer.c + 1 + ..\..\..\src\timer.c + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Drivers + + + board.c + 1 + board\board.c + + + stm32f1xx_hal_msp.c + 1 + board\CubeMX_Config\Src\stm32f1xx_hal_msp.c + + + startup_stm32f103xe.s + 2 + ..\libraries\STM32F1xx_HAL\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm\startup_stm32f103xe.s + + + drv_gpio.c + 1 + ..\libraries\HAL_Drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\HAL_Drivers\drv_usart.c + + + drv_common.c + 1 + ..\libraries\HAL_Drivers\drv_common.c + + + + + cpu + + + backtrace.c + 1 + ..\..\..\libcpu\arm\common\backtrace.c + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m3\cpuport.c + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m3\context_rvds.S + + + + + DeviceDrivers + + + pin.c + 1 + ..\..\..\components\drivers\misc\pin.c + + + serial.c + 1 + ..\..\..\components\drivers\serial\serial.c + + + completion.c + 1 + ..\..\..\components\drivers\src\completion.c + + + dataqueue.c + 1 + ..\..\..\components\drivers\src\dataqueue.c + + + pipe.c + 1 + ..\..\..\components\drivers\src\pipe.c + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\src\ringblk_buf.c + + + ringbuffer.c + 1 + ..\..\..\components\drivers\src\ringbuffer.c + + + waitqueue.c + 1 + ..\..\..\components\drivers\src\waitqueue.c + + + workqueue.c + 1 + ..\..\..\components\drivers\src\workqueue.c + + + + + finsh + + + shell.c + 1 + ..\..\..\components\finsh\shell.c + + + symbol.c + 1 + ..\..\..\components\finsh\symbol.c + + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + + + msh.c + 1 + ..\..\..\components\finsh\msh.c + + + msh_cmd.c + 1 + ..\..\..\components\finsh\msh_cmd.c + + + msh_file.c + 1 + ..\..\..\components\finsh\msh_file.c + + + + + STM32_HAL + + + system_stm32f1xx.c + 1 + ..\libraries\STM32F1xx_HAL\CMSIS\Device\ST\STM32F1xx\Source\Templates\system_stm32f1xx.c + + + stm32f1xx_hal_dma.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_dma.c + + + stm32f1xx_hal_cortex.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cortex.c + + + stm32f1xx_hal_crc.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_crc.c + + + stm32f1xx_hal_pwr.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pwr.c + + + stm32f1xx_hal_rcc.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc.c + + + stm32f1xx_hal_rcc_ex.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc_ex.c + + + stm32f1xx_hal.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal.c + + + stm32f1xx_hal_cec.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cec.c + + + stm32f1xx_hal_sram.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_sram.c + + + stm32f1xx_hal_gpio.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio.c + + + stm32f1xx_hal_gpio_ex.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio_ex.c + + + stm32f1xx_hal_uart.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_uart.c + + + stm32f1xx_hal_usart.c + 1 + ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_usart.c + + + + + + + + + + + + + +
diff --git a/bsp/stm32/stm32f103-ufun/rtconfig.h b/bsp/stm32/stm32f103-ufun/rtconfig.h new file mode 100644 index 0000000000..502efc003a --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/rtconfig.h @@ -0,0 +1,173 @@ +#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 +#define RT_DEBUG_COLOR + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_HEAP + +/* Kernel Device Object */ + +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_VER_NUM 0x40002 +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M3 + +/* 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_RB_BUFSZ 64 +#define RT_USING_PIN + +/* Using WiFi */ + + +/* Using USB */ + + +/* POSIX layer and C standard library */ + + +/* Network */ + +/* Socket abstraction layer */ + + +/* Network interface device */ + + +/* light weight TCP/IP stack */ + + +/* Modbus master and slave stack */ + + +/* AT commands */ + + +/* VBUS(Virtual Software BUS) */ + + +/* Utilities */ + + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + + +/* Wiced WiFi */ + + +/* IoT Cloud */ + + +/* security packages */ + + +/* language packages */ + + +/* multimedia packages */ + + +/* tools packages */ + + +/* system packages */ + + +/* peripheral libraries and drivers */ + + +/* miscellaneous packages */ + + +/* samples: kernel and components samples */ + +#define SOC_FAMILY_STM32 +#define SOC_SERIES_STM32F1 + +/* Hardware Drivers Config */ + +#define SOC_STM32F103RC + +/* 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/stm32f103-ufun/rtconfig.py b/bsp/stm32/stm32f103-ufun/rtconfig.py new file mode 100644 index 0000000000..fa46b74340 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/rtconfig.py @@ -0,0 +1,143 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m3' +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-m3 -mthumb -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rt-thread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + CXX = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M3 ' + 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' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iar': + # toolchains + CC = 'iccarm' + CXX = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M3' + CFLAGS += ' -e' + CFLAGS += ' --fpu=None' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu Cortex-M3' + AFLAGS += ' --fpu None' + AFLAGS += ' -S' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + + CXXFLAGS = CFLAGS + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' diff --git a/bsp/stm32/stm32f103-ufun/template.ewp b/bsp/stm32/stm32f103-ufun/template.ewp new file mode 100644 index 0000000000..332348c968 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/template.ewp @@ -0,0 +1,2074 @@ + + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + diff --git a/bsp/stm32/stm32f103-ufun/template.eww b/bsp/stm32/stm32f103-ufun/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/stm32/stm32f103-ufun/template.uvopt b/bsp/stm32/stm32f103-ufun/template.uvopt new file mode 100644 index 0000000000..541f2a2417 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/template.uvopt @@ -0,0 +1,179 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 255 + + + 0 + Reference Manual + DATASHTS\ST\STM32F10xxx.PDF + + + 1 + Technical Reference Manual + datashts\arm\cortex_m3\r1p1\DDI0337E_CORTEX_M3_R1P1_TRM.PDF + + + 2 + Generic User Guide + datashts\arm\cortex_m3\r2p1\DUI0552A_CORTEX_M3_DGUG.PDF + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 6 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + JL2CM3 + -U777479148 -O78 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8008 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F10x_CL -FS08000000 -FL040000 + + + 0 + UL2CM3 + UL2CM3(-O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FN1 -FC800 -FD20000000 -FF0STM32F10x_512 -FL040000 -FS08000000 + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + +
diff --git a/bsp/stm32/stm32f103-ufun/template.uvoptx b/bsp/stm32/stm32f103-ufun/template.uvoptx new file mode 100644 index 0000000000..ee3df104c0 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/template.uvoptx @@ -0,0 +1,192 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 4 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32F10x_512 -FL080000 -FS08000000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_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 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_CL -FS08000000 -FL040000 + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 0 + 0 + 2 + 10000000 + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
diff --git a/bsp/stm32/stm32f103-ufun/template.uvproj b/bsp/stm32/stm32f103-ufun/template.uvproj new file mode 100644 index 0000000000..523c98dd6b --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/template.uvproj @@ -0,0 +1,407 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + + + STM32F103RC + STMicroelectronics + IRAM(0x20000000-0x2000BFFF) IROM(0x8000000-0x803FFFF) CLOCK(8000000) CPUTYPE("Cortex-M3") + + "STARTUP\ST\STM32F10x\startup_stm32f10x_hd.s" ("STM32 High Density Line Startup Code") + UL2CM3(-O14 -S0 -C0 -N00("ARM Cortex-M3") -D00(1BA00477) -L00(4) -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F10x_512 -FS08000000 -FL040000) + 4230 + stm32f10x.h + + + + + + + + + + SFD\ST\STM32F1xx\STM32F103xx.sfr + 0 + 0 + + + + ST\STM32F10x\ + ST\STM32F10x\ + + 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 + + + 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 + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 0 + + 0 + 6 + + + + + + + + + + + + + + Segger\JL2CM3.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-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 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 + 0xc000 + + + 1 + 0x8000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0xc000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 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 + + + + + + + + + + + +
diff --git a/bsp/stm32/stm32f103-ufun/template.uvprojx b/bsp/stm32/stm32f103-ufun/template.uvprojx new file mode 100644 index 0000000000..0c9bb86ec1 --- /dev/null +++ b/bsp/stm32/stm32f103-ufun/template.uvprojx @@ -0,0 +1,395 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32F103RC + STMicroelectronics + Keil.STM32F1xx_DFP.2.3.0 + http://www.keil.com/pack/ + IRAM(0x20000000,0x0000C000) IROM(0x08000000,0x00040000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_512 -FS08000000 -FL080000 -FP0($$Device:STM32F103RC$Flash\STM32F10x_512.FLM)) + 4230 + $$Device:STM32F103RC$Device\Include\stm32f10x.h + + + + + + + + + + $$Device:STM32F103RC$SVD\STM32F103xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP + DCM.DLL + -pCM3 + SARMCM3.DLL + + TCM.DLL + -pCM3 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M3" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0xc000 + + + 1 + 0x8000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0xc000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Source Group 1 + + + + + + + + + + + +