From 317fbd42221280e8137866a044fcd11089831e17 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Tue, 22 Jan 2019 15:07:51 +0800 Subject: [PATCH] [bsp][stm32] add stm32g071-st-nucleo bsp --- .../HAL_Drivers/config/g0/dma_config.h | 57 + .../HAL_Drivers/config/g0/uart_config.h | 167 ++ bsp/stm32/libraries/HAL_Drivers/drv_config.h | 3 + bsp/stm32/libraries/HAL_Drivers/drv_dma.h | 3 +- bsp/stm32/libraries/HAL_Drivers/drv_gpio.c | 2 +- bsp/stm32/libraries/HAL_Drivers/drv_usart.c | 45 +- bsp/stm32/libraries/HAL_Drivers/drv_usart.h | 6 +- bsp/stm32/stm32g071-st-nucleo/.config | 349 +++ bsp/stm32/stm32g071-st-nucleo/.gitignore | 7 + bsp/stm32/stm32g071-st-nucleo/Kconfig | 21 + bsp/stm32/stm32g071-st-nucleo/README.md | 108 + bsp/stm32/stm32g071-st-nucleo/SConscript | 14 + bsp/stm32/stm32g071-st-nucleo/SConstruct | 58 + .../applications/SConscript | 11 + .../stm32g071-st-nucleo/applications/main.c | 33 + .../board/CubeMX_Config/.mxproject | 13 + .../board/CubeMX_Config/Inc/main.h | 103 + .../CubeMX_Config/Inc/stm32g0xx_hal_conf.h | 325 +++ .../board/CubeMX_Config/Inc/stm32g0xx_it.h | 81 + .../board/CubeMX_Config/Src/main.c | 758 ++++++ .../CubeMX_Config/Src/stm32g0xx_hal_msp.c | 717 +++++ .../board/CubeMX_Config/Src/stm32g0xx_it.c | 176 ++ .../CubeMX_Config/Src/system_stm32g0xx.c | 289 ++ .../board/CubeMX_Config/stm32g071rbt6.ioc | 258 ++ bsp/stm32/stm32g071-st-nucleo/board/Kconfig | 63 + .../stm32g071-st-nucleo/board/SConscript | 29 + bsp/stm32/stm32g071-st-nucleo/board/board.c | 59 + bsp/stm32/stm32g071-st-nucleo/board/board.h | 50 + .../board/linker_scripts/link.icf | 28 + .../board/linker_scripts/link.lds | 143 + .../board/linker_scripts/link.sct | 16 + .../stm32g071-st-nucleo/figures/board.jpg | Bin 0 -> 54099 bytes bsp/stm32/stm32g071-st-nucleo/project.ewp | 2333 +++++++++++++++++ bsp/stm32/stm32g071-st-nucleo/project.eww | 10 + bsp/stm32/stm32g071-st-nucleo/project.uvprojx | 890 +++++++ bsp/stm32/stm32g071-st-nucleo/rtconfig.h | 172 ++ bsp/stm32/stm32g071-st-nucleo/rtconfig.py | 134 + bsp/stm32/stm32g071-st-nucleo/template.ewp | 2074 +++++++++++++++ bsp/stm32/stm32g071-st-nucleo/template.eww | 10 + .../stm32g071-st-nucleo/template.uvprojx | 389 +++ 40 files changed, 9989 insertions(+), 15 deletions(-) create mode 100644 bsp/stm32/libraries/HAL_Drivers/config/g0/dma_config.h create mode 100644 bsp/stm32/libraries/HAL_Drivers/config/g0/uart_config.h create mode 100644 bsp/stm32/stm32g071-st-nucleo/.config create mode 100644 bsp/stm32/stm32g071-st-nucleo/.gitignore create mode 100644 bsp/stm32/stm32g071-st-nucleo/Kconfig create mode 100644 bsp/stm32/stm32g071-st-nucleo/README.md create mode 100644 bsp/stm32/stm32g071-st-nucleo/SConscript create mode 100644 bsp/stm32/stm32g071-st-nucleo/SConstruct create mode 100644 bsp/stm32/stm32g071-st-nucleo/applications/SConscript create mode 100644 bsp/stm32/stm32g071-st-nucleo/applications/main.c create mode 100644 bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/.mxproject create mode 100644 bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Inc/main.h create mode 100644 bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Inc/stm32g0xx_hal_conf.h create mode 100644 bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Inc/stm32g0xx_it.h create mode 100644 bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Src/main.c create mode 100644 bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Src/stm32g0xx_hal_msp.c create mode 100644 bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Src/stm32g0xx_it.c create mode 100644 bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Src/system_stm32g0xx.c create mode 100644 bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/stm32g071rbt6.ioc create mode 100644 bsp/stm32/stm32g071-st-nucleo/board/Kconfig create mode 100644 bsp/stm32/stm32g071-st-nucleo/board/SConscript create mode 100644 bsp/stm32/stm32g071-st-nucleo/board/board.c create mode 100644 bsp/stm32/stm32g071-st-nucleo/board/board.h create mode 100644 bsp/stm32/stm32g071-st-nucleo/board/linker_scripts/link.icf create mode 100644 bsp/stm32/stm32g071-st-nucleo/board/linker_scripts/link.lds create mode 100644 bsp/stm32/stm32g071-st-nucleo/board/linker_scripts/link.sct create mode 100644 bsp/stm32/stm32g071-st-nucleo/figures/board.jpg create mode 100644 bsp/stm32/stm32g071-st-nucleo/project.ewp create mode 100644 bsp/stm32/stm32g071-st-nucleo/project.eww create mode 100644 bsp/stm32/stm32g071-st-nucleo/project.uvprojx create mode 100644 bsp/stm32/stm32g071-st-nucleo/rtconfig.h create mode 100644 bsp/stm32/stm32g071-st-nucleo/rtconfig.py create mode 100644 bsp/stm32/stm32g071-st-nucleo/template.ewp create mode 100644 bsp/stm32/stm32g071-st-nucleo/template.eww create mode 100644 bsp/stm32/stm32g071-st-nucleo/template.uvprojx diff --git a/bsp/stm32/libraries/HAL_Drivers/config/g0/dma_config.h b/bsp/stm32/libraries/HAL_Drivers/config/g0/dma_config.h new file mode 100644 index 0000000000..8dd8598a28 --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/config/g0/dma_config.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-01-05 zylx first version + * 2019-01-08 SummerGift clean up the code + */ + +#ifndef __DMA_CONFIG_H__ +#define __DMA_CONFIG_H__ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* DMA1 channel1 */ + +/* DMA1 channel2-3 DMA2 channel1-2 */ +#if defined(BSP_UART1_RX_USING_DMA) && !defined(UART1_RX_DMA_INSTANCE) +#define UART1_DMA_RX_IRQHandler DMA1_Channel2_3_IRQHandler +#define UART1_RX_DMA_RCC RCC_AHBENR_DMA1EN +#define UART1_RX_DMA_INSTANCE DMA1_Channel3 +#define UART1_RX_DMA_IRQ DMA1_Channel2_3_IRQn +#endif +/* DMA1 channel2-3 DMA2 channel1-2 */ + +/* DMA1 channel4-7 DMA2 channel3-5 */ +#if defined(BSP_UART2_RX_USING_DMA) && !defined(UART2_RX_DMA_INSTANCE) +#define UART2_DMA_RX_IRQHandler DMA1_Ch4_7_DMAMUX1_OVR_IRQHandler +#define UART2_RX_DMA_RCC RCC_AHBENR_DMA1EN +#define UART2_RX_DMA_INSTANCE DMA1_Channel5 +#define UART2_RX_DMA_IRQ DMA1_Ch4_7_DMAMUX1_OVR_IRQn +#endif +/* DMA1 channel4-7 DMA2 channel3-5 */ +#if defined(BSP_UART3_RX_USING_DMA) && !defined(UART3_RX_DMA_INSTANCE) +#define UART3_DMA_RX_IRQHandler DMA1_Ch4_7_DMAMUX1_OVR_IRQHandler +#define UART3_RX_DMA_RCC RCC_AHBENR_DMA1EN +#define UART3_RX_DMA_INSTANCE DMA1_Channel4 +#define UART3_RX_DMA_IRQ DMA1_Ch4_7_DMAMUX1_OVR_IRQn +#endif +#if defined(BSP_UART4_RX_USING_DMA) && !defined(UART4_RX_DMA_INSTANCE) +#define UART4_DMA_RX_IRQHandler DMA1_Ch4_7_DMAMUX1_OVR_IRQHandler +#define UART4_RX_DMA_RCC RCC_AHBENR_DMA1EN +#define UART4_RX_DMA_INSTANCE DMA1_Channel6 +#define UART4_RX_DMA_IRQ DMA1_Ch4_7_DMAMUX1_OVR_IRQn +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* __DMA_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/g0/uart_config.h b/bsp/stm32/libraries/HAL_Drivers/config/g0/uart_config.h new file mode 100644 index 0000000000..bca5ef2cc4 --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/config/g0/uart_config.h @@ -0,0 +1,167 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-10-30 zylx first version + */ + +#ifndef __UART_CONFIG_H__ +#define __UART_CONFIG_H__ + +#include + +#if defined(BSP_USING_LPUART1) +#ifndef LPUART1_CONFIG +#define LPUART1_CONFIG \ + { \ + .name = "lpuart1", \ + .Instance = LPUART1, \ + .irq_type = USART3_4_LPUART1_IRQn, \ + } +#endif /* LPUART1_CONFIG */ +#if defined(BSP_LPUART1_RX_USING_DMA) +#ifndef LPUART1_DMA_CONFIG +#define LPUART1_DMA_CONFIG \ + { \ + .Instance = DMA1_Channel1, \ + .dma_rcc = RCC_AHBENR_DMA1EN, \ + .dma_irq = DMA1_Channel1_IRQn, \ + } +#endif /* LPUART1_DMA_CONFIG */ +#endif /* BSP_LPUART1_RX_USING_DMA */ +#endif /* BSP_USING_LPUART1 */ + +#if defined(BSP_USING_UART1) +#ifndef UART1_CONFIG +#define UART1_CONFIG \ + { \ + .name = "uart1", \ + .Instance = USART1, \ + .irq_type = USART1_IRQn, \ + } +#endif /* UART1_CONFIG */ +#endif /* BSP_USING_UART1 */ + +#if defined(BSP_UART1_RX_USING_DMA) +#ifndef UART1_DMA_CONFIG +#define UART1_DMA_CONFIG \ + { \ + .Instance = UART1_RX_DMA_INSTANCE, \ + .dma_rcc = UART1_RX_DMA_RCC, \ + .dma_irq = UART1_RX_DMA_IRQ, \ + } +#endif /* UART1_DMA_CONFIG */ +#endif /* BSP_UART1_RX_USING_DMA */ + +#if defined(BSP_USING_UART2) +#ifndef UART2_CONFIG +#define UART2_CONFIG \ + { \ + .name = "uart2", \ + .Instance = USART2, \ + .irq_type = USART2_IRQn, \ + } +#endif /* UART2_CONFIG */ +#endif /* BSP_USING_UART2 */ + +#if defined(BSP_UART2_RX_USING_DMA) +#ifndef UART2_DMA_CONFIG +#define UART2_DMA_CONFIG \ + { \ + .Instance = UART2_RX_DMA_INSTANCE, \ + .dma_rcc = UART2_RX_DMA_RCC, \ + .dma_irq = UART2_RX_DMA_IRQ, \ + } +#endif /* UART2_DMA_CONFIG */ +#endif /* BSP_UART2_RX_USING_DMA */ + +#if defined(BSP_USING_UART3) +#ifndef UART3_CONFIG +#ifndef SOC_SERIES_STM32G0 +#define UART3_CONFIG \ + { \ + .name = "uart3", \ + .Instance = USART3, \ + .irq_type = USART3_IRQn, \ + } +#else +#define UART3_CONFIG \ + { \ + .name = "uart3", \ + .Instance = USART3, \ + .irq_type = USART3_4_LPUART1_IRQn, \ + } +#endif /* SOC_SERIES_STM32G0 */ +#endif /* UART3_CONFIG */ +#endif /* BSP_USING_UART3 */ + +#if defined(BSP_UART3_RX_USING_DMA) +#ifndef UART3_DMA_CONFIG +#define UART3_DMA_CONFIG \ + { \ + .Instance = UART3_RX_DMA_INSTANCE, \ + .dma_rcc = UART3_RX_DMA_RCC, \ + .dma_irq = UART3_RX_DMA_IRQ, \ + } +#endif /* UART3_DMA_CONFIG */ +#endif /* BSP_UART3_RX_USING_DMA */ + +#if defined(BSP_USING_UART4) +#ifndef UART4_CONFIG +#ifndef SOC_SERIES_STM32G0 +#define UART4_CONFIG \ + { \ + .name = "uart4", \ + .Instance = UART4, \ + .irq_type = UART4_IRQn, \ + } +#else +#define UART4_CONFIG \ + { \ + .name = "uart4", \ + .Instance = USART4, \ + .irq_type = USART3_4_LPUART1_IRQn, \ + } +#endif /* UART4_CONFIG */ +#endif /* SOC_SERIES_STM32G0 */ +#endif /* BSP_USING_UART4 */ + +#if defined(BSP_UART4_RX_USING_DMA) +#ifndef UART4_DMA_CONFIG +#define UART4_DMA_CONFIG \ + { \ + .Instance = UART4_RX_DMA_INSTANCE, \ + .dma_rcc = UART4_RX_DMA_RCC, \ + .dma_irq = UART4_RX_DMA_IRQ, \ + } +#endif /* UART4_DMA_CONFIG */ +#endif /* BSP_UART4_RX_USING_DMA */ + +#if defined(BSP_USING_UART5) +#ifndef UART5_CONFIG +#define UART5_CONFIG \ + { \ + .name = "uart5", \ + .Instance = UART5, \ + .irq_type = UART5_IRQn, \ + } +#endif /* UART5_CONFIG */ +#endif /* BSP_USING_UART5 */ + +#if defined(BSP_UART5_RX_USING_DMA) +#ifndef UART5_DMA_CONFIG +#define UART5_DMA_CONFIG \ + { \ + .Instance = DMA_NOT_AVAILABLE, \ + } +#endif /* UART5_DMA_CONFIG */ +#endif /* BSP_UART5_RX_USING_DMA */ + +#ifdef __cplusplus +} +#endif + +#endif /* __UART_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_config.h b/bsp/stm32/libraries/HAL_Drivers/drv_config.h index 91f0174e41..969c9c139d 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drv_config.h @@ -58,6 +58,9 @@ extern "C" { #include "l4/adc_config.h" #include "l4/tim_config.h" #include "l4/pwm_config.h" +#elif defined(SOC_SERIES_STM32G0) +#include "g0/dma_config.h" +#include "g0/uart_config.h" #endif #ifdef __cplusplus diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_dma.h b/bsp/stm32/libraries/HAL_Drivers/drv_dma.h index 99ccaac2fd..91c3c22e91 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_dma.h +++ b/bsp/stm32/libraries/HAL_Drivers/drv_dma.h @@ -18,7 +18,8 @@ extern "C" { #endif -#if defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) +#if defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) \ + || defined(SOC_SERIES_STM32G0) #define DMA_INSTANCE_TYPE DMA_Channel_TypeDef #elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) #define DMA_INSTANCE_TYPE DMA_Stream_TypeDef diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_gpio.c b/bsp/stm32/libraries/HAL_Drivers/drv_gpio.c index b10eebd393..76cd308299 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_gpio.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_gpio.c @@ -217,7 +217,7 @@ static const struct pin_index pins[] = static const struct pin_irq_map pin_irq_map[] = { -#if defined(SOC_SERIES_STM32F0) +#if defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0) {GPIO_PIN_0, EXTI0_1_IRQn}, {GPIO_PIN_1, EXTI0_1_IRQn}, {GPIO_PIN_2, EXTI2_3_IRQn}, diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_usart.c b/bsp/stm32/libraries/HAL_Drivers/drv_usart.c index 6dbade3578..fa25402f09 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_usart.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_usart.c @@ -18,7 +18,8 @@ #define LOG_TAG "drv.usart" #include -#if !defined(BSP_USING_UART1) && !defined(BSP_USING_UART2) && !defined(BSP_USING_UART3) && !defined(BSP_USING_UART4) && !defined(BSP_USING_UART5) +#if !defined(BSP_USING_UART1) && !defined(BSP_USING_UART2) && !defined(BSP_USING_UART3) \ + && !defined(BSP_USING_UART4) && !defined(BSP_USING_UART5) && !defined(BSP_USING_LPUART1) #error "Please define at least one BSP_USING_UARTx" /* this driver can be disabled at menuconfig → RT-Thread Components → Device Drivers */ #endif @@ -44,6 +45,9 @@ enum #ifdef BSP_USING_UART5 UART5_INDEX, #endif +#ifdef BSP_USING_LPUART1 + LPUART1_INDEX, +#endif }; static struct stm32_uart_config uart_config[] = @@ -63,6 +67,9 @@ static struct stm32_uart_config uart_config[] = #ifdef BSP_USING_UART5 UART5_CONFIG, #endif +#ifdef BSP_USING_LPUART1 + LPUART1_CONFIG, +#endif }; static struct stm32_uart uart_obj[sizeof(uart_config) / sizeof(uart_config[0])] = {0}; @@ -175,7 +182,8 @@ static int stm32_putc(struct rt_serial_device *serial, char c) uart = (struct stm32_uart *)serial->parent.user_data; UART_INSTANCE_CLEAR_FUNCTION(&(uart->handle), UART_FLAG_TC); -#if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32F0) +#if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32F0) \ + || defined(SOC_SERIES_STM32G0) uart->handle.Instance->TDR = c; #else uart->handle.Instance->DR = c; @@ -195,7 +203,8 @@ static int stm32_getc(struct rt_serial_device *serial) ch = -1; if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_RXNE) != RESET) { -#if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32F0) +#if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32F0) \ + || defined(SOC_SERIES_STM32G0) ch = uart->handle.Instance->RDR & 0xff; #else ch = uart->handle.Instance->DR & 0xff; @@ -271,7 +280,8 @@ static void uart_isr(struct rt_serial_device *serial) { __HAL_UART_CLEAR_PEFLAG(&uart->handle); } -#if !defined(SOC_SERIES_STM32L4) && !defined(SOC_SERIES_STM32F7) && !defined(SOC_SERIES_STM32F0) +#if !defined(SOC_SERIES_STM32L4) && !defined(SOC_SERIES_STM32F7) && !defined(SOC_SERIES_STM32F0) \ + && !defined(SOC_SERIES_STM32G0) if (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_LBD) != RESET) { UART_INSTANCE_CLEAR_FUNCTION(&(uart->handle), UART_FLAG_LBD); @@ -421,6 +431,19 @@ void UART5_DMA_RX_IRQHandler(void) #endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART5_RX_USING_DMA) */ #endif /* BSP_USING_UART5*/ +#if defined(BSP_USING_LPUART1) +void USART3_4_LPUART1_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + uart_isr(&(uart_obj[LPUART1_INDEX].serial)); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif + #ifdef RT_SERIAL_USING_DMA static void stm32_dma_config(struct rt_serial_device *serial) { @@ -433,7 +456,7 @@ static void stm32_dma_config(struct rt_serial_device *serial) { rt_uint32_t tmpreg= 0x00U; -#if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F0) +#if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0) /* enable DMA clock && Delay after an RCC peripheral clock enabling*/ SET_BIT(RCC->AHBENR, uart->config->dma_rx->dma_rcc); tmpreg = READ_BIT(RCC->AHBENR, uart->config->dma_rx->dma_rcc); @@ -444,10 +467,10 @@ static void stm32_dma_config(struct rt_serial_device *serial) #endif UNUSED(tmpreg); /* To avoid compiler warnings */ } - + __HAL_LINKDMA(&(uart->handle), hdmarx, uart->dma.handle); -#if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F0) +#if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0) uart->dma.handle.Instance = uart->config->dma_rx->Instance; #elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) uart->dma.handle.Instance = uart->config->dma_rx->Instance; @@ -579,7 +602,7 @@ int rt_hw_usart_init(void) rt_size_t obj_num = sizeof(uart_obj) / sizeof(struct stm32_uart); struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; rt_err_t result = 0; - + stm32_uart_get_dma_config(); for (int i = 0; i < obj_num; i++) @@ -587,8 +610,8 @@ int rt_hw_usart_init(void) uart_obj[i].config = &uart_config[i]; uart_obj[i].serial.ops = &stm32_uart_ops; uart_obj[i].serial.config = config; - -#if defined(RT_SERIAL_USING_DMA) + +#if defined(RT_SERIAL_USING_DMA) if(uart_obj[i].uart_dma_flag) { /* register UART device */ @@ -597,7 +620,7 @@ int rt_hw_usart_init(void) ,&uart_obj[i]); } else -#endif +#endif { /* register UART device */ result = rt_hw_serial_register(&uart_obj[i].serial,uart_obj[i].config->name, diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_usart.h b/bsp/stm32/libraries/HAL_Drivers/drv_usart.h index c24220cf05..ebd6a717f0 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_usart.h +++ b/bsp/stm32/libraries/HAL_Drivers/drv_usart.h @@ -19,13 +19,15 @@ int rt_hw_usart_init(void); -#if defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) +#if defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) \ + || defined(SOC_SERIES_STM32G0) #define DMA_INSTANCE_TYPE DMA_Channel_TypeDef #elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) #define DMA_INSTANCE_TYPE DMA_Stream_TypeDef #endif /* defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) */ -#if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F4) +#if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F4) \ + || defined(SOC_SERIES_STM32G0) #define UART_INSTANCE_CLEAR_FUNCTION __HAL_UART_CLEAR_FLAG #elif defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32F0) #define UART_INSTANCE_CLEAR_FUNCTION __HAL_UART_CLEAR_IT diff --git a/bsp/stm32/stm32g071-st-nucleo/.config b/bsp/stm32/stm32g071-st-nucleo/.config new file mode 100644 index 0000000000..1e6c3689a0 --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/.config @@ -0,0 +1,349 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=4 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=100 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDEL_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +# CONFIG_RT_USING_TIMER_SOFT is not set +CONFIG_RT_DEBUG=y +# CONFIG_RT_DEBUG_INIT_CONFIG is not set +# CONFIG_RT_DEBUG_THREAD_CONFIG is not set +# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set +# CONFIG_RT_DEBUG_IPC_CONFIG is not set +# CONFIG_RT_DEBUG_TIMER_CONFIG is not set +# CONFIG_RT_DEBUG_IRQ_CONFIG is not set +# CONFIG_RT_DEBUG_MEM_CONFIG is not set +# CONFIG_RT_DEBUG_SLAB_CONFIG is not set +# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set +# CONFIG_RT_DEBUG_MODULE_CONFIG is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +# CONFIG_RT_USING_MEMHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMTRACE is not set +CONFIG_RT_USING_HEAP=y + +# +# Kernel Device Object +# +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="lpuart1" +CONFIG_RT_VER_NUM=0x40000 +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M0=y +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 + +# +# C++ features +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Command shell +# +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=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_SERIAL=y +# CONFIG_RT_SERIAL_USING_DMA is not set +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_MTD is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set + +# +# Using WiFi +# +# CONFIG_RT_USING_WIFI is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# POSIX layer and C standard library +# +# CONFIG_RT_USING_LIBC is not set +# CONFIG_RT_USING_PTHREADS is not set + +# +# Network +# + +# +# Socket abstraction layer +# +# CONFIG_RT_USING_SAL is not set + +# +# light weight TCP/IP stack +# +# CONFIG_RT_USING_LWIP is not set + +# +# Modbus master and slave stack +# +# CONFIG_RT_USING_MODBUS is not set + +# +# AT commands +# +# CONFIG_RT_USING_AT is not set + +# +# VBUS(Virtual Software BUS) +# +# CONFIG_RT_USING_VBUS is not set + +# +# Utilities +# +# CONFIG_RT_USING_LOGTRACE is not set +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set + +# +# ARM CMSIS +# +# CONFIG_RT_USING_CMSIS_OS is not set +# CONFIG_RT_USING_RTT_CMSIS is not set +# CONFIG_RT_USING_LWP is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_EZXML is not set +# CONFIG_PKG_USING_NANOPB is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_WIZNET is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set +# CONFIG_PKG_USING_TENCENT_IOTKIT is not set + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_libsodium is not set +# CONFIG_PKG_USING_TINYCRYPT is not set + +# +# language packages +# +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set + +# +# multimedia packages +# +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set + +# +# system packages +# +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_FAL is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_CMSIS is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set + +# +# peripheral libraries and drivers +# +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_U8G2 is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set + +# +# miscellaneous packages +# +# CONFIG_PKG_USING_LIBCSV is not set +# CONFIG_PKG_USING_OPTPARSE is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set + +# +# 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_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32G0=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_STM32G071RB=y + +# +# Onboard Peripheral Drivers +# +CONFIG_BSP_USING_USB_TO_USART=y + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_LPUART1=y +# CONFIG_BSP_USING_UART1 is not set +# CONFIG_BSP_USING_UART2 is not set + +# +# Board extended module Drivers +# diff --git a/bsp/stm32/stm32g071-st-nucleo/.gitignore b/bsp/stm32/stm32g071-st-nucleo/.gitignore new file mode 100644 index 0000000000..d45e936a4a --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/.gitignore @@ -0,0 +1,7 @@ +settings +build + +*.uvguix.* +*.uvoptx +settings/* +build/* diff --git a/bsp/stm32/stm32g071-st-nucleo/Kconfig b/bsp/stm32/stm32g071-st-nucleo/Kconfig new file mode 100644 index 0000000000..8c9d8002cf --- /dev/null +++ b/bsp/stm32/stm32g071-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/stm32g071-st-nucleo/README.md b/bsp/stm32/stm32g071-st-nucleo/README.md new file mode 100644 index 0000000000..409e67bce1 --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/README.md @@ -0,0 +1,108 @@ +# BSP README 模板 + +## 简介 + +本文档为 RT-Thread 开发团队为 STM32G071RB-Nucleo 开发板提供的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。 + +## 开发板介绍 + +STM32G071RB-Nucleo 开发板是 ST 官方推出的一款基于 ARM Cortex-M0+ 内核的开发板,最高主频为 64Mhz,该开发板具有丰富的扩展接口,可以方便验证 STM32G071RB 的芯片性能。 + +开发板外观如下图所示: + +![board](figures/board.jpg) + +该开发板常用 **板载资源** 如下: + +- MCU:STM32G071RB,主频 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-g071rb.html)。 + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :----------------- | :----------: | :------------------------------------- | +| ST-LINK 虚拟串口 | 支持 | 使用 LPUART | +| **片上外设** | **支持情况** | **备注** | +| GPIO | 支持 | PA0, PA1... PC15 ---> PIN: 0, 1...47 | +| UART | 支持 | LPUART1, USART1/2 | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + + +### 快速上手 + +本 BSP 为开发者提供 MDK4、MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线连接开发板到 PC,打开电源开关。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 xxx 仿真器下载程序,在通过 xxx 连接开发板的基础上,点击下载按钮即可下载程序到开发板 + +#### 运行结果 + +下载程序成功之后,系统会自动运行。 + +连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + +```bash + \ | / +- RT - Thread Operating System + / | \ 4.0.0 build Dec 21 2018 + 2006 - 2018 Copyright by rt-thread team +msh > +``` +### 进阶使用 + +此 BSP 默认只开启了 GPIO 和 LPUART 的功能,如果需使用 SPI,I2C 等更多高级功能,需要利用 ENV 工具对BSP 进行配置,步骤如下: + +1. 在 bsp 下打开 env 工具。 + +2. 输入`menuconfig`命令配置工程,配置好之后保存退出。 + +3. 输入`pkgs --update`命令更新软件包。 + +4. 输入`scons --target=mdk5/iar` 命令重新生成工程。 + +本章节更多详细的介绍请参考 [STM32 系列 BSP 外设驱动使用教程](../docs/STM32系列BSP外设驱动使用教程.md)。 + +## 注意事项 + +- 无 + +## 联系人信息 + +维护人: + +- [gztss](https://github.com/gztss) \ No newline at end of file diff --git a/bsp/stm32/stm32g071-st-nucleo/SConscript b/bsp/stm32/stm32g071-st-nucleo/SConscript new file mode 100644 index 0000000000..fe0ae941ae --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/SConscript @@ -0,0 +1,14 @@ +# for module compiling +import os +Import('RTT_ROOT') + +cwd = str(Dir('#')) +objs = [] +list = os.listdir(cwd) + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +Return('objs') diff --git a/bsp/stm32/stm32g071-st-nucleo/SConstruct b/bsp/stm32/stm32g071-st-nucleo/SConstruct new file mode 100644 index 0000000000..59e76d2f2e --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/SConstruct @@ -0,0 +1,58 @@ +import os +import sys +import rtconfig + +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') +else: + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + +sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] +try: + from building import * +except: + print('Cannot found RT-Thread root directory, please check RTT_ROOT') + print(RTT_ROOT) + exit(-1) + +TARGET = 'rt-thread.' + rtconfig.TARGET_EXT + +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM == 'iar': + env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = env["LINKCOM"] + ' --map rt-thread.map') + +Export('RTT_ROOT') +Export('rtconfig') + +SDK_ROOT = os.path.abspath('./') + +if os.path.exists(SDK_ROOT + '/libraries'): + libraries_path_prefix = SDK_ROOT + '/libraries' +else: + libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries' + +SDK_LIB = libraries_path_prefix +Export('SDK_LIB') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +stm32_library = '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/stm32g071-st-nucleo/applications/SConscript b/bsp/stm32/stm32g071-st-nucleo/applications/SConscript new file mode 100644 index 0000000000..01eb940dfb --- /dev/null +++ b/bsp/stm32/stm32g071-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/stm32g071-st-nucleo/applications/main.c b/bsp/stm32/stm32g071-st-nucleo/applications/main.c new file mode 100644 index 0000000000..47761d5012 --- /dev/null +++ b/bsp/stm32/stm32g071-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 LED_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/stm32g071-st-nucleo/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/.mxproject new file mode 100644 index 0000000000..5f8b4fdf7c --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/.mxproject @@ -0,0 +1,13 @@ +[PreviousGenFiles] +HeaderPath=C:/Users/Administrator/Documents/rt-thread/bsp/stm32/stm32g071-nucleo/board/CubeMX_Config/Inc +HeaderFiles=stm32g0xx_it.h;stm32g0xx_hal_conf.h;main.h; +SourcePath=C:/Users/Administrator/Documents/rt-thread/bsp/stm32/stm32g071-nucleo/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_dac.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_dac_ex.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_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.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_tim_ex.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_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_def.h;Drivers/STM32G0xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.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_dac.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dac_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_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_rcc.c;Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc_ex.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/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_dac.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_dac_ex.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_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.h;Drivers/STM32G0xx_HAL_Driver/Inc/stm32g0xx_hal_tim_ex.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_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_def.h;Drivers/STM32G0xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/CMSIS/Device/ST/STM32G0xx/Include/stm32g071xx.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;Drivers/CMSIS/Include/arm_common_tables.h;Drivers/CMSIS/Include/arm_const_structs.h;Drivers/CMSIS/Include/arm_math.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armcc_V6.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_cmFunc.h;Drivers/CMSIS/Include/core_cmInstr.h;Drivers/CMSIS/Include/core_cmSimd.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h; + +[PreviousUsedKeilFiles] +SourceFiles=..\Src\main.c;..\Src\stm32g0xx_it.c;..\Src\stm32g0xx_hal_msp.c;../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_dac.c;../Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dac_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_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_rcc.c;../Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc_ex.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;../\Src/system_stm32g0xx.c;../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_dac.c;../Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_dac_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_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_rcc.c;../Drivers/STM32G0xx_HAL_Driver/Src/stm32g0xx_hal_rcc_ex.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;../\Src/system_stm32g0xx.c;../Drivers/CMSIS/Device/ST/STM32G0xx/Source/Templates/system_stm32g0xx.c;C:/Users/Administrator/Documents/rt-thread/bsp/stm32/stm32g071-nucleo/board/CubeMX_Config//MDK-ARM/startup_stm32g071xx.s; +HeaderPath=..\Drivers\STM32G0xx_HAL_Driver\Inc;..\Drivers\STM32G0xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32G0xx\Include;..\Drivers\CMSIS\Include;..\Inc; + diff --git a/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Inc/main.h new file mode 100644 index 0000000000..b69b089d11 --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Inc/main.h @@ -0,0 +1,103 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2019 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* 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" + +/* 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 LPUART1_TX_Pin GPIO_PIN_2 +#define LPUART1_TX_GPIO_Port GPIOA +#define LPUART1_RX_Pin GPIO_PIN_3 +#define LPUART1_RX_GPIO_Port GPIOA +#define 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/stm32g071-st-nucleo/board/CubeMX_Config/Inc/stm32g0xx_hal_conf.h b/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Inc/stm32g0xx_hal_conf.h new file mode 100644 index 0000000000..d925a32adf --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Inc/stm32g0xx_hal_conf.h @@ -0,0 +1,325 @@ +/** + ****************************************************************************** + * @file stm32g0xx_hal_conf.h + * @author MCD Application Team + * @brief HAL configuration template file. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2019 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef 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_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 modules 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/stm32g071-st-nucleo/board/CubeMX_Config/Inc/stm32g0xx_it.h b/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Inc/stm32g0xx_it.h new file mode 100644 index 0000000000..e51b857582 --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Inc/stm32g0xx_it.h @@ -0,0 +1,81 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g0xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * + * COPYRIGHT(c) 2019 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* 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); +void USART3_4_LPUART1_IRQHandler(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/stm32g071-st-nucleo/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Src/main.c new file mode 100644 index 0000000000..38a25e412e --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Src/main.c @@ -0,0 +1,758 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2019 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* 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; + +DAC_HandleTypeDef hdac1; + +UART_HandleTypeDef hlpuart1; +UART_HandleTypeDef huart1; +UART_HandleTypeDef huart2; +UART_HandleTypeDef huart3; + +SPI_HandleTypeDef hspi1; +SPI_HandleTypeDef hspi2; + +TIM_HandleTypeDef htim2; +TIM_HandleTypeDef htim3; + +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_LPUART1_UART_Init(void); +static void MX_ADC1_Init(void); +static void MX_TIM2_Init(void); +static void MX_TIM3_Init(void); +static void MX_USART1_UART_Init(void); +static void MX_USART2_UART_Init(void); +static void MX_USART3_UART_Init(void); +static void MX_SPI1_Init(void); +static void MX_SPI2_Init(void); +static void MX_DAC1_Init(void); +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_LPUART1_UART_Init(); + MX_ADC1_Init(); + MX_TIM2_Init(); + MX_TIM3_Init(); + MX_USART1_UART_Init(); + MX_USART2_UART_Init(); + MX_USART3_UART_Init(); + MX_SPI1_Init(); + MX_SPI2_Init(); + MX_DAC1_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); + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1; + RCC_OscInitStruct.PLL.PLLN = 8; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; + RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /**Initializes the CPU, AHB and APB 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_LPUART1|RCC_PERIPHCLK_ADC; + PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1; + PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_SYSCLK; + 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_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_ASYNC_DIV8; + 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 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 DAC1 Initialization Function + * @param None + * @retval None + */ +static void MX_DAC1_Init(void) +{ + + /* USER CODE BEGIN DAC1_Init 0 */ + + /* USER CODE END DAC1_Init 0 */ + + DAC_ChannelConfTypeDef sConfig = {0}; + + /* USER CODE BEGIN DAC1_Init 1 */ + + /* USER CODE END DAC1_Init 1 */ + /**DAC Initialization + */ + hdac1.Instance = DAC1; + if (HAL_DAC_Init(&hdac1) != HAL_OK) + { + Error_Handler(); + } + /**DAC channel OUT1 config + */ + sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE; + sConfig.DAC_Trigger = DAC_TRIGGER_NONE; + sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE; + sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE; + sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY; + if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + /**DAC channel OUT2 config + */ + sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE; + if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN DAC1_Init 2 */ + + /* USER CODE END DAC1_Init 2 */ + +} + +/** + * @brief LPUART1 Initialization Function + * @param None + * @retval None + */ +static void MX_LPUART1_UART_Init(void) +{ + + /* USER CODE BEGIN LPUART1_Init 0 */ + + /* USER CODE END LPUART1_Init 0 */ + + /* USER CODE BEGIN LPUART1_Init 1 */ + + /* USER CODE END LPUART1_Init 1 */ + hlpuart1.Instance = LPUART1; + hlpuart1.Init.BaudRate = 115200; + hlpuart1.Init.WordLength = UART_WORDLENGTH_8B; + hlpuart1.Init.StopBits = UART_STOPBITS_1; + hlpuart1.Init.Parity = UART_PARITY_NONE; + hlpuart1.Init.Mode = UART_MODE_TX_RX; + hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; + hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + hlpuart1.Init.ClockPrescaler = UART_PRESCALER_DIV1; + hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + hlpuart1.FifoMode = UART_FIFOMODE_DISABLE; + if (HAL_UART_Init(&hlpuart1) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_SetTxFifoThreshold(&hlpuart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_SetRxFifoThreshold(&hlpuart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_DisableFifoMode(&hlpuart1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN LPUART1_Init 2 */ + + /* USER CODE END LPUART1_Init 2 */ + +} + +/** + * @brief 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_7B; + 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_7B; + 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(); + } + if (HAL_UARTEx_SetTxFifoThreshold(&huart3, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_SetRxFifoThreshold(&huart3, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK) + { + Error_Handler(); + } + if (HAL_UARTEx_DisableFifoMode(&huart3) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART3_Init 2 */ + + /* USER CODE END USART3_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 TIM2 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM2_Init(void) +{ + + /* USER CODE BEGIN TIM2_Init 0 */ + + /* USER CODE END TIM2_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM2_Init 1 */ + + /* USER CODE END TIM2_Init 1 */ + htim2.Instance = TIM2; + htim2.Init.Prescaler = 0; + htim2.Init.CounterMode = TIM_COUNTERMODE_UP; + htim2.Init.Period = 0; + htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim2) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM2_Init 2 */ + + /* USER CODE END TIM2_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_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_TIMING; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_OC_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + 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 GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOF_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Src/stm32g0xx_hal_msp.c b/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Src/stm32g0xx_hal_msp.c new file mode 100644 index 0000000000..3cfed698d3 --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Src/stm32g0xx_hal_msp.c @@ -0,0 +1,717 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : stm32g0xx_hal_msp.c + * Description : This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2019 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* 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 + PA1 ------> ADC1_IN1 + */ + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; + 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 + PA1 ------> ADC1_IN1 + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0|GPIO_PIN_1); + + /* USER CODE BEGIN ADC1_MspDeInit 1 */ + + /* USER CODE END ADC1_MspDeInit 1 */ + } + +} + +/** +* @brief DAC MSP Initialization +* This function configures the hardware resources used in this example +* @param hdac: DAC handle pointer +* @retval None +*/ +void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hdac->Instance==DAC1) + { + /* USER CODE BEGIN DAC1_MspInit 0 */ + + /* USER CODE END DAC1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_DAC1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**DAC1 GPIO Configuration + PA4 ------> DAC1_OUT1 + PA5 ------> DAC1_OUT2 + */ + GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN DAC1_MspInit 1 */ + + /* USER CODE END DAC1_MspInit 1 */ + } + +} + +/** +* @brief DAC MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hdac: DAC handle pointer +* @retval None +*/ + +void HAL_DAC_MspDeInit(DAC_HandleTypeDef* hdac) +{ + + if(hdac->Instance==DAC1) + { + /* USER CODE BEGIN DAC1_MspDeInit 0 */ + + /* USER CODE END DAC1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_DAC1_CLK_DISABLE(); + + /**DAC1 GPIO Configuration + PA4 ------> DAC1_OUT1 + PA5 ------> DAC1_OUT2 + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4|GPIO_PIN_5); + + /* USER CODE BEGIN DAC1_MspDeInit 1 */ + + /* USER CODE END DAC1_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==LPUART1) + { + /* USER CODE BEGIN LPUART1_MspInit 0 */ + + /* USER CODE END LPUART1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_LPUART1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**LPUART1 GPIO Configuration + PA2 ------> LPUART1_TX + PA3 ------> LPUART1_RX + */ + GPIO_InitStruct.Pin = LPUART1_TX_Pin|LPUART1_RX_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF6_LPUART1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* LPUART1 interrupt Init */ + HAL_NVIC_SetPriority(USART3_4_LPUART1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(USART3_4_LPUART1_IRQn); + /* USER CODE BEGIN LPUART1_MspInit 1 */ + + /* USER CODE END LPUART1_MspInit 1 */ + } + else 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_PULLUP; + 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(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + /**USART2 GPIO Configuration + PA15 ------> USART2_RX + PD5 ------> USART2_TX + */ + GPIO_InitStruct.Pin = GPIO_PIN_15; + 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); + + GPIO_InitStruct.Pin = GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF0_USART2; + HAL_GPIO_Init(GPIOD, &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_PULLUP; + 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_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF4_USART3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USART3 interrupt Init */ + HAL_NVIC_SetPriority(USART3_4_LPUART1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(USART3_4_LPUART1_IRQn); + /* 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==LPUART1) + { + /* USER CODE BEGIN LPUART1_MspDeInit 0 */ + + /* USER CODE END LPUART1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_LPUART1_CLK_DISABLE(); + + /**LPUART1 GPIO Configuration + PA2 ------> LPUART1_TX + PA3 ------> LPUART1_RX + */ + HAL_GPIO_DeInit(GPIOA, LPUART1_TX_Pin|LPUART1_RX_Pin); + + /* LPUART1 interrupt DeInit */ + /* USER CODE BEGIN LPUART1:USART3_4_LPUART1_IRQn disable */ + /** + * Uncomment the line below to disable the "USART3_4_LPUART1_IRQn" interrupt + * Be aware, disabling shared interrupt may affect other IPs + */ + /* HAL_NVIC_DisableIRQ(USART3_4_LPUART1_IRQn); */ + /* USER CODE END LPUART1:USART3_4_LPUART1_IRQn disable */ + + /* USER CODE BEGIN LPUART1_MspDeInit 1 */ + + /* USER CODE END LPUART1_MspDeInit 1 */ + } + else 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 + PA15 ------> USART2_RX + PD5 ------> USART2_TX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_15); + + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_5); + + /* 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); + + /* USART3 interrupt DeInit */ + /* USER CODE BEGIN USART3:USART3_4_LPUART1_IRQn disable */ + /** + * Uncomment the line below to disable the "USART3_4_LPUART1_IRQn" interrupt + * Be aware, disabling shared interrupt may affect other IPs + */ + /* HAL_NVIC_DisableIRQ(USART3_4_LPUART1_IRQn); */ + /* USER CODE END USART3:USART3_4_LPUART1_IRQn disable */ + + /* USER CODE BEGIN USART3_MspDeInit 1 */ + + /* USER CODE END USART3_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(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + /**SPI1 GPIO Configuration + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + PD8 ------> SPI1_SCK + */ + 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_AF0_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_8; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF1_SPI1; + HAL_GPIO_Init(GPIOD, &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 + PB13 ------> 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_13; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF0_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 + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + PD8 ------> SPI1_SCK + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_6|GPIO_PIN_7); + + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_8); + + /* 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 + PB13 ------> SPI2_SCK + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_2|GPIO_PIN_3); + + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13); + + /* 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==TIM2) + { + /* USER CODE BEGIN TIM2_MspInit 0 */ + + /* USER CODE END TIM2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM2_CLK_ENABLE(); + /* USER CODE BEGIN TIM2_MspInit 1 */ + + /* USER CODE END TIM2_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_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**TIM3 GPIO Configuration + PB0 ------> TIM3_CH3 + PB1 ------> TIM3_CH4 + PC6 ------> TIM3_CH1 + PC7 ------> TIM3_CH2 + */ + 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); + + 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(GPIOC, &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==TIM2) + { + /* USER CODE BEGIN TIM2_MspDeInit 0 */ + + /* USER CODE END TIM2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM2_CLK_DISABLE(); + /* USER CODE BEGIN TIM2_MspDeInit 1 */ + + /* USER CODE END TIM2_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 */ + } + +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Src/stm32g0xx_it.c b/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Src/stm32g0xx_it.c new file mode 100644 index 0000000000..eafaa01acf --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Src/stm32g0xx_it.c @@ -0,0 +1,176 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32g0xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * + * COPYRIGHT(c) 2019 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* 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 --------------------------------------------------------*/ +extern UART_HandleTypeDef hlpuart1; +extern UART_HandleTypeDef huart3; +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex 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). */ +/******************************************************************************/ + +/** + * @brief This function handles USART3, USART4 and LPUART1 interrupts / LPUART1 wake-up interrupt through EXTI line 28. + */ +void USART3_4_LPUART1_IRQHandler(void) +{ + /* USER CODE BEGIN USART3_4_LPUART1_IRQn 0 */ + + /* USER CODE END USART3_4_LPUART1_IRQn 0 */ + HAL_UART_IRQHandler(&huart3); + HAL_UART_IRQHandler(&hlpuart1); + /* USER CODE BEGIN USART3_4_LPUART1_IRQn 1 */ + + /* USER CODE END USART3_4_LPUART1_IRQn 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Src/system_stm32g0xx.c b/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Src/system_stm32g0xx.c new file mode 100644 index 0000000000..b8b2611797 --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/Src/system_stm32g0xx.c @@ -0,0 +1,289 @@ +/** + ****************************************************************************** + * @file system_stm32g0xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M0+ Device Peripheral Access Layer System Source File + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32g0xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * After each device reset the HSI (8 MHz then 16 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32g0xx.s" file, to + * configure the system clock before to branch to main program. + * + * This file configures the system clock as follows: + *============================================================================= + *----------------------------------------------------------------------------- + * System Clock source | HSI + *----------------------------------------------------------------------------- + * SYSCLK(Hz) | 16000000 + *----------------------------------------------------------------------------- + * HCLK(Hz) | 16000000 + *----------------------------------------------------------------------------- + * AHB Prescaler | 1 + *----------------------------------------------------------------------------- + * APB Prescaler | 1 + *----------------------------------------------------------------------------- + * HSI Division factor | 1 + *----------------------------------------------------------------------------- + * PLL_M | 1 + *----------------------------------------------------------------------------- + * PLL_N | 8 + *----------------------------------------------------------------------------- + * PLL_P | 7 + *----------------------------------------------------------------------------- + * PLL_Q | 2 + *----------------------------------------------------------------------------- + * PLL_R | 2 + *----------------------------------------------------------------------------- + * Require 48MHz for RNG | Disabled + *----------------------------------------------------------------------------- + *============================================================================= + ****************************************************************************** + * @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 + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32g0xx_system + * @{ + */ + +/** @addtogroup STM32G0xx_System_Private_Includes + * @{ + */ + +#include "stm32g0xx.h" + +#if !defined (HSE_VALUE) +#define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +#if !defined (LSI_VALUE) + #define LSI_VALUE 32000U /*!< Value of LSI in Hz*/ +#endif /* LSI_VALUE */ + +#if !defined (LSE_VALUE) + #define LSE_VALUE 32768U /*!< Value of LSE in Hz*/ +#endif /* LSE_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32G0xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32G0xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x0U /*!< Vector Table base offset field. + This value must be a multiple of 0x100. */ +/******************************************************************************/ +/** + * @} + */ + +/** @addtogroup STM32G0xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32G0xx_System_Private_Variables + * @{ + */ + /* The SystemCoreClock variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = 16000000U; + + const uint32_t AHBPrescTable[16] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U, 6U, 7U, 8U, 9U}; + const uint32_t APBPrescTable[8] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U}; + +/** + * @} + */ + +/** @addtogroup STM32G0xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32G0xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**) / HSI division factor + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***) + * + * - If SYSCLK source is LSI, SystemCoreClock will contain the LSI_VALUE + * + * - If SYSCLK source is LSE, SystemCoreClock will contain the LSE_VALUE + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (**) HSI_VALUE is a constant defined in stm32g0xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (***) HSE_VALUE is a constant defined in stm32g0xx_hal_conf.h file (default value + * 8 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp; + uint32_t pllvco; + uint32_t pllr; + uint32_t pllsource; + uint32_t pllm; + uint32_t hsidiv; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) + { + case RCC_CFGR_SWS_HSE: /* HSE used as system clock */ + SystemCoreClock = HSE_VALUE; + break; + + case RCC_CFGR_SWS_LSI: /* LSI used as system clock */ + SystemCoreClock = LSI_VALUE; + break; + + case RCC_CFGR_SWS_LSE: /* LSE used as system clock */ + SystemCoreClock = LSE_VALUE; + break; + + case RCC_CFGR_SWS_PLL: /* PLL used as system clock */ + { + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> RCC_PLLCFGR_PLLM_Pos) + 1U; + switch (pllsource) + { + case 0x03: /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm); + break; + + case 0x02: /* HSI used as PLL clock source */ + default: + pllvco = (HSI_VALUE / pllm); + break; + } + pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> RCC_PLLCFGR_PLLN_Pos); + pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> RCC_PLLCFGR_PLLR_Pos) + 1U); + SystemCoreClock = pllvco/pllr; + break; + } + case RCC_CFGR_SWS_HSI: /* HSI used as system clock */ + default: /* HSI used as system clock */ + hsidiv = (1UL << ((READ_BIT(RCC->CR, RCC_CR_HSIDIV))>> RCC_CR_HSIDIV_Pos)); + SystemCoreClock = (HSI_VALUE/hsidiv); + break; + } + /* Compute HCLK clock frequency --------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> RCC_CFGR_HPRE_Pos)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/stm32g071rbt6.ioc b/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/stm32g071rbt6.ioc new file mode 100644 index 0000000000..b0854d0869 --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/board/CubeMX_Config/stm32g071rbt6.ioc @@ -0,0 +1,258 @@ +#MicroXplorer Configuration settings - do not modify +ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_0 +ADC1.ClockPrescaler=ADC_CLOCK_ASYNC_DIV8 +ADC1.IPParameters=Rank-0\#ChannelRegularConversion,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,NbrOfConversionFlag,ClockPrescaler,master +ADC1.NbrOfConversionFlag=1 +ADC1.Rank-0\#ChannelRegularConversion=1 +ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLINGTIME_COMMON_1 +ADC1.master=1 +DAC1.DAC_Channel-DAC_OUT2=DAC_CHANNEL_2 +DAC1.IPParameters=DAC_Channel-DAC_OUT2 +File.Version=6 +KeepUserPlacement=true +LPUART1.BaudRate=115200 +LPUART1.FifoMode=UART_FIFOMODE_DISABLE +LPUART1.IPParameters=BaudRate,WordLength,FifoMode +LPUART1.WordLength=UART_WORDLENGTH_8B +Mcu.Family=STM32G0 +Mcu.IP0=ADC1 +Mcu.IP1=DAC1 +Mcu.IP10=USART1 +Mcu.IP11=USART2 +Mcu.IP12=USART3 +Mcu.IP2=LPUART1 +Mcu.IP3=NVIC +Mcu.IP4=RCC +Mcu.IP5=SPI1 +Mcu.IP6=SPI2 +Mcu.IP7=SYS +Mcu.IP8=TIM2 +Mcu.IP9=TIM3 +Mcu.IPNb=13 +Mcu.Name=STM32G071R(6-8-B)Tx +Mcu.Package=LQFP64 +Mcu.Pin0=PC11 +Mcu.Pin1=PC13 +Mcu.Pin10=PA3 +Mcu.Pin11=PA4 +Mcu.Pin12=PA5 +Mcu.Pin13=PA6 +Mcu.Pin14=PA7 +Mcu.Pin15=PC4 +Mcu.Pin16=PC5 +Mcu.Pin17=PB0 +Mcu.Pin18=PB1 +Mcu.Pin19=PB2 +Mcu.Pin2=PC14-OSC32_IN (PC14) +Mcu.Pin20=PB13 +Mcu.Pin21=PC6 +Mcu.Pin22=PC7 +Mcu.Pin23=PD8 +Mcu.Pin24=PA13 +Mcu.Pin25=PA14-BOOT0 +Mcu.Pin26=PA15 +Mcu.Pin27=PD5 +Mcu.Pin28=VP_SYS_VS_Systick +Mcu.Pin29=VP_TIM2_VS_ClockSourceINT +Mcu.Pin3=PC15-OSC32_OUT (PC15) +Mcu.Pin30=VP_TIM3_VS_ClockSourceINT +Mcu.Pin4=PF0-OSC_IN (PF0) +Mcu.Pin5=PC2 +Mcu.Pin6=PC3 +Mcu.Pin7=PA0 +Mcu.Pin8=PA1 +Mcu.Pin9=PA2 +Mcu.PinsNb=31 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32G071RBTx +MxCube.Version=5.0.1 +MxDb.Version=DB.5.0.1 +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.SVC_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.USART3_4_LPUART1_IRQn=true\:0\:0\:false\:false\:true\:true +PA0.Mode=IN0 +PA0.Signal=ADC1_IN0 +PA1.Mode=IN1 +PA1.Signal=ADC1_IN1 +PA13.GPIOParameters=GPIO_Label +PA13.GPIO_Label=TMS +PA13.Locked=true +PA13.Mode=Serial_Wire +PA13.Signal=SYS_SWDIO +PA14-BOOT0.GPIOParameters=GPIO_Label +PA14-BOOT0.GPIO_Label=TCK +PA14-BOOT0.Locked=true +PA14-BOOT0.Mode=Serial_Wire +PA14-BOOT0.Signal=SYS_SWCLK +PA15.Mode=Asynchronous +PA15.Signal=USART2_RX +PA2.GPIOParameters=GPIO_Label +PA2.GPIO_Label=LPUART1_TX +PA2.Locked=true +PA2.Mode=Asynchronous +PA2.Signal=LPUART1_TX +PA3.GPIOParameters=GPIO_Label +PA3.GPIO_Label=LPUART1_RX +PA3.Locked=true +PA3.Mode=Asynchronous +PA3.Signal=LPUART1_RX +PA4.Signal=COMP_DAC11_group +PA5.Signal=COMP_DAC12_group +PA6.Mode=Full_Duplex_Master +PA6.Signal=SPI1_MISO +PA7.Mode=Full_Duplex_Master +PA7.Signal=SPI1_MOSI +PB0.Signal=S_TIM3_CH3 +PB1.Signal=S_TIM3_CH4 +PB13.Mode=Full_Duplex_Master +PB13.Signal=SPI2_SCK +PB2.Mode=Asynchronous +PB2.Signal=USART3_TX +PC11.Mode=Asynchronous +PC11.Signal=USART3_RX +PC13.Locked=true +PC13.Mode=SYS_WakeUp1 +PC13.Signal=SYS_WKUP2 +PC14-OSC32_IN\ (PC14).Locked=true +PC14-OSC32_IN\ (PC14).Mode=LSE-External-Oscillator +PC14-OSC32_IN\ (PC14).Signal=RCC_OSC32_IN +PC15-OSC32_OUT\ (PC15).Locked=true +PC15-OSC32_OUT\ (PC15).Mode=LSE-External-Oscillator +PC15-OSC32_OUT\ (PC15).Signal=RCC_OSC32_OUT +PC2.Mode=Full_Duplex_Master +PC2.Signal=SPI2_MISO +PC3.Mode=Full_Duplex_Master +PC3.Signal=SPI2_MOSI +PC4.Mode=Asynchronous +PC4.Signal=USART1_TX +PC5.Mode=Asynchronous +PC5.Signal=USART1_RX +PC6.Signal=S_TIM3_CH1 +PC7.Signal=S_TIM3_CH2 +PCC.Checker=true +PCC.Line=STM32G0x1 +PCC.MCU=STM32G071R(6-8-B)Tx +PCC.PartNumber=STM32G071RBTx +PCC.Seq0=0 +PCC.Series=STM32G0 +PCC.Temperature=25 +PCC.Vdd=null +PD5.Mode=Asynchronous +PD5.Signal=USART2_TX +PD8.Mode=Full_Duplex_Master +PD8.Signal=SPI1_SCK +PF0-OSC_IN\ (PF0).GPIOParameters=GPIO_Label +PF0-OSC_IN\ (PF0).GPIO_Label=MCO +PF0-OSC_IN\ (PF0).Locked=true +PF0-OSC_IN\ (PF0).Mode=HSE-External-Clock-Source +PF0-OSC_IN\ (PF0).Signal=RCC_OSC_IN +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32G071RBTx +ProjectManager.FirmwarePackage=STM32Cube FW_G0 V1.0.0 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=0 +ProjectManager.MainLocation=Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=stm32g071rbt6.ioc +ProjectManager.ProjectName=stm32g071rbt6 +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=MDK-ARM V5 +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-MX_DMA_Init-DMA-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_LPUART1_UART_Init-LPUART1-false-HAL-true,4-MX_ADC1_Init-ADC1-false-HAL-true,5-MX_TIM2_Init-TIM2-false-HAL-true,6-MX_TIM3_Init-TIM3-false-HAL-true,7-MX_USART1_UART_Init-USART1-false-HAL-true,8-MX_USART2_UART_Init-USART2-false-HAL-true,9-MX_USART3_UART_Init-USART3-false-HAL-true,10-MX_SPI1_Init-SPI1-false-HAL-true,11-MX_SPI2_Init-SPI2-false-HAL-true,12-MX_DAC1_Init-DAC1-false-HAL-true +RCC.ADCFreq_Value=64000000 +RCC.AHBFreq_Value=64000000 +RCC.APBFreq_Value=64000000 +RCC.APBTimFreq_Value=64000000 +RCC.CECFreq_Value=32786.88524590164 +RCC.CortexFreq_Value=64000000 +RCC.EXTERNAL_CLOCK_VALUE=12288000 +RCC.FCLKCortexFreq_Value=64000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=64000000 +RCC.HSE_VALUE=8000000 +RCC.HSI_VALUE=16000000 +RCC.I2C1Freq_Value=64000000 +RCC.I2S1Freq_Value=64000000 +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,SYSCLKFreq_VALUE,SYSCLKSource,TIM15Freq_Value,TIM1Freq_Value,USART1Freq_Value,USART2Freq_Value,VCOInputFreq_Value,VCOOutputFreq_Value +RCC.LPTIM1Freq_Value=64000000 +RCC.LPTIM2Freq_Value=64000000 +RCC.LPUART1Freq_Value=64000000 +RCC.LSCOPinFreq_Value=32000 +RCC.LSI_VALUE=32000 +RCC.MCO1PinFreq_Value=64000000 +RCC.PLLPoutputFreq_Value=64000000 +RCC.PLLQoutputFreq_Value=64000000 +RCC.PLLRCLKFreq_Value=64000000 +RCC.PWRFreq_Value=64000000 +RCC.SYSCLKFreq_VALUE=64000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.TIM15Freq_Value=64000000 +RCC.TIM1Freq_Value=64000000 +RCC.USART1Freq_Value=64000000 +RCC.USART2Freq_Value=64000000 +RCC.VCOInputFreq_Value=16000000 +RCC.VCOOutputFreq_Value=128000000 +SH.COMP_DAC11_group.0=DAC1_OUT1,DAC_OUT1 +SH.COMP_DAC11_group.ConfNb=1 +SH.COMP_DAC12_group.0=DAC1_OUT2,DAC_OUT2 +SH.COMP_DAC12_group.ConfNb=1 +SH.S_TIM3_CH1.0=TIM3_CH1,Output Compare1 CH1 +SH.S_TIM3_CH1.ConfNb=1 +SH.S_TIM3_CH2.0=TIM3_CH2,Output Compare2 CH2 +SH.S_TIM3_CH2.ConfNb=1 +SH.S_TIM3_CH3.0=TIM3_CH3,Output Compare3 CH3 +SH.S_TIM3_CH3.ConfNb=1 +SH.S_TIM3_CH4.0=TIM3_CH4,Output Compare4 CH4 +SH.S_TIM3_CH4.ConfNb=1 +SPI1.CalculateBaudRate=32.0 MBits/s +SPI1.Direction=SPI_DIRECTION_2LINES +SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate +SPI1.Mode=SPI_MODE_MASTER +SPI1.VirtualType=VM_MASTER +SPI2.CalculateBaudRate=32.0 MBits/s +SPI2.Direction=SPI_DIRECTION_2LINES +SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate +SPI2.Mode=SPI_MODE_MASTER +SPI2.VirtualType=VM_MASTER +TIM3.Channel-Output\ Compare1\ CH1=TIM_CHANNEL_1 +TIM3.Channel-Output\ Compare2\ CH2=TIM_CHANNEL_2 +TIM3.Channel-Output\ Compare3\ CH3=TIM_CHANNEL_3 +TIM3.Channel-Output\ Compare4\ CH4=TIM_CHANNEL_4 +TIM3.IPParameters=Channel-Output Compare1 CH1,Channel-Output Compare2 CH2,Channel-Output Compare3 CH3,Channel-Output Compare4 CH4,OCPolarity_1,OCPolarity_2,OCPolarity_3,OCPolarity_4 +TIM3.OCPolarity_1=TIM_OCPOLARITY_HIGH +TIM3.OCPolarity_2=TIM_OCPOLARITY_HIGH +TIM3.OCPolarity_3=TIM_OCPOLARITY_HIGH +TIM3.OCPolarity_4=TIM_OCPOLARITY_HIGH +USART1.IPParameters=VirtualMode-Asynchronous +USART1.VirtualMode-Asynchronous=VM_ASYNC +USART2.IPParameters=VirtualMode-Asynchronous +USART2.VirtualMode-Asynchronous=VM_ASYNC +USART3.IPParameters=VirtualMode-Asynchronous +USART3.VirtualMode-Asynchronous=VM_ASYNC +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +VP_TIM2_VS_ClockSourceINT.Mode=Internal +VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT +VP_TIM3_VS_ClockSourceINT.Mode=Internal +VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT +board=NUCLEO-G071RB +boardIOC=true diff --git a/bsp/stm32/stm32g071-st-nucleo/board/Kconfig b/bsp/stm32/stm32g071-st-nucleo/board/Kconfig new file mode 100644 index 0000000000..d0bcce0b02 --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/board/Kconfig @@ -0,0 +1,63 @@ +menu "Hardware Drivers Config" + +config SOC_STM32G071RB + bool + select SOC_SERIES_STM32G0 + default y + +menu "Onboard Peripheral Drivers" + + config BSP_USING_USB_TO_USART + bool "Enable USB TO USART (lpuart1)" + select BSP_USING_LPUART1 + 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_LPUART1 + bool "Enable LPUART1" + default y + + config BSP_LPUART1_RX_USING_DMA + bool "Enable LPUART1 RX DMA" + depends on BSP_USING_LPUART1 && RT_SERIAL_USING_DMA + default n + + config BSP_USING_UART1 + bool "Enable UART1" + default n + + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default n + + config BSP_USING_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 + endif + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/stm32/stm32g071-st-nucleo/board/SConscript b/bsp/stm32/stm32g071-st-nucleo/board/SConscript new file mode 100644 index 0000000000..640c49b52b --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/board/SConscript @@ -0,0 +1,29 @@ +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'] + +startup_path_prefix = SDK_LIB + +if rtconfig.CROSS_TOOL == 'gcc': + src += [startup_path_prefix + '/STM32G0xx_HAL/CMSIS/ST/STM32G0xx/Source/Templates/gcc/startup_stm32g071xx.s'] +elif rtconfig.CROSS_TOOL == 'keil': + src += [startup_path_prefix + '/STM32G0xx_HAL/CMSIS/ST/STM32G0xx/Source/Templates/arm/startup_stm32g071xx.s'] +elif rtconfig.CROSS_TOOL == 'iar': + src += [startup_path_prefix + '/STM32G0xx_HAL/CMSIS/ST/STM32G0xx/Source/Templates/iar/startup_stm32g071xx.s'] + +CPPDEFINES = ['STM32G071xx'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) +Return('group') diff --git a/bsp/stm32/stm32g071-st-nucleo/board/board.c b/bsp/stm32/stm32g071-st-nucleo/board/board.c new file mode 100644 index 0000000000..5d634db15e --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/board/board.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift first version + */ + +#include "board.h" + +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + 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_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1; + RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; + RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1; + RCC_OscInitStruct.PLL.PLLN = 8; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; + RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /**Initializes the CPU, AHB and APB 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_LPUART1; + PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } +} diff --git a/bsp/stm32/stm32g071-st-nucleo/board/board.h b/bsp/stm32/stm32g071-st-nucleo/board/board.h new file mode 100644 index 0000000000..4abb1e6089 --- /dev/null +++ b/bsp/stm32/stm32g071-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) + +#ifdef __CC_ARM +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="CSTACK" +#define HEAP_BEGIN (__segment_end("CSTACK")) +#else +extern int __bss_end; +#define HEAP_BEGIN ((void *)&__bss_end) +#endif + +#define HEAP_END STM32_SRAM_END + +void SystemClock_Config(void); + +#ifdef __cplusplus +} +#endif + +#endif /* __BOARD_H__ */ diff --git a/bsp/stm32/stm32g071-st-nucleo/board/linker_scripts/link.icf b/bsp/stm32/stm32g071-st-nucleo/board/linker_scripts/link.icf new file mode 100644 index 0000000000..5a262a4195 --- /dev/null +++ b/bsp/stm32/stm32g071-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/stm32g071-st-nucleo/board/linker_scripts/link.lds b/bsp/stm32/stm32g071-st-nucleo/board/linker_scripts/link.lds new file mode 100644 index 0000000000..f8692a3b45 --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/board/linker_scripts/link.lds @@ -0,0 +1,143 @@ +/* + * 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); + _etext = .; + } > ROM = 0 + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > ROM + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >RAM + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } >RAM + + __bss_start = .; + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + + *(.bss.init) + } > RAM + __bss_end = .; + + _end = .; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} diff --git a/bsp/stm32/stm32g071-st-nucleo/board/linker_scripts/link.sct b/bsp/stm32/stm32g071-st-nucleo/board/linker_scripts/link.sct new file mode 100644 index 0000000000..01a848e615 --- /dev/null +++ b/bsp/stm32/stm32g071-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/stm32g071-st-nucleo/figures/board.jpg b/bsp/stm32/stm32g071-st-nucleo/figures/board.jpg new file mode 100644 index 0000000000000000000000000000000000000000..01bac472c41fb05b7e8573b04a28ec36e6abc0a9 GIT binary patch literal 54099 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�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 o!h)MOQ`4dW7*xYvSG;) + 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 + + + + + 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\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 + + + + Kernel + + $PROJ_DIR$\..\..\..\src\clock.c + + + $PROJ_DIR$\..\..\..\src\components.c + + + $PROJ_DIR$\..\..\..\src\cpu.c + + + $PROJ_DIR$\..\..\..\src\device.c + + + $PROJ_DIR$\..\..\..\src\idle.c + + + $PROJ_DIR$\..\..\..\src\ipc.c + + + $PROJ_DIR$\..\..\..\src\irq.c + + + $PROJ_DIR$\..\..\..\src\kservice.c + + + $PROJ_DIR$\..\..\..\src\mem.c + + + $PROJ_DIR$\..\..\..\src\mempool.c + + + $PROJ_DIR$\..\..\..\src\object.c + + + $PROJ_DIR$\..\..\..\src\scheduler.c + + + $PROJ_DIR$\..\..\..\src\signal.c + + + $PROJ_DIR$\..\..\..\src\thread.c + + + $PROJ_DIR$\..\..\..\src\timer.c + + + + CORTEX-M0 + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m0\cpuport.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m0\context_iar.S + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\backtrace.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\components\drivers\misc\pin.c + + + $PROJ_DIR$\..\..\..\components\drivers\serial\serial.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\completion.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\dataqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\pipe.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringblk_buf.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringbuffer.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\waitqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\workqueue.c + + + + finsh + + $PROJ_DIR$\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\components\finsh\symbol.c + + + $PROJ_DIR$\..\..\..\components\finsh\cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_file.c + + + $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 + + + + STM32_HAL + + $PROJ_DIR$\..\libraries\STM32G0xx_HAL\CMSIS\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/stm32g071-st-nucleo/project.eww b/bsp/stm32/stm32g071-st-nucleo/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/stm32/stm32g071-st-nucleo/project.uvprojx b/bsp/stm32/stm32g071-st-nucleo/project.uvprojx new file mode 100644 index 0000000000..c8d4914a36 --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/project.uvprojx @@ -0,0 +1,890 @@ + + + 2.1 +
### uVision Project, (C) Keil Software
+ + + rt-thread + 0x4 + ARM-ADS + 0 + + + STM32G071RBTx + STMicroelectronics + Keil.STM32G0xx_DFP.1.0.0 + http://www.keil.com/pack + IRAM(0x20000000,0x00008000) IROM(0x08000000,0x00020000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32G0xx_128 -FS08000000 -FL020000 -FP0($$Device:STM32G071RBTx$CMSIS\Flash\STM32G0xx_128.FLM)) + 0 + $$Device:STM32G071RBTx$Drivers\CMSIS\Device\ST\STM32G0xx\Include\stm32g0xx.h + + + + + + + + + + $$Device:STM32G071RBTx$CMSIS\SVD\STM32G07x.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 + 0x8000 + + + 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 + 0x8000 + + + 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, STM32G071xx + + applications;.;board;board\CubeMX_Config\Inc;..\libraries\HAL_Drivers;..\libraries\HAL_Drivers\config;..\..\..\include;..\..\..\libcpu\arm\cortex-m0;..\..\..\libcpu\arm\common;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\libraries\STM32G0xx_HAL\STM32G0xx_HAL_Driver\Inc;..\libraries\STM32G0xx_HAL\CMSIS\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 + + + --keep *.o(.rti_fn.*) --keep *.o(FSymTab) --keep *.o(VSymTab) + + + + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Drivers + + + board.c + 1 + board\board.c + + + + + stm32g0xx_hal_msp.c + 1 + board\CubeMX_Config\Src\stm32g0xx_hal_msp.c + + + + + startup_stm32g071xx.s + 2 + ..\libraries\STM32G0xx_HAL\CMSIS\ST\STM32G0xx\Source\Templates\arm\startup_stm32g071xx.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 + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + + + components.c + 1 + ..\..\..\src\components.c + + + + + cpu.c + 1 + ..\..\..\src\cpu.c + + + + + device.c + 1 + ..\..\..\src\device.c + + + + + idle.c + 1 + ..\..\..\src\idle.c + + + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + + + irq.c + 1 + ..\..\..\src\irq.c + + + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + + + mem.c + 1 + ..\..\..\src\mem.c + + + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + + + object.c + 1 + ..\..\..\src\object.c + + + + + scheduler.c + 1 + ..\..\..\src\scheduler.c + + + + + signal.c + 1 + ..\..\..\src\signal.c + + + + + thread.c + 1 + ..\..\..\src\thread.c + + + + + timer.c + 1 + ..\..\..\src\timer.c + + + + + CORTEX-M0 + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m0\cpuport.c + + + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m0\context_rvds.S + + + + + backtrace.c + 1 + ..\..\..\libcpu\arm\common\backtrace.c + + + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + + + DeviceDrivers + + + pin.c + 1 + ..\..\..\components\drivers\misc\pin.c + + + + + serial.c + 1 + ..\..\..\components\drivers\serial\serial.c + + + + + completion.c + 1 + ..\..\..\components\drivers\src\completion.c + + + + + dataqueue.c + 1 + ..\..\..\components\drivers\src\dataqueue.c + + + + + pipe.c + 1 + ..\..\..\components\drivers\src\pipe.c + + + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\src\ringblk_buf.c + + + + + ringbuffer.c + 1 + ..\..\..\components\drivers\src\ringbuffer.c + + + + + waitqueue.c + 1 + ..\..\..\components\drivers\src\waitqueue.c + + + + + workqueue.c + 1 + ..\..\..\components\drivers\src\workqueue.c + + + + + finsh + + + shell.c + 1 + ..\..\..\components\finsh\shell.c + + + + + symbol.c + 1 + ..\..\..\components\finsh\symbol.c + + + + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + + + + + msh.c + 1 + ..\..\..\components\finsh\msh.c + + + + + msh_cmd.c + 1 + ..\..\..\components\finsh\msh_cmd.c + + + + + msh_file.c + 1 + ..\..\..\components\finsh\msh_file.c + + + + + finsh_compiler.c + 1 + ..\..\..\components\finsh\finsh_compiler.c + + + + + finsh_error.c + 1 + ..\..\..\components\finsh\finsh_error.c + + + + + finsh_heap.c + 1 + ..\..\..\components\finsh\finsh_heap.c + + + + + finsh_init.c + 1 + ..\..\..\components\finsh\finsh_init.c + + + + + finsh_node.c + 1 + ..\..\..\components\finsh\finsh_node.c + + + + + finsh_ops.c + 1 + ..\..\..\components\finsh\finsh_ops.c + + + + + finsh_parser.c + 1 + ..\..\..\components\finsh\finsh_parser.c + + + + + finsh_var.c + 1 + ..\..\..\components\finsh\finsh_var.c + + + + + finsh_vm.c + 1 + ..\..\..\components\finsh\finsh_vm.c + + + + + finsh_token.c + 1 + ..\..\..\components\finsh\finsh_token.c + + + + + STM32_HAL + + + system_stm32g0xx.c + 1 + ..\libraries\STM32G0xx_HAL\CMSIS\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/stm32g071-st-nucleo/rtconfig.h b/bsp/stm32/stm32g071-st-nucleo/rtconfig.h new file mode 100644 index 0000000000..1a407f8e83 --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/rtconfig.h @@ -0,0 +1,172 @@ +#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_IDEL_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 +#define RT_DEBUG + +/* Inter-Thread communication */ + +#define RT_USING_SEMAPHORE +#define RT_USING_MUTEX +#define RT_USING_EVENT +#define RT_USING_MAILBOX +#define RT_USING_MESSAGEQUEUE + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_SMALL_MEM +#define RT_USING_HEAP + +/* Kernel Device Object */ + +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "lpuart1" +#define RT_VER_NUM 0x40000 +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M0 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_PRIORITY 10 + +/* C++ features */ + + +/* Command shell */ + +#define RT_USING_FINSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_USING_DESCRIPTION +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 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_USING_PIN + +/* Using WiFi */ + + +/* Using USB */ + + +/* POSIX layer and C standard library */ + + +/* Network */ + +/* Socket abstraction layer */ + + +/* light weight TCP/IP stack */ + + +/* Modbus master and slave stack */ + + +/* AT commands */ + + +/* VBUS(Virtual Software BUS) */ + + +/* Utilities */ + + +/* ARM CMSIS */ + + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + + +/* Wiced WiFi */ + + +/* IoT Cloud */ + + +/* security packages */ + + +/* language packages */ + + +/* multimedia packages */ + + +/* tools packages */ + + +/* system packages */ + + +/* peripheral libraries and drivers */ + + +/* miscellaneous packages */ + + +/* samples: kernel and components samples */ + +#define SOC_FAMILY_STM32 +#define SOC_SERIES_STM32G0 + +/* Hardware Drivers Config */ + +#define SOC_STM32G071RB + +/* Onboard Peripheral Drivers */ + +#define BSP_USING_USB_TO_USART + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_LPUART1 + +/* Board extended module Drivers */ + + +#endif diff --git a/bsp/stm32/stm32g071-st-nucleo/rtconfig.py b/bsp/stm32/stm32g071-st-nucleo/rtconfig.py new file mode 100644 index 0000000000..7c5cbfea7f --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/rtconfig.py @@ -0,0 +1,134 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m0' +CROSS_TOOL='gcc' + +# bsp lib config +BSP_LIBRARY_TYPE = None + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') + +# cross_tool provides the cross compiler +# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = r'C:\Users\XXYYZZ' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armcc' + EXEC_PATH = r'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iar' + EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' + +if PLATFORM == 'gcc': + # toolchains + PREFIX = 'arm-none-eabi-' + CC = PREFIX + 'gcc' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + CXX = PREFIX + 'g++' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + DEVICE = ' -mcpu=cortex-m0plus -mthumb -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -std=c99 -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rt-thread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M0 ' + CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' + + CFLAGS += ' -D__MICROLIB ' + AFLAGS += ' --pd "__MICROLIB SETA 1" ' + LFLAGS += ' --library_type=microlib ' + EXEC_PATH += '/ARM/ARMCC/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iar': + # toolchains + CC = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M0' + CFLAGS += ' -e' + CFLAGS += ' --fpu=None' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu Cortex-M0' + AFLAGS += ' --fpu None' + AFLAGS += ' -S' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' diff --git a/bsp/stm32/stm32g071-st-nucleo/template.ewp b/bsp/stm32/stm32g071-st-nucleo/template.ewp new file mode 100644 index 0000000000..d5d5f6b167 --- /dev/null +++ b/bsp/stm32/stm32g071-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/stm32g071-st-nucleo/template.eww b/bsp/stm32/stm32g071-st-nucleo/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/stm32/stm32g071-st-nucleo/template.uvprojx b/bsp/stm32/stm32g071-st-nucleo/template.uvprojx new file mode 100644 index 0000000000..b7dc9e4422 --- /dev/null +++ b/bsp/stm32/stm32g071-st-nucleo/template.uvprojx @@ -0,0 +1,389 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rt-thread + 0x4 + ARM-ADS + 0 + + + STM32G071RBTx + STMicroelectronics + Keil.STM32G0xx_DFP.1.0.0 + http://www.keil.com/pack + IRAM(0x20000000,0x00008000) IROM(0x08000000,0x00020000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32G0xx_128 -FS08000000 -FL020000 -FP0($$Device:STM32G071RBTx$CMSIS\Flash\STM32G0xx_128.FLM)) + 0 + $$Device:STM32G071RBTx$Drivers\CMSIS\Device\ST\STM32G0xx\Include\stm32g0xx.h + + + + + + + + + + $$Device:STM32G071RBTx$CMSIS\SVD\STM32G07x.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 + 0x8000 + + + 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 + 0x8000 + + + 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 + + + + + + + + + + + + + + + + + +
-- GitLab