From d869b605c61048ec177fe388d20241f1576d3104 Mon Sep 17 00:00:00 2001 From: NU-LL <1125934312@qq.com> Date: Wed, 1 Jul 2020 20:29:43 +0800 Subject: [PATCH 1/3] add stm32g070-st-nucleo bsp --- bsp/stm32/libraries/HAL_Drivers/SConscript | 7 +- .../HAL_Drivers/drv_flash/drv_flash_g0.c | 230 ++ bsp/stm32/libraries/STM32G0xx_HAL/SConscript | 9 +- bsp/stm32/stm32g070-st-nucleo/.config | 453 ++++ bsp/stm32/stm32g070-st-nucleo/.gitignore | 7 + bsp/stm32/stm32g070-st-nucleo/Kconfig | 21 + bsp/stm32/stm32g070-st-nucleo/README.md | 116 + bsp/stm32/stm32g070-st-nucleo/SConscript | 15 + bsp/stm32/stm32g070-st-nucleo/SConstruct | 60 + .../applications/SConscript | 11 + .../stm32g070-st-nucleo/applications/main.c | 33 + .../board/CubeMX_Config/.mxproject | 12 + .../board/CubeMX_Config/Inc/main.h | 82 + .../CubeMX_Config/Inc/stm32g0xx_hal_conf.h | 310 +++ .../board/CubeMX_Config/Inc/stm32g0xx_it.h | 65 + .../board/CubeMX_Config/Src/main.c | 797 ++++++ .../CubeMX_Config/Src/stm32g0xx_hal_msp.c | 598 +++++ .../board/CubeMX_Config/Src/stm32g0xx_it.c | 145 + .../board/CubeMX_Config/stm32g070rbt6.ioc | 247 ++ bsp/stm32/stm32g070-st-nucleo/board/Kconfig | 198 ++ .../stm32g070-st-nucleo/board/SConscript | 30 + bsp/stm32/stm32g070-st-nucleo/board/board.c | 62 + bsp/stm32/stm32g070-st-nucleo/board/board.h | 50 + .../board/linker_scripts/link.icf | 28 + .../board/linker_scripts/link.lds | 156 ++ .../board/linker_scripts/link.sct | 16 + .../stm32g070-st-nucleo/board/ports/fal_cfg.h | 34 + .../stm32g070-st-nucleo/figures/board.jpg | Bin 0 -> 66304 bytes bsp/stm32/stm32g070-st-nucleo/project.ewp | 2326 +++++++++++++++++ bsp/stm32/stm32g070-st-nucleo/project.eww | 10 + bsp/stm32/stm32g070-st-nucleo/project.uvprojx | 762 ++++++ bsp/stm32/stm32g070-st-nucleo/rtconfig.h | 169 ++ bsp/stm32/stm32g070-st-nucleo/rtconfig.py | 150 ++ bsp/stm32/stm32g070-st-nucleo/template.ewp | 2074 +++++++++++++++ bsp/stm32/stm32g070-st-nucleo/template.eww | 10 + .../stm32g070-st-nucleo/template.uvprojx | 390 +++ 36 files changed, 9679 insertions(+), 4 deletions(-) create mode 100644 bsp/stm32/libraries/HAL_Drivers/drv_flash/drv_flash_g0.c create mode 100644 bsp/stm32/stm32g070-st-nucleo/.config create mode 100644 bsp/stm32/stm32g070-st-nucleo/.gitignore create mode 100644 bsp/stm32/stm32g070-st-nucleo/Kconfig create mode 100644 bsp/stm32/stm32g070-st-nucleo/README.md create mode 100644 bsp/stm32/stm32g070-st-nucleo/SConscript create mode 100644 bsp/stm32/stm32g070-st-nucleo/SConstruct create mode 100644 bsp/stm32/stm32g070-st-nucleo/applications/SConscript create mode 100644 bsp/stm32/stm32g070-st-nucleo/applications/main.c create mode 100644 bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/.mxproject create mode 100644 bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Inc/main.h create mode 100644 bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Inc/stm32g0xx_hal_conf.h create mode 100644 bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Inc/stm32g0xx_it.h create mode 100644 bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Src/main.c create mode 100644 bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Src/stm32g0xx_hal_msp.c create mode 100644 bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Src/stm32g0xx_it.c create mode 100644 bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/stm32g070rbt6.ioc create mode 100644 bsp/stm32/stm32g070-st-nucleo/board/Kconfig create mode 100644 bsp/stm32/stm32g070-st-nucleo/board/SConscript create mode 100644 bsp/stm32/stm32g070-st-nucleo/board/board.c create mode 100644 bsp/stm32/stm32g070-st-nucleo/board/board.h create mode 100644 bsp/stm32/stm32g070-st-nucleo/board/linker_scripts/link.icf create mode 100644 bsp/stm32/stm32g070-st-nucleo/board/linker_scripts/link.lds create mode 100644 bsp/stm32/stm32g070-st-nucleo/board/linker_scripts/link.sct create mode 100644 bsp/stm32/stm32g070-st-nucleo/board/ports/fal_cfg.h create mode 100644 bsp/stm32/stm32g070-st-nucleo/figures/board.jpg create mode 100644 bsp/stm32/stm32g070-st-nucleo/project.ewp create mode 100644 bsp/stm32/stm32g070-st-nucleo/project.eww create mode 100644 bsp/stm32/stm32g070-st-nucleo/project.uvprojx create mode 100644 bsp/stm32/stm32g070-st-nucleo/rtconfig.h create mode 100644 bsp/stm32/stm32g070-st-nucleo/rtconfig.py create mode 100644 bsp/stm32/stm32g070-st-nucleo/template.ewp create mode 100644 bsp/stm32/stm32g070-st-nucleo/template.eww create mode 100644 bsp/stm32/stm32g070-st-nucleo/template.uvprojx diff --git a/bsp/stm32/libraries/HAL_Drivers/SConscript b/bsp/stm32/libraries/HAL_Drivers/SConscript index fddbc1fa93..2aaaf1d918 100644 --- a/bsp/stm32/libraries/HAL_Drivers/SConscript +++ b/bsp/stm32/libraries/HAL_Drivers/SConscript @@ -10,7 +10,7 @@ src = Split(""" if GetDepend(['RT_USING_PIN']): src += ['drv_gpio.c'] - + if GetDepend(['RT_USING_SERIAL']): src += ['drv_usart.c'] @@ -35,7 +35,7 @@ if GetDepend(['BSP_USING_ETH', 'RT_USING_LWIP']): if GetDepend(['RT_USING_ADC']): src += Glob('drv_adc.c') - + if GetDepend(['RT_USING_DAC']): src += Glob('drv_dac.c') @@ -58,6 +58,9 @@ if GetDepend('BSP_USING_LCD_MIPI'): if GetDepend('BSP_USING_ONCHIP_RTC'): src += ['drv_rtc.c'] +if GetDepend(['BSP_USING_ON_CHIP_FLASH', 'SOC_SERIES_STM32G0']): + src += ['drv_flash/drv_flash_g0.c'] + if GetDepend(['BSP_USING_ON_CHIP_FLASH', 'SOC_SERIES_STM32F0']): src += ['drv_flash/drv_flash_f0.c'] diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_flash/drv_flash_g0.c b/bsp/stm32/libraries/HAL_Drivers/drv_flash/drv_flash_g0.c new file mode 100644 index 0000000000..c5eefb9497 --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/drv_flash/drv_flash_g0.c @@ -0,0 +1,230 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-06-27 NU-LL first version + */ + +#include "board.h" + +#ifdef BSP_USING_ON_CHIP_FLASH +#include "drv_config.h" +#include "drv_flash.h" + +#if defined(PKG_USING_FAL) +#include "fal.h" +#endif + +// #define DRV_DEBUG +#define LOG_TAG "drv.flash" +#include + +/** + * @brief Gets the page of a given address + * @param Addr: Address of the FLASH Memory + * @retval The page of a given address + */ +static uint32_t GetPage(uint32_t addr) +{ + uint32_t page = 0; + page = RT_ALIGN_DOWN(addr-STM32_FLASH_START_ADRESS, FLASH_PAGE_SIZE)/FLASH_PAGE_SIZE; + return page; +} + +/** + * Read data from flash. + * @note This operation's units is word. + * + * @param addr flash address + * @param buf buffer to store read data + * @param size read bytes size + * + * @return result + */ +int stm32_flash_read(rt_uint32_t addr, rt_uint8_t *buf, size_t size) +{ + size_t i; + + if ((addr + size) > STM32_FLASH_END_ADDRESS) + { + LOG_E("read outrange flash size! addr is (0x%p)", (void *)(addr + size)); + return -RT_EINVAL; + } + + for (i = 0; i < size; i++, buf++, addr++) + { + *buf = *(rt_uint8_t *) addr; + } + + return size; +} + +/** + * Write data to flash. + * @note This operation's units is word. + * @note This operation must after erase. @see flash_erase. + * + * @param addr flash address + * @param buf the write data buffer + * @param size write bytes size + * + * @return result + */ +int stm32_flash_write(rt_uint32_t addr, const uint8_t *buf, size_t size) +{ + size_t i, j; + rt_err_t result = 0; + rt_uint64_t write_data = 0, temp_data = 0; + + if ((addr + size) > STM32_FLASH_END_ADDRESS) + { + LOG_E("ERROR: write outrange flash size! addr is (0x%p)\n", (void*)(addr + size)); + return -RT_EINVAL; + } + + if(addr % 8 != 0) + { + LOG_E("write addr must be 8-byte alignment"); + return -RT_EINVAL; + } + + HAL_FLASH_Unlock(); + + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR); + + if (size < 1) + { + return -RT_ERROR; + } + + for (i = 0; i < size;) + { + if ((size - i) < 8) + { + for (j = 0; (size - i) > 0; i++, j++) + { + temp_data = *buf; + write_data = (write_data) | (temp_data << 8 * j); + buf ++; + } + } + else + { + for (j = 0; j < 8; j++, i++) + { + temp_data = *buf; + write_data = (write_data) | (temp_data << 8 * j); + buf ++; + } + } + + /* write data */ + if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, addr, write_data) == HAL_OK) + { + /* Check the written value */ + if (*(uint64_t*)addr != write_data) + { + LOG_E("ERROR: write data != read data\n"); + result = -RT_ERROR; + goto __exit; + } + } + else + { + result = -RT_ERROR; + goto __exit; + } + + temp_data = 0; + write_data = 0; + + addr += 8; + } + +__exit: + HAL_FLASH_Lock(); + if (result != 0) + { + return result; + } + + return size; +} + +/** + * Erase data on flash. + * @note This operation is irreversible. + * @note This operation's units is different which on many chips. + * + * @param addr flash address + * @param size erase bytes size + * + * @return result + */ +int stm32_flash_erase(rt_uint32_t addr, size_t size) +{ + rt_err_t result = RT_EOK; + uint32_t PAGEError = 0; + + /*Variable used for Erase procedure*/ + FLASH_EraseInitTypeDef EraseInitStruct; + + if ((addr + size) > STM32_FLASH_END_ADDRESS) + { + LOG_E("ERROR: erase outrange flash size! addr is (0x%p)\n", (void *)(addr + size)); + return -RT_EINVAL; + } + + HAL_FLASH_Unlock(); + + /* Fill EraseInit structure*/ + EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; + EraseInitStruct.Page = GetPage(addr); + EraseInitStruct.NbPages = (size + FLASH_PAGE_SIZE - 1) / FLASH_PAGE_SIZE; + + if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK) + { + result = -RT_ERROR; + goto __exit; + } + +__exit: + HAL_FLASH_Lock(); + + if (result != RT_EOK) + { + return result; + } + + LOG_D("erase done: addr (0x%p), size %d", (void *)addr, size); + return size; +} + +#if defined(PKG_USING_FAL) + +static int fal_flash_read(long offset, rt_uint8_t *buf, size_t size); +static int fal_flash_write(long offset, const rt_uint8_t *buf, size_t size); +static int fal_flash_erase(long offset, size_t size); + +const struct fal_flash_dev stm32_onchip_flash = { "onchip_flash", STM32_FLASH_START_ADRESS, STM32_FLASH_SIZE, FLASH_PAGE_SIZE, {NULL, fal_flash_read, fal_flash_write, fal_flash_erase} }; + +static int fal_flash_read(long offset, rt_uint8_t *buf, size_t size) +{ + return stm32_flash_read(stm32_onchip_flash.addr + offset, buf, size); +} + +static int fal_flash_write(long offset, const rt_uint8_t *buf, size_t size) +{ + return stm32_flash_write(stm32_onchip_flash.addr + offset, buf, size); +} + +static int fal_flash_erase(long offset, size_t size) +{ + return stm32_flash_erase(stm32_onchip_flash.addr + offset, size); +} + +#endif +#endif /* BSP_USING_ON_CHIP_FLASH */ diff --git a/bsp/stm32/libraries/STM32G0xx_HAL/SConscript b/bsp/stm32/libraries/STM32G0xx_HAL/SConscript index 934239833d..3d712c5d0b 100644 --- a/bsp/stm32/libraries/STM32G0xx_HAL/SConscript +++ b/bsp/stm32/libraries/STM32G0xx_HAL/SConscript @@ -33,7 +33,7 @@ if GetDepend(['RT_USING_I2C']): if GetDepend(['RT_USING_SPI']): src += ['STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi.c'] - src += ['STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi_ex.c'] + src += ['STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi_ex.c'] src += ['STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_spi.c'] if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']): @@ -50,7 +50,12 @@ if GetDepend(['RT_USING_WDT']): src += ['STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_iwdg.c'] src += ['STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_wwdg.c'] -path = [cwd + '/STM32G0xx_HAL_Driver/Inc', +if GetDepend(['RT_USING_RTC']): + src += ['STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rtc.c'] + src += ['STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rtc_ex.c'] + src += ['STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rtc.c'] + +path = [cwd + '/STM32G0xx_HAL_Driver/Inc', cwd + '/CMSIS/Device/ST/STM32G0xx/Include', cwd + '/CMSIS/Include'] diff --git a/bsp/stm32/stm32g070-st-nucleo/.config b/bsp/stm32/stm32g070-st-nucleo/.config new file mode 100644 index 0000000000..8c3da02cd2 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/.config @@ -0,0 +1,453 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=4 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=100 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=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 +CONFIG_RT_DEBUG=y +CONFIG_RT_DEBUG_COLOR=y +# CONFIG_RT_DEBUG_INIT_CONFIG is not set +# CONFIG_RT_DEBUG_THREAD_CONFIG is not set +# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set +# CONFIG_RT_DEBUG_IPC_CONFIG is not set +# CONFIG_RT_DEBUG_TIMER_CONFIG is not set +# CONFIG_RT_DEBUG_IRQ_CONFIG is not set +# CONFIG_RT_DEBUG_MEM_CONFIG is not set +# CONFIG_RT_DEBUG_SLAB_CONFIG is not set +# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set +# CONFIG_RT_DEBUG_MODULE_CONFIG is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +# CONFIG_RT_USING_MEMHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMTRACE is not set +CONFIG_RT_USING_HEAP=y + +# +# Kernel Device Object +# +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart2" +CONFIG_RT_VER_NUM=0x40003 +CONFIG_ARCH_ARM=y +# CONFIG_RT_USING_CPU_FFS is not set +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M0=y +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 + +# +# C++ features +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Command shell +# +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_CMD_SIZE=80 +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_USING_MSH_DEFAULT=y +# CONFIG_FINSH_USING_MSH_ONLY is not set +CONFIG_FINSH_ARG_MAX=10 + +# +# Device virtual file system +# +# CONFIG_RT_USING_DFS is not set + +# +# Device Drivers +# +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_PIPE_BUFSZ=512 +# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set +CONFIG_RT_USING_SERIAL=y +# CONFIG_RT_SERIAL_USING_DMA is not set +CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_DAC 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_HWCRYPTO is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_WIFI is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# POSIX layer and C standard library +# +# CONFIG_RT_USING_LIBC is not set +# CONFIG_RT_USING_PTHREADS is not set +CONFIG_RT_LIBC_USING_TIME=y + +# +# Network +# + +# +# Socket abstraction layer +# +# CONFIG_RT_USING_SAL is not set + +# +# Network interface device +# +# CONFIG_RT_USING_NETDEV is not set + +# +# light weight TCP/IP stack +# +# CONFIG_RT_USING_LWIP is not set + +# +# AT commands +# +# CONFIG_RT_USING_AT is not set + +# +# VBUS(Virtual Software BUS) +# +# CONFIG_RT_USING_VBUS is not set + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set +# CONFIG_RT_USING_LWP is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_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_CJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_LIBMODBUS is not set +# CONFIG_PKG_USING_FREEMODBUS is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_EZXML is not set +# CONFIG_PKG_USING_NANOPB is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_RW007 is not set +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_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 + +# +# 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_NIMBLE is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set +# 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_ONNX_PARSER is not set +# CONFIG_PKG_USING_ONNX_BACKEND 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_RT_CJSON_TOOLS is not set +# CONFIG_PKG_USING_AGILE_TELNET is not set + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_libsodium is not set +# CONFIG_PKG_USING_TINYCRYPT is not set +# CONFIG_PKG_USING_TFM is not set +# CONFIG_PKG_USING_YD_CRYPTO is not set + +# +# language packages +# +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set + +# +# multimedia packages +# +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set +# CONFIG_PKG_USING_WAVPLAYER is not set +# CONFIG_PKG_USING_TJPGD is not set + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_ADBD is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_DHRYSTONE 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_URLENCODE is not set + +# +# system packages +# +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_FAL is not set +# CONFIG_PKG_USING_FLASHDB is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_CMSIS is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_THREAD_POOL is not set +# 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 + +# +# peripheral libraries and drivers +# +# CONFIG_PKG_USING_SENSORS_DRIVERS is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_U8G2 is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_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 +# CONFIG_PKG_USING_WM_LIBRARIES is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_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_AD7746 is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_TOUCH_DRIVERS is not set +# CONFIG_PKG_USING_MAX17048 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_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 + +# +# miscellaneous packages +# +# CONFIG_PKG_USING_LIBCSV is not set +# CONFIG_PKG_USING_OPTPARSE is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set +# CONFIG_PKG_USING_UPACKER is not set +# CONFIG_PKG_USING_UPARAM is not set + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ARMv7M_DWT is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_UKAL is not set +CONFIG_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32G0=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_STM32G070RB=y + +# +# Onboard Peripheral Drivers +# +CONFIG_BSP_USING_USB_TO_UART=y + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +# CONFIG_BSP_USING_UART1 is not set +CONFIG_BSP_USING_UART2=y +# CONFIG_BSP_USING_UART3 is not set +# CONFIG_BSP_USING_TIM is not set +# CONFIG_BSP_USING_PWM is not set +# CONFIG_BSP_USING_SPI is not set +# CONFIG_BSP_USING_I2C1 is not set +# CONFIG_BSP_USING_ADC is not set +# CONFIG_BSP_USING_ON_CHIP_FLASH is not set +# CONFIG_BSP_USING_ONCHIP_RTC is not set +# CONFIG_BSP_USING_WDT is not set +# CONFIG_BSP_USING_UDID is not set + +# +# Board extended module Drivers +# diff --git a/bsp/stm32/stm32g070-st-nucleo/.gitignore b/bsp/stm32/stm32g070-st-nucleo/.gitignore new file mode 100644 index 0000000000..d45e936a4a --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/.gitignore @@ -0,0 +1,7 @@ +settings +build + +*.uvguix.* +*.uvoptx +settings/* +build/* diff --git a/bsp/stm32/stm32g070-st-nucleo/Kconfig b/bsp/stm32/stm32g070-st-nucleo/Kconfig new file mode 100644 index 0000000000..79b160b856 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/Kconfig @@ -0,0 +1,21 @@ +mainmenu "RT-Thread Configuration" + +config BSP_DIR + string + option env="BSP_ROOT" + default "." + +config RTT_DIR + string + option env="RTT_ROOT" + default "../../.." + +config PKGS_DIR + string + option env="PKGS_ROOT" + default "packages" + +source "$RTT_DIR/Kconfig" +source "$PKGS_DIR/Kconfig" +source "../libraries/Kconfig" +source "board/Kconfig" diff --git a/bsp/stm32/stm32g070-st-nucleo/README.md b/bsp/stm32/stm32g070-st-nucleo/README.md new file mode 100644 index 0000000000..b221d5e6d2 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/README.md @@ -0,0 +1,116 @@ +# STM32G071 BSP + +## 简介 + +本文档为 STM32G070RB-Nucleo 开发板的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。 + +## 开发板介绍 + +STM32G070RB-Nucleo 开发板是 ST 官方推出的一款基于 ARM Cortex-M0+ 内核的开发板,最高主频为 64Mhz,该开发板具有丰富的扩展接口,可以方便验证 STM32G070RB 的芯片性能。 + +开发板外观如下图所示: + +![board](figures/board.jpg) + +该开发板常用 **板载资源** 如下: + +- MCU:STM32G070RB,主频 64MHz,128KB FLASH ,36KB RAM +- 外部 RAM:无 +- 外部 FLASH:无 +- 常用外设 + - 按键:1个,user(兼具唤醒功能,PC13) +- 常用接口:USB 转串口、arduino 接口等 +- 调试接口,标准 SWD + +开发板更多详细信息请参考 ST 的 [NUCLEO 开发板介绍](https://www.st.com/content/st_com/en/products/evaluation-tools/product-evaluation-tools/mcu-eval-tools/stm32-mcu-eval-tools/stm32-mcu-nucleo/nucleo-g070rb.html)。 + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :----------------- | :----------: | :------------------------------------- | +| ST-LINK 虚拟串口 | 支持 | 使用 USART2 | +| **片上外设** | **支持情况** | **备注** | +| GPIO | 支持 | PA0, PA1... PC15 ---> PIN: 0, 1...47 | +| UART | 支持 | USART1/2/3 | +| TIM | 支持 | TIM1/3 | +| PWM | 支持 | | +| SPI | 支持 | SPI1/2 | +| I2C | 支持 | 软件 I2C | +| ADC | 支持 | | +| WDT | 支持 | | +| FLASH | 支持 | 已适配 [FAL](https://github.com/RT-Thread-packages/fal) | +| RTC | 暂不支持 | 详见注意事项 | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + +### 快速上手 + +本 BSP 为开发者提供 MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线连接开发板到 PC,打开电源开关。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 将工程使用的仿真器设置为ST-Link并安装仿真器好驱动程序以后,将开发板连接到PC,点击下载按钮即可下载程序到开发板。 + +#### 运行结果 + +下载程序成功之后,系统会自动运行。 + +连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + +```bash + \ | / +- RT - Thread Operating System + / | \ 4.0.2 build Jul 1 2020 + 2006 - 2019 Copyright by rt-thread team +msh > +``` + +### 进阶使用 + +此 BSP 默认只开启了 GPIO 和 UART 的功能,如果需使用 SPI,I2C 等更多高级功能,需要利用 ENV 工具对BSP 进行配置,步骤如下: + +1. 在 bsp 下打开 env 工具。 + +2. 输入`menuconfig`命令配置工程,配置好之后保存退出。 + +3. 输入`pkgs --update`命令更新软件包。 + +4. 输入`scons --target=mdk5/iar` 命令重新生成工程。 + +本章节更多详细的介绍请参考 [STM32 系列 BSP 外设驱动使用教程](../docs/STM32系列BSP外设驱动使用教程.md)。 + +## 注意事项 + +- G0系列RTC驱动有点问题,详见论坛 [该贴](https://www.rt-thread.org/qa/thread-424601-1-2.html) + +## 联系人信息 + +维护人: + +- [NU-LL](https://github.com/NU-LL) diff --git a/bsp/stm32/stm32g070-st-nucleo/SConscript b/bsp/stm32/stm32g070-st-nucleo/SConscript new file mode 100644 index 0000000000..20f7689c53 --- /dev/null +++ b/bsp/stm32/stm32g070-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/stm32g070-st-nucleo/SConstruct b/bsp/stm32/stm32g070-st-nucleo/SConstruct new file mode 100644 index 0000000000..96fd191077 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/SConstruct @@ -0,0 +1,60 @@ +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, CCFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM == 'iar': + env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = env["LINKCOM"] + ' --map rt-thread.map') + +Export('RTT_ROOT') +Export('rtconfig') + +SDK_ROOT = os.path.abspath('./') + +if os.path.exists(SDK_ROOT + '/libraries'): + libraries_path_prefix = SDK_ROOT + '/libraries' +else: + libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries' + +SDK_LIB = libraries_path_prefix +Export('SDK_LIB') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +stm32_library = 'STM32G0xx_HAL' +rtconfig.BSP_LIBRARY_TYPE = stm32_library + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, stm32_library, 'SConscript'))) + +# include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'HAL_Drivers', 'SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/stm32/stm32g070-st-nucleo/applications/SConscript b/bsp/stm32/stm32g070-st-nucleo/applications/SConscript new file mode 100644 index 0000000000..01eb940dfb --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/applications/SConscript @@ -0,0 +1,11 @@ +Import('RTT_ROOT') +Import('rtconfig') +from building import * + +cwd = os.path.join(str(Dir('#')), 'applications') +src = Glob('*.c') +CPPPATH = [cwd, str(Dir('#'))] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/stm32/stm32g070-st-nucleo/applications/main.c b/bsp/stm32/stm32g070-st-nucleo/applications/main.c new file mode 100644 index 0000000000..8541bd3b9f --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/applications/main.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift change to new framework + */ + +#include +#include +#include + +/* defined the LED pin: PA5 */ +#define LED0_PIN GET_PIN(A, 5) + +int main(void) +{ + int count = 1; + /* set LED0 pin mode to output */ + rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); + + while (count++) + { + rt_pin_write(LED0_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED0_PIN, PIN_LOW); + rt_thread_mdelay(500); + } + + return RT_EOK; +} diff --git a/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/.mxproject new file mode 100644 index 0000000000..03293ddd2a --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/.mxproject @@ -0,0 +1,12 @@ +[PreviousGenFiles] +HeaderPath=G:/1 Code/STM32/stm32g070-st-nucleo-doorcontroler/board/CubeMX_Config/Inc +HeaderFiles=stm32g0xx_it.h;stm32g0xx_hal_conf.h;main.h; +SourcePath=G:/1 Code/STM32/stm32g070-st-nucleo-doorcontroler/board/CubeMX_Config/Src +SourceFiles=stm32g0xx_it.c;stm32g0xx_hal_msp.c;main.c; + +[PreviousLibFiles] +LibFiles=Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_gpio.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_gpio_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_adc.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_adc_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_adc.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_rcc.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_rcc_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_rcc.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_flash.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_flash_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_flash_ramfunc.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_dma.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_dma_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_pwr.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_pwr_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_cortex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_def.h;Drivers/STM32G0xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_exti.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_iwdg.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_rtc.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_rtc_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_spi.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_spi_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_tim.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_tim_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_system.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_uart.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_uart_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_wwdg.h;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_gpio.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_adc.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_adc_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_adc.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_ll_rcc.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_flash.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_flash_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dma.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dma_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_pwr_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_cortex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_exti.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_iwdg.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rtc.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rtc_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_spi_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_tim_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_uart_ex.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_wwdg.c;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_gpio.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_gpio_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_adc.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_adc_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_adc.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_rcc.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_rcc_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_rcc.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_flash.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_flash_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_flash_ramfunc.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_dma.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_dma_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_pwr.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_pwr_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_cortex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_def.h;Drivers/STM32G0xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_exti.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_iwdg.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_rtc.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_rtc_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_spi.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_spi_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_tim.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_tim_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_ll_system.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_uart.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_uart_ex.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_wwdg.h;Drivers/CMSIS/Device/ST/STM32G0xx/Include/stm32g070xx.h;Drivers/CMSIS/Device/ST/STM32G0xx/Include/stm32g0xx.h;Drivers/CMSIS/Device/ST/STM32G0xx/Include/system_stm32g0xx.h;Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/system_stm32g0xx.c; + +[] +SourceFiles=;; + diff --git a/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Inc/main.h new file mode 100644 index 0000000000..8e41b0243d --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Inc/main.h @@ -0,0 +1,82 @@ +/* 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) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32g0xx_hal.h" +#include "stm32g0xx_ll_system.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 */ + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ +#define MCO_Pin GPIO_PIN_0 +#define MCO_GPIO_Port GPIOF +#define LED_GREEN_Pin GPIO_PIN_5 +#define LED_GREEN_GPIO_Port GPIOA +#define TMS_Pin GPIO_PIN_13 +#define TMS_GPIO_Port GPIOA +#define TCK_Pin GPIO_PIN_14 +#define TCK_GPIO_Port GPIOA +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Inc/stm32g0xx_hal_conf.h b/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Inc/stm32g0xx_hal_conf.h new file mode 100644 index 0000000000..2b8cebd87e --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Inc/stm32g0xx_hal_conf.h @@ -0,0 +1,310 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_conf.h + * @author MCD Application Team + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2018 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef STM32G0xx_HAL_CONF_H +#define STM32G0xx_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_CEC_MODULE_ENABLED */ +/* #define HAL_COMP_MODULE_ENABLED */ +/* #define HAL_CRC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +/* #define HAL_DAC_MODULE_ENABLED */ +/* #define HAL_EXTI_MODULE_ENABLED */ +/* #define HAL_I2C_MODULE_ENABLED */ +/* #define HAL_I2S_MODULE_ENABLED */ +#define HAL_IWDG_MODULE_ENABLED +/* #define HAL_IRDA_MODULE_ENABLED */ +/* #define HAL_LPTIM_MODULE_ENABLED */ +/* #define HAL_RNG_MODULE_ENABLED */ +#define HAL_RTC_MODULE_ENABLED +/* #define HAL_SMARTCARD_MODULE_ENABLED */ +/* #define HAL_SMBUS_MODULE_ENABLED */ +#define HAL_SPI_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_CEC_REGISTER_CALLBACKS 0u +#define USE_HAL_COMP_REGISTER_CALLBACKS 0u +#define USE_HAL_CRYP_REGISTER_CALLBACKS 0u +#define USE_HAL_DAC_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_RNG_REGISTER_CALLBACKS 0u +#define USE_HAL_RTC_REGISTER_CALLBACKS 0u +#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0u +#define USE_HAL_SPI_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 8000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) +#define HSE_STARTUP_TIMEOUT 100U /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) +#define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) +#define LSI_VALUE 32000U /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz +The real value may vary depending on the variations +in voltage and temperature.*/ +/** + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) +#define LSE_VALUE 32768U /*!< Value of the External oscillator in Hz*/ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) +#define LSE_STARTUP_TIMEOUT 5000U /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S1 peripheral + * This value is used by the RCC HAL module to compute the I2S1 clock source + * frequency. + */ +#if !defined (EXTERNAL_I2S1_CLOCK_VALUE) +#define EXTERNAL_I2S1_CLOCK_VALUE 12288000U /*!< Value of the I2S1 External clock source in Hz*/ +#endif /* EXTERNAL_I2S1_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 3300U /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY 0U /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 1U +#define INSTRUCTION_CACHE_ENABLE 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 + +/* ################## CRYP peripheral configuration ########################## */ + +#define USE_HAL_CRYP_SUSPEND_RESUME 1U + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED +#include "stm32g0xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED +#include "stm32g0xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED +#include "stm32g0xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED +#include "stm32g0xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED +#include "stm32g0xx_hal_adc.h" +#include "stm32g0xx_hal_adc_ex.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED +#include "stm32g0xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED +#include "stm32g0xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED +#include "stm32g0xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED +#include "stm32g0xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED +#include "stm32g0xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED +#include "stm32g0xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED +#include "stm32g0xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED +#include "stm32g0xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED +#include "stm32g0xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED +#include "stm32g0xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED +#include "stm32g0xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED +#include "stm32g0xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED +#include "stm32g0xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED +#include "stm32g0xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED +#include "stm32g0xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED +#include "stm32g0xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED +#include "stm32g0xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED +#include "stm32g0xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED +#include "stm32g0xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED +#include "stm32g0xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED +#include "stm32g0xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED +#include "stm32g0xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for functions 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 /* STM32G0xx_HAL_CONF_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Inc/stm32g0xx_it.h b/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Inc/stm32g0xx_it.h new file mode 100644 index 0000000000..0149e0fd30 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Inc/stm32g0xx_it.h @@ -0,0 +1,65 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g0xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32G0xx_IT_H +#define __STM32G0xx_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 SVC_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32G0xx_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Src/main.c new file mode 100644 index 0000000000..42a94e2849 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Src/main.c @@ -0,0 +1,797 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* 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 ---------------------------------------------------------*/ +ADC_HandleTypeDef hadc1; + +IWDG_HandleTypeDef hiwdg; + +RTC_HandleTypeDef hrtc; + +SPI_HandleTypeDef hspi1; +SPI_HandleTypeDef hspi2; + +TIM_HandleTypeDef htim1; +TIM_HandleTypeDef htim3; + +UART_HandleTypeDef huart1; +UART_HandleTypeDef huart2; +UART_HandleTypeDef huart3; + +WWDG_HandleTypeDef hwwdg; + +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_USART2_UART_Init(void); +static void MX_ADC1_Init(void); +static void MX_IWDG_Init(void); +static void MX_SPI1_Init(void); +static void MX_SPI2_Init(void); +static void MX_TIM1_Init(void); +static void MX_TIM3_Init(void); +static void MX_USART1_UART_Init(void); +static void MX_USART3_UART_Init(void); +static void MX_RTC_Init(void); +static void MX_WWDG_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_USART2_UART_Init(); + MX_ADC1_Init(); + MX_IWDG_Init(); + MX_SPI1_Init(); + MX_SPI2_Init(); + MX_TIM1_Init(); + MX_TIM3_Init(); + MX_USART1_UART_Init(); + MX_USART3_UART_Init(); + MX_RTC_Init(); + MX_WWDG_Init(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + + /** Configure the main internal regulator output voltage + */ + HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1); + /** Configure LSE Drive Capability + */ + HAL_PWR_EnableBkUpAccess(); + __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW); + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI + |RCC_OSCILLATORTYPE_LSE; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1; + RCC_OscInitStruct.PLL.PLLN = 8; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the peripherals clocks + */ + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1 + |RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_ADC; + PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_SYSCLK; + PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; + + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief ADC1 Initialization Function + * @param None + * @retval None + */ +static void MX_ADC1_Init(void) +{ + + /* USER CODE BEGIN ADC1_Init 0 */ + + /* USER CODE END ADC1_Init 0 */ + + ADC_AnalogWDGConfTypeDef AnalogWDGConfig = {0}; + ADC_ChannelConfTypeDef sConfig = {0}; + + /* USER CODE BEGIN ADC1_Init 1 */ + + /* USER CODE END ADC1_Init 1 */ + /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion) + */ + hadc1.Instance = ADC1; + hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; + hadc1.Init.Resolution = ADC_RESOLUTION_12B; + hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; + hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; + hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; + hadc1.Init.LowPowerAutoWait = DISABLE; + hadc1.Init.LowPowerAutoPowerOff = DISABLE; + hadc1.Init.ContinuousConvMode = DISABLE; + hadc1.Init.NbrOfConversion = 1; + hadc1.Init.DiscontinuousConvMode = DISABLE; + hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; + hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + hadc1.Init.DMAContinuousRequests = DISABLE; + hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; + hadc1.Init.SamplingTimeCommon1 = ADC_SAMPLETIME_1CYCLE_5; + hadc1.Init.SamplingTimeCommon2 = ADC_SAMPLETIME_1CYCLE_5; + hadc1.Init.OversamplingMode = DISABLE; + hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH; + if (HAL_ADC_Init(&hadc1) != HAL_OK) + { + Error_Handler(); + } + /** Configure Analog WatchDog 2 + */ + AnalogWDGConfig.WatchdogMode = ADC_ANALOGWATCHDOG_SINGLE_REG; + if (HAL_ADC_AnalogWDGConfig(&hadc1, &AnalogWDGConfig) != HAL_OK) + { + Error_Handler(); + } + /** Configure Regular Channel + */ + sConfig.Channel = ADC_CHANNEL_0; + sConfig.Rank = ADC_REGULAR_RANK_1; + sConfig.SamplingTime = ADC_SAMPLINGTIME_COMMON_1; + if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN ADC1_Init 2 */ + + /* USER CODE END ADC1_Init 2 */ + +} + +/** + * @brief IWDG Initialization Function + * @param None + * @retval None + */ +static void MX_IWDG_Init(void) +{ + + /* USER CODE BEGIN IWDG_Init 0 */ + + /* USER CODE END IWDG_Init 0 */ + + /* USER CODE BEGIN IWDG_Init 1 */ + + /* USER CODE END IWDG_Init 1 */ + hiwdg.Instance = IWDG; + hiwdg.Init.Prescaler = IWDG_PRESCALER_4; + hiwdg.Init.Window = 4095; + hiwdg.Init.Reload = 4095; + if (HAL_IWDG_Init(&hiwdg) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN IWDG_Init 2 */ + + /* USER CODE END IWDG_Init 2 */ + +} + +/** + * @brief RTC Initialization Function + * @param None + * @retval None + */ +static void MX_RTC_Init(void) +{ + + /* USER CODE BEGIN RTC_Init 0 */ + + /* USER CODE END RTC_Init 0 */ + + RTC_TimeTypeDef sTime = {0}; + RTC_DateTypeDef sDate = {0}; + + /* USER CODE BEGIN RTC_Init 1 */ + + /* USER CODE END RTC_Init 1 */ + /** Initialize RTC Only + */ + hrtc.Instance = RTC; + hrtc.Init.HourFormat = RTC_HOURFORMAT_24; + hrtc.Init.AsynchPrediv = 127; + hrtc.Init.SynchPrediv = 255; + hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; + hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE; + hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; + hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; + hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE; + if (HAL_RTC_Init(&hrtc) != HAL_OK) + { + Error_Handler(); + } + + /* USER CODE BEGIN Check_RTC_BKUP */ + + /* USER CODE END Check_RTC_BKUP */ + + /** Initialize RTC and set the Time and Date + */ + sTime.Hours = 0x0; + sTime.Minutes = 0x0; + sTime.Seconds = 0x0; + sTime.SubSeconds = 0x0; + sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; + sTime.StoreOperation = RTC_STOREOPERATION_RESET; + if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK) + { + Error_Handler(); + } + sDate.WeekDay = RTC_WEEKDAY_MONDAY; + sDate.Month = RTC_MONTH_JANUARY; + sDate.Date = 0x1; + sDate.Year = 0x0; + + if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN RTC_Init 2 */ + + /* USER CODE END RTC_Init 2 */ + +} + +/** + * @brief SPI1 Initialization Function + * @param None + * @retval None + */ +static void MX_SPI1_Init(void) +{ + + /* USER CODE BEGIN SPI1_Init 0 */ + + /* USER CODE END SPI1_Init 0 */ + + /* USER CODE BEGIN SPI1_Init 1 */ + + /* USER CODE END SPI1_Init 1 */ + /* SPI1 parameter configuration*/ + hspi1.Instance = SPI1; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_4BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.NSS = SPI_NSS_SOFT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 7; + hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + if (HAL_SPI_Init(&hspi1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI1_Init 2 */ + + /* USER CODE END SPI1_Init 2 */ + +} + +/** + * @brief SPI2 Initialization Function + * @param None + * @retval None + */ +static void MX_SPI2_Init(void) +{ + + /* USER CODE BEGIN SPI2_Init 0 */ + + /* USER CODE END SPI2_Init 0 */ + + /* USER CODE BEGIN SPI2_Init 1 */ + + /* USER CODE END SPI2_Init 1 */ + /* SPI2 parameter configuration*/ + hspi2.Instance = SPI2; + hspi2.Init.Mode = SPI_MODE_MASTER; + hspi2.Init.Direction = SPI_DIRECTION_2LINES; + hspi2.Init.DataSize = SPI_DATASIZE_4BIT; + hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi2.Init.NSS = SPI_NSS_SOFT; + hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi2.Init.TIMode = SPI_TIMODE_DISABLE; + hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi2.Init.CRCPolynomial = 7; + hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi2.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + if (HAL_SPI_Init(&hspi2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI2_Init 2 */ + + /* USER CODE END SPI2_Init 2 */ + +} + +/** + * @brief TIM1 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM1_Init(void) +{ + + /* USER CODE BEGIN TIM1_Init 0 */ + + /* USER CODE END TIM1_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; + + /* USER CODE BEGIN TIM1_Init 1 */ + + /* USER CODE END TIM1_Init 1 */ + htim1.Instance = TIM1; + htim1.Init.Prescaler = 0; + htim1.Init.CounterMode = TIM_COUNTERMODE_UP; + htim1.Init.Period = 0; + htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim1.Init.RepetitionCounter = 0; + htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim1) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + sBreakDeadTimeConfig.BreakAFMode = TIM_BREAK_AFMODE_INPUT; + sBreakDeadTimeConfig.Break2AFMode = TIM_BREAK_AFMODE_INPUT; + if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM1_Init 2 */ + + /* USER CODE END TIM1_Init 2 */ + +} + +/** + * @brief TIM3 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM3_Init(void) +{ + + /* USER CODE BEGIN TIM3_Init 0 */ + + /* USER CODE END TIM3_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + TIM_OC_InitTypeDef sConfigOC = {0}; + + /* USER CODE BEGIN TIM3_Init 1 */ + + /* USER CODE END TIM3_Init 1 */ + htim3.Instance = TIM3; + htim3.Init.Prescaler = 0; + htim3.Init.CounterMode = TIM_COUNTERMODE_UP; + htim3.Init.Period = 0; + htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim3) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_Init(&htim3) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_OC_Init(&htim3) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_TIMING; + if (HAL_TIM_OC_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_OC_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_OC_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM3_Init 2 */ + + /* USER CODE END TIM3_Init 2 */ + HAL_TIM_MspPostInit(&htim3); + +} + +/** + * @brief USART1 Initialization Function + * @param None + * @retval None + */ +static void MX_USART1_UART_Init(void) +{ + + /* USER CODE BEGIN USART1_Init 0 */ + + /* USER CODE END USART1_Init 0 */ + + /* USER CODE BEGIN USART1_Init 1 */ + + /* USER CODE END USART1_Init 1 */ + huart1.Instance = USART1; + huart1.Init.BaudRate = 115200; + huart1.Init.WordLength = UART_WORDLENGTH_8B; + huart1.Init.StopBits = UART_STOPBITS_1; + huart1.Init.Parity = UART_PARITY_NONE; + huart1.Init.Mode = UART_MODE_TX_RX; + huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart1.Init.OverSampling = UART_OVERSAMPLING_16; + huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1; + huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + if (HAL_UART_Init(&huart1) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART1_Init 2 */ + + /* USER CODE END USART1_Init 2 */ + +} + +/** + * @brief USART2 Initialization Function + * @param None + * @retval None + */ +static void MX_USART2_UART_Init(void) +{ + + /* USER CODE BEGIN USART2_Init 0 */ + + /* USER CODE END USART2_Init 0 */ + + /* USER CODE BEGIN USART2_Init 1 */ + + /* USER CODE END USART2_Init 1 */ + huart2.Instance = USART2; + huart2.Init.BaudRate = 115200; + huart2.Init.WordLength = UART_WORDLENGTH_7B; + huart2.Init.StopBits = UART_STOPBITS_1; + huart2.Init.Parity = UART_PARITY_NONE; + huart2.Init.Mode = UART_MODE_TX_RX; + huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart2.Init.OverSampling = UART_OVERSAMPLING_16; + huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1; + huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + if (HAL_UART_Init(&huart2) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_SetTxFifoThreshold(&huart2, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_SetRxFifoThreshold(&huart2, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_DisableFifoMode(&huart2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART2_Init 2 */ + + /* USER CODE END USART2_Init 2 */ + +} + +/** + * @brief USART3 Initialization Function + * @param None + * @retval None + */ +static void MX_USART3_UART_Init(void) +{ + + /* USER CODE BEGIN USART3_Init 0 */ + + /* USER CODE END USART3_Init 0 */ + + /* USER CODE BEGIN USART3_Init 1 */ + + /* USER CODE END USART3_Init 1 */ + huart3.Instance = USART3; + huart3.Init.BaudRate = 115200; + huart3.Init.WordLength = UART_WORDLENGTH_8B; + huart3.Init.StopBits = UART_STOPBITS_1; + huart3.Init.Parity = UART_PARITY_NONE; + huart3.Init.Mode = UART_MODE_TX_RX; + huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart3.Init.OverSampling = UART_OVERSAMPLING_16; + huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + huart3.Init.ClockPrescaler = UART_PRESCALER_DIV1; + huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + if (HAL_UART_Init(&huart3) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART3_Init 2 */ + + /* USER CODE END USART3_Init 2 */ + +} + +/** + * @brief WWDG Initialization Function + * @param None + * @retval None + */ +static void MX_WWDG_Init(void) +{ + + /* USER CODE BEGIN WWDG_Init 0 */ + + /* USER CODE END WWDG_Init 0 */ + + /* USER CODE BEGIN WWDG_Init 1 */ + + /* USER CODE END WWDG_Init 1 */ + hwwdg.Instance = WWDG; + hwwdg.Init.Prescaler = WWDG_PRESCALER_1; + hwwdg.Init.Window = 64; + hwwdg.Init.Counter = 64; + hwwdg.Init.EWIMode = WWDG_EWI_DISABLE; + if (HAL_WWDG_Init(&hwwdg) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN WWDG_Init 2 */ + + /* USER CODE END WWDG_Init 2 */ + +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* 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(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : LED_GREEN_Pin */ + GPIO_InitStruct.Pin = LED_GREEN_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(LED_GREEN_GPIO_Port, &GPIO_InitStruct); + +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Src/stm32g0xx_hal_msp.c b/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Src/stm32g0xx_hal_msp.c new file mode 100644 index 0000000000..7c05429633 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Src/stm32g0xx_hal_msp.c @@ -0,0 +1,598 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : stm32g0xx_hal_msp.c + * Description : This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* 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 */ + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + /** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/** +* @brief ADC MSP Initialization +* This function configures the hardware resources used in this example +* @param hadc: ADC handle pointer +* @retval None +*/ +void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hadc->Instance==ADC1) + { + /* USER CODE BEGIN ADC1_MspInit 0 */ + + /* USER CODE END ADC1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_ADC_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**ADC1 GPIO Configuration + PA0 ------> ADC1_IN0 + */ + GPIO_InitStruct.Pin = GPIO_PIN_0; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN ADC1_MspInit 1 */ + + /* USER CODE END ADC1_MspInit 1 */ + } + +} + +/** +* @brief ADC MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hadc: ADC handle pointer +* @retval None +*/ +void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc) +{ + if(hadc->Instance==ADC1) + { + /* USER CODE BEGIN ADC1_MspDeInit 0 */ + + /* USER CODE END ADC1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_ADC_CLK_DISABLE(); + + /**ADC1 GPIO Configuration + PA0 ------> ADC1_IN0 + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0); + + /* USER CODE BEGIN ADC1_MspDeInit 1 */ + + /* USER CODE END ADC1_MspDeInit 1 */ + } + +} + +/** +* @brief RTC MSP Initialization +* This function configures the hardware resources used in this example +* @param hrtc: RTC handle pointer +* @retval None +*/ +void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc) +{ + if(hrtc->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspInit 0 */ + + /* USER CODE END RTC_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_RTC_ENABLE(); + __HAL_RCC_RTCAPB_CLK_ENABLE(); + /* USER CODE BEGIN RTC_MspInit 1 */ + + /* USER CODE END RTC_MspInit 1 */ + } + +} + +/** +* @brief RTC MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hrtc: RTC handle pointer +* @retval None +*/ +void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc) +{ + if(hrtc->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspDeInit 0 */ + + /* USER CODE END RTC_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_RTC_DISABLE(); + __HAL_RCC_RTCAPB_CLK_DISABLE(); + /* USER CODE BEGIN RTC_MspDeInit 1 */ + + /* USER CODE END RTC_MspDeInit 1 */ + } + +} + +/** +* @brief SPI MSP Initialization +* This function configures the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspInit 0 */ + + /* USER CODE END SPI1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SPI1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**SPI1 GPIO Configuration + PA1 ------> SPI1_SCK + PA11 [PA9] ------> SPI1_MISO + PA12 [PA10] ------> SPI1_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_11|GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF0_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI1_MspInit 1 */ + + /* USER CODE END SPI1_MspInit 1 */ + } + else if(hspi->Instance==SPI2) + { + /* USER CODE BEGIN SPI2_MspInit 0 */ + + /* USER CODE END SPI2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SPI2_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**SPI2 GPIO Configuration + PC2 ------> SPI2_MISO + PC3 ------> SPI2_MOSI + PB10 ------> SPI2_SCK + */ + GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF1_SPI2; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI2_MspInit 1 */ + + /* USER CODE END SPI2_MspInit 1 */ + } + +} + +/** +* @brief SPI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) +{ + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspDeInit 0 */ + + /* USER CODE END SPI1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI1_CLK_DISABLE(); + + /**SPI1 GPIO Configuration + PA1 ------> SPI1_SCK + PA11 [PA9] ------> SPI1_MISO + PA12 [PA10] ------> SPI1_MOSI + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1|GPIO_PIN_11|GPIO_PIN_12); + + /* USER CODE BEGIN SPI1_MspDeInit 1 */ + + /* USER CODE END SPI1_MspDeInit 1 */ + } + else if(hspi->Instance==SPI2) + { + /* USER CODE BEGIN SPI2_MspDeInit 0 */ + + /* USER CODE END SPI2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI2_CLK_DISABLE(); + + /**SPI2 GPIO Configuration + PC2 ------> SPI2_MISO + PC3 ------> SPI2_MOSI + PB10 ------> SPI2_SCK + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_2|GPIO_PIN_3); + + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10); + + /* USER CODE BEGIN SPI2_MspDeInit 1 */ + + /* USER CODE END SPI2_MspDeInit 1 */ + } + +} + +/** +* @brief TIM_Base MSP Initialization +* This function configures the hardware resources used in this example +* @param htim_base: TIM_Base handle pointer +* @retval None +*/ +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) +{ + if(htim_base->Instance==TIM1) + { + /* USER CODE BEGIN TIM1_MspInit 0 */ + + /* USER CODE END TIM1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM1_CLK_ENABLE(); + /* USER CODE BEGIN TIM1_MspInit 1 */ + + /* USER CODE END TIM1_MspInit 1 */ + } + else if(htim_base->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspInit 0 */ + + /* USER CODE END TIM3_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM3_CLK_ENABLE(); + /* USER CODE BEGIN TIM3_MspInit 1 */ + + /* USER CODE END TIM3_MspInit 1 */ + } + +} + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(htim->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspPostInit 0 */ + + /* USER CODE END TIM3_MspPostInit 0 */ + + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**TIM3 GPIO Configuration + PA6 ------> TIM3_CH1 + PA7 ------> TIM3_CH2 + PB0 ------> TIM3_CH3 + PB1 ------> TIM3_CH4 + */ + GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF1_TIM3; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF1_TIM3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM3_MspPostInit 1 */ + + /* USER CODE END TIM3_MspPostInit 1 */ + } + +} +/** +* @brief TIM_Base MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param htim_base: TIM_Base handle pointer +* @retval None +*/ +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) +{ + if(htim_base->Instance==TIM1) + { + /* USER CODE BEGIN TIM1_MspDeInit 0 */ + + /* USER CODE END TIM1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM1_CLK_DISABLE(); + /* USER CODE BEGIN TIM1_MspDeInit 1 */ + + /* USER CODE END TIM1_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM3) + { + /* USER CODE BEGIN TIM3_MspDeInit 0 */ + + /* USER CODE END TIM3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM3_CLK_DISABLE(); + /* USER CODE BEGIN TIM3_MspDeInit 1 */ + + /* USER CODE END TIM3_MspDeInit 1 */ + } + +} + +/** +* @brief UART MSP Initialization +* This function configures the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspInit(UART_HandleTypeDef* huart) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(huart->Instance==USART1) + { + /* USER CODE BEGIN USART1_MspInit 0 */ + + /* USER CODE END USART1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART1_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**USART1 GPIO Configuration + PC4 ------> USART1_TX + PC5 ------> USART1_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF1_USART1; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* USER CODE BEGIN USART1_MspInit 1 */ + + /* USER CODE END USART1_MspInit 1 */ + } + else if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspInit 0 */ + + /* USER CODE END USART2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART2_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF1_USART2; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN USART2_MspInit 1 */ + + /* USER CODE END USART2_MspInit 1 */ + } + else if(huart->Instance==USART3) + { + /* USER CODE BEGIN USART3_MspInit 0 */ + + /* USER CODE END USART3_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART3_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**USART3 GPIO Configuration + PC11 ------> USART3_RX + PB2 ------> USART3_TX + */ + GPIO_InitStruct.Pin = GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF0_USART3; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF4_USART3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN USART3_MspInit 1 */ + + /* USER CODE END USART3_MspInit 1 */ + } + +} + +/** +* @brief UART MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) +{ + if(huart->Instance==USART1) + { + /* USER CODE BEGIN USART1_MspDeInit 0 */ + + /* USER CODE END USART1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART1_CLK_DISABLE(); + + /**USART1 GPIO Configuration + PC4 ------> USART1_TX + PC5 ------> USART1_RX + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_4|GPIO_PIN_5); + + /* USER CODE BEGIN USART1_MspDeInit 1 */ + + /* USER CODE END USART1_MspDeInit 1 */ + } + else if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspDeInit 0 */ + + /* USER CODE END USART2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART2_CLK_DISABLE(); + + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3); + + /* USER CODE BEGIN USART2_MspDeInit 1 */ + + /* USER CODE END USART2_MspDeInit 1 */ + } + else if(huart->Instance==USART3) + { + /* USER CODE BEGIN USART3_MspDeInit 0 */ + + /* USER CODE END USART3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART3_CLK_DISABLE(); + + /**USART3 GPIO Configuration + PC11 ------> USART3_RX + PB2 ------> USART3_TX + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_11); + + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_2); + + /* USER CODE BEGIN USART3_MspDeInit 1 */ + + /* USER CODE END USART3_MspDeInit 1 */ + } + +} + +/** +* @brief WWDG MSP Initialization +* This function configures the hardware resources used in this example +* @param hwwdg: WWDG handle pointer +* @retval None +*/ +void HAL_WWDG_MspInit(WWDG_HandleTypeDef* hwwdg) +{ + if(hwwdg->Instance==WWDG) + { + /* USER CODE BEGIN WWDG_MspInit 0 */ + + /* USER CODE END WWDG_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_WWDG_CLK_ENABLE(); + /* USER CODE BEGIN WWDG_MspInit 1 */ + + /* USER CODE END WWDG_MspInit 1 */ + } + +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Src/stm32g0xx_it.c b/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Src/stm32g0xx_it.c new file mode 100644 index 0000000000..5d2ca523b1 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/Src/stm32g0xx_it.c @@ -0,0 +1,145 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g0xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2020 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32g0xx_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-M0+ Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVC_IRQn 0 */ + + /* USER CODE END SVC_IRQn 0 */ + /* USER CODE BEGIN SVC_IRQn 1 */ + + /* USER CODE END SVC_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32G0xx 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_stm32g0xx.s). */ +/******************************************************************************/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/stm32g070rbt6.ioc b/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/stm32g070rbt6.ioc new file mode 100644 index 0000000000..353d97411c --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/board/CubeMX_Config/stm32g070rbt6.ioc @@ -0,0 +1,247 @@ +#MicroXplorer Configuration settings - do not modify +Mcu.Family=STM32G0 +PC3.Mode=Full_Duplex_Master +ProjectManager.MainLocation=Src +PA2.GPIO_PuPd=GPIO_PULLUP +PA11\ [PA9].Mode=Full_Duplex_Master +RCC.USART1Freq_Value=64000000 +USART2.IPParameters=VirtualMode-Asynchronous,WordLength +RCC.CortexFreq_Value=64000000 +ProjectManager.KeepUserCode=true +Mcu.UserName=STM32G070RBTx +SPI1.VirtualType=VM_MASTER +SPI2.VirtualType=VM_MASTER +PB10.Mode=Full_Duplex_Master +TIM3.Channel-Output\ Compare3\ CH3=TIM_CHANNEL_3 +PA12\ [PA10].Mode=Full_Duplex_Master +VP_IWDG_VS_IWDG.Mode=IWDG_Activate +PA3.GPIO_PuPd=GPIO_PULLUP +PA14-BOOT0.Mode=Serial_Wire +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART2_UART_Init-USART2-false-HAL-true,4-MX_ADC1_Init-ADC1-false-HAL-true,5-MX_IWDG_Init-IWDG-false-HAL-true,6-MX_SPI1_Init-SPI1-false-HAL-true,7-MX_SPI2_Init-SPI2-false-HAL-true,8-MX_TIM1_Init-TIM1-false-HAL-true,9-MX_TIM3_Init-TIM3-false-HAL-true,10-MX_USART1_UART_Init-USART1-false-HAL-true,11-MX_USART3_UART_Init-USART3-false-HAL-true +VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled +RCC.RTCFreq_Value=32768 +PA3.GPIOParameters=GPIO_PuPd +RCC.USART2Freq_Value=64000000 +VP_RTC_VS_RTC_Calendar.Signal=RTC_VS_RTC_Calendar +PC15-OSC32_OUT\ (PC15).Mode=LSE-External-Oscillator +NVIC.SVC_IRQn=true\:0\:0\:false\:false\:true\:false\:false +PC5.Mode=Asynchronous +USART1.IPParameters=VirtualMode-Asynchronous +PF0-OSC_IN\ (PF0).GPIO_Label=MCO +PA2.GPIOParameters=GPIO_PuPd +PinOutPanel.RotationAngle=0 +PF0-OSC_IN\ (PF0).Signal=RCC_OSC_IN +RCC.MCO1PinFreq_Value=64000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +ProjectManager.StackSize=0x400 +PC14-OSC32_IN\ (PC14).Mode=LSE-External-Oscillator +USART3.VirtualMode-Asynchronous=VM_ASYNC +RCC.LPTIM1Freq_Value=16000000 +Mcu.IP4=RTC +RCC.FCLKCortexFreq_Value=64000000 +Mcu.IP5=SPI1 +Mcu.IP2=NVIC +Mcu.IP3=RCC +Mcu.IP0=ADC1 +Mcu.IP1=IWDG +Mcu.UserConstants= +SH.S_TIM3_CH2.ConfNb=1 +PA14-BOOT0.GPIOParameters=GPIO_Label +Mcu.ThirdPartyNb=0 +SPI1.Direction=SPI_DIRECTION_2LINES +RCC.HCLKFreq_Value=64000000 +PA12\ [PA10].Signal=SPI1_MOSI +Mcu.IPNb=14 +ProjectManager.PreviousToolchain= +SPI1.CalculateBaudRate=32.0 MBits/s +PC3.Signal=SPI2_MOSI +Mcu.Pin6=PC3 +Mcu.Pin7=PA0 +Mcu.Pin8=PA1 +Mcu.Pin9=PA2 +RCC.AHBFreq_Value=64000000 +PF0-OSC_IN\ (PF0).Locked=true +Mcu.Pin0=PC11 +Mcu.Pin1=PC13 +PA14-BOOT0.Signal=SYS_SWCLK +TIM3.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 +Mcu.Pin2=PC14-OSC32_IN (PC14) +Mcu.Pin3=PC15-OSC32_OUT (PC15) +Mcu.Pin4=PF0-OSC_IN (PF0) +Mcu.Pin5=PC2 +ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_0 +ProjectManager.ProjectBuild=false +RCC.HSE_VALUE=8000000 +PB2.Signal=USART3_TX +Mcu.IP10=USART1 +USART2.VirtualMode-Asynchronous=VM_ASYNC +NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false\:true +RCC.RTCClockSelection=RCC_RTCCLKSOURCE_LSE +Mcu.IP12=USART3 +Mcu.IP11=USART2 +ProjectManager.FirmwarePackage=STM32Cube FW_G0 V1.3.0 +MxDb.Version=DB.5.0.60 +Mcu.IP13=WWDG +ProjectManager.BackupPrevious=false +RCC.VCOInputFreq_Value=16000000 +File.Version=6 +PA0.Mode=IN0 +SPI2.CalculateBaudRate=32.0 MBits/s +VP_SYS_VS_DBSignals.Mode=DisableDeadBatterySignals +RCC.PLLRCLKFreq_Value=64000000 +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false +SH.S_TIM3_CH1.0=TIM3_CH1,PWM Generation1 CH1 +ProjectManager.HalAssertFull=false +VP_TIM1_VS_ClockSourceINT.Mode=Internal +ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLINGTIME_COMMON_1 +ProjectManager.ProjectName=stm32g070rbt6 +PA0.Signal=ADC1_IN0 +RCC.TIM1Freq_Value=16000000 +PA13.GPIOParameters=GPIO_Label +Mcu.Package=LQFP64 +PB1.Signal=S_TIM3_CH4 +PA6.Signal=S_TIM3_CH1 +RCC.TIM15Freq_Value=16000000 +PA5.Locked=true +SPI2.Mode=SPI_MODE_MASTER +RCC.APBFreq_Value=64000000 +ProjectManager.ToolChainLocation= +RCC.LSI_VALUE=32000 +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +RCC.LSCOPinFreq_Value=32000 +USART3.IPParameters=VirtualMode-Asynchronous +VP_RTC_VS_RTC_Calendar.Mode=RTC_Calendar +PA5.GPIOParameters=GPIO_Speed,GPIO_Label +PC11.Mode=Asynchronous +USART2.WordLength=WORDLENGTH_7B +PC14-OSC32_IN\ (PC14).Locked=true +RCC.PLLPoutputFreq_Value=64000000 +RCC.CECFreq_Value=32786.88524590164 +RCC.LPUART1Freq_Value=16000000 +SPI2.Direction=SPI_DIRECTION_2LINES +PC5.Signal=USART1_RX +TIM3.Channel-Output\ Compare2\ CH2=TIM_CHANNEL_2 +ProjectManager.CustomerFirmwarePackage= +VP_TIM3_VS_ClockSourceINT.Mode=Internal +PC4.Mode=Asynchronous +PA3.Signal=USART2_RX +VP_WWDG_VS_WWDG.Signal=WWDG_VS_WWDG +PA2.Locked=true +VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate +RCC.PLLQoutputFreq_Value=64000000 +ProjectManager.ProjectFileName=stm32g070rbt6.ioc +PA14-BOOT0.GPIO_Label=TCK +ADC1.Rank-0\#ChannelRegularConversion=1 +Mcu.PinsNb=32 +ProjectManager.NoMain=false +SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate +ADC1.IPParameters=Rank-0\#ChannelRegularConversion,master,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,NbrOfConversionFlag +PC13.Locked=true +PC13.Signal=SYS_WKUP2 +PC11.Signal=USART3_RX +PC2.Signal=SPI2_MISO +PC4.Signal=USART1_TX +RCC.EXTERNAL_CLOCK_VALUE=12288000 +ProjectManager.DefaultFWLocation=true +PC2.Mode=Full_Duplex_Master +PC15-OSC32_OUT\ (PC15).Signal=RCC_OSC32_OUT +ProjectManager.DeletePrevious=true +boardIOC=true +SH.S_TIM3_CH3.0=TIM3_CH3,Output Compare3 CH3 +RCC.FamilyName=M +PF0-OSC_IN\ (PF0).Mode=HSE-External-Clock-Source +USART1.VirtualMode-Asynchronous=VM_ASYNC +PA13.Signal=SYS_SWDIO +PA3.Mode=Asynchronous +ProjectManager.TargetToolchain=Makefile +SH.S_TIM3_CH3.ConfNb=1 +VP_TIM1_VS_ClockSourceINT.Signal=TIM1_VS_ClockSourceINT +RCC.I2S1Freq_Value=64000000 +SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate +PC15-OSC32_OUT\ (PC15).Locked=true +VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT +PA1.Signal=SPI1_SCK +PB10.Signal=SPI2_SCK +PA5.Signal=GPIO_Output +SH.S_TIM3_CH2.0=TIM3_CH2,Output Compare2 CH2 +board=NUCLEO-G070RB +RCC.VCOOutputFreq_Value=128000000 +ProjectManager.LastFirmware=true +PA1.Mode=Full_Duplex_Master +MxCube.Version=5.6.1 +RCC.I2C1Freq_Value=64000000 +SPI1.Mode=SPI_MODE_MASTER +VP_SYS_VS_DBSignals.Signal=SYS_VS_DBSignals +Mcu.Pin30=VP_TIM3_VS_ClockSourceINT +RCC.ADCFreq_Value=64000000 +VP_SYS_VS_Systick.Mode=SysTick +TIM3.IPParameters=Channel-Output Compare2 CH2,Channel-Output Compare3 CH3,Channel-Output Compare4 CH4,Channel-PWM Generation1 CH1 +Mcu.Pin31=VP_WWDG_VS_WWDG +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false +PC13.Mode=SYS_WakeUp1 +PA13.Mode=Serial_Wire +ProjectManager.FreePins=false +RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APBFreq_Value,APBTimFreq_Value,CECFreq_Value,CortexFreq_Value,EXTERNAL_CLOCK_VALUE,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2C1Freq_Value,I2S1Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PWRFreq_Value,RTCClockSelection,RTCFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,TIM15Freq_Value,TIM1Freq_Value,USART1Freq_Value,USART2Freq_Value,VCOInputFreq_Value,VCOOutputFreq_Value +ProjectManager.AskForMigrate=true +Mcu.Name=STM32G070RBTx +PA11\ [PA9].Signal=SPI1_MISO +RCC.LPTIM2Freq_Value=16000000 +Mcu.Pin26=VP_RTC_VS_RTC_Calendar +PA14-BOOT0.Locked=true +Mcu.Pin27=VP_SYS_VS_Systick +PA2.Signal=USART2_TX +PA13.GPIO_Label=TMS +Mcu.Pin24=VP_IWDG_VS_IWDG +ProjectManager.UnderRoot=false +Mcu.Pin25=VP_RTC_VS_RTC_Activate +TIM3.Channel-Output\ Compare4\ CH4=TIM_CHANNEL_4 +Mcu.IP8=TIM1 +Mcu.IP9=TIM3 +Mcu.Pin28=VP_SYS_VS_DBSignals +Mcu.IP6=SPI2 +Mcu.Pin29=VP_TIM1_VS_ClockSourceINT +Mcu.IP7=SYS +ProjectManager.CoupleFile=false +RCC.APBTimFreq_Value=64000000 +RCC.SYSCLKFreq_VALUE=64000000 +Mcu.Pin22=PA13 +Mcu.Pin23=PA14-BOOT0 +Mcu.Pin20=PA11 [PA9] +ADC1.master=1 +Mcu.Pin21=PA12 [PA10] +PA3.Locked=true +PA5.GPIO_Label=LED_GREEN +NVIC.ForceEnableDMAVector=true +KeepUserPlacement=false +PC14-OSC32_IN\ (PC14).Signal=RCC_OSC32_IN +PB2.Mode=Asynchronous +PA13.Locked=true +ProjectManager.CompilerOptimize=6 +VP_IWDG_VS_IWDG.Signal=IWDG_VS_IWDG +ProjectManager.HeapSize=0x200 +Mcu.Pin15=PC5 +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false +Mcu.Pin16=PB0 +Mcu.Pin13=PA7 +Mcu.Pin14=PC4 +VP_WWDG_VS_WWDG.Mode=WWDG_Activate +Mcu.Pin19=PB10 +SH.S_TIM3_CH1.ConfNb=1 +ProjectManager.ComputerToolchain=false +Mcu.Pin17=PB1 +RCC.HSI_VALUE=16000000 +Mcu.Pin18=PB2 +PA5.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +SH.S_TIM3_CH4.ConfNb=1 +ADC1.NbrOfConversionFlag=1 +Mcu.Pin11=PA5 +Mcu.Pin12=PA6 +Mcu.Pin10=PA3 +PA2.Mode=Asynchronous +RCC.PWRFreq_Value=64000000 +PB0.Signal=S_TIM3_CH3 +PF0-OSC_IN\ (PF0).GPIOParameters=GPIO_Label +ProjectManager.DeviceId=STM32G070RBTx +ProjectManager.LibraryCopy=1 +SH.S_TIM3_CH4.0=TIM3_CH4,Output Compare4 CH4 +PA7.Signal=S_TIM3_CH2 diff --git a/bsp/stm32/stm32g070-st-nucleo/board/Kconfig b/bsp/stm32/stm32g070-st-nucleo/board/Kconfig new file mode 100644 index 0000000000..9f1ce51720 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/board/Kconfig @@ -0,0 +1,198 @@ +menu "Hardware Drivers Config" + +config SOC_STM32G070RB + bool + select SOC_SERIES_STM32G0 + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y + +menu "Onboard Peripheral Drivers" + + config BSP_USING_USB_TO_UART + bool "Enable USB TO UART (uart2)" + select BSP_USING_UART2 + default y + +endmenu + +menu "On-chip Peripheral Drivers" + + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default y + + menuconfig BSP_USING_UART + bool "Enable UART" + default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_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_UART2 + bool "Enable UART2" + default n + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + + 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 + endif + + menuconfig BSP_USING_TIM + bool "Enable timer" + default n + select RT_USING_HWTIMER + if BSP_USING_TIM + + config BSP_USING_TIM1 + bool "Enable TIM1" + default n + + config BSP_USING_TIM3 + bool "Enable TIM3" + default n + endif + + menuconfig BSP_USING_PWM + bool "Enable pwm" + default n + select RT_USING_PWM + if BSP_USING_PWM + menuconfig BSP_USING_PWM3 + bool "Enable timer3 output pwm" + default n + if BSP_USING_PWM3 + config BSP_USING_PWM3_CH1 + bool "Enable PWM3 channel1" + default n + + config BSP_USING_PWM3_CH2 + bool "Enable PWM3 channel2" + default n + + config BSP_USING_PWM3_CH3 + bool "Enable PWM3 channel3" + default n + + config BSP_USING_PWM3_CH4 + bool "Enable PWM3 channel4" + default n + endif + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n + + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n + + config BSP_USING_SPI2 + bool "Enable SPI2 BUS" + default n + + config BSP_SPI2_TX_USING_DMA + bool "Enable SPI2 TX DMA" + depends on BSP_USING_SPI2 + default n + + config BSP_SPI2_RX_USING_DMA + bool "Enable SPI2 RX DMA" + depends on BSP_USING_SPI2 + select BSP_SPI2_TX_USING_DMA + default n + endif + + menuconfig BSP_USING_I2C1 + bool "Enable I2C1 BUS (software simulation)" + default n + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + if BSP_USING_I2C1 + config BSP_I2C1_SCL_PIN + int "i2c1 scl pin number" + range 0 63 + default 22 + config BSP_I2C1_SDA_PIN + int "I2C1 sda pin number" + range 0 63 + default 23 + endif + + menuconfig BSP_USING_ADC + bool "Enable ADC" + default n + select RT_USING_ADC + if BSP_USING_ADC + config BSP_USING_ADC1 + bool "Enable ADC1" + default n + endif + + config BSP_USING_ON_CHIP_FLASH + bool "Enable on-chip FLASH" + default n + + menuconfig BSP_USING_ONCHIP_RTC + bool "Enable RTC" + select RT_USING_RTC + select RT_USING_LIBC + default n + if BSP_USING_ONCHIP_RTC + choice + prompt "Select clock source" + default BSP_RTC_USING_LSE + + config BSP_RTC_USING_LSE + bool "RTC USING LSE" + + config BSP_RTC_USING_LSI + bool "RTC USING LSI" + endchoice + endif + + config BSP_USING_WDT + bool "Enable Watchdog Timer" + select RT_USING_WDT + default n + source "libraries/HAL_Drivers/Kconfig" + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/stm32/stm32g070-st-nucleo/board/SConscript b/bsp/stm32/stm32g070-st-nucleo/board/SConscript new file mode 100644 index 0000000000..1ee2dd32b3 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/board/SConscript @@ -0,0 +1,30 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +CubeMX_Config/Src/stm32g0xx_hal_msp.c +''') + +path = [cwd] +path += [cwd + '/CubeMX_Config/Inc'] +path += [cwd + '/ports'] + +startup_path_prefix = SDK_LIB + +if rtconfig.CROSS_TOOL == 'gcc': + src += [startup_path_prefix + '/STM32G0xx_HAL/CMSIS/Device/ST/STM32G0xx/Source/Templates/gcc/startup_stm32g070xx.s'] +elif rtconfig.CROSS_TOOL == 'keil': + src += [startup_path_prefix + '/STM32G0xx_HAL/CMSIS/Device/ST/STM32G0xx/Source/Templates/arm/startup_stm32g070xx.s'] +elif rtconfig.CROSS_TOOL == 'iar': + src += [startup_path_prefix + '/STM32G0xx_HAL/CMSIS/Device/ST/STM32G0xx/Source/Templates/iar/startup_stm32g070xx.s'] + +CPPDEFINES = ['STM32G070xx'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) +Return('group') diff --git a/bsp/stm32/stm32g070-st-nucleo/board/board.c b/bsp/stm32/stm32g070-st-nucleo/board/board.c new file mode 100644 index 0000000000..2076a612f9 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/board/board.c @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-7-1 NU-LL first version + */ + +#include "board.h" + +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + + /** Configure the main internal regulator output voltage + */ + HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1); + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1; + RCC_OscInitStruct.PLL.PLLN = 8; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the peripherals clocks + */ + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2 + |RCC_PERIPHCLK_ADC; + PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_SYSCLK; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } +} diff --git a/bsp/stm32/stm32g070-st-nucleo/board/board.h b/bsp/stm32/stm32g070-st-nucleo/board/board.h new file mode 100644 index 0000000000..f0345a1293 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/board/board.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift first version + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include +#include "drv_common.h" +#include "drv_gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define STM32_FLASH_START_ADRESS ((uint32_t)0x08000000) +#define STM32_FLASH_SIZE (128 * 1024) +#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE)) + +/* Internal SRAM memory size[Kbytes] <8-64>, Default: 36 */ +#define STM32_SRAM_SIZE 36 +#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024) + +#if defined(__CC_ARM) || defined(__CLANG_ARM) +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="CSTACK" +#define HEAP_BEGIN (__segment_end("CSTACK")) +#else +extern int __bss_end; +#define HEAP_BEGIN ((void *)&__bss_end) +#endif + +#define HEAP_END STM32_SRAM_END + +void SystemClock_Config(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __BOARD_H__ */ diff --git a/bsp/stm32/stm32g070-st-nucleo/board/linker_scripts/link.icf b/bsp/stm32/stm32g070-st-nucleo/board/linker_scripts/link.icf new file mode 100644 index 0000000000..5a262a4195 --- /dev/null +++ b/bsp/stm32/stm32g070-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__ = 0x08020000; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x20009000; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x0200; +define symbol __ICFEDIT_size_heap__ = 0x0000; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, last block CSTACK}; \ No newline at end of file diff --git a/bsp/stm32/stm32g070-st-nucleo/board/linker_scripts/link.lds b/bsp/stm32/stm32g070-st-nucleo/board/linker_scripts/link.lds new file mode 100644 index 0000000000..963ce61634 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/board/linker_scripts/link.lds @@ -0,0 +1,156 @@ +/* + * linker script for STM32FG0x with GNU ld + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08000000, LENGTH = 128k /* 128KB flash */ + RAM (rw) : ORIGIN = 0x20000000, LENGTH = 36k /* 36K sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x200; + +SECTIONS +{ + .text : + { + . = ALIGN(4); + _stext = .; + KEEP(*(.isr_vector)) /* Startup code */ + + . = ALIGN(4); + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + + . = ALIGN(4); + + PROVIDE(__ctors_start__ = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE(__ctors_end__ = .); + + . = ALIGN(4); + + _etext = .; + } > ROM = 0 + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > ROM + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + PROVIDE(__dtors_start__ = .); + KEEP(*(SORT(.dtors.*))) + KEEP(*(.dtors)) + PROVIDE(__dtors_end__ = .); + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >RAM + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } >RAM + + __bss_start = .; + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + + *(.bss.init) + } > RAM + __bss_end = .; + + _end = .; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} diff --git a/bsp/stm32/stm32g070-st-nucleo/board/linker_scripts/link.sct b/bsp/stm32/stm32g070-st-nucleo/board/linker_scripts/link.sct new file mode 100644 index 0000000000..01a848e615 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/board/linker_scripts/link.sct @@ -0,0 +1,16 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00020000 { ; load region size_region + ER_IROM1 0x08000000 0x00020000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + .ANY (+XO) + } + RW_IRAM1 0x20000000 0x00009000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/bsp/stm32/stm32g070-st-nucleo/board/ports/fal_cfg.h b/bsp/stm32/stm32g070-st-nucleo/board/ports/fal_cfg.h new file mode 100644 index 0000000000..ee65e188d9 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/board/ports/fal_cfg.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-12-8 zylx first version + */ + +#ifndef _FAL_CFG_H_ +#define _FAL_CFG_H_ + +#include +#include + +extern const struct fal_flash_dev stm32_onchip_flash; + +/* flash device table */ +#define FAL_FLASH_DEV_TABLE \ +{ \ + &stm32_onchip_flash, \ +} +/* ====================== Partition Configuration ========================== */ +#ifdef FAL_PART_HAS_TABLE_CFG + +/* partition table */ +#define FAL_PART_TABLE \ +{ \ + {FAL_PART_MAGIC_WROD, "app", "onchip_flash", 0, 112 * 1024, 0}, \ + {FAL_PART_MAGIC_WROD, "param", "onchip_flash", 112 * 1024 , 16 * 1024, 0}, \ +} +#endif /* FAL_PART_HAS_TABLE_CFG */ +#endif /* _FAL_CFG_H_ */ diff --git a/bsp/stm32/stm32g070-st-nucleo/figures/board.jpg b/bsp/stm32/stm32g070-st-nucleo/figures/board.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13471220ca3b8417e45f6b6890434f5591da38c1 GIT binary patch literal 66304 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

Y3Dwuf1q8I$uL=LmK$E_s@3FmQNESQ( zG$nW0Bija8Dk`9|a!V-=rsSwh1gM@Jv!^D!gu6@$>kQhtC10O@wK23oU0*-_9;y3k z+Z2SM&vtCSUV|&bpA2~$WXx<#HlN+%wrr7p%i~D8m^k;Dy^kagGHN?GX?EwN7Rx#6 z;?8c{z~xo@+H1m%3?74Kj9*GsPA;Qwdmcvc+u)%g$z79$Z-V6Fwdoq`dc(t-!UB=L z^_j{ooJ|8}2o13AaOo`!Si*2`znT`#Jza&5mF4e4sWc%SE{iCeAANM!W)rby2`WOE zD99X@b2qGV?&(?=>l%KkT-+La5r^ zsn%dVS4ms;Dw^`T+Bij(rvAY3t9cUnoY(ZDmF?Z#f&dF0)XmRM#CFj*{jOj`fJ3J` z{$S$F71qh8>A5>g9O)_GfqAvlYEfY1lRMNgf~4nUoBlHHQYW!osyP2>*O6qMq}K8x zrgCdGbX%%#HR|E8e;dWr5vm|QuLM>ptqIyv_;3*3{)ifkahS-T-7*%MRmC5C9-#&NQ|y5s z+(g|;8Hj`)0xB*Yu4u!fwRCUOP|7ePldF%;FtF&?iU}MH$SoRPHa&mXR0VhBY?UlLpm_c-+qJExzbZOKlPN-Q zMIZ)8qvn0)1s(oNW7bM={oLk6+CK`RsFu&HcW{tFSs!$Wpes-d8;VuwAW)uNG9{{j zPgVHVGdexr>!W!uN+E&)5X&^DO~hf0(1PV*^qFeZH%+eKT@G8yyT|Pr8cJmR&Ij6< zL*v_>REDwVfB~4h@h#A|hbbiMHpT~whZ{57)V7n33d-i^BU8mUU|xU>N%xm#8K?;d zxUw9tkE8BR;CxJH2t?RdAQh9pxv5+goR-?5NXmk*XvVkvMul9RX#ZVU4rb>UtZl`H zUq~%1NILtKd1e+r$_B)9r~}a%K~kjNNF$lxmwP8aOEr?Sk0|7zkVkTJlB=k-u8~+= zJsY|kciR|-yov#k03$o5socYbrBxfh0C!VH+1yXZl1F=*oujeOTLs?5TA3Hre1E9M z8(Oq#lETm`jWXgBvkmDt46bn5G@0O=&D8K2Fj2!#SO#q^BgLfPCJ|B^CG2ekc*JAh zXMq*Xo959KvjO%>hQp5%lH=#kUM$?TaxW8@mW) z#0Gnm0EL6J1f-aN-~Mhr$k#p&$u)OJ#BwIk!#;+x%jZ@~tMwn+Mw_g;e>VhSgUHX|1KxA0AS%d-w zb#@gf4=}1Fz3U#Cy}xzDPl1){dkQ@Y)2Jsd@&QJ#e-F^{AuZJQ3TW4{Riqnn*I=y8 z9Z3n5hZ{Zi<9pcMTRXQg3om(PzmXmVI|osWNDhE%Ck#k6*D17RKi5IGG*oAz#sw}# zU4_yTue3b9tq&ocb*kw12=GL>caV}cpXr7p^edpnx}?`hf#tI^UB}jsu$6b!5XxGZW|?T|6ry}W4^`_$NOv=`>#9>}ZfBYLJ_rx*87DQsk}$#~0Z-zLic zDOP?`R?na>OO8)@+;US-Hr6&WDvtkVu3^zz-!m>7M40c(%;GD>dO#f^z)`%1Z5vaN z+sR&?>J^yT?-Qs$?t;w}6CufmLu>^{#gs^*X_5vDDYhZo z_lUDiz?0MoYUUBG{ml-IH*! zA8?f)a0y*nb2jjBrmxk@!=+UYx{t`+h}7`+t0xPWxiZ$2#B9G`Q;9*ucU!(P464+Y zONzCZi*;1@L2?mL+9(M<{wjC#yp4(IfWI_PA=8>itrW8}vvcK!2{lG?ngtn`kYO|i z36`dTF8)h62eJoWPb0V^5${v~(&#A8b|8sHcGVo;apWouL9$nNnQz7*o$q9$_KIoD zRyO4g>C9ouqH`*&H+JDmBM1A@u?(o|!<^rd9fyi;TqXE*wzY<69X8z|8`F?Zzb=vW z8zgJZlbLqj+#zu8K`!Vrf(!Nlefw*@k0;IrD(5L_-B}BKWE5auej+mNWxE?RPv27+ z>Kf_luJCcHmWSn~rA}ao&xd)gRXbRj0N_#D0bKu4V=4=15}x>|AjJDh2bab@823-R z4Q@RY+3fM`wWMIuR!;|$;zLS^4Vft)QZ)W27|ynH@VNmcZWToOJ{yZs$b2kIjN%?8C*o9H+r7$btJvK1uQRQzt(8xF%cUCV#;SiiCgXbQCoc0Uo} zaSiNX>3=z$$~!uG zP*gT@I_#ul{iBom!)W9t*ziW$vs%oVUb7F)D?uFL`3hqN06;fe06+RoYWRQ}&T>y& zF_*KqbKa`gDyO6}*Uj|abKHnx_fCYOyb|7K&Boz`j3u$fm0#C0=4LtpMLI30$N{WC zKNs$Au9?)vLZ0dkV;p|tNo*Ih$?oB(@yYT2FDMh!9LZxGx{_^7zKYnLxjP;-XB*VK z6O={DYJG$vN^0+|>9!^`_+ZpE7$JY?>B#{Q-ru6A?>}^8vCUQvxq%NQ;<&~XKd?hX zSToHHSf6l;*Zh-)fUnx6F#hN#N-6@zKzyK4gyj9w;GYqh;NrJYXeM?pibMvgua)DGs0}uqW1+TN^w& zOi_7hUTGh+p&cxE+$13x5e)Ly6MdkckMT|aRji!@R>4%LmTCEW?H-b)Ie=y)&E*w&HoxPGv7 zBl$Ehf};x;lTHb=9tWoMW1DQe0K1w#<`BoaNn@B3;c+WR@m--Tp1%NLf5{CSx4ZIPl%AD7<@TbB>Z;JF96;Um4eRD?B1Np_Q_`Sro{*0`T5oD9m(z+Yu~HT z@~PX8GYsT$>fySWLZz>QNF}8;{%)iIwfN1xICBEt2JvZ)Hx(tS@;S=RB#J*vS6`eHGr0cux%9^>NWiU|O zur*+AmMn;El+YJ=hcgd7yiDTatE?hyYjv{;a(=_(_62}H0T^o^^}3#ka+&YRFzoc_ z+3A$KtBccnmy{lt;NeJ|raL8ZBk#|wGwNXRH0t$wW4u1vIlo|P$!8-+TRTuqYu3+9 zhz_aYU`$2*I-aJFy|PqSJ1pze2X{>=hUkpEcu9Mr39<*Y%d2LMN-H0}(YOTj(X6X* zZ$FoSy%pUVXMXXC>(rZo_Fb`=z|MuY`x6lJS@9F%8-Bv8At+2ocE{<4f0ahp;9V_? z;Ts!U)UdFyKqq+S`)4-r zI;cMiM`8>*!!c9D4-c=e(9v>U{&IMH8V<`)V6~3<-xmfz8%eFHNH^g7S)Co5))*USX-&fZ=YAY2JW#xhuPb}2Me}2$wS!t#6 zaop>oIO)Zx(cD*Wr9AEci(t_+HMdx01s}`4QKUA;3i0bil;A7Z24O3DVRO!(HP@$c zg^WRUq*WO+VSsSSb^W;8Rs^?juylm?N+is-xh>H%$DtwP-{>)bl`;D0Ls)i}*#_2p zNTHUHfne|A4Z`vSE-iRoY|(7$&}jat-`uV7d8hW(%+dmP zf3PRSk7=Jl2K+jnjjaIM)bvUbUT}?qUqbA@ITu-Gcjyv)9(j=# z$`)DB5%R(6HoDEEcd>2K@*4Lh+qfz>xIcE>X`9?ROoC#BYQ|9*hf05QF#p1lyZv~%etJOa-98IwJf>e*sh_w&%6GLcY1X_9pl(t+*e;3yk+}wRjVeLe zH5of+UQVI!UA+7ydSJ^cAqYkfH9FFv=zm%CIfB5TlKyvNdijMZ2A)#ch)`5uU~nZK za@$e9_fLbSyJixWszUKQ3#3kJHk4*AkKA-PSGmYJL@{?oiBGjj7H>@fSr#cxUxBnA zP@aFYwd%)F-gT3Qm6FW(MGmQAf9K(&)t!{;G)S<23I53P{N&<`rZ+5EphgM-?5cqX z5uXr&(5HCn`KK8iy6l&Bdv@JEE}NM0h*9cEL%X*%pa)4|?!yBaS5ZG_gE;J;wkBIo z+0cs{`a%PVN9d)383-Wt-M*F^xLhy`>J#_}7(;JwX58_sbfR4vq#*lL*b_?Tw893k z0CS88+(~cLfAGqhkn(7WErkB2RBgouoIGBOE!Qil8S?lXR5bpv!c}HsaT0F12wcvE z?St8Vwxes`7Mmk6$5Cj>VUit6iCAWh)VbF?JaCht-aLl^hs8Z8Xn6=3b2ylLp??%iu_F#jb3h0C zoJCrjCZrm6X>`=H(}e8~c;*BFeq60TYh%9#(kK0-^c~5@7IkA~m~SikGBmrh z;3}1W4miAcHI(cqDQ)*9&J~x_VnB5FW4acuHpXa?zOw_?@J;sJrFj9f@p~UUvxr-k zlhq~T(!})H{ht~t5&q3U{%*Sxu;H9iEJ*m?qdG_1h~T&%G)0 zVN?cELE=*AuXIUcc}QFbUFNpb@6?UwZkV{)5KOam!2zC1N4vrthx>=Bz5%1};NPM$ zQH+7gNKKNlQ{Yh$IW`7t&+%Ur-w5j5gAygbNC!TS62iP;Dkxhx*PHy)rc*w*b-N!q z9T`1n-kdeh=+~}lhz?zQbWq8b3T8RFf?6-a zv14U0o~fiq`Zs;M@^h7>becbAcyJeMu;_TOxGzf_Ysv5 zNLa1(IExWPCWBD4j%~H$US#K@7Qdex)-BaVL6vY7efHCaoC!p$qm%u5cFjm&WGPHy zKSGIY+FcND9}=x`7wTt8!pFlO4k)-bEH@UvBIj@c%THvLrgwOz0Lfl+cm%zg7%vJ zWd8LT{JG+pr7M@4xUOCs%KYuR>!vwcZ(Sud-vvt4OsBA(Ukj&~?;#XWJkoBs&@PGYp~?zT6cY$oz)Gm1PR6z-#? zcX{zwWRu0-bf$w#UfX_&W=#)IfZvT4y$>C2T9;@8pXsY~247Sz;iAn<%(fNPv*X($ zY6ePD^at;vg0MlJ+^XTtx{ERt?IK`d}k?AtoVYPrm{?t8mUIf%_Vm7mq83dq`wA6b?I zF%qfDkQAlOZ1HljpltbYzHp*ul7{johXx(RC_Ds+1H~QfDd3Vi?)TJnMiMz|699Pa zKqq5IuFCt2EtZeC@ui3jlxt}}Q)OBByEkoD0sYknd&(Rq-y}bGoyMEx%YJp~S4Q>m zwtjh3@}-^^rW8XrXjG{mTGw839v?kPc@V$EYDZfU!mD4Q|-&{^Nj*}%gq z-R?#x*L1xN$lu2{?PI}W3OeRA<70V@w|M@xbLG| zb8}H6R_H&D0uzG$hix}JAyO_+}?h!eN|XX zFh4vpayUHv_*=Qe_G80`*8)aNO(>_q8>j9-$xCYfC;kFZl;-J7g;{H>6MN19_Akxr zVQM%xqR7Y?-O=igy*Tv;%*f9kY7|UqzF*n@jVMa2i%xv-< zH(67CFp*`Ov{a(Y%Gl1T?54EQucU$Gt1K<86A!+uwx0%CbHuzH&95DuT|};4$RZ)_ zsv)(jVQ~q(c+1Z#*87rw9;N@&*_`RFu6(5u%On?V0<@c`K)05DXI2j_U%V!Z_!Tg3 z?k|9`Wy}7?_@m(7&rMCqcje@7`i6*K%CP!`!i61@I^h!2H(h-lwb0RW}HpXLjtGsU*=4IRVBb!gS$n;Ck z7ao#1QgeF%`6cs<0E15pRk&E&3*dmUeEgTDnz$ePN!yW(3}#TNhY!6@W?w7QtpGlZxv(j*W`Uk<*#EWjcVUC{6% z&7ZV#lt&3!au{-dg0qXztcGTH+uv_q9yE3%{+zq0o>!QYbkn@yn{iF{iB#|IJB)%j z@3AQFC^+eSIO->kq$3bta4C2YKxZwmP(G9aRAtbcKljPP*|7(j?^@zo$#lcrmf)&i z4Y-;gQpIDxN86P74#G13v?3ks9nzR=L5`BKr~`nu0-6ZvDToO(?!bjEx6|rRC{*T7 zpSzOjt!j(_pxlKvqg>a5KwWL3-{+!K9?w+jp1;a~o%I;k&dk@#S6*o_k<)sZqkm|9 z*&=HJFotRD2jpfL@9`rNHUZ^(DwTn92Iq5(BlnSwiT#K1E)E7)X4SU0-7$m`_@Ajw zC0I|zIL|lA90R$D8=7oQPn$QE41ccn^6(f)Iuv+%PI1;9F-4_3J!k@w>1?xnLWx zemv@$28vTHABP()?1hrp4trqJX*}0ds>RTpW@Gvh>lNs zOz?=5(8In5t4JYFO>8>bc;fM+MBeWBm$n+b-L8CANy)p)7FK0IJ9j=mT{~Gp*yL8s z+pTACTLMyRs%P%1=DQ(iYa)pvx~dFea+m$7>)hajXJ~fjm&@cLAmYoD@<=<&ZogKP z2IT#^n1aQ1nBR7&@B!QV`rYj{BJM4Wp-tyZ`&@=p#QfG-fE1C>K<0=)P`yv~j#c2h zY)Y{1enJo-Aj4bxOS5_<(em`-gGs7msq5CZZXMW-2=OzSh+s;BzaJ42t07f;k*OvU ztai-KZk^Aa0}+6B4gA(o3&SPy&zWPJ2;1By4xFeyUs2 zlxUOMrVH#dW)1s;N!2TcKOzK|LcNVfn4tRRdtP$=Lf5&cY{+~cAH9y-w`|(yTr}J( z64NThyPs--OP10yghIp%@TGyfI|ppZa%~|j%d)HwfF`TfIB_?>aNb77_?{(M+mmJS zL1sG2>3D@chjy&;s2^jtUj3vDIx%l^ZwxWJC&6T#+U+jO$;+ggAVcvD$nuOYjO!(I z>fAPDLjaB5UACc9mE7pL6{`mgNELZOx)-ksI$?C0?z?>8W0Em>Yb6RpZZ#T{UY<}> zEuQZz+fa$%erqHI)+qEj#cV5T3w_8E>Ndc9zEayahL>KynhIxZd)9eHR_6*!$+PZT z5&=34zU90DdT-2?MlHqe#aaOpg9~G;v23c$J6a`SQ}j}#(&2f)s6AL&%rGw?UuhjG zeZg_UnWd1CJb%Gq*5cW)FSmOuOvvb~g7 zvZyD{mC!f9R3DwpA*o{NGuFMlu`q1H`am1bX$V=!E50h)?%<_>ijiFkz?=RKJ=h&T z>C(Bs9s+1l0UPrm&4!7gdQB;*)Jef6Y<7$G<5&+1|3nG z`VX&=ZMF}#{ZI7Koa;(_l+!334Dh`}OtWcTzS3wr^G+5(xXhnocafghgb>^>kVjkk zx^*3)e{PTTQf~1w>6n^1Wp5|p;^ED?sXVgU|7-vJ3`m2O(bDk8q`|t;u)#?T%ca!3 zzckW7s13lLI#KF3vil=nU+u8k7jTTEY$N{D z`!e`4`Q*y#J^jmSLEoD@mo8+TR^^Kt8NQ^MEdIAcvEh5l>eWy`GlK{(MOC*(3?{Gg z6|6Nvbbik}EWiH1jtW4{fJalj%?WpF+S-K|3ivIx+#j2uId_#=a*-x8bZERqItIOqdsT82g|a-=O7pvHH@lKbB3vm9+q0!V&*`|KGnfl{v>Uruj;Lm;ED%Ip~6YSY6SOP((O5lj-;Kqif8*rTSUm zYJ%IJKVt@h_5DIsd#d%dBHiC8dZAI_3HWiVtXuga0uoXjEcOT=!(i}gdY4mSzGTNE!pxWTzYz05fR zBeDIMT|awim^x3ZuHO19=o?-T@tU;0YC5kTM{}+cvW9Cqf4$S-CS$lq+sJ#mnM#HI`mt`l~$Jb&usABFx#YU+DO+Z7RU;pG6N%Bq-b>(lh51<$dy!+ zKqtPA%;<;Bc*p-_@y>a{TNww$#yd4uvvezHUiW+?=g7(_6Zipkx4PX4I6v}p=q5X| zcf2ECG=ytP=g$`3BbbP%YK}BIEAyS~bbeiT!A{H2@cpyo;ljV7sWlB#HT#+{_kkLS zFJGHQ(lA~1<19PrSk;#FrGnOe-Ff!qpA%wMqFBoR=~(pt`n+PF;+Hyilt;|As8N~1 ztU0DZ1r^lRJ95GV*NFFD4wM8J=e7zqtV}WlJZLvHkc25Lv%vfLqQbG1144U;!|S>4 z44)2~-e+K5g)ar4KMdH(3%4q%Pf=y+D4sq>UZUe4L^!gQT1xK3Z{$G1CO4NM7 ZzhgeC`|SVo3HtxXDg6KNH3a_7{9msI3Nioy literal 0 HcmV?d00001 diff --git a/bsp/stm32/stm32g070-st-nucleo/project.ewp b/bsp/stm32/stm32g070-st-nucleo/project.ewp new file mode 100644 index 0000000000..7ff56f9134 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/project.ewp @@ -0,0 +1,2326 @@ + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Kernel + + $PROJ_DIR$\..\..\..\src\clock.c + + + $PROJ_DIR$\..\..\..\src\components.c + + + $PROJ_DIR$\..\..\..\src\device.c + + + $PROJ_DIR$\..\..\..\src\idle.c + + + $PROJ_DIR$\..\..\..\src\ipc.c + + + $PROJ_DIR$\..\..\..\src\irq.c + + + $PROJ_DIR$\..\..\..\src\kservice.c + + + $PROJ_DIR$\..\..\..\src\mem.c + + + $PROJ_DIR$\..\..\..\src\mempool.c + + + $PROJ_DIR$\..\..\..\src\object.c + + + $PROJ_DIR$\..\..\..\src\scheduler.c + + + $PROJ_DIR$\..\..\..\src\signal.c + + + $PROJ_DIR$\..\..\..\src\thread.c + + + $PROJ_DIR$\..\..\..\src\timer.c + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + Drivers + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\board\CubeMX_Config\Src\stm32g0xx_hal_msp.c + + + $PROJ_DIR$\..\libraries\STM32G0xx_HAL\CMSIS\Device\ST\STM32G0xx\Source\Templates\iar\startup_stm32g071xx.s + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_gpio.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_usart.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_common.c + + + + cpu + + $PROJ_DIR$\..\..\..\libcpu\arm\common\backtrace.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m0\cpuport.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m0\context_iar.S + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\components\drivers\misc\pin.c + + + $PROJ_DIR$\..\..\..\components\drivers\serial\serial.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\completion.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\dataqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\pipe.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringblk_buf.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringbuffer.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\waitqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\workqueue.c + + + + finsh + + $PROJ_DIR$\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\components\finsh\cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\components\finsh\finsh_compiler.c + + + $PROJ_DIR$\..\..\..\components\finsh\finsh_error.c + + + $PROJ_DIR$\..\..\..\components\finsh\finsh_heap.c + + + $PROJ_DIR$\..\..\..\components\finsh\finsh_init.c + + + $PROJ_DIR$\..\..\..\components\finsh\finsh_node.c + + + $PROJ_DIR$\..\..\..\components\finsh\finsh_ops.c + + + $PROJ_DIR$\..\..\..\components\finsh\finsh_parser.c + + + $PROJ_DIR$\..\..\..\components\finsh\finsh_var.c + + + $PROJ_DIR$\..\..\..\components\finsh\finsh_vm.c + + + $PROJ_DIR$\..\..\..\components\finsh\finsh_token.c + + + + libc + + + STM32_HAL + + $PROJ_DIR$\..\libraries\STM32G0xx_HAL\CMSIS\Device\ST\STM32G0xx\Source\Templates\system_stm32g0xx.c + + + $PROJ_DIR$\..\libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_cec.c + + + $PROJ_DIR$\..\libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_rcc.c + + + $PROJ_DIR$\..\libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_rcc_ex.c + + + $PROJ_DIR$\..\libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_flash.c + + + $PROJ_DIR$\..\libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_flash_ex.c + + + $PROJ_DIR$\..\libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_dma.c + + + $PROJ_DIR$\..\libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_dma_ex.c + + + $PROJ_DIR$\..\libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_pwr.c + + + $PROJ_DIR$\..\libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_pwr_ex.c + + + $PROJ_DIR$\..\libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_cortex.c + + + $PROJ_DIR$\..\libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal.c + + + $PROJ_DIR$\..\libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_gpio.c + + + $PROJ_DIR$\..\libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_uart.c + + + $PROJ_DIR$\..\libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_uart_ex.c + + + $PROJ_DIR$\..\libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_usart_ex.c + + + $PROJ_DIR$\..\libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_usart.c + + + diff --git a/bsp/stm32/stm32g070-st-nucleo/project.eww b/bsp/stm32/stm32g070-st-nucleo/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/stm32/stm32g070-st-nucleo/project.uvprojx b/bsp/stm32/stm32g070-st-nucleo/project.uvprojx new file mode 100644 index 0000000000..309fc164a9 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/project.uvprojx @@ -0,0 +1,762 @@ + + + + 2.1 + +

### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32G070RBTx + STMicroelectronics + Keil.STM32G0xx_DFP.1.2.0 + https://www.keil.com/pack/ + IRAM(0x20000000,0x00009000) IROM(0x08000000,0x00020000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32G0xx_128 -FS08000000 -FL020000 -FP0($$Device:STM32G070RBTx$CMSIS\Flash\STM32G0xx_128.FLM)) + 0 + $$Device:STM32G070RBTx$Drivers\CMSIS\Device\ST\STM32G0xx\Include\stm32g0xx.h + + + + + + + + + + $$Device:STM32G070RBTx$CMSIS\SVD\STM32G070.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\ + template + 1 + 0 + 0 + 1 + 0 + .\build\ + 1 + 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 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP-MPU + DARMCM1.DLL + -pCM0+ + SARMCM3.DLL + -MPU + TARMCM1.DLL + -pCM0+ + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0+" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 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 + 0x9000 + + + 1 + 0x8000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x9000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 4 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + USE_HAL_DRIVER, STM32G070xx + + applications;.;rt-thread\libcpu\arm\common;rt-thread\libcpu\arm\cortex-m0;rt-thread\components\drivers\include;rt-thread\components\drivers\include;rt-thread\components\drivers\include;board;board\CubeMX_Config\Inc;board\ports;libraries\HAL_Drivers;libraries\HAL_Drivers\config;rt-thread\components\finsh;.;rt-thread\include;rt-thread\components\libc\compilers\common;libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Inc;libraries\STM32G0xx_HAL\CMSIS\Device\ST\STM32G0xx\Include;libraries\STM32G0xx_HAL\CMSIS\Include + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + cpu + + + backtrace.c + 1 + rt-thread\libcpu\arm\common\backtrace.c + + + div0.c + 1 + rt-thread\libcpu\arm\common\div0.c + + + showmem.c + 1 + rt-thread\libcpu\arm\common\showmem.c + + + cpuport.c + 1 + rt-thread\libcpu\arm\cortex-m0\cpuport.c + + + context_rvds.S + 2 + rt-thread\libcpu\arm\cortex-m0\context_rvds.S + + + + + DeviceDrivers + + + pin.c + 1 + rt-thread\components\drivers\misc\pin.c + + + serial.c + 1 + rt-thread\components\drivers\serial\serial.c + + + completion.c + 1 + rt-thread\components\drivers\src\completion.c + + + dataqueue.c + 1 + rt-thread\components\drivers\src\dataqueue.c + + + pipe.c + 1 + rt-thread\components\drivers\src\pipe.c + + + ringblk_buf.c + 1 + rt-thread\components\drivers\src\ringblk_buf.c + + + ringbuffer.c + 1 + rt-thread\components\drivers\src\ringbuffer.c + + + waitqueue.c + 1 + rt-thread\components\drivers\src\waitqueue.c + + + workqueue.c + 1 + rt-thread\components\drivers\src\workqueue.c + + + + + Drivers + + + board.c + 1 + board\board.c + + + stm32g0xx_hal_msp.c + 1 + board\CubeMX_Config\Src\stm32g0xx_hal_msp.c + + + startup_stm32g070xx.s + 2 + libraries\STM32G0xx_HAL\CMSIS\Device\ST\STM32G0xx\Source\Templates\arm\startup_stm32g070xx.s + + + drv_gpio.c + 1 + libraries\HAL_Drivers\drv_gpio.c + + + drv_usart.c + 1 + libraries\HAL_Drivers\drv_usart.c + + + drv_common.c + 1 + libraries\HAL_Drivers\drv_common.c + + + + + finsh + + + shell.c + 1 + rt-thread\components\finsh\shell.c + + + cmd.c + 1 + rt-thread\components\finsh\cmd.c + + + msh.c + 1 + rt-thread\components\finsh\msh.c + + + finsh_compiler.c + 1 + rt-thread\components\finsh\finsh_compiler.c + + + finsh_error.c + 1 + rt-thread\components\finsh\finsh_error.c + + + finsh_heap.c + 1 + rt-thread\components\finsh\finsh_heap.c + + + finsh_init.c + 1 + rt-thread\components\finsh\finsh_init.c + + + finsh_node.c + 1 + rt-thread\components\finsh\finsh_node.c + + + finsh_ops.c + 1 + rt-thread\components\finsh\finsh_ops.c + + + finsh_parser.c + 1 + rt-thread\components\finsh\finsh_parser.c + + + finsh_var.c + 1 + rt-thread\components\finsh\finsh_var.c + + + finsh_vm.c + 1 + rt-thread\components\finsh\finsh_vm.c + + + finsh_token.c + 1 + rt-thread\components\finsh\finsh_token.c + + + + + Kernel + + + clock.c + 1 + rt-thread\src\clock.c + + + components.c + 1 + rt-thread\src\components.c + + + device.c + 1 + rt-thread\src\device.c + + + idle.c + 1 + rt-thread\src\idle.c + + + ipc.c + 1 + rt-thread\src\ipc.c + + + irq.c + 1 + rt-thread\src\irq.c + + + kservice.c + 1 + rt-thread\src\kservice.c + + + mem.c + 1 + rt-thread\src\mem.c + + + mempool.c + 1 + rt-thread\src\mempool.c + + + object.c + 1 + rt-thread\src\object.c + + + scheduler.c + 1 + rt-thread\src\scheduler.c + + + signal.c + 1 + rt-thread\src\signal.c + + + thread.c + 1 + rt-thread\src\thread.c + + + timer.c + 1 + rt-thread\src\timer.c + + + + + libc + + + time.c + 1 + rt-thread\components\libc\compilers\common\time.c + + + + + STM32_HAL + + + system_stm32g0xx.c + 1 + libraries\STM32G0xx_HAL\CMSIS\Device\ST\STM32G0xx\Source\Templates\system_stm32g0xx.c + + + stm32g0xx_hal_cec.c + 1 + libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_cec.c + + + stm32g0xx_hal_rcc.c + 1 + libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_rcc.c + + + stm32g0xx_hal_rcc_ex.c + 1 + libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_rcc_ex.c + + + stm32g0xx_hal_flash.c + 1 + libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_flash.c + + + stm32g0xx_hal_flash_ex.c + 1 + libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_flash_ex.c + + + stm32g0xx_hal_dma.c + 1 + libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_dma.c + + + stm32g0xx_hal_dma_ex.c + 1 + libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_dma_ex.c + + + stm32g0xx_hal_pwr.c + 1 + libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_pwr.c + + + stm32g0xx_hal_pwr_ex.c + 1 + libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_pwr_ex.c + + + stm32g0xx_hal_cortex.c + 1 + libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_cortex.c + + + stm32g0xx_hal.c + 1 + libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal.c + + + stm32g0xx_hal_gpio.c + 1 + libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_gpio.c + + + stm32g0xx_hal_uart.c + 1 + libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_uart.c + + + stm32g0xx_hal_uart_ex.c + 1 + libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_uart_ex.c + + + stm32g0xx_hal_usart_ex.c + 1 + libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_hal_usart_ex.c + + + stm32g0xx_ll_usart.c + 1 + libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Src\stm32g0xx_ll_usart.c + + + + + + + + + + + + + + diff --git a/bsp/stm32/stm32g070-st-nucleo/rtconfig.h b/bsp/stm32/stm32g070-st-nucleo/rtconfig.h new file mode 100644 index 0000000000..6abecff5f8 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/rtconfig.h @@ -0,0 +1,169 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* Automatically generated file; DO NOT EDIT. */ +/* RT-Thread Configuration */ + +/* RT-Thread Kernel */ + +#define RT_NAME_MAX 8 +#define RT_ALIGN_SIZE 4 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 100 +#define RT_USING_OVERFLOW_CHECK +#define RT_USING_HOOK +#define RT_USING_IDLE_HOOK +#define RT_IDLE_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 +#define RT_DEBUG +#define RT_DEBUG_COLOR + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_HEAP + +/* Kernel Device Object */ + +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart2" +#define RT_VER_NUM 0x40003 +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M0 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_PRIORITY 10 + +/* C++ features */ + + +/* Command shell */ + +#define RT_USING_FINSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_USING_DESCRIPTION +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 4096 +#define FINSH_CMD_SIZE 80 +#define FINSH_USING_MSH +#define FINSH_USING_MSH_DEFAULT +#define FINSH_ARG_MAX 10 + +/* Device virtual file system */ + + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_PIPE_BUFSZ 512 +#define RT_USING_SERIAL +#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_PIN + +/* Using USB */ + + +/* POSIX layer and C standard library */ + +#define RT_LIBC_USING_TIME + +/* Network */ + +/* Socket abstraction layer */ + + +/* Network interface device */ + + +/* light weight TCP/IP stack */ + + +/* AT commands */ + + +/* VBUS(Virtual Software BUS) */ + + +/* Utilities */ + + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + + +/* Wiced WiFi */ + + +/* IoT Cloud */ + + +/* security packages */ + + +/* language packages */ + + +/* multimedia packages */ + + +/* tools packages */ + + +/* system packages */ + + +/* peripheral libraries and drivers */ + + +/* miscellaneous packages */ + + +/* samples: kernel and components samples */ + +#define SOC_FAMILY_STM32 +#define SOC_SERIES_STM32G0 + +/* Hardware Drivers Config */ + +#define SOC_STM32G070RB + +/* Onboard Peripheral Drivers */ + +#define BSP_USING_USB_TO_UART + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_UART2 + +/* Board extended module Drivers */ + + +#endif diff --git a/bsp/stm32/stm32g070-st-nucleo/rtconfig.py b/bsp/stm32/stm32g070-st-nucleo/rtconfig.py new file mode 100644 index 0000000000..d279b23658 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/rtconfig.py @@ -0,0 +1,150 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m0' +CROSS_TOOL='gcc' + +# bsp lib config +BSP_LIBRARY_TYPE = None + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') + +# cross_tool provides the cross compiler +# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = r'C:\Users\XXYYZZ' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armcc' + EXEC_PATH = r'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iar' + EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' + +if PLATFORM == 'gcc': + # toolchains + PREFIX = 'arm-none-eabi-' + CC = PREFIX + 'gcc' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + CXX = PREFIX + 'g++' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + DEVICE = ' -mcpu=cortex-m0plus -mthumb -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -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-M0 ' + CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' + + CFLAGS += ' -D__MICROLIB ' + AFLAGS += ' --pd "__MICROLIB SETA 1" ' + LFLAGS += ' --library_type=microlib ' + EXEC_PATH += '/ARM/ARMCC/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iar': + # toolchains + CC = 'iccarm' + CXX = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M0' + CFLAGS += ' -e' + CFLAGS += ' --fpu=None' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu Cortex-M0' + AFLAGS += ' --fpu None' + AFLAGS += ' -S' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + + 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/stm32g070-st-nucleo/template.ewp b/bsp/stm32/stm32g070-st-nucleo/template.ewp new file mode 100644 index 0000000000..9c6d9a994e --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/template.ewp @@ -0,0 +1,2074 @@ + + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 31 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 31 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 35 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 22 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + diff --git a/bsp/stm32/stm32g070-st-nucleo/template.eww b/bsp/stm32/stm32g070-st-nucleo/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/stm32/stm32g070-st-nucleo/template.uvprojx b/bsp/stm32/stm32g070-st-nucleo/template.uvprojx new file mode 100644 index 0000000000..585b403d78 --- /dev/null +++ b/bsp/stm32/stm32g070-st-nucleo/template.uvprojx @@ -0,0 +1,390 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32G070RBTx + STMicroelectronics + Keil.STM32G0xx_DFP.1.2.0 + https://www.keil.com/pack/ + IRAM(0x20000000,0x00009000) IROM(0x08000000,0x00020000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32G0xx_128 -FS08000000 -FL020000 -FP0($$Device:STM32G070RBTx$CMSIS\Flash\STM32G0xx_128.FLM)) + 0 + $$Device:STM32G070RBTx$Drivers\CMSIS\Device\ST\STM32G0xx\Include\stm32g0xx.h + + + + + + + + + + $$Device:STM32G070RBTx$CMSIS\SVD\STM32G070.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\ + template + 1 + 0 + 0 + 1 + 0 + .\build\ + 1 + 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 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP-MPU + DARMCM1.DLL + -pCM0+ + SARMCM3.DLL + -MPU + TARMCM1.DLL + -pCM0+ + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4104 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M0+" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 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 + 0x9000 + + + 1 + 0x8000000 + 0x20000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x20000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x9000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 4 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 0 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + .\board\linker_scripts\link.sct + + + + + + + + + + + + + + + + + +
From 22bc88e4aac0f92031e6dafef91174f70547db3d Mon Sep 17 00:00:00 2001 From: NU-LL <1125934312@qq.com> Date: Wed, 1 Jul 2020 20:50:04 +0800 Subject: [PATCH 2/3] fix .travis.yml --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index bef14898d4..1f654c9c74 100644 --- a/.travis.yml +++ b/.travis.yml @@ -103,13 +103,14 @@ env: - RTT_BSP='stm32/stm32f767-atk-apollo' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32f767-fire-challenger' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32f767-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm' + - RTT_BSP='stm32/stm32g070-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32g071-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32g431-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32h743-atk-apollo' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32h743-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32h747-st-discovery' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32l4r9-st-eval' RTT_TOOL_CHAIN='sourcery-arm' - - RTT_BSP='stm32/stm32l010-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm' + - RTT_BSP='stm32/stm32l010-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32l053-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32l412-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32l432-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm' From 9c055e893bb553bac1459b40314ff104c9df44c6 Mon Sep 17 00:00:00 2001 From: NU-LL <1125934312@qq.com> Date: Tue, 7 Jul 2020 10:11:08 +0800 Subject: [PATCH 3/3] Fix format issues --- bsp/stm32/stm32g070-st-nucleo/applications/SConscript | 2 +- bsp/stm32/stm32g070-st-nucleo/board/board.c | 2 +- bsp/stm32/stm32g070-st-nucleo/board/linker_scripts/link.icf | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bsp/stm32/stm32g070-st-nucleo/applications/SConscript b/bsp/stm32/stm32g070-st-nucleo/applications/SConscript index 01eb940dfb..e08e694faf 100644 --- a/bsp/stm32/stm32g070-st-nucleo/applications/SConscript +++ b/bsp/stm32/stm32g070-st-nucleo/applications/SConscript @@ -2,7 +2,7 @@ Import('RTT_ROOT') Import('rtconfig') from building import * -cwd = os.path.join(str(Dir('#')), 'applications') +cwd = os.path.join(str(Dir('#')), 'applications') src = Glob('*.c') CPPPATH = [cwd, str(Dir('#'))] diff --git a/bsp/stm32/stm32g070-st-nucleo/board/board.c b/bsp/stm32/stm32g070-st-nucleo/board/board.c index 2076a612f9..0c907528d0 100644 --- a/bsp/stm32/stm32g070-st-nucleo/board/board.c +++ b/bsp/stm32/stm32g070-st-nucleo/board/board.c @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2020-7-1 NU-LL first version + * 2020-7-1 NU-LL first version */ #include "board.h" diff --git a/bsp/stm32/stm32g070-st-nucleo/board/linker_scripts/link.icf b/bsp/stm32/stm32g070-st-nucleo/board/linker_scripts/link.icf index 5a262a4195..3c754ac8f3 100644 --- a/bsp/stm32/stm32g070-st-nucleo/board/linker_scripts/link.icf +++ b/bsp/stm32/stm32g070-st-nucleo/board/linker_scripts/link.icf @@ -25,4 +25,4 @@ do not initialize { section .noinit }; place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; place in ROM_region { readonly }; -place in RAM_region { readwrite, last block CSTACK}; \ No newline at end of file +place in RAM_region { readwrite, last block CSTACK};