From f510a65f93f6ee20c4e7a40e53daafb395cb6a64 Mon Sep 17 00:00:00 2001 From: Supper Thomas <78900636@qq.com> Date: Mon, 4 Dec 2023 21:33:12 +0800 Subject: [PATCH] [bsp/stm32/stm32g491] Add nucleo of stm32g491 --- .github/workflows/bsp_buildings.yml | 1 + .../manual_trigger_scons_STM32_all.yml | 1 + bsp/stm32/stm32g491-st-nucleo/.config | 1059 ++++++ bsp/stm32/stm32g491-st-nucleo/.gitignore | 42 + bsp/stm32/stm32g491-st-nucleo/Kconfig | 24 + bsp/stm32/stm32g491-st-nucleo/README.md | 108 + bsp/stm32/stm32g491-st-nucleo/README_zh.md | 106 + bsp/stm32/stm32g491-st-nucleo/SConscript | 15 + bsp/stm32/stm32g491-st-nucleo/SConstruct | 59 + .../applications/SConscript | 15 + .../stm32g491-st-nucleo/applications/main.c | 30 + .../board/.ignore_format.yml | 6 + .../board/CubeMX_Config/.mxproject | 25 + .../board/CubeMX_Config/Core/Inc/main.h | 84 + .../Core/Inc/stm32g4xx_hal_conf.h | 380 +++ .../CubeMX_Config/Core/Inc/stm32g4xx_it.h | 67 + .../board/CubeMX_Config/Core/Src/main.c | 274 ++ .../Core/Src/stm32g4xx_hal_msp.c | 162 + .../CubeMX_Config/Core/Src/stm32g4xx_it.c | 217 ++ .../CubeMX_Config/Core/Src/system_stm32g4xx.c | 285 ++ .../board/CubeMX_Config/CubeMX_Config.ioc | 183 ++ bsp/stm32/stm32g491-st-nucleo/board/Kconfig | 70 + .../stm32g491-st-nucleo/board/SConscript | 30 + bsp/stm32/stm32g491-st-nucleo/board/board.c | 54 + bsp/stm32/stm32g491-st-nucleo/board/board.h | 43 + .../board/linker_scripts/link.icf | 28 + .../board/linker_scripts/link.lds | 158 + .../board/linker_scripts/link.sct | 15 + .../stm32g491-st-nucleo/figures/board.jpg | Bin 0 -> 125195 bytes bsp/stm32/stm32g491-st-nucleo/project.ewd | 2834 +++++++++++++++++ bsp/stm32/stm32g491-st-nucleo/project.ewp | 2385 ++++++++++++++ bsp/stm32/stm32g491-st-nucleo/project.eww | 10 + bsp/stm32/stm32g491-st-nucleo/project.uvoptx | 1016 ++++++ bsp/stm32/stm32g491-st-nucleo/project.uvprojx | 753 +++++ bsp/stm32/stm32g491-st-nucleo/rtconfig.h | 263 ++ bsp/stm32/stm32g491-st-nucleo/rtconfig.py | 184 ++ bsp/stm32/stm32g491-st-nucleo/template.ewp | 2088 ++++++++++++ bsp/stm32/stm32g491-st-nucleo/template.eww | 10 + bsp/stm32/stm32g491-st-nucleo/template.uvoptx | 192 ++ .../stm32g491-st-nucleo/template.uvprojx | 396 +++ 40 files changed, 13672 insertions(+) create mode 100644 bsp/stm32/stm32g491-st-nucleo/.config create mode 100644 bsp/stm32/stm32g491-st-nucleo/.gitignore create mode 100644 bsp/stm32/stm32g491-st-nucleo/Kconfig create mode 100644 bsp/stm32/stm32g491-st-nucleo/README.md create mode 100644 bsp/stm32/stm32g491-st-nucleo/README_zh.md create mode 100644 bsp/stm32/stm32g491-st-nucleo/SConscript create mode 100644 bsp/stm32/stm32g491-st-nucleo/SConstruct create mode 100644 bsp/stm32/stm32g491-st-nucleo/applications/SConscript create mode 100644 bsp/stm32/stm32g491-st-nucleo/applications/main.c create mode 100644 bsp/stm32/stm32g491-st-nucleo/board/.ignore_format.yml create mode 100644 bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/.mxproject create mode 100644 bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Inc/main.h create mode 100644 bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Inc/stm32g4xx_hal_conf.h create mode 100644 bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Inc/stm32g4xx_it.h create mode 100644 bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Src/main.c create mode 100644 bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Src/stm32g4xx_hal_msp.c create mode 100644 bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Src/stm32g4xx_it.c create mode 100644 bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Src/system_stm32g4xx.c create mode 100644 bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc create mode 100644 bsp/stm32/stm32g491-st-nucleo/board/Kconfig create mode 100644 bsp/stm32/stm32g491-st-nucleo/board/SConscript create mode 100644 bsp/stm32/stm32g491-st-nucleo/board/board.c create mode 100644 bsp/stm32/stm32g491-st-nucleo/board/board.h create mode 100644 bsp/stm32/stm32g491-st-nucleo/board/linker_scripts/link.icf create mode 100644 bsp/stm32/stm32g491-st-nucleo/board/linker_scripts/link.lds create mode 100644 bsp/stm32/stm32g491-st-nucleo/board/linker_scripts/link.sct create mode 100644 bsp/stm32/stm32g491-st-nucleo/figures/board.jpg create mode 100644 bsp/stm32/stm32g491-st-nucleo/project.ewd create mode 100644 bsp/stm32/stm32g491-st-nucleo/project.ewp create mode 100644 bsp/stm32/stm32g491-st-nucleo/project.eww create mode 100644 bsp/stm32/stm32g491-st-nucleo/project.uvoptx create mode 100644 bsp/stm32/stm32g491-st-nucleo/project.uvprojx create mode 100644 bsp/stm32/stm32g491-st-nucleo/rtconfig.h create mode 100644 bsp/stm32/stm32g491-st-nucleo/rtconfig.py create mode 100644 bsp/stm32/stm32g491-st-nucleo/template.ewp create mode 100644 bsp/stm32/stm32g491-st-nucleo/template.eww create mode 100644 bsp/stm32/stm32g491-st-nucleo/template.uvoptx create mode 100644 bsp/stm32/stm32g491-st-nucleo/template.uvprojx diff --git a/.github/workflows/bsp_buildings.yml b/.github/workflows/bsp_buildings.yml index 4a5f6d31f1..0ebdb051e3 100644 --- a/.github/workflows/bsp_buildings.yml +++ b/.github/workflows/bsp_buildings.yml @@ -151,6 +151,7 @@ jobs: - "stm32/stm32g070-st-nucleo" - "stm32/stm32g071-st-nucleo" - "stm32/stm32g431-st-nucleo" + - "stm32/stm32g491-st-nucleo" - "stm32/stm32g474-st-nucleo" - "stm32/stm32h563-st-nucleo" - "stm32/stm32h743-armfly-v7" diff --git a/.github/workflows/manual_trigger_scons_STM32_all.yml b/.github/workflows/manual_trigger_scons_STM32_all.yml index 2e9c4e9bed..6da83c7355 100644 --- a/.github/workflows/manual_trigger_scons_STM32_all.yml +++ b/.github/workflows/manual_trigger_scons_STM32_all.yml @@ -87,6 +87,7 @@ jobs: - {RTT_BSP_NAME: "stm32_stm32g070-st-nucleo", RTT_TOOL_CHAIN: "sourcery-arm", RTT_BSP: "stm32/stm32g070-st-nucleo"} - {RTT_BSP_NAME: "stm32_stm32g071-st-nucleo", RTT_TOOL_CHAIN: "sourcery-arm", RTT_BSP: "stm32/stm32g071-st-nucleo"} - {RTT_BSP_NAME: "stm32_stm32g431-st-nucleo", RTT_TOOL_CHAIN: "sourcery-arm", RTT_BSP: "stm32/stm32g431-st-nucleo"} + - {RTT_BSP_NAME: "stm32_stm32g491-st-nucleo", RTT_TOOL_CHAIN: "sourcery-arm", RTT_BSP: "stm32/stm32g491-st-nucleo"} - {RTT_BSP_NAME: "stm32_stm32g474-st-nucleo", RTT_TOOL_CHAIN: "sourcery-arm", RTT_BSP: "stm32/stm32g474-st-nucleo"} - {RTT_BSP_NAME: "stm32_stm32h743-armfly-v7", RTT_TOOL_CHAIN: "sourcery-arm", RTT_BSP: "stm32/stm32h743-armfly-v7"} - {RTT_BSP_NAME: "stm32_stm32h743-atk-apollo", RTT_TOOL_CHAIN: "sourcery-arm", RTT_BSP: "stm32/stm32h743-atk-apollo"} diff --git a/bsp/stm32/stm32g491-st-nucleo/.config b/bsp/stm32/stm32g491-st-nucleo/.config new file mode 100644 index 0000000000..62ef76374c --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/.config @@ -0,0 +1,1059 @@ +# +# 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_SMART is not set +# CONFIG_RT_USING_NANO is not set +# CONFIG_RT_USING_AMP is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_CPUS_NR=1 +CONFIG_RT_ALIGN_SIZE=8 +# 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_HOOK_USING_FUNC_PTR=y +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +# CONFIG_RT_USING_TIMER_SOFT is not set + +# +# kservice optimization +# +# CONFIG_RT_KSERVICE_USING_STDLIB is not set +# CONFIG_RT_KSERVICE_USING_TINY_SIZE is not set +# CONFIG_RT_USING_TINY_FFS is not set +# CONFIG_RT_KPRINTF_USING_LONGLONG is not set +CONFIG_RT_USING_DEBUG=y +CONFIG_RT_DEBUGING_COLOR=y +CONFIG_RT_DEBUGING_CONTEXT=y +# CONFIG_RT_DEBUGING_AUTO_INIT 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_MESSAGEQUEUE_PRIORITY is not set +# CONFIG_RT_USING_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMHEAP is not set +CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y +# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set +# CONFIG_RT_USING_SLAB_AS_HEAP is not set +# CONFIG_RT_USING_USERHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +# CONFIG_RT_USING_MEMTRACE is not set +# CONFIG_RT_USING_HEAP_ISR is not set +CONFIG_RT_USING_HEAP=y +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="lpuart1" +CONFIG_RT_VER_NUM=0x50100 +# CONFIG_RT_USING_STDC_ATOMIC is not set +CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 +# CONFIG_RT_USING_CACHE is not set +CONFIG_RT_USING_HW_ATOMIC=y +# CONFIG_ARCH_ARM_BOOTWITH_FLUSH_CACHE is not set +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set +CONFIG_RT_USING_CPU_FFS=y +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M4=y + +# +# 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 +# CONFIG_RT_USING_LEGACY is not set +CONFIG_RT_USING_MSH=y +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_CMD_SIZE=80 +CONFIG_MSH_USING_BUILT_IN_COMMANDS=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_ARG_MAX=10 +CONFIG_FINSH_USING_OPTION_COMPLETION=y + +# +# DFS: device virtual file system +# +# CONFIG_RT_USING_DFS is not set +# CONFIG_RT_USING_FAL is not set + +# +# Device Drivers +# +# CONFIG_RT_USING_DM is not set +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set +CONFIG_RT_USING_SERIAL=y +CONFIG_RT_USING_SERIAL_V1=y +# CONFIG_RT_USING_SERIAL_V2 is not set +CONFIG_RT_SERIAL_USING_DMA=y +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_PHY is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM 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_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 +# CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set +# CONFIG_RT_USING_HWCRYPTO is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_DEV_BUS is not set +# CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_VIRTIO is not set +# CONFIG_RT_USING_KTIME is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB is not set +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# C/C++ and POSIX layer +# + +# +# ISO-ANSI C layer +# + +# +# Timezone and Daylight Saving Time +# +# CONFIG_RT_LIBC_USING_FULL_TZ_DST is not set +CONFIG_RT_LIBC_USING_LIGHT_TZ_DST=y +CONFIG_RT_LIBC_TZ_DEFAULT_HOUR=8 +CONFIG_RT_LIBC_TZ_DEFAULT_MIN=0 +CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0 + +# +# POSIX (Portable Operating System Interface) layer +# +# CONFIG_RT_USING_POSIX_FS is not set +# CONFIG_RT_USING_POSIX_DELAY is not set +# CONFIG_RT_USING_POSIX_CLOCK is not set +# CONFIG_RT_USING_POSIX_TIMER is not set +# CONFIG_RT_USING_PTHREADS is not set +# CONFIG_RT_USING_MODULE is not set + +# +# Interprocess Communication (IPC) +# +# CONFIG_RT_USING_POSIX_PIPE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_QUEUE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_SEMAPHORE is not set + +# +# Socket is in the 'Network' category +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Network +# +# CONFIG_RT_USING_SAL is not set +# CONFIG_RT_USING_NETDEV is not set +# CONFIG_RT_USING_LWIP is not set +# CONFIG_RT_USING_AT is not set + +# +# Memory protection +# +# CONFIG_RT_USING_MEM_PROTECTION is not set +# CONFIG_RT_USING_HW_STACK_GUARD 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_VAR_EXPORT is not set +# CONFIG_RT_USING_RESOURCE_ID is not set +# CONFIG_RT_USING_ADT is not set +# CONFIG_RT_USING_RT_LINK is not set +# CONFIG_RT_USING_VBUS is not set + +# +# RT-Thread Utestcases +# +# CONFIG_RT_USING_UTESTCASES is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_LWIP is not set +# CONFIG_PKG_USING_LORAWAN_DRIVER is not set +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_UMQTT 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_MYMQTT is not set +# CONFIG_PKG_USING_KAWAII_MQTT is not set +# CONFIG_PKG_USING_BC28_MQTT is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_FREEMODBUS 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 + +# +# CYW43012 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43012 is not set + +# +# BL808 WiFi +# +# CONFIG_PKG_USING_WLAN_BL808 is not set + +# +# CYW43439 WiFi +# +# CONFIG_PKG_USING_WLAN_CYW43439 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_CMUX is not set +# CONFIG_PKG_USING_PPP_DEVICE 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 +# CONFIG_PKG_USING_ZB_COORDINATOR 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_IOT_EXPLORER is not set +# CONFIG_PKG_USING_JIOT-C-SDK is not set +# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set +# CONFIG_PKG_USING_JOYLINK is not set +# CONFIG_PKG_USING_IOTSHARP_SDK is not set +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER 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 +# CONFIG_PKG_USING_LIBRWS is not set +# CONFIG_PKG_USING_TCPSERVER is not set +# CONFIG_PKG_USING_PROTOBUF_C is not set +# CONFIG_PKG_USING_DLT645 is not set +# CONFIG_PKG_USING_QXWZ is not set +# CONFIG_PKG_USING_SMTP_CLIENT is not set +# CONFIG_PKG_USING_ABUP_FOTA is not set +# CONFIG_PKG_USING_LIBCURL2RTT is not set +# CONFIG_PKG_USING_CAPNP is not set +# CONFIG_PKG_USING_AGILE_TELNET is not set +# CONFIG_PKG_USING_NMEALIB is not set +# CONFIG_PKG_USING_PDULIB is not set +# CONFIG_PKG_USING_BTSTACK is not set +# CONFIG_PKG_USING_BT_CYW43012 is not set +# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set +# CONFIG_PKG_USING_WAYZ_IOTKIT is not set +# CONFIG_PKG_USING_MAVLINK is not set +# CONFIG_PKG_USING_BSAL is not set +# CONFIG_PKG_USING_AGILE_MODBUS is not set +# CONFIG_PKG_USING_AGILE_FTP is not set +# CONFIG_PKG_USING_EMBEDDEDPROTO is not set +# CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_RYANMQTT is not set +# CONFIG_PKG_USING_RYANW5500 is not set +# CONFIG_PKG_USING_LORA_PKT_FWD is not set +# CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set +# CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set +# CONFIG_PKG_USING_HM is not set +# CONFIG_PKG_USING_SMALL_MODBUS is not set +# CONFIG_PKG_USING_NET_SERVER is not set +# CONFIG_PKG_USING_ZFTP is not set +# CONFIG_PKG_USING_WOL is not set +# CONFIG_PKG_USING_ZEPHYR_POLLING is not set +# CONFIG_PKG_USING_MATTER_ADAPTATION_LAYER is not set +# CONFIG_PKG_USING_LHC_MODBUS is not set + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_LIBSODIUM is not set +# CONFIG_PKG_USING_LIBHYDROGEN is not set +# CONFIG_PKG_USING_TINYCRYPT is not set +# CONFIG_PKG_USING_TFM is not set +# CONFIG_PKG_USING_YD_CRYPTO is not set + +# +# language packages +# + +# +# JSON: JavaScript Object Notation, a lightweight data-interchange format +# +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set +# CONFIG_PKG_USING_RAPIDJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_AGILE_JSMN is not set +# CONFIG_PKG_USING_PARSON is not set + +# +# XML: Extensible Markup Language +# +# CONFIG_PKG_USING_SIMPLE_XML is not set +# CONFIG_PKG_USING_EZXML is not set +# CONFIG_PKG_USING_LUATOS_SOC is not set +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set +# CONFIG_PKG_USING_PIKASCRIPT is not set +# CONFIG_PKG_USING_RTT_RUST is not set + +# +# multimedia packages +# + +# +# LVGL: powerful and easy-to-use embedded GUI library +# +# CONFIG_PKG_USING_LVGL is not set +# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set +# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set +# CONFIG_PKG_USING_WAVPLAYER is not set +# CONFIG_PKG_USING_TJPGD is not set +# CONFIG_PKG_USING_PDFGEN is not set +# CONFIG_PKG_USING_HELIX is not set +# CONFIG_PKG_USING_AZUREGUIX is not set +# CONFIG_PKG_USING_TOUCHGFX2RTT is not set +# CONFIG_PKG_USING_NUEMWIN is not set +# CONFIG_PKG_USING_MP3PLAYER is not set +# CONFIG_PKG_USING_TINYJPEG is not set +# CONFIG_PKG_USING_UGUI is not set +# CONFIG_PKG_USING_MCURSES is not set +# CONFIG_PKG_USING_TERMBOX is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_PERSIMMON is not set +# CONFIG_PKG_USING_3GPP_AMRNB 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_SEGGER_RTT is not set +# CONFIG_PKG_USING_RTT_AUTO_EXE_CMD is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_LOGMGR is not set +# CONFIG_PKG_USING_ADBD is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_DHRYSTONE is not set +# CONFIG_PKG_USING_MEMORYPERF is not set +# CONFIG_PKG_USING_NR_MICRO_SHELL is not set +# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set +# CONFIG_PKG_USING_LUNAR_CALENDAR is not set +# CONFIG_PKG_USING_BS8116A is not set +# CONFIG_PKG_USING_GPS_RMC is not set +# CONFIG_PKG_USING_URLENCODE is not set +# CONFIG_PKG_USING_UMCN is not set +# CONFIG_PKG_USING_LWRB2RTT is not set +# CONFIG_PKG_USING_CPU_USAGE is not set +# CONFIG_PKG_USING_GBK2UTF8 is not set +# CONFIG_PKG_USING_VCONSOLE is not set +# CONFIG_PKG_USING_KDB is not set +# CONFIG_PKG_USING_WAMR is not set +# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set +# CONFIG_PKG_USING_LWLOG is not set +# CONFIG_PKG_USING_ANV_TRACE is not set +# CONFIG_PKG_USING_ANV_MEMLEAK is not set +# CONFIG_PKG_USING_ANV_TESTSUIT is not set +# CONFIG_PKG_USING_ANV_BENCH is not set +# CONFIG_PKG_USING_DEVMEM is not set +# CONFIG_PKG_USING_REGEX is not set +# CONFIG_PKG_USING_MEM_SANDBOX is not set +# CONFIG_PKG_USING_SOLAR_TERMS is not set +# CONFIG_PKG_USING_GAN_ZHI is not set +# CONFIG_PKG_USING_FDT is not set +# CONFIG_PKG_USING_CBOX is not set +# CONFIG_PKG_USING_SNOWFLAKE is not set +# CONFIG_PKG_USING_HASH_MATCH is not set +# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set +# CONFIG_PKG_USING_RT_TRACE is not set +# CONFIG_PKG_USING_ZDEBUG is not set + +# +# system packages +# + +# +# enhanced kernel services +# +# CONFIG_PKG_USING_RT_MEMCPY_CM is not set +# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set +# CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set + +# +# acceleration: Assembly language or algorithmic acceleration packages +# +# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set +# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set +# CONFIG_PKG_USING_QFPLIB_M3 is not set + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +# CONFIG_PKG_USING_CMSIS_RTOS1 is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set + +# +# Micrium: Micrium software products porting for RT-Thread +# +# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set +# CONFIG_PKG_USING_UCOSII_WRAPPER is not set +# CONFIG_PKG_USING_UC_CRC is not set +# CONFIG_PKG_USING_UC_CLK is not set +# CONFIG_PKG_USING_UC_COMMON is not set +# CONFIG_PKG_USING_UC_MODBUS is not set +# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set +# CONFIG_PKG_USING_LITEOS_SDK is not set +# CONFIG_PKG_USING_TZ_DATABASE is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_PERF_COUNTER is not set +# CONFIG_PKG_USING_FLASHDB is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_DFS_JFFS2 is not set +# CONFIG_PKG_USING_DFS_UFFS is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_THREAD_POOL is not set +# CONFIG_PKG_USING_ROBOTS is not set +# CONFIG_PKG_USING_EV is not set +# CONFIG_PKG_USING_SYSWATCH is not set +# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set +# CONFIG_PKG_USING_PLCCORE is not set +# CONFIG_PKG_USING_RAMDISK is not set +# CONFIG_PKG_USING_MININI is not set +# CONFIG_PKG_USING_QBOOT is not set +# CONFIG_PKG_USING_PPOOL is not set +# CONFIG_PKG_USING_OPENAMP is not set +# CONFIG_PKG_USING_RPMSG_LITE is not set +# CONFIG_PKG_USING_LPM is not set +# CONFIG_PKG_USING_TLSF is not set +# CONFIG_PKG_USING_EVENT_RECORDER is not set +# CONFIG_PKG_USING_ARM_2D is not set +# CONFIG_PKG_USING_MCUBOOT is not set +# CONFIG_PKG_USING_TINYUSB is not set +# CONFIG_PKG_USING_CHERRYUSB is not set +# CONFIG_PKG_USING_KMULTI_RTIMER is not set +# CONFIG_PKG_USING_TFDB is not set +# CONFIG_PKG_USING_QPC is not set +# CONFIG_PKG_USING_AGILE_UPGRADE is not set +# CONFIG_PKG_USING_FLASH_BLOB is not set +# CONFIG_PKG_USING_MLIBC is not set +# CONFIG_PKG_USING_TASK_MSG_BUS is not set +# CONFIG_PKG_USING_SFDB is not set +# CONFIG_PKG_USING_RTP is not set +# CONFIG_PKG_USING_REB is not set +# CONFIG_PKG_USING_R_RHEALSTONE is not set + +# +# peripheral libraries and drivers +# + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_TMP1075 is not set +# CONFIG_PKG_USING_SR04 is not set +# CONFIG_PKG_USING_CCS811 is not set +# CONFIG_PKG_USING_PMSXX is not set +# CONFIG_PKG_USING_RT3020 is not set +# CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_SHT4X is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set +# CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set +# CONFIG_PKG_USING_STHS34PF80 is not set + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_CST816X is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ESP_IDF 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_LITTLED is not set +# CONFIG_PKG_USING_LKDGUI is not set +# CONFIG_PKG_USING_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_MULTI_INFRARED is not set +# CONFIG_PKG_USING_AGILE_BUTTON is not set +# CONFIG_PKG_USING_AGILE_LED is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_ILI9341 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_RPLIDAR is not set +# CONFIG_PKG_USING_AS608 is not set +# CONFIG_PKG_USING_RC522 is not set +# CONFIG_PKG_USING_WS2812B is not set +# CONFIG_PKG_USING_EMBARC_BSP is not set +# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set +# CONFIG_PKG_USING_MULTI_RTIMER is not set +# CONFIG_PKG_USING_MAX7219 is not set +# CONFIG_PKG_USING_BEEP is not set +# CONFIG_PKG_USING_EASYBLINK is not set +# CONFIG_PKG_USING_PMS_SERIES is not set +# CONFIG_PKG_USING_CAN_YMODEM is not set +# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set +# CONFIG_PKG_USING_QLED is not set +# CONFIG_PKG_USING_AGILE_CONSOLE is not set +# CONFIG_PKG_USING_LD3320 is not set +# CONFIG_PKG_USING_WK2124 is not set +# CONFIG_PKG_USING_LY68L6400 is not set +# CONFIG_PKG_USING_DM9051 is not set +# CONFIG_PKG_USING_SSD1306 is not set +# CONFIG_PKG_USING_QKEY is not set +# CONFIG_PKG_USING_RS485 is not set +# CONFIG_PKG_USING_RS232 is not set +# CONFIG_PKG_USING_NES is not set +# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set +# CONFIG_PKG_USING_VDEVICE is not set +# CONFIG_PKG_USING_SGM706 is not set +# CONFIG_PKG_USING_STM32WB55_SDK is not set +# CONFIG_PKG_USING_RDA58XX is not set +# CONFIG_PKG_USING_LIBNFC is not set +# CONFIG_PKG_USING_MFOC is not set +# CONFIG_PKG_USING_TMC51XX is not set +# CONFIG_PKG_USING_TCA9534 is not set +# CONFIG_PKG_USING_KOBUKI is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_MICRO_ROS is not set +# CONFIG_PKG_USING_MCP23008 is not set +# CONFIG_PKG_USING_BLUETRUM_SDK is not set +# CONFIG_PKG_USING_MISAKA_AT24CXX is not set +# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set +# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set +# CONFIG_PKG_USING_RFM300 is not set +# CONFIG_PKG_USING_IO_INPUT_FILTER is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_AIP650 is not set +# CONFIG_PKG_USING_FINGERPRINT is not set +# CONFIG_PKG_USING_BT_ECB02C is not set +# CONFIG_PKG_USING_UAT is not set +# CONFIG_PKG_USING_ST7789 is not set +# CONFIG_PKG_USING_VS1003 is not set +# CONFIG_PKG_USING_X9555 is not set +# CONFIG_PKG_USING_SYSTEM_RUN_LED is not set +# CONFIG_PKG_USING_SPI_TOOLS is not set + +# +# AI packages +# +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_QUEST is not set +# CONFIG_PKG_USING_NAXOS is not set +# CONFIG_PKG_USING_R_TINYMAIX is not set + +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_QPID is not set +# CONFIG_PKG_USING_UKAL is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set +# CONFIG_PKG_USING_KISSFFT is not set +# CONFIG_PKG_USING_CMSIS_DSP is not set + +# +# miscellaneous packages +# + +# +# project laboratory +# + +# +# 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 + +# +# entertainment: terminal games and other interesting software packages +# +# CONFIG_PKG_USING_CMATRIX is not set +# CONFIG_PKG_USING_SL is not set +# CONFIG_PKG_USING_CAL is not set +# CONFIG_PKG_USING_ACLOCK is not set +# CONFIG_PKG_USING_THREES is not set +# CONFIG_PKG_USING_2048 is not set +# CONFIG_PKG_USING_SNAKE is not set +# CONFIG_PKG_USING_TETRIS is not set +# CONFIG_PKG_USING_DONUT is not set +# CONFIG_PKG_USING_COWSAY is not set +# CONFIG_PKG_USING_MORSE is not set +# CONFIG_PKG_USING_TINYSQUARE is not set +# 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_LZMA is not set +# CONFIG_PKG_USING_RALARAM is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_MINIZIP is not set +# CONFIG_PKG_USING_HEATSHRINK 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_UPACKER is not set +# CONFIG_PKG_USING_UPARAM is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_KI is not set +# CONFIG_PKG_USING_ARMv7M_DWT is not set +# CONFIG_PKG_USING_CRCLIB is not set +# CONFIG_PKG_USING_LWGPS is not set +# CONFIG_PKG_USING_STATE_MACHINE is not set +# CONFIG_PKG_USING_DESIGN_PATTERN is not set +# CONFIG_PKG_USING_CONTROLLER is not set +# CONFIG_PKG_USING_PHASE_LOCKED_LOOP is not set +# CONFIG_PKG_USING_MFBD is not set +# CONFIG_PKG_USING_SLCAN2RTT is not set +# CONFIG_PKG_USING_SOEM is not set +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set +# CONFIG_PKG_USING_GET_IRQ_PRIORITY is not set + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects and Demos +# +# CONFIG_PKG_USING_ARDUINO_MSGQ_C_CPP_DEMO is not set +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_ADAFRUIT_MAX31855 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set +# CONFIG_PKG_USING_ADAFRUIT_MSA301 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set +# CONFIG_PKG_USING_SEEED_ITG3200 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set +# CONFIG_PKG_USING_SEEED_MP503 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_GFX_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_ARDUINO_TFT_ESPI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ST7735 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SSD1306 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ILI9341 is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_RTCLIB is not set +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set +# CONFIG_PKG_USING_ARDUINO_TICKER is not set +# CONFIG_PKG_USING_ARDUINO_TASKSCHEDULER is not set + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TPA2016 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DRV2605 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS1841 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS3502 is not set + +# +# Other +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set + +# +# Uncategorized +# +CONFIG_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32G4=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_STM32G491RE=y + +# +# Onboard Peripheral Drivers +# + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_LPUART1=y +# CONFIG_BSP_LPUART1_RX_USING_DMA is not set +# CONFIG_BSP_USING_UART1 is not set +# CONFIG_BSP_USING_UART3 is not set +# CONFIG_BSP_USING_UART4 is not set +# CONFIG_BSP_USING_UDID is not set + +# +# Board extended module Drivers +# diff --git a/bsp/stm32/stm32g491-st-nucleo/.gitignore b/bsp/stm32/stm32g491-st-nucleo/.gitignore new file mode 100644 index 0000000000..7221bde019 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/.gitignore @@ -0,0 +1,42 @@ +*.pyc +*.map +*.dblite +*.elf +*.bin +*.hex +*.axf +*.exe +*.pdb +*.idb +*.ilk +*.old +build +Debug +documentation/html +packages/ +*~ +*.o +*.obj +*.out +*.bak +*.dep +*.lib +*.i +*.d +.DS_Stor* +.config 3 +.config 4 +.config 5 +Midea-X1 +*.uimg +GPATH +GRTAGS +GTAGS +.vscode +JLinkLog.txt +JLinkSettings.ini +DebugConfig/ +RTE/ +settings/ +*.uvguix* +cconfig.h diff --git a/bsp/stm32/stm32g491-st-nucleo/Kconfig b/bsp/stm32/stm32g491-st-nucleo/Kconfig new file mode 100644 index 0000000000..362bdfbed8 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/Kconfig @@ -0,0 +1,24 @@ +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" + +if !RT_USING_NANO +source "board/Kconfig" +endif diff --git a/bsp/stm32/stm32g491-st-nucleo/README.md b/bsp/stm32/stm32g491-st-nucleo/README.md new file mode 100644 index 0000000000..b9f144212b --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/README.md @@ -0,0 +1,108 @@ +# STM32G491-Nucleo BSP Introduction + +[中文](README_zh.md) + +## MCU: STM32G491RE @170MHz, 128KB FLASH, 32KB RAM + +The STM32G491x6/x8/xB devices are based on the high-performance Arm® Cortex®-M4 32-bit RISC core. They operate at a frequency of up to 170 MHz. + +The Cortex-M4 core features a single-precision floating-point unit (FPU), which supports all the Arm single-precision data-processing instructions and all the data types. It also implements a full set of DSP (digital signal processing) instructions and a memory protection unit (MPU) which enhances the application’s security. +These devices embed high-speed memories (128 Kbytes of Flash memory, and 32 Kbytes of SRAM), an extensive range of enhanced I/Os and peripherals connected to two APB buses, two AHB buses and a 32-bit multi-AHB bus matrix. +The devices also embed several protection mechanisms for embedded Flash memory and SRAM: readout protection, write protection, securable memory area and proprietary code readout protection. +The devices embed peripherals allowing mathematical/arithmetic function acceleration (CORDIC for trigonometric functions and FMAC unit for filter functions). +They offer two fast 12-bit ADCs (5 Msps), four comparators, three operational amplifiers, four DAC channels (2 external and 2 internal), an internal voltage reference buffer, a low-power RTC, one general-purpose 32-bit timers, two 16-bit PWM timers dedicated to motor control, seven general-purpose 16-bit timers, and one 16-bit low-power timer. +They also feature standard and advanced communication interfaces such as: +\- Three I2Cs +\- Three SPIs multiplexed with two half duplex I2Ss +\- Three USARTs, one UART and one low-power UART. +\- One FDCAN +\- One SAI +\- USB device +\- UCPD +The devices operate in the -40 to +85 °C (+105 °C junction) and -40 to +125 °C (+130 °C junction) temperature ranges from a 1.71 to 3.6 V power supply. A comprehensive set of power-saving modes allows the design of low-power applications. +Some independent power supplies are supported including an analog independent supply input for ADC, DAC, OPAMPs and comparators. A VBAT input allows backup of the RTC and the registers. +The STM32G491x6/x8/xB family offers 9 packages from 32-pin to 100-pin. + +#### KEY FEATURES + +- Core: Arm® 32-bit Cortex®-M4 CPU with FPU, Adaptive real-time accelerator (ART Accelerator) allowing 0-wait-state execution from Flash memory, frequency up to 170 MHz with 213 DMIPS, MPU, DSP instructions +- Operating conditions: + - VDD, VDDA voltage range: 1.71 V to 3.6 V +- Mathematical hardware accelerators + - CORDIC for trigonometric functions acceleration + - FMAC: filter mathematical accelerator +- Memories + - 128 Kbytes of Flash memory with ECC support, proprietary code readout protection (PCROP), securable memory area, 1 Kbyte OTP + - 22 Kbytes of SRAM, with hardware parity check implemented on the first 16 Kbytes + - Routine booster: 10 Kbytes of SRAM on instruction and data bus, with hardware parity check (CCM SRAM) +- Reset and supply management + - Power-on/power-down reset (POR/PDR/BOR) + - Programmable voltage detector (PVD) + - Low-power modes: sleep, stop, standby and shutdown + - VBAT supply for RTC and backup registers +- Clock management + - 4 to 48 MHz crystal oscillator + - 32 kHz oscillator with calibration + - Internal 16 MHz RC with PLL option (± 1%) + - Internal 32 kHz RC oscillator (± 5%) +- Up to 86 fast I/Os + - All mappable on external interrupt vectors + - Several I/Os with 5 V tolerant capability +- Interconnect matrix +- 12-channel DMA controller +- 2 x ADCs 0.25 µs (up to 23 channels). Resolution up to 16-bit with hardware oversampling, 0 to 3.6 V conversion range + +- 4 x 12-bit DAC channels + - 2 x buffered external channels 1 MSPS + - 2 x unbuffered internal channels 15 MSPS +- 4 x ultra-fast rail-to-rail analog comparators +- 3 x operational amplifiers that can be used in PGA mode, all terminals accessible +- Internal voltage reference buffer (VREFBUF) supporting three output voltages (2.048 V, 2.5 V, 2.9 V) +- 14 timers: + - 1 x 32-bit timer and 2 x 16-bit timers with up to four IC/OC/PWM or pulse counter and quadrature (incremental) encoder input + - 2 x 16-bit 8-channel advanced motor control timers, with up to 8 x PWM channels, dead time generation and emergency stop + - 1 x 16-bit timer with 2 x IC/OCs, one OCN/PWM, dead time generation and emergency stop + - 2 x 16-bit timers with IC/OC/OCN/PWM, dead time generation and emergency stop + - 2 x watchdog timers (independent, window) + - 1 x SysTick timer: 24-bit downcounter + - 2 x 16-bit basic timers + - 1 x low-power timer +- Calendar RTC with alarm, periodic wakeup from stop/standby +- Communication interfaces + - 1 x FDCAN controller supporting flexible data rate + - 3 x I2C Fast mode plus (1 Mbit/s) with 20 mA current sink, SMBus/PMBus, wakeup from stop + - 4 x USART/UARTs (ISO 7816 interface, LIN, IrDA, modem control) + - 1 x LPUART + - 3 x SPIs, 4 to 16 programmable bit frames, 2 x with multiplexed half duplex I2S interface + - 1 x SAI (serial audio interface) + - USB 2.0 full-speed interface with LPM and BCD support + - IRTIM (infrared interface) + - USB Type-C™ /USB power delivery controller (UCPD) +- True random number generator (RNG) +- CRC calculation unit, 96-bit unique ID +- Development support: serial wire debug (SWD), JTAG, Embedded Trace Macrocell™ + + + +## Read more + +| Documents | Description | +| :----------------------------------------------------------: | :----------------------------------------------------------: | +| [STM32_Nucleo-64_BSP_Introduction](../docs/STM32_Nucleo-64_BSP_Introduction.md) | How to run RT-Thread on STM32 Nucleo-64 boards (**Must-Read**) | +| [STM32G491RE ST Official Website](https://www.st.com/en/microcontrollers-microprocessors/stm32G491RE.html#documentation) | STM32G491RE datasheet and other resources | + + + +## Maintained By + +[supperthomas](https://github.com/supperthomas), <78900636@qq.com> + + + +## Translated By + +Meco Man @ RT-Thread Community + +> jiantingman@foxmail.com +> +> https://github.com/mysterywolf \ No newline at end of file diff --git a/bsp/stm32/stm32g491-st-nucleo/README_zh.md b/bsp/stm32/stm32g491-st-nucleo/README_zh.md new file mode 100644 index 0000000000..095661be52 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/README_zh.md @@ -0,0 +1,106 @@ +# NUCLEO-G491RE 开发板 BSP 说明 + +## 简介 + +本文档为 NUCLEO-G491RE 开发板的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。 + +## 开发板介绍 + +NUCLEO-G491RE 是 ST 公司推出的一款针对 STM32G4 系列设计的 Cortex-M4 Nucleo-64 开发板,支持 mbed,兼容 Arduino、还带有 ST Morpho 扩展接口,可连接微控制器的所有周边外设。 + +开发板外观如下图所示: + +![board](figures/board.jpg) + +该开发板常用 **板载资源** 如下: + +- MCU:STM32G491RE,主频 170MHz,512KB FLASH ,112KB RAM +- 常用外设 + - LED:1个,LD2(黄色,PA5) +- 常用接口:USB 转串口 +- 调试接口,标准 ST-LINK/SWD + +开发板更多详细信息请参考【NUCLEO-G491RE】 [开发板介绍](https://www.st.com/zh/evaluation-tools/nucleo-g491re.html)。 + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :----------------- | :----------: | :------------------------------------- | +| USB 转串口 | 支持 | | +| **片上外设** | **支持情况** | **备注** | +| GPIO | 支持 | | +| UART | 支持 | LPUART1 USART1/3 UART4 | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + + +### 快速上手 + +本 BSP 为开发者提供 MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5.36 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线连接开发板到 PC,通过数据线对开发板供电,下载,调试。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 ST-LINK 仿真器下载程序,在通过 ST-LINK 连接开发板的基础上,点击下载按钮即可下载程序到开发板 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,黄色的 LD2 以 500MS 周期闪烁。 + +连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + +```bash + \ | / +- RT - Thread Operating System + / | \ 4.0.2 build Oct 5 2019 + 2006 - 2019 Copyright by rt-thread team +msh > +``` +### 进阶使用 + +此 BSP 默认只开启了 GPIO 和 LPUART1 的功能,如果需使用更多高级功能,需要利用 ENV 工具对 BSP 进行配置,步骤如下: + +1. 在 bsp 下打开 env 工具。 + +2. 输入`menuconfig`命令配置工程,配置好之后保存退出。 + +3. 输入`pkgs --update`命令更新软件包。 + +4. 输入`scons --target=mdk4/mdk5/iar` 命令重新生成工程。 + +本章节更多详细的介绍请参考 [STM32 系列 BSP 外设驱动使用教程](../docs/STM32系列BSP外设驱动使用教程.md)。 + +## 注意事项 + +- 默认终端输出设备是 LPUART1 + +## 联系人信息 + +维护人: + +- [supperthomas](https://github.com/supperthomas), 邮箱:<78900636@qq.com> \ No newline at end of file diff --git a/bsp/stm32/stm32g491-st-nucleo/SConscript b/bsp/stm32/stm32g491-st-nucleo/SConscript new file mode 100644 index 0000000000..20f7689c53 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/SConscript @@ -0,0 +1,15 @@ +# for module compiling +import os +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +Return('objs') diff --git a/bsp/stm32/stm32g491-st-nucleo/SConstruct b/bsp/stm32/stm32g491-st-nucleo/SConstruct new file mode 100644 index 0000000000..98b47d0529 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/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 + +DefaultEnvironment(tools=[]) +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CFLAGS = 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 in ['iccarm']: + env.Replace(CCCOM = ['$CC $CFLAGS $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 = 'STM32G4xx_HAL' +rtconfig.BSP_LIBRARY_TYPE = stm32_library + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, stm32_library, 'SConscript'), variant_dir='build/libraries/'+stm32_library, duplicate=0)) +# include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'HAL_Drivers', 'SConscript'),variant_dir='build/libraries/'+'HAL_Drivers', duplicate=0)) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/stm32/stm32g491-st-nucleo/applications/SConscript b/bsp/stm32/stm32g491-st-nucleo/applications/SConscript new file mode 100644 index 0000000000..9bb9abae89 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/applications/SConscript @@ -0,0 +1,15 @@ +from building import * +import os + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [cwd] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) + +Return('group') diff --git a/bsp/stm32/stm32g491-st-nucleo/applications/main.c b/bsp/stm32/stm32g491-st-nucleo/applications/main.c new file mode 100644 index 0000000000..b797e8bc3d --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/applications/main.c @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2023-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-12-04 Supperthomas first version + */ + +#include +#include +#include + +/* defined the LED2 pin: PA5 */ +#define LED2_PIN GET_PIN(A, 5) + +int main(void) +{ + /* set LED2 pin mode to output */ + rt_pin_mode(LED2_PIN, PIN_MODE_OUTPUT); + + while (1) + { + rt_pin_write(LED2_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED2_PIN, PIN_LOW); + rt_thread_mdelay(500); + } +} diff --git a/bsp/stm32/stm32g491-st-nucleo/board/.ignore_format.yml b/bsp/stm32/stm32g491-st-nucleo/board/.ignore_format.yml new file mode 100644 index 0000000000..0d7f3e360c --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/board/.ignore_format.yml @@ -0,0 +1,6 @@ +# files format check exclude path, please follow the instructions below to modify; +# If you need to exclude an entire folder, add the folder path in dir_path; +# If you need to exclude a file, add the path to the file in file_path. + +dir_path: +- CubeMX_Config diff --git a/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/.mxproject new file mode 100644 index 0000000000..377c225978 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/.mxproject @@ -0,0 +1,25 @@ +[PreviousLibFiles] +LibFiles=Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_uart.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_usart.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_lpuart.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_uart_ex.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_def.h;Drivers\STM32G4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_rcc.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_rcc_ex.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_bus.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_rcc.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_system.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_utils.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_crs.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_flash.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_flash_ex.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_flash_ramfunc.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_gpio.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_gpio_ex.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_gpio.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_exti.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_exti.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_dma.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_dma_ex.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_dma.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_dmamux.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_pwr.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_pwr_ex.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_pwr.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_cortex.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_cortex.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_tim.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_tim_ex.h;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_uart.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_uart_ex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_rcc.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_rcc_ex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_flash.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_flash_ex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_flash_ramfunc.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_gpio.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_exti.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_dma.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_dma_ex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_pwr.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_pwr_ex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_cortex.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_tim.c;Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_tim_ex.c;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_uart.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_usart.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_lpuart.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_uart_ex.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_def.h;Drivers\STM32G4xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_rcc.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_rcc_ex.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_bus.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_rcc.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_system.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_utils.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_crs.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_flash.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_flash_ex.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_flash_ramfunc.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_gpio.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_gpio_ex.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_gpio.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_exti.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_exti.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_dma.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_dma_ex.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_dma.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_dmamux.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_pwr.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_pwr_ex.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_pwr.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_cortex.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_ll_cortex.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_tim.h;Drivers\STM32G4xx_HAL_Driver\Inc\stm32g4xx_hal_tim_ex.h;Drivers\CMSIS\Device\ST\STM32G4xx\Include\stm32g491xx.h;Drivers\CMSIS\Device\ST\STM32G4xx\Include\stm32g4xx.h;Drivers\CMSIS\Device\ST\STM32G4xx\Include\system_stm32g4xx.h;Drivers\CMSIS\Device\ST\STM32G4xx\Source\Templates\system_stm32g4xx.c;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_armclang_ltm.h;Drivers\CMSIS\Include\cmsis_compiler.h;Drivers\CMSIS\Include\cmsis_gcc.h;Drivers\CMSIS\Include\cmsis_iccarm.h;Drivers\CMSIS\Include\cmsis_version.h;Drivers\CMSIS\Include\core_armv81mml.h;Drivers\CMSIS\Include\core_armv8mbl.h;Drivers\CMSIS\Include\core_armv8mml.h;Drivers\CMSIS\Include\core_cm0.h;Drivers\CMSIS\Include\core_cm0plus.h;Drivers\CMSIS\Include\core_cm1.h;Drivers\CMSIS\Include\core_cm23.h;Drivers\CMSIS\Include\core_cm3.h;Drivers\CMSIS\Include\core_cm33.h;Drivers\CMSIS\Include\core_cm35p.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_cm7.h;Drivers\CMSIS\Include\core_sc000.h;Drivers\CMSIS\Include\core_sc300.h;Drivers\CMSIS\Include\mpu_armv7.h;Drivers\CMSIS\Include\mpu_armv8.h;Drivers\CMSIS\Include\tz_context.h; + +[PreviousUsedKeilFiles] +SourceFiles=..\Core\Src\main.c;..\Core\Src\stm32g4xx_it.c;..\Core\Src\stm32g4xx_hal_msp.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_uart.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_uart_ex.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_rcc.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_rcc_ex.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_flash.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_flash_ex.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_flash_ramfunc.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_gpio.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_exti.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_dma.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_dma_ex.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_pwr.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_pwr_ex.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_cortex.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_tim.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_tim_ex.c;..\Drivers\CMSIS\Device\ST\STM32G4xx\Source\Templates\system_stm32g4xx.c;..\Core\Src\system_stm32g4xx.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_uart.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_uart_ex.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_rcc.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_rcc_ex.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_flash.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_flash_ex.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_flash_ramfunc.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_gpio.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_exti.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_dma.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_dma_ex.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_pwr.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_pwr_ex.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_cortex.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_tim.c;..\Drivers\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_tim_ex.c;..\Drivers\CMSIS\Device\ST\STM32G4xx\Source\Templates\system_stm32g4xx.c;..\Core\Src\system_stm32g4xx.c;;; +HeaderPath=..\Drivers\STM32G4xx_HAL_Driver\Inc;..\Drivers\STM32G4xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32G4xx\Include;..\Drivers\CMSIS\Include;..\Core\Inc; +CDefines=USE_HAL_DRIVER;STM32G491xx;USE_HAL_DRIVER;USE_HAL_DRIVER; + +[PreviousGenFiles] +AdvancedFolderStructure=true +HeaderFileListSize=3 +HeaderFiles#0=..\Core\Inc\stm32g4xx_it.h +HeaderFiles#1=..\Core\Inc\stm32g4xx_hal_conf.h +HeaderFiles#2=..\Core\Inc\main.h +HeaderFolderListSize=1 +HeaderPath#0=..\Core\Inc +HeaderFiles=; +SourceFileListSize=3 +SourceFiles#0=..\Core\Src\stm32g4xx_it.c +SourceFiles#1=..\Core\Src\stm32g4xx_hal_msp.c +SourceFiles#2=..\Core\Src\main.c +SourceFolderListSize=1 +SourcePath#0=..\Core\Src +SourceFiles=; + diff --git a/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Inc/main.h b/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Inc/main.h new file mode 100644 index 0000000000..9d3a3972a5 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Inc/main.h @@ -0,0 +1,84 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g4xx_hal.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ +#define B1_Pin GPIO_PIN_13 +#define B1_GPIO_Port GPIOC +#define B1_EXTI_IRQn EXTI15_10_IRQn +#define LPUART1_TX_Pin GPIO_PIN_2 +#define LPUART1_TX_GPIO_Port GPIOA +#define LPUART1_RX_Pin GPIO_PIN_3 +#define LPUART1_RX_GPIO_Port GPIOA +#define LD2_Pin GPIO_PIN_5 +#define LD2_GPIO_Port GPIOA +#define T_SWDIO_Pin GPIO_PIN_13 +#define T_SWDIO_GPIO_Port GPIOA +#define T_SWCLK_Pin GPIO_PIN_14 +#define T_SWCLK_GPIO_Port GPIOA +#define T_SWO_Pin GPIO_PIN_3 +#define T_SWO_GPIO_Port GPIOB + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ diff --git a/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Inc/stm32g4xx_hal_conf.h b/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Inc/stm32g4xx_hal_conf.h new file mode 100644 index 0000000000..25fc721f91 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Inc/stm32g4xx_hal_conf.h @@ -0,0 +1,380 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g4xx_hal_conf.h + * @author MCD Application Team + * @brief HAL configuration file + ****************************************************************************** + * @attention + * + * Copyright (c) 2019 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32G4xx_HAL_CONF_H +#define STM32G4xx_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_COMP_MODULE_ENABLED */ +/*#define HAL_CORDIC_MODULE_ENABLED */ +/*#define HAL_CRC_MODULE_ENABLED */ +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_DAC_MODULE_ENABLED */ +/*#define HAL_FDCAN_MODULE_ENABLED */ +/*#define HAL_FMAC_MODULE_ENABLED */ +/*#define HAL_HRTIM_MODULE_ENABLED */ +/*#define HAL_IRDA_MODULE_ENABLED */ +/*#define HAL_IWDG_MODULE_ENABLED */ +/*#define HAL_I2C_MODULE_ENABLED */ +/*#define HAL_I2S_MODULE_ENABLED */ +/*#define HAL_LPTIM_MODULE_ENABLED */ +/*#define HAL_NAND_MODULE_ENABLED */ +/*#define HAL_NOR_MODULE_ENABLED */ +/*#define HAL_OPAMP_MODULE_ENABLED */ +/*#define HAL_PCD_MODULE_ENABLED */ +/*#define HAL_QSPI_MODULE_ENABLED */ +/*#define HAL_RNG_MODULE_ENABLED */ +/*#define HAL_RTC_MODULE_ENABLED */ +/*#define HAL_SAI_MODULE_ENABLED */ +/*#define HAL_SMARTCARD_MODULE_ENABLED */ +/*#define HAL_SMBUS_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_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## Register Callbacks selection ############################## */ +/** + * @brief This is the list of modules where register callback can be used + */ +#define USE_HAL_ADC_REGISTER_CALLBACKS 0U +#define USE_HAL_COMP_REGISTER_CALLBACKS 0U +#define USE_HAL_CORDIC_REGISTER_CALLBACKS 0U +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0U +#define USE_HAL_DAC_REGISTER_CALLBACKS 0U +#define USE_HAL_EXTI_REGISTER_CALLBACKS 0U +#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U +#define USE_HAL_FMAC_REGISTER_CALLBACKS 0U +#define USE_HAL_HRTIM_REGISTER_CALLBACKS 0U +#define USE_HAL_I2C_REGISTER_CALLBACKS 0U +#define USE_HAL_I2S_REGISTER_CALLBACKS 0U +#define USE_HAL_IRDA_REGISTER_CALLBACKS 0U +#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U +#define USE_HAL_NAND_REGISTER_CALLBACKS 0U +#define USE_HAL_NOR_REGISTER_CALLBACKS 0U +#define USE_HAL_OPAMP_REGISTER_CALLBACKS 0U +#define USE_HAL_PCD_REGISTER_CALLBACKS 0U +#define USE_HAL_QSPI_REGISTER_CALLBACKS 0U +#define USE_HAL_RNG_REGISTER_CALLBACKS 0U +#define USE_HAL_RTC_REGISTER_CALLBACKS 0U +#define USE_HAL_SAI_REGISTER_CALLBACKS 0U +#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U +#define USE_HAL_SPI_REGISTER_CALLBACKS 0U +#define USE_HAL_SRAM_REGISTER_CALLBACKS 0U +#define USE_HAL_TIM_REGISTER_CALLBACKS 0U +#define USE_HAL_UART_REGISTER_CALLBACKS 0U +#define USE_HAL_USART_REGISTER_CALLBACKS 0U +#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U + +/* ########################## 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 (24000000UL) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT (100UL) /*!< 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 (16000000UL) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal High Speed oscillator (HSI48) value for USB FS and RNG. + * This internal oscillator is mainly dedicated to provide a high precision clock to + * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. + * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency + * which is subject to manufacturing process variations. + */ +#if !defined (HSI48_VALUE) + #define HSI48_VALUE (48000000UL) /*!< Value of the Internal High Speed oscillator for USB FS/RNG in Hz. + The real value my vary depending on manufacturing process variations.*/ +#endif /* HSI48_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) +/*!< Value of the Internal Low Speed oscillator in Hz +The real value may vary depending on the variations in voltage and temperature.*/ +#define LSI_VALUE (32000UL) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ +/** + * @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 (32768UL) /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) +#define LSE_STARTUP_TIMEOUT (5000UL) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S and SAI peripherals + * This value is used by the I2S and SAI HAL modules to compute the I2S and SAI clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) +#define EXTERNAL_CLOCK_VALUE (12288000UL) /*!< Value of the External oscillator in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ + +#define VDD_VALUE (3300UL) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY (0UL) /*!< tick interrupt priority (lowest by default) */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 0U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver + * Activated: CRC code is present inside driver + * Deactivated: CRC code cleaned from driver + */ + +#define USE_SPI_CRC 0U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED +#include "stm32g4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED +#include "stm32g4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED +#include "stm32g4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED +#include "stm32g4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED +#include "stm32g4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED +#include "stm32g4xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CORDIC_MODULE_ENABLED +#include "stm32g4xx_hal_cordic.h" +#endif /* HAL_CORDIC_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED +#include "stm32g4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED +#include "stm32g4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED +#include "stm32g4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED +#include "stm32g4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_FDCAN_MODULE_ENABLED +#include "stm32g4xx_hal_fdcan.h" +#endif /* HAL_FDCAN_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED +#include "stm32g4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_FMAC_MODULE_ENABLED +#include "stm32g4xx_hal_fmac.h" +#endif /* HAL_FMAC_MODULE_ENABLED */ + +#ifdef HAL_HRTIM_MODULE_ENABLED +#include "stm32g4xx_hal_hrtim.h" +#endif /* HAL_HRTIM_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED +#include "stm32g4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED +#include "stm32g4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED +#include "stm32g4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED +#include "stm32g4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED +#include "stm32g4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED +#include "stm32g4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED +#include "stm32g4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_OPAMP_MODULE_ENABLED +#include "stm32g4xx_hal_opamp.h" +#endif /* HAL_OPAMP_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED +#include "stm32g4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED +#include "stm32g4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED +#include "stm32g4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED +#include "stm32g4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED +#include "stm32g4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED +#include "stm32g4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED +#include "stm32g4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED +#include "stm32g4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED +#include "stm32g4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED +#include "stm32g4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED +#include "stm32g4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED +#include "stm32g4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED +#include "stm32g4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED +#include "stm32g4xx_hal_wwdg.h" +#endif /* HAL_WWDG_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 /* STM32G4xx_HAL_CONF_H */ diff --git a/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Inc/stm32g4xx_it.h b/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Inc/stm32g4xx_it.h new file mode 100644 index 0000000000..34d7e8ff7b --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Inc/stm32g4xx_it.h @@ -0,0 +1,67 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32G4xx_IT_H +#define __STM32G4xx_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); +void EXTI15_10_IRQHandler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32G4xx_IT_H */ diff --git a/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Src/main.c b/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Src/main.c new file mode 100644 index 0000000000..8e5114efec --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Src/main.c @@ -0,0 +1,274 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* 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 hlpuart1; + +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_LPUART1_UART_Init(void); +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_LPUART1_UART_Init(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /** Configure the main internal regulator output voltage + */ + HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV4; + RCC_OscInitStruct.PLL.PLLN = 85; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; + RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief LPUART1 Initialization Function + * @param None + * @retval None + */ +static void MX_LPUART1_UART_Init(void) +{ + + /* USER CODE BEGIN LPUART1_Init 0 */ + + /* USER CODE END LPUART1_Init 0 */ + + /* USER CODE BEGIN LPUART1_Init 1 */ + + /* USER CODE END LPUART1_Init 1 */ + hlpuart1.Instance = LPUART1; + hlpuart1.Init.BaudRate = 115200; + hlpuart1.Init.WordLength = UART_WORDLENGTH_8B; + hlpuart1.Init.StopBits = UART_STOPBITS_1; + hlpuart1.Init.Parity = UART_PARITY_NONE; + hlpuart1.Init.Mode = UART_MODE_TX_RX; + hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; + hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1; + hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + if (HAL_UART_Init(&hlpuart1) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN LPUART1_Init 2 */ + + /* USER CODE END LPUART1_Init 2 */ + +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; +/* USER CODE BEGIN MX_GPIO_Init_1 */ +/* USER CODE END MX_GPIO_Init_1 */ + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOF_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : B1_Pin */ + GPIO_InitStruct.Pin = B1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : LD2_Pin */ + GPIO_InitStruct.Pin = LD2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); + + /* EXTI interrupt init*/ + HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); + +/* USER CODE BEGIN MX_GPIO_Init_2 */ +/* USER CODE END MX_GPIO_Init_2 */ +} + +/* 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 */ + __disable_irq(); + 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, + ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ diff --git a/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Src/stm32g4xx_hal_msp.c b/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Src/stm32g4xx_hal_msp.c new file mode 100644 index 0000000000..47648bc270 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Src/stm32g4xx_hal_msp.c @@ -0,0 +1,162 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g4xx_hal_msp.c + * @brief This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /** Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral + */ + HAL_PWREx_DisableUCPDDeadBattery(); + + /* 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}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + if(huart->Instance==LPUART1) + { + /* USER CODE BEGIN LPUART1_MspInit 0 */ + + /* USER CODE END LPUART1_MspInit 0 */ + + /** Initializes the peripherals clocks + */ + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_LPUART1; + PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + // Error_Handler(); + } + + /* Peripheral clock enable */ + __HAL_RCC_LPUART1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**LPUART1 GPIO Configuration + PA2 ------> LPUART1_TX + PA3 ------> LPUART1_RX + */ + GPIO_InitStruct.Pin = LPUART1_TX_Pin|LPUART1_RX_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF12_LPUART1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN LPUART1_MspInit 1 */ + + /* USER CODE END LPUART1_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==LPUART1) + { + /* USER CODE BEGIN LPUART1_MspDeInit 0 */ + + /* USER CODE END LPUART1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_LPUART1_CLK_DISABLE(); + + /**LPUART1 GPIO Configuration + PA2 ------> LPUART1_TX + PA3 ------> LPUART1_RX + */ + HAL_GPIO_DeInit(GPIOA, LPUART1_TX_Pin|LPUART1_RX_Pin); + + /* USER CODE BEGIN LPUART1_MspDeInit 1 */ + + /* USER CODE END LPUART1_MspDeInit 1 */ + } + +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Src/stm32g4xx_it.c b/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Src/stm32g4xx_it.c new file mode 100644 index 0000000000..e8c54ee51b --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Src/stm32g4xx_it.c @@ -0,0 +1,217 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + * Copyright (c) 2023 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32g4xx_it.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ + +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex-M4 Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + while (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 */ +} + +/******************************************************************************/ +/* STM32G4xx 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_stm32g4xx.s). */ +/******************************************************************************/ + +/** + * @brief This function handles EXTI line[15:10] interrupts. + */ +void EXTI15_10_IRQHandler(void) +{ + /* USER CODE BEGIN EXTI15_10_IRQn 0 */ + + /* USER CODE END EXTI15_10_IRQn 0 */ + HAL_GPIO_EXTI_IRQHandler(B1_Pin); + /* USER CODE BEGIN EXTI15_10_IRQn 1 */ + + /* USER CODE END EXTI15_10_IRQn 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ diff --git a/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Src/system_stm32g4xx.c b/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Src/system_stm32g4xx.c new file mode 100644 index 0000000000..922e57abc1 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/Core/Src/system_stm32g4xx.c @@ -0,0 +1,285 @@ +/** + ****************************************************************************** + * @file system_stm32g4xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32g4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * After each device reset the HSI (16 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32g4xx.s" file, to + * configure the system clock before to branch to main program. + * + * This file configures the system clock as follows: + *============================================================================= + *----------------------------------------------------------------------------- + * System Clock source | HSI + *----------------------------------------------------------------------------- + * SYSCLK(Hz) | 16000000 + *----------------------------------------------------------------------------- + * HCLK(Hz) | 16000000 + *----------------------------------------------------------------------------- + * AHB Prescaler | 1 + *----------------------------------------------------------------------------- + * APB1 Prescaler | 1 + *----------------------------------------------------------------------------- + * APB2 Prescaler | 1 + *----------------------------------------------------------------------------- + * PLL_M | 1 + *----------------------------------------------------------------------------- + * PLL_N | 16 + *----------------------------------------------------------------------------- + * PLL_P | 7 + *----------------------------------------------------------------------------- + * PLL_Q | 2 + *----------------------------------------------------------------------------- + * PLL_R | 2 + *----------------------------------------------------------------------------- + * Require 48MHz for RNG | Disabled + *----------------------------------------------------------------------------- + *============================================================================= + ****************************************************************************** + * @attention + * + * Copyright (c) 2019 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32g4xx_system + * @{ + */ + +/** @addtogroup STM32G4xx_System_Private_Includes + * @{ + */ + +#include "stm32g4xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE 24000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32G4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32G4xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/* Note: Following vector table addresses must be defined in line with linker + configuration. */ +/*!< Uncomment the following line if you need to relocate the vector table + anywhere in Flash or Sram, else the vector table is kept at the automatic + remap of boot address selected */ +/* #define USER_VECT_TAB_ADDRESS */ + +#if defined(USER_VECT_TAB_ADDRESS) +/*!< Uncomment the following line if you need to relocate your vector Table + in Sram else user remap will be done in Flash. */ +/* #define VECT_TAB_SRAM */ +#if defined(VECT_TAB_SRAM) +#define VECT_TAB_BASE_ADDRESS SRAM_BASE /*!< Vector Table base address field. + This value must be a multiple of 0x200. */ +#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +#else +#define VECT_TAB_BASE_ADDRESS FLASH_BASE /*!< Vector Table base address field. + This value must be a multiple of 0x200. */ +#define VECT_TAB_OFFSET 0x00000000U /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +#endif /* VECT_TAB_SRAM */ +#endif /* USER_VECT_TAB_ADDRESS */ +/******************************************************************************/ +/** + * @} + */ + +/** @addtogroup STM32G4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32G4xx_System_Private_Variables + * @{ + */ + /* The SystemCoreClock variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = HSI_VALUE; + + const uint8_t AHBPrescTable[16] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U, 6U, 7U, 8U, 9U}; + const uint8_t APBPrescTable[8] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U}; + +/** + * @} + */ + +/** @addtogroup STM32G4xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32G4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system. + * @param None + * @retval None + */ + +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << (10*2))|(3UL << (11*2))); /* set CP10 and CP11 Full Access */ + #endif + + /* Configure the Vector Table location add offset address ------------------*/ +#if defined(USER_VECT_TAB_ADDRESS) + SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#endif /* USER_VECT_TAB_ADDRESS */ +} + +/** + * @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/divided by the PLL factors. + * + * (**) HSI_VALUE is a constant defined in stm32g4xx_hal.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (***) HSE_VALUE is a constant defined in stm32g4xx_hal.h file (default value + * 24 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp, pllvco, pllr, pllsource, pllm; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) + { + case 0x04: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + + case 0x08: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + + case 0x0C: /* PLL used as system clock source */ + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLLM) * PLLN + SYSCLK = PLL_VCO / PLLR + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> 4) + 1U ; + if (pllsource == 0x02UL) /* HSI used as PLL clock source */ + { + pllvco = (HSI_VALUE / pllm); + } + else /* HSE used as PLL clock source */ + { + pllvco = (HSE_VALUE / pllm); + } + pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 8); + pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 25) + 1U) * 2U; + SystemCoreClock = pllvco/pllr; + break; + + default: + break; + } + /* Compute HCLK clock frequency --------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + + diff --git a/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc b/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc new file mode 100644 index 0000000000..7ffff2a22d --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc @@ -0,0 +1,183 @@ +#MicroXplorer Configuration settings - do not modify +CAD.formats= +CAD.pinconfig= +CAD.provider= +File.Version=6 +KeepUserPlacement=false +LPUART1.BaudRate=115200 +LPUART1.IPParameters=BaudRate,WordLength +LPUART1.WordLength=UART_WORDLENGTH_8B +Mcu.CPN=STM32G491RET6 +Mcu.Family=STM32G4 +Mcu.IP0=LPUART1 +Mcu.IP1=NVIC +Mcu.IP2=RCC +Mcu.IP3=SYS +Mcu.IPNb=4 +Mcu.Name=STM32G491R(C-E)Tx +Mcu.Package=LQFP64 +Mcu.Pin0=PC13 +Mcu.Pin1=PC14-OSC32_IN +Mcu.Pin10=PB3 +Mcu.Pin11=VP_SYS_VS_Systick +Mcu.Pin12=VP_SYS_VS_DBSignals +Mcu.Pin2=PC15-OSC32_OUT +Mcu.Pin3=PF0-OSC_IN +Mcu.Pin4=PF1-OSC_OUT +Mcu.Pin5=PA2 +Mcu.Pin6=PA3 +Mcu.Pin7=PA5 +Mcu.Pin8=PA13 +Mcu.Pin9=PA14 +Mcu.PinsNb=13 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32G491RETx +MxCube.Version=6.10.0 +MxDb.Version=DB.6.0.100 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.EXTI15_10_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true +NVIC.ForceEnableDMAVector=true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:false +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false +PA13.GPIOParameters=GPIO_Label +PA13.GPIO_Label=T_SWDIO +PA13.Locked=true +PA13.Mode=Serial_Wire +PA13.Signal=SYS_JTMS-SWDIO +PA14.GPIOParameters=GPIO_Label +PA14.GPIO_Label=T_SWCLK +PA14.Locked=true +PA14.Mode=Serial_Wire +PA14.Signal=SYS_JTCK-SWCLK +PA2.GPIOParameters=GPIO_Label +PA2.GPIO_Label=LPUART1_TX [STLINKV3E_VCP_RX] +PA2.Locked=true +PA2.Mode=Asynchronous +PA2.Signal=LPUART1_TX +PA3.GPIOParameters=GPIO_Label +PA3.GPIO_Label=LPUART1_RX [STLINKV3E_VCP_TX] +PA3.Locked=true +PA3.Mode=Asynchronous +PA3.Signal=LPUART1_RX +PA5.GPIOParameters=GPIO_Label +PA5.GPIO_Label=LD2 [green led] +PA5.Locked=true +PA5.Signal=GPIO_Output +PB3.GPIOParameters=GPIO_Label +PB3.GPIO_Label=T_SWO +PB3.Locked=true +PB3.Signal=SYS_JTDO-SWO +PC13.GPIOParameters=GPIO_Label +PC13.GPIO_Label=B1 [blue push button] +PC13.Locked=true +PC13.Signal=GPXTI13 +PC14-OSC32_IN.Locked=true +PC14-OSC32_IN.Mode=LSE-External-Oscillator +PC14-OSC32_IN.Signal=RCC_OSC32_IN +PC15-OSC32_OUT.Locked=true +PC15-OSC32_OUT.Mode=LSE-External-Oscillator +PC15-OSC32_OUT.Signal=RCC_OSC32_OUT +PF0-OSC_IN.Locked=true +PF0-OSC_IN.Mode=HSE-External-Oscillator +PF0-OSC_IN.Signal=RCC_OSC_IN +PF1-OSC_OUT.Locked=true +PF1-OSC_OUT.Mode=HSE-External-Oscillator +PF1-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=STM32G491RETx +ProjectManager.FirmwarePackage=STM32Cube FW_G4 V1.5.1 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=0 +ProjectManager.MainLocation=Core/Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=CubeMX_Config.ioc +ProjectManager.ProjectName=CubeMX_Config +ProjectManager.ProjectStructure= +ProjectManager.RegisterCallBack= +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=MDK-ARM V5.32 +ProjectManager.ToolChainLocation= +ProjectManager.UAScriptAfterPath= +ProjectManager.UAScriptBeforePath= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_LPUART1_UART_Init-LPUART1-false-HAL-true +RCC.ADC12Freq_Value=170000000 +RCC.ADC345Freq_Value=170000000 +RCC.AHBFreq_Value=170000000 +RCC.APB1Freq_Value=170000000 +RCC.APB1TimFreq_Value=170000000 +RCC.APB2Freq_Value=170000000 +RCC.APB2TimFreq_Value=170000000 +RCC.CRSFreq_Value=48000000 +RCC.CortexFreq_Value=170000000 +RCC.EXTERNAL_CLOCK_VALUE=12288000 +RCC.FCLKCortexFreq_Value=170000000 +RCC.FDCANFreq_Value=170000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=170000000 +RCC.HRTIM1Freq_Value=170000000 +RCC.HSE_VALUE=24000000 +RCC.HSI48_VALUE=48000000 +RCC.HSI_VALUE=16000000 +RCC.I2C1Freq_Value=170000000 +RCC.I2C2Freq_Value=170000000 +RCC.I2C3Freq_Value=170000000 +RCC.I2C4Freq_Value=170000000 +RCC.I2SFreq_Value=170000000 +RCC.IPParameters=ADC12Freq_Value,ADC345Freq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CRSFreq_Value,CortexFreq_Value,EXTERNAL_CLOCK_VALUE,FCLKCortexFreq_Value,FDCANFreq_Value,FamilyName,HCLKFreq_Value,HRTIM1Freq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2C4Freq_Value,I2SFreq_Value,LPTIM1Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,PLLM,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PWRFreq_Value,QSPIFreq_Value,RNGFreq_Value,RTCClockSelection,RTCFreq_Value,SAI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value +RCC.LPTIM1Freq_Value=170000000 +RCC.LPUART1Freq_Value=170000000 +RCC.LSCOPinFreq_Value=32000 +RCC.LSI_VALUE=32000 +RCC.MCO1PinFreq_Value=16000000 +RCC.PLLM=RCC_PLLM_DIV4 +RCC.PLLN=85 +RCC.PLLPoutputFreq_Value=170000000 +RCC.PLLQoutputFreq_Value=170000000 +RCC.PLLRCLKFreq_Value=170000000 +RCC.PWRFreq_Value=170000000 +RCC.QSPIFreq_Value=170000000 +RCC.RNGFreq_Value=48000000 +RCC.RTCClockSelection=RCC_RTCCLKSOURCE_LSE +RCC.RTCFreq_Value=32768 +RCC.SAI1Freq_Value=170000000 +RCC.SYSCLKFreq_VALUE=170000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.UART4Freq_Value=170000000 +RCC.UART5Freq_Value=170000000 +RCC.USART1Freq_Value=170000000 +RCC.USART2Freq_Value=170000000 +RCC.USART3Freq_Value=170000000 +RCC.USBFreq_Value=48000000 +RCC.VCOInputFreq_Value=4000000 +RCC.VCOOutputFreq_Value=340000000 +SH.GPXTI13.0=GPIO_EXTI13 +SH.GPXTI13.ConfNb=1 +VP_SYS_VS_DBSignals.Mode=DisableDeadBatterySignals +VP_SYS_VS_DBSignals.Signal=SYS_VS_DBSignals +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +board=NUCLEO-G491RE +boardIOC=true diff --git a/bsp/stm32/stm32g491-st-nucleo/board/Kconfig b/bsp/stm32/stm32g491-st-nucleo/board/Kconfig new file mode 100644 index 0000000000..3cfaf5d148 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/board/Kconfig @@ -0,0 +1,70 @@ +menu "Hardware Drivers Config" + +config SOC_STM32G491RE + bool + select SOC_SERIES_STM32G4 + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + 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_LPUART1 + bool "Enable LPUART1" + default y + + config BSP_LPUART1_RX_USING_DMA + bool "Enable LPUART1 RX DMA" + depends on BSP_USING_LPUART1 && RT_SERIAL_USING_DMA + default n + + config BSP_USING_UART1 + bool "Enable UART1" + default n + + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default n + + config BSP_USING_UART3 + bool "Enable UART3" + default n + + config BSP_UART3_RX_USING_DMA + bool "Enable UART3 RX DMA" + depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA + default n + + config BSP_USING_UART4 + bool "Enable UART4" + default n + + config BSP_UART4_RX_USING_DMA + bool "Enable UART4 RX DMA" + depends on BSP_USING_UART4 && RT_SERIAL_USING_DMA + default n + endif + source "$BSP_DIR/../libraries/HAL_Drivers/drivers/Kconfig" + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/stm32/stm32g491-st-nucleo/board/SConscript b/bsp/stm32/stm32g491-st-nucleo/board/SConscript new file mode 100644 index 0000000000..4fba7bdba8 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/board/SConscript @@ -0,0 +1,30 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +CubeMX_Config/Core/Src/stm32g4xx_hal_msp.c +''') + +path = [cwd] +path += [cwd + '/CubeMX_Config/Core/Inc'] + +startup_path_prefix = SDK_LIB + +if rtconfig.PLATFORM in ['gcc']: + src += [startup_path_prefix + '/STM32G4xx_HAL/CMSIS/Device/ST/STM32G4xx/Source/Templates/gcc/startup_stm32g491xx.s'] +elif rtconfig.PLATFORM in ['armcc', 'armclang']: + src += [startup_path_prefix + '/STM32G4xx_HAL/CMSIS/Device/ST/STM32G4xx/Source/Templates/arm/startup_stm32g491xx.s'] +elif rtconfig.PLATFORM in ['iccarm']: + src += [startup_path_prefix + '/STM32G4xx_HAL/CMSIS/Device/ST/STM32G4xx/Source/Templates/iar/startup_stm32g491xx.s'] + +CPPDEFINES = ['STM32G491xx'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') diff --git a/bsp/stm32/stm32g491-st-nucleo/board/board.c b/bsp/stm32/stm32g491-st-nucleo/board/board.c new file mode 100644 index 0000000000..ce3f776d4a --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/board/board.c @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2023-2024, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2023-12-04 Supperthomas First version + */ + +#include "board.h" + +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /** Configure the main internal regulator output voltage + */ + HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST); + + /** Initializes the RCC Oscillators according to the specified parameters + * in the RCC_OscInitTypeDef structure. + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV4; + RCC_OscInitStruct.PLL.PLLN = 85; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; + RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /** Initializes the CPU, AHB and APB buses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) + { + Error_Handler(); + } +} + diff --git a/bsp/stm32/stm32g491-st-nucleo/board/board.h b/bsp/stm32/stm32g491-st-nucleo/board/board.h new file mode 100644 index 0000000000..2154d88034 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/board/board.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift first version + * 2019-01-08 AndeyQi add stm32f446-st-nucleo bsp + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include +#include "drv_common.h" +#include "drv_gpio.h" + +#define STM32_FLASH_START_ADRESS ((uint32_t)0x08000000) +#define STM32_FLASH_SIZE (512 * 1024) +#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE)) + +#define STM32_SRAM_SIZE 32 +#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024) + +#if defined(__ARMCC_VERSION) +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN (&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="CSTACK" +#define HEAP_BEGIN (__segment_end("CSTACK")) +#else +extern int __bss_end; +#define HEAP_BEGIN (&__bss_end) +#endif + +#define HEAP_END STM32_SRAM_END + +void SystemClock_Config(void); + +#endif + diff --git a/bsp/stm32/stm32g491-st-nucleo/board/linker_scripts/link.icf b/bsp/stm32/stm32g491-st-nucleo/board/linker_scripts/link.icf new file mode 100644 index 0000000000..4274ac64e6 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/board/linker_scripts/link.icf @@ -0,0 +1,28 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x0400; +define symbol __ICFEDIT_size_heap__ = 0x000; +/**** 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/stm32g491-st-nucleo/board/linker_scripts/link.lds b/bsp/stm32/stm32g491-st-nucleo/board/linker_scripts/link.lds new file mode 100644 index 0000000000..67337e873b --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/board/linker_scripts/link.lds @@ -0,0 +1,158 @@ +/* + * linker script for STM32F4xx with GNU ld + * bernard.xiong 2009-10-14 + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08000000, LENGTH = 512k /* 512KB flash */ + RAM (rw) : ORIGIN = 0x20000000, LENGTH = 128k /* 128K sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x400; + +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/stm32g491-st-nucleo/board/linker_scripts/link.sct b/bsp/stm32/stm32g491-st-nucleo/board/linker_scripts/link.sct new file mode 100644 index 0000000000..a370c46f9e --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/board/linker_scripts/link.sct @@ -0,0 +1,15 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00080000 { ; load region size_region + ER_IROM1 0x08000000 0x00080000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_IRAM1 0x20000000 0x0001C000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/bsp/stm32/stm32g491-st-nucleo/figures/board.jpg b/bsp/stm32/stm32g491-st-nucleo/figures/board.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0869afd17d1c61ee4f6bf82b5bf82b31e5e46b8e GIT binary patch literal 125195 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

v) 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 E0}|MSq5uE@ literal 0 HcmV?d00001 diff --git a/bsp/stm32/stm32g491-st-nucleo/project.ewd b/bsp/stm32/stm32g491-st-nucleo/project.ewd new file mode 100644 index 0000000000..eaaa7f7470 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/project.ewd @@ -0,0 +1,2834 @@ + + + 3 + + rt-thread + + ARM + + 1 + + C-SPY + 2 + + 29 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 29 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 6 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/bsp/stm32/stm32g491-st-nucleo/project.ewp b/bsp/stm32/stm32g491-st-nucleo/project.ewp new file mode 100644 index 0000000000..c389d257b1 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/project.ewp @@ -0,0 +1,2385 @@ + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 33 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 37 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 11 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 176 + inputOutputBased + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + + Release + + ARM + + 0 + + General + 3 + + 33 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 37 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 11 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + inputOutputBased + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 25 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + Compiler + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cctype.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstdlib.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cstring.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\ctime.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cunistd.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\common\cwchar.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\environ.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_close.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_lseek.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_mem.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_open.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_read.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_remove.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscall_write.c + + + $PROJ_DIR$\..\..\..\components\libc\compilers\dlib\syscalls.c + + + + CPU + + $PROJ_DIR$\..\..\..\libcpu\arm\common\atomic_arm.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\context_iar.S + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\components\drivers\core\device.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\completion.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\dataqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\pipe.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\ringblk_buf.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\ringbuffer.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\waitqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\ipc\workqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\misc\pin.c + + + $PROJ_DIR$\..\..\..\components\drivers\serial\serial.c + + + + Drivers + + $PROJ_DIR$\..\libraries\HAL_Drivers\drivers\drv_gpio.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drivers\drv_usart.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_common.c + + + $PROJ_DIR$\..\libraries\STM32G4xx_HAL\CMSIS\Device\ST\STM32G4xx\Source\Templates\iar\startup_stm32g491xx.s + + + $PROJ_DIR$\board\CubeMX_Config\Core\Src\stm32g4xx_hal_msp.c + + + $PROJ_DIR$\board\board.c + + + + Finsh + + $PROJ_DIR$\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_parse.c + + + $PROJ_DIR$\..\..\..\components\finsh\cmd.c + + + + Kernel + + $PROJ_DIR$\..\..\..\src\clock.c + + + $PROJ_DIR$\..\..\..\src\components.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_up.c + + + $PROJ_DIR$\..\..\..\src\thread.c + + + $PROJ_DIR$\..\..\..\src\timer.c + + + + Libraries + + $PROJ_DIR$\..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_pwr.c + + + $PROJ_DIR$\..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_dma_ex.c + + + $PROJ_DIR$\..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_gpio.c + + + $PROJ_DIR$\..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_rcc_ex.c + + + $PROJ_DIR$\..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_usart.c + + + $PROJ_DIR$\..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_pwr_ex.c + + + $PROJ_DIR$\..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_cryp.c + + + $PROJ_DIR$\..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_usart_ex.c + + + $PROJ_DIR$\..\libraries\STM32G4xx_HAL\CMSIS\Device\ST\STM32G4xx\Source\Templates\system_stm32g4xx.c + + + $PROJ_DIR$\..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_cortex.c + + + $PROJ_DIR$\..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal.c + + + $PROJ_DIR$\..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_rcc.c + + + $PROJ_DIR$\..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_dma.c + + + $PROJ_DIR$\..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_uart.c + + + $PROJ_DIR$\..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_uart_ex.c + + + $PROJ_DIR$\..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_rng.c + + + $PROJ_DIR$\..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_crc.c + + + $PROJ_DIR$\..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_cryp_ex.c + + + + POSIX + + diff --git a/bsp/stm32/stm32g491-st-nucleo/project.eww b/bsp/stm32/stm32g491-st-nucleo/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/stm32/stm32g491-st-nucleo/project.uvoptx b/bsp/stm32/stm32g491-st-nucleo/project.uvoptx new file mode 100644 index 0000000000..6674530fed --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/project.uvoptx @@ -0,0 +1,1016 @@ + + + + 1.0 + +

### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.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 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC8000 -FD20000000 -FF0STM32G49x-Ax_512 -FL080000 -FS08000000 -FP0($$Device:STM32G491RETx$CMSIS\Flash\STM32G49x-Ax_512.FLM) + + + 0 + ST-LINKIII-KEIL_SWO + -U0039004E3431511337393330 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(2BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8000 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC8000 -FN1 -FF0STM32G49x-Ax_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32G491RETx$CMSIS\Flash\STM32G49x-Ax_512.FLM) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 0 + 0 + 2 + 10000000 + + + + + + Applications + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Compiler + 1 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\armlibc\syscall_mem.c + syscall_mem.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\armlibc\syscalls.c + syscalls.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cctype.c + cctype.c + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstdlib.c + cstdlib.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cstring.c + cstring.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\ctime.c + ctime.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cunistd.c + cunistd.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\..\components\libc\compilers\common\cwchar.c + cwchar.c + 0 + 0 + + + + + CPU + 0 + 0 + 0 + 0 + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\atomic_arm.c + atomic_arm.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + 3 + 13 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 4 + 15 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\core\device.c + device.c + 0 + 0 + + + 4 + 16 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\completion.c + completion.c + 0 + 0 + + + 4 + 17 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\dataqueue.c + dataqueue.c + 0 + 0 + + + 4 + 18 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\pipe.c + pipe.c + 0 + 0 + + + 4 + 19 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 4 + 20 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 4 + 21 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\waitqueue.c + waitqueue.c + 0 + 0 + + + 4 + 22 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\ipc\workqueue.c + workqueue.c + 0 + 0 + + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 4 + 24 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 5 + 25 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 5 + 26 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 5 + 27 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_common.c + drv_common.c + 0 + 0 + + + 5 + 28 + 2 + 0 + 0 + 0 + ..\libraries\STM32G4xx_HAL\CMSIS\Device\ST\STM32G4xx\Source\Templates\arm\startup_stm32g491xx.s + startup_stm32g491xx.s + 0 + 0 + + + 5 + 29 + 1 + 0 + 0 + 0 + board\CubeMX_Config\Core\Src\stm32g4xx_hal_msp.c + stm32g4xx_hal_msp.c + 0 + 0 + + + 5 + 30 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + + + Finsh + 0 + 0 + 0 + 0 + + 6 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 33 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_parse.c + msh_parse.c + 0 + 0 + + + 6 + 34 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 7 + 35 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 7 + 36 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 7 + 37 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 7 + 38 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 7 + 39 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 7 + 40 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 7 + 41 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 7 + 42 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 7 + 43 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler_up.c + scheduler_up.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 7 + 46 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + Libraries + 0 + 0 + 0 + 0 + + 8 + 47 + 1 + 0 + 0 + 0 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_pwr.c + stm32g4xx_hal_pwr.c + 0 + 0 + + + 8 + 48 + 1 + 0 + 0 + 0 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_dma_ex.c + stm32g4xx_hal_dma_ex.c + 0 + 0 + + + 8 + 49 + 1 + 0 + 0 + 0 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_gpio.c + stm32g4xx_hal_gpio.c + 0 + 0 + + + 8 + 50 + 1 + 0 + 0 + 0 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_rcc_ex.c + stm32g4xx_hal_rcc_ex.c + 0 + 0 + + + 8 + 51 + 1 + 0 + 0 + 0 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_usart.c + stm32g4xx_hal_usart.c + 0 + 0 + + + 8 + 52 + 1 + 0 + 0 + 0 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_pwr_ex.c + stm32g4xx_hal_pwr_ex.c + 0 + 0 + + + 8 + 53 + 1 + 0 + 0 + 0 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_cryp.c + stm32g4xx_hal_cryp.c + 0 + 0 + + + 8 + 54 + 1 + 0 + 0 + 0 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_usart_ex.c + stm32g4xx_hal_usart_ex.c + 0 + 0 + + + 8 + 55 + 1 + 0 + 0 + 0 + ..\libraries\STM32G4xx_HAL\CMSIS\Device\ST\STM32G4xx\Source\Templates\system_stm32g4xx.c + system_stm32g4xx.c + 0 + 0 + + + 8 + 56 + 1 + 0 + 0 + 0 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_cortex.c + stm32g4xx_hal_cortex.c + 0 + 0 + + + 8 + 57 + 1 + 0 + 0 + 0 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal.c + stm32g4xx_hal.c + 0 + 0 + + + 8 + 58 + 1 + 0 + 0 + 0 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_rcc.c + stm32g4xx_hal_rcc.c + 0 + 0 + + + 8 + 59 + 1 + 0 + 0 + 0 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_dma.c + stm32g4xx_hal_dma.c + 0 + 0 + + + 8 + 60 + 1 + 0 + 0 + 0 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_uart.c + stm32g4xx_hal_uart.c + 0 + 0 + + + 8 + 61 + 1 + 0 + 0 + 0 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_uart_ex.c + stm32g4xx_hal_uart_ex.c + 0 + 0 + + + 8 + 62 + 1 + 0 + 0 + 0 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_rng.c + stm32g4xx_hal_rng.c + 0 + 0 + + + 8 + 63 + 1 + 0 + 0 + 0 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_crc.c + stm32g4xx_hal_crc.c + 0 + 0 + + + 8 + 64 + 1 + 0 + 0 + 0 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_cryp_ex.c + stm32g4xx_hal_cryp_ex.c + 0 + 0 + + + + diff --git a/bsp/stm32/stm32g491-st-nucleo/project.uvprojx b/bsp/stm32/stm32g491-st-nucleo/project.uvprojx new file mode 100644 index 0000000000..d32a7a5414 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/project.uvprojx @@ -0,0 +1,753 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32G491RETx + STMicroelectronics + Keil.STM32G4xx_DFP.1.5.0 + https://www.keil.com/pack/ + IRAM(0x20000000,0x0001C000) IROM(0x08000000,0x00080000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0STM32G49x-Ax_512 -FS08000000 -FL080000 -FP0($$Device:STM32G491RETx$CMSIS\Flash\STM32G49x-Ax_512.FLM)) + 0 + $$Device:STM32G491RETx$Drivers\CMSIS\Device\ST\STM32G4xx\Include\stm32g4xx.h + + + + + + + + + + $$Device:STM32G491RETx$CMSIS\SVD\STM32G491xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 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 + 0x1c000 + + + 1 + 0x8000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x1c000 + + + 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 + + + __STDC_LIMIT_MACROS, RT_USING_ARMLIBC, USE_HAL_DRIVER, RT_USING_LIBC, __CLK_TCK=RT_TICK_PER_SECOND, __RTTHREAD__, STM32G491xx + + .;..\libraries\HAL_Drivers;..\..\..\components\drivers\include;board\CubeMX_Config\Core\Inc;..\..\..\libcpu\arm\common;..\..\..\components\libc\posix\ipc;..\..\..\components\libc\compilers\common\include;..\..\..\components\libc\posix\io\poll;..\libraries\HAL_Drivers\CMSIS\Include;..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Inc;board;applications;..\..\..\components\libc\compilers\common\extension;..\libraries\STM32G4xx_HAL\CMSIS\Device\ST\STM32G4xx\Include;..\..\..\components\drivers\include;..\..\..\libcpu\arm\cortex-m4;..\..\..\components\libc\posix\io\eventfd;..\..\..\components\finsh;..\..\..\components\drivers\include;..\..\..\include;..\..\..\components\drivers\include;..\libraries\HAL_Drivers\drivers;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\components\libc\posix\io\epoll;..\libraries\HAL_Drivers\drivers\config + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 4 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Compiler + + + syscall_mem.c + 1 + ..\..\..\components\libc\compilers\armlibc\syscall_mem.c + + + syscalls.c + 1 + ..\..\..\components\libc\compilers\armlibc\syscalls.c + + + cctype.c + 1 + ..\..\..\components\libc\compilers\common\cctype.c + + + cstdlib.c + 1 + ..\..\..\components\libc\compilers\common\cstdlib.c + + + cstring.c + 1 + ..\..\..\components\libc\compilers\common\cstring.c + + + ctime.c + 1 + ..\..\..\components\libc\compilers\common\ctime.c + + + cunistd.c + 1 + ..\..\..\components\libc\compilers\common\cunistd.c + + + cwchar.c + 1 + ..\..\..\components\libc\compilers\common\cwchar.c + + + + + CPU + + + atomic_arm.c + 1 + ..\..\..\libcpu\arm\common\atomic_arm.c + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m4\context_rvds.S + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + + + DeviceDrivers + + + device.c + 1 + ..\..\..\components\drivers\core\device.c + + + completion.c + 1 + ..\..\..\components\drivers\ipc\completion.c + + + dataqueue.c + 1 + ..\..\..\components\drivers\ipc\dataqueue.c + + + pipe.c + 1 + ..\..\..\components\drivers\ipc\pipe.c + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\ipc\ringblk_buf.c + + + ringbuffer.c + 1 + ..\..\..\components\drivers\ipc\ringbuffer.c + + + waitqueue.c + 1 + ..\..\..\components\drivers\ipc\waitqueue.c + + + workqueue.c + 1 + ..\..\..\components\drivers\ipc\workqueue.c + + + pin.c + 1 + ..\..\..\components\drivers\misc\pin.c + + + serial.c + 1 + ..\..\..\components\drivers\serial\serial.c + + + + + Drivers + + + drv_gpio.c + 1 + ..\libraries\HAL_Drivers\drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\HAL_Drivers\drivers\drv_usart.c + + + drv_common.c + 1 + ..\libraries\HAL_Drivers\drv_common.c + + + startup_stm32g491xx.s + 2 + ..\libraries\STM32G4xx_HAL\CMSIS\Device\ST\STM32G4xx\Source\Templates\arm\startup_stm32g491xx.s + + + stm32g4xx_hal_msp.c + 1 + board\CubeMX_Config\Core\Src\stm32g4xx_hal_msp.c + + + board.c + 1 + board\board.c + + + + + Finsh + + + shell.c + 1 + ..\..\..\components\finsh\shell.c + + + msh.c + 1 + ..\..\..\components\finsh\msh.c + + + msh_parse.c + 1 + ..\..\..\components\finsh\msh_parse.c + + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + components.c + 1 + ..\..\..\src\components.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_up.c + 1 + ..\..\..\src\scheduler_up.c + + + thread.c + 1 + ..\..\..\src\thread.c + + + timer.c + 1 + ..\..\..\src\timer.c + + + + + Libraries + + + stm32g4xx_hal_pwr.c + 1 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_pwr.c + + + stm32g4xx_hal_dma_ex.c + 1 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_dma_ex.c + + + stm32g4xx_hal_gpio.c + 1 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_gpio.c + + + stm32g4xx_hal_rcc_ex.c + 1 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_rcc_ex.c + + + stm32g4xx_hal_usart.c + 1 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_usart.c + + + stm32g4xx_hal_pwr_ex.c + 1 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_pwr_ex.c + + + stm32g4xx_hal_cryp.c + 1 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_cryp.c + + + stm32g4xx_hal_usart_ex.c + 1 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_usart_ex.c + + + system_stm32g4xx.c + 1 + ..\libraries\STM32G4xx_HAL\CMSIS\Device\ST\STM32G4xx\Source\Templates\system_stm32g4xx.c + + + stm32g4xx_hal_cortex.c + 1 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_cortex.c + + + stm32g4xx_hal.c + 1 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal.c + + + stm32g4xx_hal_rcc.c + 1 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_rcc.c + + + stm32g4xx_hal_dma.c + 1 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_dma.c + + + stm32g4xx_hal_uart.c + 1 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_uart.c + + + stm32g4xx_hal_uart_ex.c + 1 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_uart_ex.c + + + stm32g4xx_hal_rng.c + 1 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_rng.c + + + stm32g4xx_hal_crc.c + 1 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_crc.c + + + stm32g4xx_hal_cryp_ex.c + 1 + ..\libraries\STM32G4xx_HAL\STM32G4xx_HAL_Driver\Src\stm32g4xx_hal_cryp_ex.c + + + + + + + + + + + + + +
diff --git a/bsp/stm32/stm32g491-st-nucleo/rtconfig.h b/bsp/stm32/stm32g491-st-nucleo/rtconfig.h new file mode 100644 index 0000000000..f5bc8313f1 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/rtconfig.h @@ -0,0 +1,263 @@ +#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_CPUS_NR 1 +#define RT_ALIGN_SIZE 8 +#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_HOOK_USING_FUNC_PTR +#define RT_USING_IDLE_HOOK +#define RT_IDLE_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 + +/* kservice optimization */ + +#define RT_USING_DEBUG +#define RT_DEBUGING_COLOR +#define RT_DEBUGING_CONTEXT + +/* 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_SMALL_MEM_AS_HEAP +#define RT_USING_HEAP +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "lpuart1" +#define RT_VER_NUM 0x50100 +#define RT_BACKTRACE_LEVEL_MAX_NR 32 +#define RT_USING_HW_ATOMIC +#define RT_USING_CPU_FFS +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M4 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_PRIORITY 10 +#define RT_USING_MSH +#define RT_USING_FINSH +#define FINSH_USING_MSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 4096 +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_CMD_SIZE 80 +#define MSH_USING_BUILT_IN_COMMANDS +#define FINSH_USING_DESCRIPTION +#define FINSH_ARG_MAX 10 +#define FINSH_USING_OPTION_COMPLETION + +/* DFS: device virtual file system */ + + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_UNAMED_PIPE_NUMBER 64 +#define RT_USING_SERIAL +#define RT_USING_SERIAL_V1 +#define RT_SERIAL_USING_DMA +#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_PIN + +/* Using USB */ + + +/* C/C++ and POSIX layer */ + +/* ISO-ANSI C layer */ + +/* Timezone and Daylight Saving Time */ + +#define RT_LIBC_USING_LIGHT_TZ_DST +#define RT_LIBC_TZ_DEFAULT_HOUR 8 +#define RT_LIBC_TZ_DEFAULT_MIN 0 +#define RT_LIBC_TZ_DEFAULT_SEC 0 + +/* POSIX (Portable Operating System Interface) layer */ + + +/* Interprocess Communication (IPC) */ + + +/* Socket is in the 'Network' category */ + + +/* Network */ + + +/* Memory protection */ + + +/* Utilities */ + + +/* RT-Thread Utestcases */ + + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + + +/* Wiced WiFi */ + + +/* CYW43012 WiFi */ + + +/* BL808 WiFi */ + + +/* CYW43439 WiFi */ + + +/* IoT Cloud */ + + +/* security packages */ + + +/* language packages */ + +/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ + + +/* XML: Extensible Markup Language */ + + +/* multimedia packages */ + +/* LVGL: powerful and easy-to-use embedded GUI library */ + + +/* u8g2: a monochrome graphic library */ + + +/* tools packages */ + + +/* system packages */ + +/* enhanced kernel services */ + + +/* acceleration: Assembly language or algorithmic acceleration packages */ + + +/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ + + +/* Micrium: Micrium software products porting for RT-Thread */ + + +/* peripheral libraries and drivers */ + +/* sensors drivers */ + + +/* touch drivers */ + + +/* Kendryte SDK */ + + +/* AI packages */ + + +/* Signal Processing and Control Algorithm Packages */ + + +/* miscellaneous packages */ + +/* project laboratory */ + +/* samples: kernel and components samples */ + + +/* entertainment: terminal games and other interesting software packages */ + + +/* Arduino libraries */ + + +/* Projects and Demos */ + + +/* Sensors */ + + +/* Display */ + + +/* Timing */ + + +/* Data Processing */ + + +/* Data Storage */ + +/* Communication */ + + +/* Device Control */ + + +/* Other */ + + +/* Signal IO */ + + +/* Uncategorized */ + +#define SOC_FAMILY_STM32 +#define SOC_SERIES_STM32G4 + +/* Hardware Drivers Config */ + +#define SOC_STM32G491RE + +/* Onboard Peripheral Drivers */ + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_LPUART1 + +/* Board extended module Drivers */ + + +#endif diff --git a/bsp/stm32/stm32g491-st-nucleo/rtconfig.py b/bsp/stm32/stm32g491-st-nucleo/rtconfig.py new file mode 100644 index 0000000000..5e5bc02064 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/rtconfig.py @@ -0,0 +1,184 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m4' +CROSS_TOOL='gcc' + +# bsp lib config +BSP_LIBRARY_TYPE = None + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') + +# cross_tool provides the cross compiler +# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = r'C:\Users\XXYYZZ' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armcc' + EXEC_PATH = r'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iccarm' + EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.3' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' + +if PLATFORM == 'gcc': + # toolchains + PREFIX = 'arm-none-eabi-' + CC = PREFIX + 'gcc' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + CXX = PREFIX + 'g++' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + DEVICE = ' -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rt-thread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + CXX = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M4.fp ' + CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --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 == 'armclang': + # toolchains + CC = 'armclang' + CXX = 'armclang' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M4.fp ' + CFLAGS = ' --target=arm-arm-none-eabi -mcpu=cortex-m4 ' + CFLAGS += ' -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 ' + CFLAGS += ' -mfloat-abi=hard -c -fno-rtti -funsigned-char -fshort-enums -fshort-wchar ' + CFLAGS += ' -gdwarf-3 -ffunction-sections ' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --info sizes --info totals --info unused --info veneers ' + LFLAGS += ' --list rt-thread.map ' + LFLAGS += r' --strict --scatter "board\linker_scripts\link.sct" ' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCLANG/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCLANG/lib' + + EXEC_PATH += '/ARM/ARMCLANG/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O1' # armclang recommend + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iccarm': + # toolchains + CC = 'iccarm' + CXX = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M4' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu Cortex-M4' + AFLAGS += ' --fpu VFPv4_sp' + AFLAGS += ' -S' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + + CXXFLAGS = CFLAGS + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' + +def dist_handle(BSP_ROOT, dist_dir): + import sys + cwd_path = os.getcwd() + sys.path.append(os.path.join(os.path.dirname(BSP_ROOT), 'tools')) + from sdk_dist import dist_do_building + dist_do_building(BSP_ROOT, dist_dir) diff --git a/bsp/stm32/stm32g491-st-nucleo/template.ewp b/bsp/stm32/stm32g491-st-nucleo/template.ewp new file mode 100644 index 0000000000..89bd58d88e --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/template.ewp @@ -0,0 +1,2088 @@ + + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 33 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 37 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 11 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 176 + inputOutputBased + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 25 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + + Release + + ARM + + 0 + + General + 3 + + 33 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 37 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 11 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + inputOutputBased + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 25 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + diff --git a/bsp/stm32/stm32g491-st-nucleo/template.eww b/bsp/stm32/stm32g491-st-nucleo/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/stm32/stm32g491-st-nucleo/template.uvoptx b/bsp/stm32/stm32g491-st-nucleo/template.uvoptx new file mode 100644 index 0000000000..2230e4b77a --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/template.uvoptx @@ -0,0 +1,192 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc; *.md + *.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 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC8000 -FD20000000 -FF0STM32G49x-Ax_512 -FL080000 -FS08000000 -FP0($$Device:STM32G491RETx$CMSIS\Flash\STM32G49x-Ax_512.FLM) + + + 0 + ST-LINKIII-KEIL_SWO + -U0039004E3431511337393330 -O206 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(2BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8000 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC8000 -FN1 -FF0STM32G49x-Ax_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32G491RETx$CMSIS\Flash\STM32G49x-Ax_512.FLM) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 0 + 0 + 2 + 10000000 + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
diff --git a/bsp/stm32/stm32g491-st-nucleo/template.uvprojx b/bsp/stm32/stm32g491-st-nucleo/template.uvprojx new file mode 100644 index 0000000000..7fa809c87b --- /dev/null +++ b/bsp/stm32/stm32g491-st-nucleo/template.uvprojx @@ -0,0 +1,396 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32G491RETx + STMicroelectronics + Keil.STM32G4xx_DFP.1.5.0 + https://www.keil.com/pack/ + IRAM(0x20000000,0x0001C000) IROM(0x08000000,0x00080000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC8000 -FN1 -FF0STM32G49x-Ax_512 -FS08000000 -FL080000 -FP0($$Device:STM32G491RETx$CMSIS\Flash\STM32G49x-Ax_512.FLM)) + 0 + $$Device:STM32G491RETx$Drivers\CMSIS\Device\ST\STM32G4xx\Include\stm32g4xx.h + + + + + + + + + + $$Device:STM32G491RETx$CMSIS\SVD\STM32G491xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 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 + 0x1c000 + + + 1 + 0x8000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x1c000 + + + 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 + 4 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Source Group 1 + + + + + + + + + + + +