From b35e888cddbdf382444e598c791c5322deffd4b9 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Mon, 17 Dec 2018 10:35:19 +0800 Subject: [PATCH 01/14] [bsp][stm32] optimize docs --- bsp/stm32/docs/STM32系列BSP添加教程.md | 2 ++ bsp/stm32/docs/figures/linker_scripts.png | Bin 10911 -> 11023 bytes 2 files changed, 2 insertions(+) diff --git a/bsp/stm32/docs/STM32系列BSP添加教程.md b/bsp/stm32/docs/STM32系列BSP添加教程.md index 2ac0f6b48e..4d6f25dc71 100644 --- a/bsp/stm32/docs/STM32系列BSP添加教程.md +++ b/bsp/stm32/docs/STM32系列BSP添加教程.md @@ -129,6 +129,8 @@ STM32 BSP 由三部分组成,分别是 (1) 通用库、(2) BSP 模板和 (3) ![修改启动文件和芯片型号](./figures/SConscript.png) +注意:如果在文件夹中找不到相应系列的 .s 文件,可能是多个系列的芯片重用了相同的启动文件,此时可以在 CubeMX 中生成目标芯片的工程,查看使用了哪个启动文件,然后再修改启动文件名。 + #### 修改工程模板 **template** 文件是生成 MDK/IAR 工程的模板文件,通过修改该文件可以设置工程中使用的芯片型号以及下载方式。MDK4/MDK5/IAR 的工程模板文件,如下图所示: diff --git a/bsp/stm32/docs/figures/linker_scripts.png b/bsp/stm32/docs/figures/linker_scripts.png index 38087b18aca02d65137a053dabdcf7e0975a275e..32e36e23397738e285e0ed714b488819b91724b3 100644 GIT binary patch literal 11023 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 From 71751eb6f1dada410ab404d5ee8ae501db70b022 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Mon, 17 Dec 2018 10:38:15 +0800 Subject: [PATCH 02/14] [bsp][stm32] add sdio, hw_timer and pwm drivers --- bsp/stm32/libraries/HAL_Drivers/SConscript | 16 +- .../HAL_Drivers/config/f1/pwm_config.h | 60 ++ .../HAL_Drivers/config/f1/sdio_config.h | 36 + .../HAL_Drivers/config/f1/tim_config.h | 70 ++ .../HAL_Drivers/config/f4/pwm_config.h | 60 ++ .../HAL_Drivers/config/f4/sdio_config.h | 38 + .../HAL_Drivers/config/f4/tim_config.h | 59 ++ .../HAL_Drivers/config/l4/pwm_config.h | 60 ++ .../HAL_Drivers/config/l4/tim_config.h | 59 ++ bsp/stm32/libraries/HAL_Drivers/drv_config.h | 8 + bsp/stm32/libraries/HAL_Drivers/drv_hwtimer.c | 525 +++++++++++ bsp/stm32/libraries/HAL_Drivers/drv_pwm.c | 480 ++++++++++ bsp/stm32/libraries/HAL_Drivers/drv_sdio.c | 846 ++++++++++++++++++ bsp/stm32/libraries/HAL_Drivers/drv_sdio.h | 178 ++++ 14 files changed, 2490 insertions(+), 5 deletions(-) create mode 100644 bsp/stm32/libraries/HAL_Drivers/config/f1/pwm_config.h create mode 100644 bsp/stm32/libraries/HAL_Drivers/config/f1/sdio_config.h create mode 100644 bsp/stm32/libraries/HAL_Drivers/config/f1/tim_config.h create mode 100644 bsp/stm32/libraries/HAL_Drivers/config/f4/pwm_config.h create mode 100644 bsp/stm32/libraries/HAL_Drivers/config/f4/sdio_config.h create mode 100644 bsp/stm32/libraries/HAL_Drivers/config/f4/tim_config.h create mode 100644 bsp/stm32/libraries/HAL_Drivers/config/l4/pwm_config.h create mode 100644 bsp/stm32/libraries/HAL_Drivers/config/l4/tim_config.h create mode 100644 bsp/stm32/libraries/HAL_Drivers/drv_hwtimer.c create mode 100644 bsp/stm32/libraries/HAL_Drivers/drv_pwm.c create mode 100644 bsp/stm32/libraries/HAL_Drivers/drv_sdio.c create mode 100644 bsp/stm32/libraries/HAL_Drivers/drv_sdio.h diff --git a/bsp/stm32/libraries/HAL_Drivers/SConscript b/bsp/stm32/libraries/HAL_Drivers/SConscript index c37704bb80..ff0725e3b0 100644 --- a/bsp/stm32/libraries/HAL_Drivers/SConscript +++ b/bsp/stm32/libraries/HAL_Drivers/SConscript @@ -13,7 +13,13 @@ if GetDepend(['RT_USING_PIN']): if GetDepend(['RT_USING_SERIAL']): src += ['drv_usart.c'] - + +if GetDepend(['RT_USING_HWTIMER']): + src += ['drv_hwtimer.c'] + +if GetDepend(['RT_USING_PWM']): + src += ['drv_pwm.c'] + if GetDepend(['RT_USING_SPI']): src += ['drv_spi.c'] @@ -22,10 +28,7 @@ if GetDepend(['RT_USING_QSPI']): if GetDepend(['RT_USING_USB_DEVICE']): src += ['drv_usb.c'] - -if GetDepend(['RT_USING_SDCARD']): - src += ['drv_sdcard.c'] - + if GetDepend(['RT_USING_I2C', 'RT_USING_I2C_BITOPS']): src += ['drv_soft_i2c.c'] @@ -53,6 +56,9 @@ if GetDepend(['BSP_USING_ON_CHIP_FLASH', 'SOC_SERIES_STM32L4']): if GetDepend(['BSP_USING_WDT']): src += ['drv_wdt.c'] +if GetDepend(['BSP_USING_SDIO']): + src += ['drv_sdio.c'] + src += ['drv_common.c'] path = [cwd] diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f1/pwm_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f1/pwm_config.h new file mode 100644 index 0000000000..2474460ccd --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/config/f1/pwm_config.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-12-13 zylx first version + */ + +#ifndef __PWM_CONFIG_H__ +#define __PWM_CONFIG_H__ + +#include + +#ifdef BSP_USING_PWM2 +#ifndef PWM2_CONFIG +#define PWM2_CONFIG \ + { \ + .tim_handle.Instance = TIM2, \ + .name = "pwm2", \ + .channel = 0 \ + } +#endif /* PWM2_CONFIG */ +#endif /* BSP_USING_PWM2 */ + +#ifdef BSP_USING_PWM3 +#ifndef PWM3_CONFIG +#define PWM3_CONFIG \ + { \ + .tim_handle.Instance = TIM3, \ + .name = "pwm3", \ + .channel = 0 \ + } +#endif /* PWM3_CONFIG */ +#endif /* BSP_USING_PWM3 */ + +#ifdef BSP_USING_PWM4 +#ifndef PWM4_CONFIG +#define PWM4_CONFIG \ + { \ + .tim_handle.Instance = TIM4, \ + .name = "pwm4", \ + .channel = 0 \ + } +#endif /* PWM4_CONFIG */ +#endif /* BSP_USING_PWM4 */ + +#ifdef BSP_USING_PWM5 +#ifndef PWM5_CONFIG +#define PWM5_CONFIG \ + { \ + .tim_handle.Instance = TIM5, \ + .name = "pwm5", \ + .channel = 0 \ + } +#endif /* PWM5_CONFIG */ +#endif /* BSP_USING_PWM5 */ + +#endif /* __PWM_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f1/sdio_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f1/sdio_config.h new file mode 100644 index 0000000000..5bee78d7fa --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/config/f1/sdio_config.h @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-12-13 BalanceTWK first version + */ + +#ifndef __SDIO_CONFIG_H__ +#define __SDIO_CONFIG_H__ + +#include +#include "stm32f1xx_hal.h" + +#ifdef BSP_USING_SDIO +#define SDIO_BUS_CONFIG \ + { \ + .Instance = SDIO, \ + .dma_rx.dma_rcc = RCC_AHBENR_DMA2EN, \ + .dma_tx.dma_rcc = RCC_AHBENR_DMA2EN, \ + .dma_rx.Instance = DMA2_Channel4, \ + .dma_rx.dma_irq = DMA2_Channel4_IRQn, \ + .dma_tx.Instance = DMA2_Channel4, \ + .dma_tx.dma_irq = DMA2_Channel4_IRQn, \ + } + +#define SPI1_DMA_RX_IRQHandler DMA2_Channel4_IRQHandler +#define SPI1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler +#endif + +#endif /*__SDIO_CONFIG_H__ */ + + + diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f1/tim_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f1/tim_config.h new file mode 100644 index 0000000000..75a3e0b84a --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/config/f1/tim_config.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-12-11 zylx first version + */ + +#ifndef __TIM_CONFIG_H__ +#define __TIM_CONFIG_H__ + +#include + +#ifndef TIM_DEV_INFO_CONFIG +#define TIM_DEV_INFO_CONFIG \ + { \ + .maxfreq = 1000000, \ + .minfreq = 2000, \ + .maxcnt = 0xFFFF, \ + .cntmode = HWTIMER_CNTMODE_UP, \ + } +#endif /* TIM_DEV_INFO_CONFIG */ + +#ifdef BSP_USING_TIM2 +#ifndef TIM2_CONFIG +#define TIM2_CONFIG \ + { \ + .tim_handle.Instance = TIM2, \ + .tim_irqn = TIM2_IRQn, \ + .name = "timer2", \ + } +#endif /* TIM2_CONFIG */ +#endif /* BSP_USING_TIM2 */ + +#ifdef BSP_USING_TIM3 +#ifndef TIM3_CONFIG +#define TIM3_CONFIG \ + { \ + .tim_handle.Instance = TIM3, \ + .tim_irqn = TIM3_IRQn, \ + .name = "timer3", \ + } +#endif /* TIM3_CONFIG */ +#endif /* BSP_USING_TIM3 */ + +#ifdef BSP_USING_TIM4 +#ifndef TIM4_CONFIG +#define TIM4_CONFIG \ + { \ + .tim_handle.Instance = TIM4, \ + .tim_irqn = TIM4_IRQn, \ + .name = "timer4", \ + } +#endif /* TIM4_CONFIG */ +#endif /* BSP_USING_TIM4 */ + +#ifdef BSP_USING_TIM5 +#ifndef TIM5_CONFIG +#define TIM5_CONFIG \ + { \ + .tim_handle.Instance = TIM5, \ + .tim_irqn = TIM5_IRQn, \ + .name = "timer5", \ + } +#endif /* TIM5_CONFIG */ +#endif /* BSP_USING_TIM5 */ + +#endif /* __TIM_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f4/pwm_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f4/pwm_config.h new file mode 100644 index 0000000000..2474460ccd --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/config/f4/pwm_config.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-12-13 zylx first version + */ + +#ifndef __PWM_CONFIG_H__ +#define __PWM_CONFIG_H__ + +#include + +#ifdef BSP_USING_PWM2 +#ifndef PWM2_CONFIG +#define PWM2_CONFIG \ + { \ + .tim_handle.Instance = TIM2, \ + .name = "pwm2", \ + .channel = 0 \ + } +#endif /* PWM2_CONFIG */ +#endif /* BSP_USING_PWM2 */ + +#ifdef BSP_USING_PWM3 +#ifndef PWM3_CONFIG +#define PWM3_CONFIG \ + { \ + .tim_handle.Instance = TIM3, \ + .name = "pwm3", \ + .channel = 0 \ + } +#endif /* PWM3_CONFIG */ +#endif /* BSP_USING_PWM3 */ + +#ifdef BSP_USING_PWM4 +#ifndef PWM4_CONFIG +#define PWM4_CONFIG \ + { \ + .tim_handle.Instance = TIM4, \ + .name = "pwm4", \ + .channel = 0 \ + } +#endif /* PWM4_CONFIG */ +#endif /* BSP_USING_PWM4 */ + +#ifdef BSP_USING_PWM5 +#ifndef PWM5_CONFIG +#define PWM5_CONFIG \ + { \ + .tim_handle.Instance = TIM5, \ + .name = "pwm5", \ + .channel = 0 \ + } +#endif /* PWM5_CONFIG */ +#endif /* BSP_USING_PWM5 */ + +#endif /* __PWM_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f4/sdio_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f4/sdio_config.h new file mode 100644 index 0000000000..40f3d03e10 --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/config/f4/sdio_config.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-12-13 BalanceTWK first version + */ + +#ifndef __SDIO_CONFIG_H__ +#define __SDIO_CONFIG_H__ + +#include +#include "stm32f4xx_hal.h" + +#ifdef BSP_USING_SDIO +#define SDIO_BUS_CONFIG \ + { \ + .Instance = SDIO, \ + .dma_rx.dma_rcc = RCC_AHB1ENR_DMA2EN, \ + .dma_tx.dma_rcc = RCC_AHB1ENR_DMA2EN, \ + .dma_rx.Instance = DMA2_Stream3, \ + .dma_rx.channel = DMA_CHANNEL_4, \ + .dma_rx.dma_irq = DMA2_Stream3_IRQn, \ + .dma_tx.Instance = DMA2_Stream6, \ + .dma_tx.channel = DMA_CHANNEL_4, \ + .dma_tx.dma_irq = DMA2_Stream6_IRQn, \ + } + +#define SPI1_DMA_RX_IRQHandler DMA2_Stream3_IRQHandler +#define SPI1_DMA_TX_IRQHandler DMA2_Stream6_IRQHandler +#endif + +#endif /*__SDIO_CONFIG_H__ */ + + + diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f4/tim_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f4/tim_config.h new file mode 100644 index 0000000000..169d07a7a4 --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/config/f4/tim_config.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-12-11 zylx first version + */ + +#ifndef __TIM_CONFIG_H__ +#define __TIM_CONFIG_H__ + +#include + +#ifndef TIM_DEV_INFO_CONFIG +#define TIM_DEV_INFO_CONFIG \ + { \ + .maxfreq = 1000000, \ + .minfreq = 3000, \ + .maxcnt = 0xFFFF, \ + .cntmode = HWTIMER_CNTMODE_UP, \ + } +#endif /* TIM_DEV_INFO_CONFIG */ + +#ifdef BSP_USING_TIM11 +#ifndef TIM11_CONFIG +#define TIM11_CONFIG \ + { \ + .tim_handle.Instance = TIM11, \ + .tim_irqn = TIM1_TRG_COM_TIM11_IRQn, \ + .name = "timer11", \ + } +#endif /* TIM11_CONFIG */ +#endif /* BSP_USING_TIM11 */ + +#ifdef BSP_USING_TIM13 +#ifndef TIM13_CONFIG +#define TIM13_CONFIG \ + { \ + .tim_handle.Instance = TIM13, \ + .tim_irqn = TIM8_UP_TIM13_IRQn, \ + .name = "timer13", \ + } +#endif /* TIM13_CONFIG */ +#endif /* BSP_USING_TIM13 */ + +#ifdef BSP_USING_TIM14 +#ifndef TIM14_CONFIG +#define TIM14_CONFIG \ + { \ + .tim_handle.Instance = TIM14, \ + .tim_irqn = TIM8_TRG_COM_TIM14_IRQn, \ + .name = "timer14", \ + } +#endif /* TIM14_CONFIG */ +#endif /* BSP_USING_TIM14 */ + +#endif /* __TIM_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/l4/pwm_config.h b/bsp/stm32/libraries/HAL_Drivers/config/l4/pwm_config.h new file mode 100644 index 0000000000..2474460ccd --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/config/l4/pwm_config.h @@ -0,0 +1,60 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-12-13 zylx first version + */ + +#ifndef __PWM_CONFIG_H__ +#define __PWM_CONFIG_H__ + +#include + +#ifdef BSP_USING_PWM2 +#ifndef PWM2_CONFIG +#define PWM2_CONFIG \ + { \ + .tim_handle.Instance = TIM2, \ + .name = "pwm2", \ + .channel = 0 \ + } +#endif /* PWM2_CONFIG */ +#endif /* BSP_USING_PWM2 */ + +#ifdef BSP_USING_PWM3 +#ifndef PWM3_CONFIG +#define PWM3_CONFIG \ + { \ + .tim_handle.Instance = TIM3, \ + .name = "pwm3", \ + .channel = 0 \ + } +#endif /* PWM3_CONFIG */ +#endif /* BSP_USING_PWM3 */ + +#ifdef BSP_USING_PWM4 +#ifndef PWM4_CONFIG +#define PWM4_CONFIG \ + { \ + .tim_handle.Instance = TIM4, \ + .name = "pwm4", \ + .channel = 0 \ + } +#endif /* PWM4_CONFIG */ +#endif /* BSP_USING_PWM4 */ + +#ifdef BSP_USING_PWM5 +#ifndef PWM5_CONFIG +#define PWM5_CONFIG \ + { \ + .tim_handle.Instance = TIM5, \ + .name = "pwm5", \ + .channel = 0 \ + } +#endif /* PWM5_CONFIG */ +#endif /* BSP_USING_PWM5 */ + +#endif /* __PWM_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/l4/tim_config.h b/bsp/stm32/libraries/HAL_Drivers/config/l4/tim_config.h new file mode 100644 index 0000000000..fe857cc360 --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/config/l4/tim_config.h @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-12-12 zylx first version + */ + +#ifndef __TIM_CONFIG_H__ +#define __TIM_CONFIG_H__ + +#include + +#ifndef TIM_DEV_INFO_CONFIG +#define TIM_DEV_INFO_CONFIG \ + { \ + .maxfreq = 1000000, \ + .minfreq = 2000, \ + .maxcnt = 0xFFFF, \ + .cntmode = HWTIMER_CNTMODE_UP, \ + } +#endif /* TIM_DEV_INFO_CONFIG */ + +#ifdef BSP_USING_TIM15 +#ifndef TIM15_CONFIG +#define TIM15_CONFIG \ + { \ + .tim_handle.Instance = TIM15, \ + .tim_irqn = TIM1_BRK_TIM15_IRQn, \ + .name = "timer15", \ + } +#endif /* TIM15_CONFIG */ +#endif /* BSP_USING_TIM15 */ + +#ifdef BSP_USING_TIM16 +#ifndef TIM16_CONFIG +#define TIM16_CONFIG \ + { \ + .tim_handle.Instance = TIM16, \ + .tim_irqn = TIM1_UP_TIM16_IRQn, \ + .name = "timer16", \ + } +#endif /* TIM16_CONFIG */ +#endif /* BSP_USING_TIM16 */ + +#ifdef BSP_USING_TIM17 +#ifndef TIM17_CONFIG +#define TIM17_CONFIG \ + { \ + .tim_handle.Instance = TIM17, \ + .tim_irqn = TIM1_TRG_COM_TIM17_IRQn, \ + .name = "timer17", \ + } +#endif /* TIM17_CONFIG */ +#endif /* BSP_USING_TIM17 */ + +#endif /* __TIM_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_config.h b/bsp/stm32/libraries/HAL_Drivers/drv_config.h index 5a1aae7b40..1887d12ffa 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drv_config.h @@ -18,14 +18,22 @@ #include "f1/uart_config.h" #include "f1/spi_config.h" #include "f1/adc_config.h" +#include "f1/tim_config.h" +#include "f1/sdio_config.h" +#include "f1/pwm_config.h" #elif defined(SOC_SERIES_STM32F4) #include "f4/uart_config.h" #include "f4/spi_config.h" #include "f4/adc_config.h" +#include "f4/tim_config.h" +#include "f4/sdio_config.h" +#include "f4/pwm_config.h" #elif defined(SOC_SERIES_STM32L4) #include "l4/uart_config.h" #include "l4/spi_config.h" #include "l4/adc_config.h" +#include "l4/tim_config.h" +#include "l4/pwm_config.h" #endif #endif diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_hwtimer.c b/bsp/stm32/libraries/HAL_Drivers/drv_hwtimer.c new file mode 100644 index 0000000000..4f17425d86 --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/drv_hwtimer.c @@ -0,0 +1,525 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-12-10 zylx first version + */ + +#include +#ifdef BSP_USING_TIM +#include "drv_config.h" + +//#define DRV_DEBUG +#define LOG_TAG "drv.hwtimer" +#include + +#ifdef RT_USING_HWTIMER +enum +{ +#ifdef BSP_USING_TIM1 + TIM1_INDEX, +#endif +#ifdef BSP_USING_TIM2 + TIM2_INDEX, +#endif +#ifdef BSP_USING_TIM3 + TIM3_INDEX, +#endif +#ifdef BSP_USING_TIM4 + TIM4_INDEX, +#endif +#ifdef BSP_USING_TIM5 + TIM5_INDEX, +#endif +#ifdef BSP_USING_TIM6 + TIM6_INDEX, +#endif +#ifdef BSP_USING_TIM7 + TIM7_INDEX, +#endif +#ifdef BSP_USING_TIM8 + TIM8_INDEX, +#endif +#ifdef BSP_USING_TIM9 + TIM9_INDEX, +#endif +#ifdef BSP_USING_TIM10 + TIM10_INDEX, +#endif +#ifdef BSP_USING_TIM11 + TIM11_INDEX, +#endif +#ifdef BSP_USING_TIM12 + TIM12_INDEX, +#endif +#ifdef BSP_USING_TIM13 + TIM13_INDEX, +#endif +#ifdef BSP_USING_TIM14 + TIM14_INDEX, +#endif +#ifdef BSP_USING_TIM15 + TIM15_INDEX, +#endif +#ifdef BSP_USING_TIM16 + TIM16_INDEX, +#endif +#ifdef BSP_USING_TIM17 + TIM17_INDEX, +#endif +}; + +struct stm32_hwtimer +{ + rt_hwtimer_t time_device; + TIM_HandleTypeDef tim_handle; + IRQn_Type tim_irqn; + char *name; +}; + +static struct stm32_hwtimer stm32_hwtimer_obj[] = +{ +#ifdef BSP_USING_TIM1 + TIM1_CONFIG, +#endif + +#ifdef BSP_USING_TIM2 + TIM2_CONFIG, +#endif + +#ifdef BSP_USING_TIM3 + TIM3_CONFIG, +#endif + +#ifdef BSP_USING_TIM4 + TIM4_CONFIG, +#endif + +#ifdef BSP_USING_TIM5 + TIM5_CONFIG, +#endif + +#ifdef BSP_USING_TIM6 + TIM6_CONFIG, +#endif + +#ifdef BSP_USING_TIM7 + TIM7_CONFIG, +#endif + +#ifdef BSP_USING_TIM8 + TIM8_CONFIG, +#endif + +#ifdef BSP_USING_TIM9 + TIM9_CONFIG, +#endif + +#ifdef BSP_USING_TIM10 + TIM10_CONFIG, +#endif + +#ifdef BSP_USING_TIM11 + TIM11_CONFIG, +#endif + +#ifdef BSP_USING_TIM12 + TIM12_CONFIG, +#endif + +#ifdef BSP_USING_TIM13 + TIM13_CONFIG, +#endif + +#ifdef BSP_USING_TIM14 + TIM14_CONFIG, +#endif + +#ifdef BSP_USING_TIM15 + TIM15_CONFIG, +#endif + +#ifdef BSP_USING_TIM16 + TIM16_CONFIG, +#endif + +#ifdef BSP_USING_TIM17 + TIM17_CONFIG, +#endif +}; + +static void timer_init(struct rt_hwtimer_device *timer, rt_uint32_t state) +{ + uint32_t prescaler_value = 0; + TIM_HandleTypeDef *tim = RT_NULL; + struct stm32_hwtimer *tim_device = RT_NULL; + + RT_ASSERT(timer != RT_NULL); + if (state) + { + tim = (TIM_HandleTypeDef *)timer->parent.user_data; + tim_device = (struct stm32_hwtimer *)timer; + + /* time init */ +#if defined(SOC_SERIES_STM32F4) + if (tim->Instance == TIM9 || tim->Instance == TIM10 || tim->Instance == TIM11) +#elif defined(SOC_SERIES_STM32L4) + if (tim->Instance == TIM15 || tim->Instance == TIM16 || tim->Instance == TIM17) +#elif defined(SOC_SERIES_STM32F1) + if (0) +#endif + { + prescaler_value = (uint32_t)(HAL_RCC_GetPCLK2Freq() * 2 / 10000) - 1; + } + else + { + prescaler_value = (uint32_t)(HAL_RCC_GetPCLK1Freq() * 2 / 10000) - 1; + } + tim->Init.Period = 10000 - 1; + tim->Init.Prescaler = prescaler_value; + tim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + if (timer->info->cntmode == HWTIMER_CNTMODE_UP) + { + tim->Init.CounterMode = TIM_COUNTERMODE_UP; + } + else + { + tim->Init.CounterMode = TIM_COUNTERMODE_DOWN; + } + tim->Init.RepetitionCounter = 0; +#if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) + tim->Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; +#endif + if (HAL_TIM_Base_Init(tim) != HAL_OK) + { + LOG_E("%s init failed", tim_device->name); + return; + } + else + { + /* set the TIMx priority */ + HAL_NVIC_SetPriority(tim_device->tim_irqn, 3, 0); + + /* enable the TIMx global Interrupt */ + HAL_NVIC_EnableIRQ(tim_device->tim_irqn); + + /* clear update flag */ + __HAL_TIM_CLEAR_FLAG(tim, TIM_FLAG_UPDATE); + /* enable update request source */ + __HAL_TIM_URS_ENABLE(tim); + + LOG_D("%s init success", tim_device->name); + } + } +} + +static rt_err_t timer_start(rt_hwtimer_t *timer, rt_uint32_t t, rt_hwtimer_mode_t opmode) +{ + rt_err_t result = RT_EOK; + TIM_HandleTypeDef *tim = RT_NULL; + + RT_ASSERT(timer != RT_NULL); + + tim = (TIM_HandleTypeDef *)timer->parent.user_data; + + /* set tim cnt */ + __HAL_TIM_SET_AUTORELOAD(tim, t); + + if (opmode == HWTIMER_MODE_ONESHOT) + { + /* set timer to single mode */ + tim->Instance->CR1 |= TIM_OPMODE_SINGLE; + } + + /* start timer */ + if (HAL_TIM_Base_Start_IT(tim) != HAL_OK) + { + LOG_E("TIM2 start failed"); + result = -RT_ERROR; + } + + return result; +} + +static void timer_stop(rt_hwtimer_t *timer) +{ + TIM_HandleTypeDef *tim = RT_NULL; + + RT_ASSERT(timer != RT_NULL); + + tim = (TIM_HandleTypeDef *)timer->parent.user_data; + + /* stop timer */ + HAL_TIM_Base_Stop_IT(tim); +} + +static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) +{ + TIM_HandleTypeDef *tim = RT_NULL; + rt_err_t result = RT_EOK; + + RT_ASSERT(timer != RT_NULL); + RT_ASSERT(arg != RT_NULL); + + tim = (TIM_HandleTypeDef *)timer->parent.user_data; + + switch (cmd) + { + case HWTIMER_CTRL_FREQ_SET: + { + rt_uint32_t freq; + rt_uint16_t val; + + /* set timer frequence */ + freq = *((rt_uint32_t *)arg); + +#if defined(SOC_SERIES_STM32F4) + if (tim->Instance == TIM9 || tim->Instance == TIM10 || tim->Instance == TIM11) +#elif defined(SOC_SERIES_STM32L4) + if (tim->Instance == TIM15 || tim->Instance == TIM16 || tim->Instance == TIM17) +#elif defined(SOC_SERIES_STM32F1) + if (0) +#endif + { +#if defined(SOC_SERIES_STM32L4) + val = HAL_RCC_GetPCLK2Freq() / freq; +#else + val = HAL_RCC_GetPCLK2Freq() * 2 / freq; +#endif + } + else + { + val = HAL_RCC_GetPCLK1Freq() * 2 / freq; + } + __HAL_TIM_SET_PRESCALER(tim, val - 1); + + /* Update frequency value */ + tim->Instance->EGR |= TIM_EVENTSOURCE_UPDATE; + } + break; + default: + { + result = -RT_ENOSYS; + } + break; + } + + return result; +} + +static rt_uint32_t timer_counter_get(rt_hwtimer_t *timer) +{ + TIM_HandleTypeDef *tim = RT_NULL; + + RT_ASSERT(timer != RT_NULL); + + tim = (TIM_HandleTypeDef *)timer->parent.user_data; + + return tim->Instance->CNT; +} + +static const struct rt_hwtimer_info _info = TIM_DEV_INFO_CONFIG; + +static const struct rt_hwtimer_ops _ops = +{ + .init = timer_init, + .start = timer_start, + .stop = timer_stop, + .count_get = timer_counter_get, + .control = timer_ctrl, +}; + +#ifdef BSP_USING_TIM2 +void TIM2_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM2_INDEX].tim_handle); + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TIM3 +void TIM3_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM3_INDEX].tim_handle); + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TIM4 +void TIM4_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM4_INDEX].tim_handle); + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TIM5 +void TIM5_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM5_INDEX].tim_handle); + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TIM11 +void TIM1_TRG_COM_TIM11_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM11_INDEX].tim_handle); + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TIM13 +void TIM8_UP_TIM13_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM13_INDEX].tim_handle); + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TIM14 +void TIM8_TRG_COM_TIM14_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM14_INDEX].tim_handle); + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TIM15 +void TIM1_BRK_TIM15_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM15_INDEX].tim_handle); + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TIM16 +void TIM1_UP_TIM16_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM16_INDEX].tim_handle); + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif +#ifdef BSP_USING_TIM17 +void TIM1_TRG_COM_TIM17_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + HAL_TIM_IRQHandler(&stm32_hwtimer_obj[TIM17_INDEX].tim_handle); + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif + +void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) +{ +#ifdef BSP_USING_TIM2 + if (htim->Instance == TIM2) + { + rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM2_INDEX].time_device); + } +#endif +#ifdef BSP_USING_TIM3 + if (htim->Instance == TIM3) + { + rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM3_INDEX].time_device); + } +#endif +#ifdef BSP_USING_TIM4 + if (htim->Instance == TIM4) + { + rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM4_INDEX].time_device); + } +#endif +#ifdef BSP_USING_TIM5 + if (htim->Instance == TIM5) + { + rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM5_INDEX].time_device); + } +#endif +#ifdef BSP_USING_TIM11 + if (htim->Instance == TIM11) + { + rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM11_INDEX].time_device); + } +#endif +#ifdef BSP_USING_TIM13 + if (htim->Instance == TIM13) + { + rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM13_INDEX].time_device); + } +#endif +#ifdef BSP_USING_TIM14 + if (htim->Instance == TIM14) + { + rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM14_INDEX].time_device); + } +#endif +#ifdef BSP_USING_TIM15 + if (htim->Instance == TIM15) + { + rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM15_INDEX].time_device); + } +#endif +#ifdef BSP_USING_TIM16 + if (htim->Instance == TIM16) + { + rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM16_INDEX].time_device); + } +#endif +#ifdef BSP_USING_TIM17 + if (htim->Instance == TIM17) + { + rt_device_hwtimer_isr(&stm32_hwtimer_obj[TIM17_INDEX].time_device); + } +#endif +} + +static int stm32_hwtimer_init(void) +{ + int i = 0; + int result = RT_EOK; + + for (i = 0; i < sizeof(stm32_hwtimer_obj) / sizeof(stm32_hwtimer_obj[0]); i++) + { + stm32_hwtimer_obj[i].time_device.info = &_info; + stm32_hwtimer_obj[i].time_device.ops = &_ops; + if (rt_device_hwtimer_register(&stm32_hwtimer_obj[i].time_device, stm32_hwtimer_obj[i].name, &stm32_hwtimer_obj[i].tim_handle) == RT_EOK) + { + LOG_D("%s register success", stm32_hwtimer_obj[i].name); + } + else + { + LOG_E("%s register failed", stm32_hwtimer_obj[i].name); + result = -RT_ERROR; + } + } + + return result; +} +INIT_BOARD_EXPORT(stm32_hwtimer_init); + +#endif /* RT_USING_HWTIMER */ +#endif /* BSP_USING_TIM */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_pwm.c b/bsp/stm32/libraries/HAL_Drivers/drv_pwm.c new file mode 100644 index 0000000000..5fa290c1bb --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/drv_pwm.c @@ -0,0 +1,480 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-12-13 zylx first version + */ + +#include +#ifdef RT_USING_PWM +#include "drv_config.h" + +//#define DRV_DEBUG +#define LOG_TAG "drv.pwm" +#include + +#define MAX_PERIOD 65535 +#define MIN_PERIOD 3 +#define MIN_PULSE 2 + +extern void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + +enum +{ +#ifdef BSP_USING_PWM1 + PWM1_INDEX, +#endif +#ifdef BSP_USING_PWM2 + PWM2_INDEX, +#endif +#ifdef BSP_USING_PWM3 + PWM3_INDEX, +#endif +#ifdef BSP_USING_PWM4 + PWM4_INDEX, +#endif +#ifdef BSP_USING_PWM5 + PWM5_INDEX, +#endif +#ifdef BSP_USING_PWM6 + PWM6_INDEX, +#endif +#ifdef BSP_USING_PWM7 + PWM7_INDEX, +#endif +#ifdef BSP_USING_PWM8 + PWM8_INDEX, +#endif +#ifdef BSP_USING_PWM9 + PWM9_INDEX, +#endif +#ifdef BSP_USING_PWM10 + PWM10_INDEX, +#endif +#ifdef BSP_USING_PWM11 + PWM11_INDEX, +#endif +#ifdef BSP_USING_PWM12 + PWM12_INDEX, +#endif +#ifdef BSP_USING_PWM13 + PWM13_INDEX, +#endif +#ifdef BSP_USING_PWM14 + PWM14_INDEX, +#endif +#ifdef BSP_USING_PWM15 + PWM15_INDEX, +#endif +#ifdef BSP_USING_PWM16 + PWM16_INDEX, +#endif +#ifdef BSP_USING_PWM17 + PWM17_INDEX, +#endif +}; + +struct stm32_pwm +{ + struct rt_device_pwm pwm_device; + TIM_HandleTypeDef tim_handle; + rt_uint8_t channel; + char *name; +}; + +static struct stm32_pwm stm32_pwm_obj[] = +{ +#ifdef BSP_USING_PWM1 + PWM1_CONFIG, +#endif + +#ifdef BSP_USING_PWM2 + PWM2_CONFIG, +#endif + +#ifdef BSP_USING_PWM3 + PWM3_CONFIG, +#endif + +#ifdef BSP_USING_PWM4 + PWM4_CONFIG, +#endif + +#ifdef BSP_USING_PWM5 + PWM5_CONFIG, +#endif + +#ifdef BSP_USING_PWM6 + PWM6_CONFIG, +#endif + +#ifdef BSP_USING_PWM7 + PWM7_CONFIG, +#endif + +#ifdef BSP_USING_PWM8 + PWM8_CONFIG, +#endif + +#ifdef BSP_USING_PWM9 + PWM9_CONFIG, +#endif + +#ifdef BSP_USING_PWM10 + PWM10_CONFIG, +#endif + +#ifdef BSP_USING_PWM11 + PWM11_CONFIG, +#endif + +#ifdef BSP_USING_PWM12 + PWM12_CONFIG, +#endif + +#ifdef BSP_USING_PWM13 + PWM13_CONFIG, +#endif + +#ifdef BSP_USING_PWM14 + PWM14_CONFIG, +#endif + +#ifdef BSP_USING_PWM15 + PWM15_CONFIG, +#endif + +#ifdef BSP_USING_PWM16 + PWM16_CONFIG, +#endif + +#ifdef BSP_USING_PWM17 + PWM17_CONFIG, +#endif +}; + +static rt_err_t drv_pwm_control(struct rt_device_pwm *device, int cmd, void *arg); +static struct rt_pwm_ops drv_ops = +{ + drv_pwm_control +}; + +static rt_err_t drv_pwm_enable(TIM_HandleTypeDef *htim, struct rt_pwm_configuration *configuration, rt_bool_t enable) +{ + /* Converts the channel number to the channel number of Hal library */ + rt_uint32_t channel = 0x04 * (configuration->channel - 1); + + if (!enable) + { + HAL_TIM_PWM_Stop(htim, channel); + } + else + { + HAL_TIM_PWM_Start(htim, channel); + } + + return RT_EOK; +} + +static rt_err_t drv_pwm_get(TIM_HandleTypeDef *htim, struct rt_pwm_configuration *configuration) +{ + /* Converts the channel number to the channel number of Hal library */ + rt_uint32_t channel = 0x04 * (configuration->channel - 1); + rt_uint64_t tim_clock; + +#if defined(SOC_SERIES_STM32F4) + if (htim->Instance == TIM9 || htim->Instance == TIM10 || htim->Instance == TIM11) +#elif defined(SOC_SERIES_STM32L4) + if (htim->Instance == TIM15 || htim->Instance == TIM16 || htim->Instance == TIM17) +#elif defined(SOC_SERIES_STM32F1) + if (0) +#endif + { + tim_clock = HAL_RCC_GetPCLK2Freq() * 2; + } + else + { +#if defined(SOC_SERIES_STM32L4) + tim_clock = HAL_RCC_GetPCLK1Freq(); +#else + tim_clock = HAL_RCC_GetPCLK1Freq() * 2; +#endif + } + + if (__HAL_TIM_GET_CLOCKDIVISION(htim) == TIM_CLOCKDIVISION_DIV2) + { + tim_clock = tim_clock / 2; + } + else if (__HAL_TIM_GET_CLOCKDIVISION(htim) == TIM_CLOCKDIVISION_DIV4) + { + tim_clock = tim_clock / 4; + } + + /* Convert nanosecond to frequency and duty cycle. 1s = 1 * 1000 * 1000 * 1000 ns */ + tim_clock /= 1000000UL; + configuration->period = (__HAL_TIM_GET_AUTORELOAD(htim) + 1) * (htim->Instance->PSC + 1) * 1000UL / tim_clock; + configuration->pulse = (__HAL_TIM_GET_COMPARE(htim, channel) + 1) * (htim->Instance->PSC + 1) * 1000UL / tim_clock; + + return RT_EOK; +} + +static rt_err_t drv_pwm_set(TIM_HandleTypeDef *htim, struct rt_pwm_configuration *configuration) +{ + rt_uint32_t period, pulse; + rt_uint64_t tim_clock, psc; + /* Converts the channel number to the channel number of Hal library */ + rt_uint32_t channel = 0x04 * (configuration->channel - 1); + +#if defined(SOC_SERIES_STM32F4) + if (htim->Instance == TIM9 || htim->Instance == TIM10 || htim->Instance == TIM11) +#elif defined(SOC_SERIES_STM32L4) + if (htim->Instance == TIM15 || htim->Instance == TIM16 || htim->Instance == TIM17) +#elif defined(SOC_SERIES_STM32F1) + if (0) +#endif + { + tim_clock = HAL_RCC_GetPCLK2Freq() * 2; + } + else + { +#if defined(SOC_SERIES_STM32L4) + tim_clock = HAL_RCC_GetPCLK1Freq(); +#else + tim_clock = HAL_RCC_GetPCLK1Freq() * 2; +#endif + } + + /* Convert nanosecond to frequency and duty cycle. 1s = 1 * 1000 * 1000 * 1000 ns */ + tim_clock /= 1000000UL; + period = (unsigned long long)configuration->period * tim_clock / 1000ULL ; + psc = period / MAX_PERIOD + 1; + period = period / psc; + __HAL_TIM_SET_PRESCALER(htim, psc - 1); + + if (period < MIN_PERIOD) + { + period = MIN_PERIOD; + } + __HAL_TIM_SET_AUTORELOAD(htim, period - 1); + + pulse = (unsigned long long)configuration->pulse * tim_clock / psc / 1000ULL; + if (pulse < MIN_PULSE) + { + pulse = MIN_PULSE; + } + else if (pulse > period) + { + pulse = period; + } + __HAL_TIM_SET_COMPARE(htim, channel, pulse - 1); + __HAL_TIM_SET_COUNTER(htim, 0); + + /* Update frequency value */ + HAL_TIM_GenerateEvent(htim, TIM_EVENTSOURCE_UPDATE); + + return RT_EOK; +} + +static rt_err_t drv_pwm_control(struct rt_device_pwm *device, int cmd, void *arg) +{ + struct rt_pwm_configuration *configuration = (struct rt_pwm_configuration *)arg; + TIM_HandleTypeDef *htim = (TIM_HandleTypeDef *)device->parent.user_data; + + switch (cmd) + { + case PWM_CMD_ENABLE: + return drv_pwm_enable(htim, configuration, RT_TRUE); + case PWM_CMD_DISABLE: + return drv_pwm_enable(htim, configuration, RT_FALSE); + case PWM_CMD_SET: + return drv_pwm_set(htim, configuration); + case PWM_CMD_GET: + return drv_pwm_get(htim, configuration); + default: + return RT_EINVAL; + } +} + +static rt_err_t stm32_hw_pwm_init(struct stm32_pwm *device) +{ + rt_err_t result = RT_EOK; + TIM_HandleTypeDef *tim = RT_NULL; + TIM_OC_InitTypeDef oc_config = {0}; + TIM_MasterConfigTypeDef master_config = {0}; + TIM_ClockConfigTypeDef clock_config = {0}; + + RT_ASSERT(device != RT_NULL); + + tim = (TIM_HandleTypeDef *)&device->tim_handle; + + /* configure the timer to pwm mode */ + tim->Init.Prescaler = 0; + tim->Init.CounterMode = TIM_COUNTERMODE_UP; + tim->Init.Period = 0; + tim->Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; +#if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) + tim->Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; +#endif + if (HAL_TIM_Base_Init(tim) != HAL_OK) + { + LOG_E("%s time base init failed", device->name); + result = -RT_ERROR; + goto __exit; + } + + clock_config.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(tim, &clock_config) != HAL_OK) + { + LOG_E("%s clock init failed", device->name); + result = -RT_ERROR; + goto __exit; + } + + if (HAL_TIM_PWM_Init(tim) != HAL_OK) + { + LOG_E("%s pwm init failed", device->name); + result = -RT_ERROR; + goto __exit; + } + + master_config.MasterOutputTrigger = TIM_TRGO_RESET; + master_config.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(tim, &master_config) != HAL_OK) + { + LOG_E("%s master config failed", device->name); + result = -RT_ERROR; + goto __exit; + } + + oc_config.OCMode = TIM_OCMODE_PWM1; + oc_config.Pulse = 0; + oc_config.OCPolarity = TIM_OCPOLARITY_HIGH; + oc_config.OCFastMode = TIM_OCFAST_DISABLE; + + /* config pwm channel */ + if (device->channel & 0x01) + { + if (HAL_TIM_PWM_ConfigChannel(tim, &oc_config, TIM_CHANNEL_1) != HAL_OK) + { + LOG_E("%s channel1 config failed", device->name); + result = -RT_ERROR; + goto __exit; + } + } + + if (device->channel & 0x02) + { + if (HAL_TIM_PWM_ConfigChannel(tim, &oc_config, TIM_CHANNEL_2) != HAL_OK) + { + LOG_E("%s channel2 config failed", device->name); + result = -RT_ERROR; + goto __exit; + } + } + + if (device->channel & 0x04) + { + if (HAL_TIM_PWM_ConfigChannel(tim, &oc_config, TIM_CHANNEL_3) != HAL_OK) + { + LOG_E("%s channel3 config failed", device->name); + result = -RT_ERROR; + goto __exit; + } + } + + if (device->channel & 0x08) + { + if (HAL_TIM_PWM_ConfigChannel(tim, &oc_config, TIM_CHANNEL_4) != HAL_OK) + { + LOG_E("%s channel4 config failed", device->name); + result = -RT_ERROR; + goto __exit; + } + } + + /* pwm pin configuration */ + HAL_TIM_MspPostInit(tim); + + /* enable update request source */ + __HAL_TIM_URS_ENABLE(tim); + +__exit: + return result; +} + +static void pwm_get_channel(void) +{ +#ifdef BSP_USING_PWM2_CH4 + stm32_pwm_obj[PWM2_INDEX].channel |= 1 << 3; +#endif +#ifdef BSP_USING_PWM3_CH1 + stm32_pwm_obj[PWM3_INDEX].channel |= 1 << 0; +#endif +#ifdef BSP_USING_PWM3_CH2 + stm32_pwm_obj[PWM3_INDEX].channel |= 1 << 1; +#endif +#ifdef BSP_USING_PWM3_CH3 + stm32_pwm_obj[PWM3_INDEX].channel |= 1 << 2; +#endif +#ifdef BSP_USING_PWM3_CH4 + stm32_pwm_obj[PWM3_INDEX].channel |= 1 << 3; +#endif +#ifdef BSP_USING_PWM4_CH2 + stm32_pwm_obj[PWM4_INDEX].channel |= 1 << 1; +#endif +#ifdef BSP_USING_PWM4_CH3 + stm32_pwm_obj[PWM4_INDEX].channel |= 1 << 2; +#endif +#ifdef BSP_USING_PWM5_CH1 + stm32_pwm_obj[PWM5_INDEX].channel |= 1 << 1; +#endif +#ifdef BSP_USING_PWM5_CH2 + stm32_pwm_obj[PWM5_INDEX].channel |= 1 << 2; +#endif +#ifdef BSP_USING_PWM5_CH3 + stm32_pwm_obj[PWM5_INDEX].channel |= 1 << 3; +#endif +} + +static int stm32_pwm_init(void) +{ + int i = 0; + int result = RT_EOK; + + pwm_get_channel(); + + for (i = 0; i < sizeof(stm32_pwm_obj) / sizeof(stm32_pwm_obj[0]); i++) + { + /* pwm init */ + if (stm32_hw_pwm_init(&stm32_pwm_obj[i]) != RT_EOK) + { + LOG_E("%s init failed", stm32_pwm_obj[i].name); + result = -RT_ERROR; + goto __exit; + } + else + { + LOG_D("%s init success", stm32_pwm_obj[i].name); + + /* register pwm device */ + if (rt_device_pwm_register(rt_calloc(1, sizeof(struct rt_device_pwm)), stm32_pwm_obj[i].name, &drv_ops, &stm32_pwm_obj[i].tim_handle) == RT_EOK) + { + + LOG_D("%s register success", stm32_pwm_obj[i].name); + } + else + { + LOG_E("%s register failed", stm32_pwm_obj[i].name); + result = -RT_ERROR; + } + } + } + +__exit: + return result; +} +INIT_DEVICE_EXPORT(stm32_pwm_init); +#endif /* RT_USING_PWM */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_sdio.c b/bsp/stm32/libraries/HAL_Drivers/drv_sdio.c new file mode 100644 index 0000000000..f2d6867343 --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/drv_sdio.c @@ -0,0 +1,846 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-06-22 tyx first + * 2018-12-12 balanceTWK change to new framework + */ + +#include "board.h" +#include "drv_sdio.h" +#include "drv_config.h" + +#ifdef BSP_USING_SDIO + +//#define DRV_DEBUG +#define LOG_TAG "drv.sdio" +#include + +static struct stm32_sdio_config sdio_config = SDIO_BUS_CONFIG; +static struct stm32_sdio_class sdio_obj; +static struct rt_mmcsd_host *host; + +#define SDIO_TX_RX_COMPLETE_TIMEOUT_LOOPS (100000) + +#define RTHW_SDIO_LOCK(_sdio) rt_mutex_take(&_sdio->mutex, RT_WAITING_FOREVER) +#define RTHW_SDIO_UNLOCK(_sdio) rt_mutex_release(&_sdio->mutex); + +struct sdio_pkg +{ + struct rt_mmcsd_cmd *cmd; + void *buff; + rt_uint32_t flag; +}; + +struct rthw_sdio +{ + struct rt_mmcsd_host *host; + struct stm32_sdio_des sdio_des; + struct rt_event event; + struct rt_mutex mutex; + struct sdio_pkg *pkg; +}; + +ALIGN(SDIO_ALIGN_LEN) +static rt_uint8_t cache_buf[SDIO_BUFF_SIZE]; + +static rt_uint32_t stm32_sdio_clk_get(struct stm32_sdio *hw_sdio) +{ + return SDIO_CLOCK_FREQ; +} + +/** + * @brief This function get order from sdio. + * @param data + * @retval sdio order + */ +static int get_order(rt_uint32_t data) +{ + int order = 0; + + switch (data) + { + case 1: + order = 0; + break; + case 2: + order = 1; + break; + case 4: + order = 2; + break; + case 8: + order = 3; + break; + case 16: + order = 4; + break; + case 32: + order = 5; + break; + case 64: + order = 6; + break; + case 128: + order = 7; + break; + case 256: + order = 8; + break; + case 512: + order = 9; + break; + case 1024: + order = 10; + break; + case 2048: + order = 11; + break; + case 4096: + order = 12; + break; + case 8192: + order = 13; + break; + case 16384: + order = 14; + break; + default : + order = 0; + break; + } + + return order; +} + +/** + * @brief This function wait sdio completed. + * @param sdio rthw_sdio + * @retval None + */ +static void rthw_sdio_wait_completed(struct rthw_sdio *sdio) +{ + rt_uint32_t status; + struct rt_mmcsd_cmd *cmd = sdio->pkg->cmd; + struct rt_mmcsd_data *data = cmd->data; + struct stm32_sdio *hw_sdio = sdio->sdio_des.hw_sdio; + + if (rt_event_recv(&sdio->event, 0xffffffff, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, + rt_tick_from_millisecond(5000), &status) != RT_EOK) + { + LOG_E("wait completed timeout"); + cmd->err = -RT_ETIMEOUT; + return; + } + + if (sdio->pkg == RT_NULL) + { + return; + } + + cmd->resp[0] = hw_sdio->resp1; + cmd->resp[1] = hw_sdio->resp2; + cmd->resp[2] = hw_sdio->resp3; + cmd->resp[3] = hw_sdio->resp4; + + if (status & HW_SDIO_ERRORS) + { + if ((status & HW_SDIO_IT_CCRCFAIL) && (resp_type(cmd) & (RESP_R3 | RESP_R4))) + { + cmd->err = RT_EOK; + } + else + { + cmd->err = -RT_ERROR; + } + + if (status & HW_SDIO_IT_CTIMEOUT) + { + cmd->err = -RT_ETIMEOUT; + } + + if (status & HW_SDIO_IT_DCRCFAIL) + { + data->err = -RT_ERROR; + } + + if (status & HW_SDIO_IT_DTIMEOUT) + { + data->err = -RT_ETIMEOUT; + } + + if (cmd->err == RT_EOK) + { + LOG_D("sta:0x%08X [%08X %08X %08X %08X]", status, cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3]); + } + else + { + LOG_D("err:0x%08x, %s%s%s%s%s%s%s cmd:%d arg:0x%08x rw:%c len:%d blksize:%d", + status, + status & HW_SDIO_IT_CCRCFAIL ? "CCRCFAIL " : "", + status & HW_SDIO_IT_DCRCFAIL ? "DCRCFAIL " : "", + status & HW_SDIO_IT_CTIMEOUT ? "CTIMEOUT " : "", + status & HW_SDIO_IT_DTIMEOUT ? "DTIMEOUT " : "", + status & HW_SDIO_IT_TXUNDERR ? "TXUNDERR " : "", + status & HW_SDIO_IT_RXOVERR ? "RXOVERR " : "", + status == 0 ? "NULL" : "", + cmd->cmd_code, + cmd->arg, + data ? (data->flags & DATA_DIR_WRITE ? 'w' : 'r') : '-', + data ? data->blks * data->blksize : 0, + data ? data->blksize : 0 + ); + } + } + else +{ + cmd->err = RT_EOK; + LOG_D("sta:0x%08X [%08X %08X %08X %08X]", status, cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3]); + } +} + +/** + * @brief This function transfer data by dma. + * @param sdio rthw_sdio + * @param pkg sdio package + * @retval None + */ +static void rthw_sdio_transfer_by_dma(struct rthw_sdio *sdio, struct sdio_pkg *pkg) +{ + struct rt_mmcsd_data *data; + int size; + void *buff; + struct stm32_sdio *hw_sdio; + + if ((RT_NULL == pkg) || (RT_NULL == sdio)) + { + LOG_E("rthw_sdio_transfer_by_dma invalid args"); + return; + } + + data = pkg->cmd->data; + if (RT_NULL == data) + { + LOG_E("rthw_sdio_transfer_by_dma invalid args"); + return; + } + + buff = pkg->buff; + if (RT_NULL == buff) + { + LOG_E("rthw_sdio_transfer_by_dma invalid args"); + return; + } + hw_sdio = sdio->sdio_des.hw_sdio; + size = data->blks * data->blksize; + + if (data->flags & DATA_DIR_WRITE) + { + sdio->sdio_des.txconfig((rt_uint32_t *)buff, (rt_uint32_t *)&hw_sdio->fifo, size); + hw_sdio->dctrl |= HW_SDIO_DMA_ENABLE; + } + else if (data->flags & DATA_DIR_READ) + { + sdio->sdio_des.rxconfig((rt_uint32_t *)&hw_sdio->fifo, (rt_uint32_t *)buff, size); + hw_sdio->dctrl |= HW_SDIO_DMA_ENABLE | HW_SDIO_DPSM_ENABLE; + } +} + +/** + * @brief This function send command. + * @param sdio rthw_sdio + * @param pkg sdio package + * @retval None + */ +static void rthw_sdio_send_command(struct rthw_sdio *sdio, struct sdio_pkg *pkg) +{ + struct rt_mmcsd_cmd *cmd = pkg->cmd; + struct rt_mmcsd_data *data = cmd->data; + struct stm32_sdio *hw_sdio = sdio->sdio_des.hw_sdio; + rt_uint32_t reg_cmd; + + /* save pkg */ + sdio->pkg = pkg; + + LOG_D("CMD:%d ARG:0x%08x RES:%s%s%s%s%s%s%s%s%s rw:%c len:%d blksize:%d", + cmd->cmd_code, + cmd->arg, + resp_type(cmd) == RESP_NONE ? "NONE" : "", + resp_type(cmd) == RESP_R1 ? "R1" : "", + resp_type(cmd) == RESP_R1B ? "R1B" : "", + resp_type(cmd) == RESP_R2 ? "R2" : "", + resp_type(cmd) == RESP_R3 ? "R3" : "", + resp_type(cmd) == RESP_R4 ? "R4" : "", + resp_type(cmd) == RESP_R5 ? "R5" : "", + resp_type(cmd) == RESP_R6 ? "R6" : "", + resp_type(cmd) == RESP_R7 ? "R7" : "", + data ? (data->flags & DATA_DIR_WRITE ? 'w' : 'r') : '-', + data ? data->blks * data->blksize : 0, + data ? data->blksize : 0 + ); + + /* config cmd reg */ + reg_cmd = cmd->cmd_code | HW_SDIO_CPSM_ENABLE; + if (resp_type(cmd) == RESP_NONE) + reg_cmd |= HW_SDIO_RESPONSE_NO; + else if (resp_type(cmd) == RESP_R2) + reg_cmd |= HW_SDIO_RESPONSE_LONG; + else + reg_cmd |= HW_SDIO_RESPONSE_SHORT; + + /* config data reg */ + if (data != RT_NULL) +{ + rt_uint32_t dir = 0; + rt_uint32_t size = data->blks * data->blksize; + int order; + + hw_sdio->dctrl = 0; + hw_sdio->dtimer = HW_SDIO_DATATIMEOUT; + hw_sdio->dlen = size; + order = get_order(data->blksize); + dir = (data->flags & DATA_DIR_READ) ? HW_SDIO_TO_HOST : 0; + hw_sdio->dctrl = HW_SDIO_IO_ENABLE | (order << 4) | dir; + } + + /* transfer config */ + if (data != RT_NULL) + { + rthw_sdio_transfer_by_dma(sdio, pkg); + } + + /* open irq */ + hw_sdio->mask |= HW_SDIO_IT_CMDSENT | HW_SDIO_IT_CMDREND | HW_SDIO_ERRORS; + if (data != RT_NULL) + { + hw_sdio->mask |= HW_SDIO_IT_DATAEND; + } + + /* send cmd */ + hw_sdio->arg = cmd->arg; + hw_sdio->cmd = reg_cmd; + + /* wait completed */ + rthw_sdio_wait_completed(sdio); + + /* Waiting for data to be sent to completion */ + if (data != RT_NULL) + { + volatile rt_uint32_t count = SDIO_TX_RX_COMPLETE_TIMEOUT_LOOPS; + + while (count && (hw_sdio->sta & (HW_SDIO_IT_TXACT | HW_SDIO_IT_RXACT))) + { + count--; + } + + if ((count == 0) || (hw_sdio->sta & HW_SDIO_ERRORS)) + { + cmd->err = -RT_ERROR; + } + } + + /* close irq, keep sdio irq */ + hw_sdio->mask = hw_sdio->mask & HW_SDIO_IT_SDIOIT ? HW_SDIO_IT_SDIOIT : 0x00; + + /* clear pkg */ + sdio->pkg = RT_NULL; +} + +/** + * @brief This function send sdio request. + * @param sdio rthw_sdio + * @param req request + * @retval None + */ +static void rthw_sdio_request(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req) +{ + struct sdio_pkg pkg; + struct rthw_sdio *sdio = host->private_data; + struct rt_mmcsd_data *data; + + RTHW_SDIO_LOCK(sdio); + + if (req->cmd != RT_NULL) + { + memset(&pkg, 0, sizeof(pkg)); + data = req->cmd->data; + pkg.cmd = req->cmd; + + if (data != RT_NULL) + { + rt_uint32_t size = data->blks * data->blksize; + + RT_ASSERT(size <= SDIO_BUFF_SIZE); + + pkg.buff = data->buf; + if ((rt_uint32_t)data->buf & (SDIO_ALIGN_LEN - 1)) + { + pkg.buff = cache_buf; + if (data->flags & DATA_DIR_WRITE) + { + memcpy(cache_buf, data->buf, size); + } + } + } + + rthw_sdio_send_command(sdio, &pkg); + + if ((data != RT_NULL) && (data->flags & DATA_DIR_READ) && ((rt_uint32_t)data->buf & (SDIO_ALIGN_LEN - 1))) + { + memcpy(data->buf, cache_buf, data->blksize * data->blks); + } + } + + if (req->stop != RT_NULL) + { + memset(&pkg, 0, sizeof(pkg)); + pkg.cmd = req->stop; + rthw_sdio_send_command(sdio, &pkg); + } + + RTHW_SDIO_UNLOCK(sdio); + + mmcsd_req_complete(sdio->host); +} + +/** + * @brief This function config sdio. + * @param host rt_mmcsd_host + * @param io_cfg rt_mmcsd_io_cfg + * @retval None + */ +static void rthw_sdio_iocfg(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io_cfg) +{ + rt_uint32_t clkcr, div, clk_src; + rt_uint32_t clk = io_cfg->clock; + struct rthw_sdio *sdio = host->private_data; + struct stm32_sdio *hw_sdio = sdio->sdio_des.hw_sdio; + + clk_src = sdio->sdio_des.clk_get(sdio->sdio_des.hw_sdio); + if (clk_src < 400 * 1000) + { + LOG_E("The clock rate is too low! rata:%d", clk_src); + return; + } + + if (clk > host->freq_max) clk = host->freq_max; + + if (clk > clk_src) + { + LOG_W("Setting rate is greater than clock source rate."); + clk = clk_src; + } + + LOG_D("clk:%d width:%s%s%s power:%s%s%s", + clk, + io_cfg->bus_width == MMCSD_BUS_WIDTH_8 ? "8" : "", + io_cfg->bus_width == MMCSD_BUS_WIDTH_4 ? "4" : "", + io_cfg->bus_width == MMCSD_BUS_WIDTH_1 ? "1" : "", + io_cfg->power_mode == MMCSD_POWER_OFF ? "OFF" : "", + io_cfg->power_mode == MMCSD_POWER_UP ? "UP" : "", + io_cfg->power_mode == MMCSD_POWER_ON ? "ON" : "" + ); + + RTHW_SDIO_LOCK(sdio); + + div = clk_src / clk; + if ((clk == 0) || (div == 0)) + { + clkcr = 0; + } + else + { + if (div < 2) + { + div = 2; + } + else if (div > 0xFF) + { + div = 0xFF; + } + div -= 2; + clkcr = div | HW_SDIO_CLK_ENABLE; + } + + if (io_cfg->bus_width == MMCSD_BUS_WIDTH_8) + { + clkcr |= HW_SDIO_BUSWIDE_8B; + } + else if (io_cfg->bus_width == MMCSD_BUS_WIDTH_4) + { + clkcr |= HW_SDIO_BUSWIDE_4B; + } + else + { + clkcr |= HW_SDIO_BUSWIDE_1B; + } + + hw_sdio->clkcr = clkcr; + + switch (io_cfg->power_mode) + { + case MMCSD_POWER_OFF: + hw_sdio->power = HW_SDIO_POWER_OFF; + break; + case MMCSD_POWER_UP: + hw_sdio->power = HW_SDIO_POWER_UP; + break; + case MMCSD_POWER_ON: + hw_sdio->power = HW_SDIO_POWER_ON; + break; + default: + LOG_W("unknown power_mode %d", io_cfg->power_mode); + break; + } + + RTHW_SDIO_UNLOCK(sdio); +} + +/** + * @brief This function update sdio interrupt. + * @param host rt_mmcsd_host + * @param enable + * @retval None + */ +void rthw_sdio_irq_update(struct rt_mmcsd_host *host, rt_int32_t enable) +{ + struct rthw_sdio *sdio = host->private_data; + struct stm32_sdio *hw_sdio = sdio->sdio_des.hw_sdio; + + if (enable) + { + LOG_D("enable sdio irq"); + hw_sdio->mask |= HW_SDIO_IT_SDIOIT; + } + else + { + LOG_D("disable sdio irq"); + hw_sdio->mask &= ~HW_SDIO_IT_SDIOIT; + } +} + +/** + * @brief This function delect sdcard. + * @param host rt_mmcsd_host + * @retval 0x01 + */ +static rt_int32_t rthw_sd_delect(struct rt_mmcsd_host *host) +{ + LOG_D("try to detect device"); + return 0x01; +} + +/** + * @brief This function interrupt process function. + * @param host rt_mmcsd_host + * @retval None + */ +void rthw_sdio_irq_process(struct rt_mmcsd_host *host) +{ + int complete = 0; + struct rthw_sdio *sdio = host->private_data; + struct stm32_sdio *hw_sdio = sdio->sdio_des.hw_sdio; + rt_uint32_t intstatus = hw_sdio->sta; + + if (intstatus & HW_SDIO_ERRORS) + { + hw_sdio->icr = HW_SDIO_ERRORS; + complete = 1; + } + else + { + if (intstatus & HW_SDIO_IT_CMDREND) + { + hw_sdio->icr = HW_SDIO_IT_CMDREND; + + if (sdio->pkg != RT_NULL) + { + if (!sdio->pkg->cmd->data) + { + complete = 1; + } + else if ((sdio->pkg->cmd->data->flags & DATA_DIR_WRITE)) + { + hw_sdio->dctrl |= HW_SDIO_DPSM_ENABLE; + } + } + } + + if (intstatus & HW_SDIO_IT_CMDSENT) + { + hw_sdio->icr = HW_SDIO_IT_CMDSENT; + + if (resp_type(sdio->pkg->cmd) == RESP_NONE) + { + complete = 1; + } + } + + if (intstatus & HW_SDIO_IT_DATAEND) + { + hw_sdio->icr = HW_SDIO_IT_DATAEND; + complete = 1; + } + } + + if ((intstatus & HW_SDIO_IT_SDIOIT) && (hw_sdio->mask & HW_SDIO_IT_SDIOIT)) + { + hw_sdio->icr = HW_SDIO_IT_SDIOIT; + sdio_irq_wakeup(host); + } + + if (complete) + { + hw_sdio->mask &= ~HW_SDIO_ERRORS; + rt_event_send(&sdio->event, intstatus); + } +} + +static const struct rt_mmcsd_host_ops ops = +{ + rthw_sdio_request, + rthw_sdio_iocfg, + rthw_sd_delect, + rthw_sdio_irq_update, +}; + +/** + * @brief This function create mmcsd host. + * @param sdio_des stm32_sdio_des + * @retval rt_mmcsd_host + */ +struct rt_mmcsd_host *sdio_host_create(struct stm32_sdio_des *sdio_des) +{ + struct rt_mmcsd_host *host; + struct rthw_sdio *sdio = RT_NULL; + + if ((sdio_des == RT_NULL) || (sdio_des->txconfig == RT_NULL) || (sdio_des->rxconfig == RT_NULL)) + { + LOG_E("L:%d F:%s %s %s %s", + (sdio_des == RT_NULL ? "sdio_des is NULL" : ""), + (sdio_des ? (sdio_des->txconfig ? "txconfig is NULL" : "") : ""), + (sdio_des ? (sdio_des->rxconfig ? "rxconfig is NULL" : "") : "") + ); + return RT_NULL; + } + + sdio = rt_malloc(sizeof(struct rthw_sdio)); + if (sdio == RT_NULL) + { + LOG_E("L:%d F:%s malloc rthw_sdio fail"); + return RT_NULL; + } + rt_memset(sdio, 0, sizeof(struct rthw_sdio)); + + host = mmcsd_alloc_host(); + if (host == RT_NULL) + { + LOG_E("L:%d F:%s mmcsd alloc host fail"); + rt_free(sdio); + return RT_NULL; + } + + rt_memcpy(&sdio->sdio_des, sdio_des, sizeof(struct stm32_sdio_des)); + sdio->sdio_des.hw_sdio = (sdio_des->hw_sdio == RT_NULL ? (struct stm32_sdio *)SDIO_BASE_ADDRESS : sdio_des->hw_sdio); + sdio->sdio_des.clk_get = (sdio_des->clk_get == RT_NULL ? stm32_sdio_clk_get : sdio_des->clk_get); + + rt_event_init(&sdio->event, "sdio", RT_IPC_FLAG_FIFO); + rt_mutex_init(&sdio->mutex, "sdio", RT_IPC_FLAG_FIFO); + + /* set host defautl attributes */ + host->ops = &ops; + host->freq_min = 400 * 1000; + host->freq_max = SDIO_MAX_FREQ; + host->valid_ocr = 0X00FFFF80;/* The voltage range supported is 1.65v-3.6v */ +#ifndef SDIO_USING_1_BIT + host->flags = MMCSD_BUSWIDTH_4 | MMCSD_MUTBLKWRITE | MMCSD_SUP_SDIO_IRQ; +#else + host->flags = MMCSD_MUTBLKWRITE | MMCSD_SUP_SDIO_IRQ; +#endif + host->max_seg_size = SDIO_BUFF_SIZE; + host->max_dma_segs = 1; + host->max_blk_size = 512; + host->max_blk_count = 512; + + /* link up host and sdio */ + sdio->host = host; + host->private_data = sdio; + + rthw_sdio_irq_update(host, 1); + + /* ready to change */ + mmcsd_change(host); + + return host; +} + +/** + * @brief This function configures the DMATX. + * @param BufferSRC: pointer to the source buffer + * @param BufferSize: buffer size + * @retval None + */ +void SD_LowLevel_DMA_TxConfig(uint32_t *src, uint32_t *dst, uint32_t BufferSize) +{ +#if defined(SOC_SERIES_STM32F1) + static uint32_t size = 0; + size += BufferSize * 4; + sdio_obj.cfg = &sdio_config; + sdio_obj.dma.handle_tx.Instance = sdio_config.dma_tx.Instance; + sdio_obj.dma.handle_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; + sdio_obj.dma.handle_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; + sdio_obj.dma.handle_tx.Init.MemInc = DMA_MINC_ENABLE; + sdio_obj.dma.handle_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; + sdio_obj.dma.handle_tx.Init.PeriphInc = DMA_PINC_DISABLE; + sdio_obj.dma.handle_tx.Init.Priority = DMA_PRIORITY_MEDIUM; + /* DMA_PFCTRL */ + HAL_DMA_DeInit(&sdio_obj.dma.handle_tx); + HAL_DMA_Init(&sdio_obj.dma.handle_tx); + + HAL_DMA_Start(&sdio_obj.dma.handle_tx, (uint32_t)src, (uint32_t)dst, BufferSize); +#else + static uint32_t size = 0; + size += BufferSize * 4; + sdio_obj.cfg = &sdio_config; + sdio_obj.dma.handle_tx.Instance = sdio_config.dma_tx.Instance; + sdio_obj.dma.handle_tx.Init.Channel = sdio_config.dma_tx.channel; + sdio_obj.dma.handle_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; + sdio_obj.dma.handle_tx.Init.PeriphInc = DMA_PINC_DISABLE; + sdio_obj.dma.handle_tx.Init.MemInc = DMA_MINC_ENABLE; + sdio_obj.dma.handle_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; + sdio_obj.dma.handle_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; + sdio_obj.dma.handle_tx.Init.Mode = DMA_PFCTRL; + sdio_obj.dma.handle_tx.Init.Priority = DMA_PRIORITY_MEDIUM; + sdio_obj.dma.handle_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE; + sdio_obj.dma.handle_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; + sdio_obj.dma.handle_tx.Init.MemBurst = DMA_MBURST_INC4; + sdio_obj.dma.handle_tx.Init.PeriphBurst = DMA_PBURST_INC4; + /* DMA_PFCTRL */ + HAL_DMA_DeInit(&sdio_obj.dma.handle_tx); + HAL_DMA_Init(&sdio_obj.dma.handle_tx); + + HAL_DMA_Start(&sdio_obj.dma.handle_tx, (uint32_t)src, (uint32_t)dst, BufferSize); +#endif +} + +/** + * @brief This function configures the DMARX. + * @param BufferDST: pointer to the destination buffer + * @param BufferSize: buffer size + * @retval None + */ +void SD_LowLevel_DMA_RxConfig(uint32_t *src, uint32_t *dst, uint32_t BufferSize) +{ +#if defined(SOC_SERIES_STM32F1) + sdio_obj.cfg = &sdio_config; + sdio_obj.dma.handle_tx.Instance = sdio_config.dma_tx.Instance; + sdio_obj.dma.handle_tx.Init.Direction = DMA_PERIPH_TO_MEMORY; + sdio_obj.dma.handle_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; + sdio_obj.dma.handle_tx.Init.MemInc = DMA_MINC_ENABLE; + sdio_obj.dma.handle_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; + sdio_obj.dma.handle_tx.Init.PeriphInc = DMA_PINC_DISABLE; + sdio_obj.dma.handle_tx.Init.Priority = DMA_PRIORITY_MEDIUM; + + HAL_DMA_DeInit(&sdio_obj.dma.handle_tx); + HAL_DMA_Init(&sdio_obj.dma.handle_tx); + + HAL_DMA_Start(&sdio_obj.dma.handle_tx, (uint32_t)src, (uint32_t)dst, BufferSize); +#else + sdio_obj.cfg = &sdio_config; + sdio_obj.dma.handle_tx.Instance = sdio_config.dma_tx.Instance; + sdio_obj.dma.handle_tx.Init.Channel = sdio_config.dma_tx.channel; + sdio_obj.dma.handle_tx.Init.Direction = DMA_PERIPH_TO_MEMORY; + sdio_obj.dma.handle_tx.Init.PeriphInc = DMA_PINC_DISABLE; + sdio_obj.dma.handle_tx.Init.MemInc = DMA_MINC_ENABLE; + sdio_obj.dma.handle_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; + sdio_obj.dma.handle_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; + sdio_obj.dma.handle_tx.Init.Mode = DMA_PFCTRL; + sdio_obj.dma.handle_tx.Init.Priority = DMA_PRIORITY_MEDIUM; + sdio_obj.dma.handle_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE; + sdio_obj.dma.handle_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; + sdio_obj.dma.handle_tx.Init.MemBurst = DMA_MBURST_INC4; + sdio_obj.dma.handle_tx.Init.PeriphBurst = DMA_PBURST_INC4; + + HAL_DMA_DeInit(&sdio_obj.dma.handle_tx); + HAL_DMA_Init(&sdio_obj.dma.handle_tx); + + HAL_DMA_Start(&sdio_obj.dma.handle_tx, (uint32_t)src, (uint32_t)dst, BufferSize); +#endif + +} + +/** + * @brief This function get stm32 sdio clock. + * @param hw_sdio: stm32_sdio + * @retval PCLK2Freq + */ +static rt_uint32_t stm32_sdio_clock_get(struct stm32_sdio *hw_sdio) +{ + return HAL_RCC_GetPCLK2Freq(); +} + +static rt_err_t DMA_TxConfig(rt_uint32_t *src, rt_uint32_t *dst, int Size) +{ + SD_LowLevel_DMA_TxConfig((uint32_t *)src, (uint32_t *)dst, Size / 4); + return RT_EOK; +} + +static rt_err_t DMA_RxConfig(rt_uint32_t *src, rt_uint32_t *dst, int Size) +{ + SD_LowLevel_DMA_RxConfig((uint32_t *)src, (uint32_t *)dst, Size / 4); + return RT_EOK; +} + +void SDIO_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + /* Process All SDIO Interrupt Sources */ + rthw_sdio_irq_process(host); + + /* leave interrupt */ + rt_interrupt_leave(); +} + +int rt_hw_sdio_init(void) +{ + struct stm32_sdio_des sdio_des; + SD_HandleTypeDef hsd; + hsd.Instance = SDIO; + { + rt_uint32_t tmpreg = 0x00U; +#if defined(SOC_SERIES_STM32F1) + /* enable DMA clock && Delay after an RCC peripheral clock enabling*/ + SET_BIT(RCC->AHBENR, sdio_config.dma_rx.dma_rcc); + tmpreg = READ_BIT(RCC->AHBENR, sdio_config.dma_rx.dma_rcc); +#elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32L4) + SET_BIT(RCC->AHB1ENR, sdio_config.dma_rx.dma_rcc); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->AHB1ENR, sdio_config.dma_rx.dma_rcc); +#endif + UNUSED(tmpreg); /* To avoid compiler warnings */ + } + HAL_NVIC_SetPriority(SDIO_IRQn, 2, 0); + HAL_NVIC_EnableIRQ(SDIO_IRQn); + HAL_SD_MspInit(&hsd); + + sdio_des.clk_get = stm32_sdio_clock_get; + sdio_des.hw_sdio = (struct stm32_sdio *)SDIO; + sdio_des.rxconfig = DMA_RxConfig; + sdio_des.txconfig = DMA_TxConfig; + + host = sdio_host_create(&sdio_des); + if (host == RT_NULL) + { + LOG_E("host create fail"); + return -1; + } + + return 0; +} +INIT_DEVICE_EXPORT(rt_hw_sdio_init); + +#endif diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_sdio.h b/bsp/stm32/libraries/HAL_Drivers/drv_sdio.h new file mode 100644 index 0000000000..f0b3cdb347 --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/drv_sdio.h @@ -0,0 +1,178 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-12-13 BalanceTWK first version + */ + +#ifndef _DRV_SDIO_H +#define _DRV_SDIO_H +#include +#include "rtdevice.h" +#include +#include +#include "drv_dma.h" +#include +#include +#include + +#define SDIO_BUFF_SIZE 4096 +#define SDIO_MAX_FREQ 2000000 +#define SDIO_ALIGN_LEN 32 + +#ifndef SDIO_BASE_ADDRESS +#define SDIO_BASE_ADDRESS (0x40012800U) +#endif + +#ifndef SDIO_CLOCK_FREQ +#define SDIO_CLOCK_FREQ (48U * 1000 * 1000) +#endif + +#ifndef SDIO_BUFF_SIZE +#define SDIO_BUFF_SIZE (4096) +#endif + +#ifndef SDIO_ALIGN_LEN +#define SDIO_ALIGN_LEN (32) +#endif + +#ifndef SDIO_MAX_FREQ +#define SDIO_MAX_FREQ (24 * 1000 * 1000) +#endif + +#define HW_SDIO_IT_CCRCFAIL (0x01U << 0) +#define HW_SDIO_IT_DCRCFAIL (0x01U << 1) +#define HW_SDIO_IT_CTIMEOUT (0x01U << 2) +#define HW_SDIO_IT_DTIMEOUT (0x01U << 3) +#define HW_SDIO_IT_TXUNDERR (0x01U << 4) +#define HW_SDIO_IT_RXOVERR (0x01U << 5) +#define HW_SDIO_IT_CMDREND (0x01U << 6) +#define HW_SDIO_IT_CMDSENT (0x01U << 7) +#define HW_SDIO_IT_DATAEND (0x01U << 8) +#define HW_SDIO_IT_STBITERR (0x01U << 9) +#define HW_SDIO_IT_DBCKEND (0x01U << 10) +#define HW_SDIO_IT_CMDACT (0x01U << 11) +#define HW_SDIO_IT_TXACT (0x01U << 12) +#define HW_SDIO_IT_RXACT (0x01U << 13) +#define HW_SDIO_IT_TXFIFOHE (0x01U << 14) +#define HW_SDIO_IT_RXFIFOHF (0x01U << 15) +#define HW_SDIO_IT_TXFIFOF (0x01U << 16) +#define HW_SDIO_IT_RXFIFOF (0x01U << 17) +#define HW_SDIO_IT_TXFIFOE (0x01U << 18) +#define HW_SDIO_IT_RXFIFOE (0x01U << 19) +#define HW_SDIO_IT_TXDAVL (0x01U << 20) +#define HW_SDIO_IT_RXDAVL (0x01U << 21) +#define HW_SDIO_IT_SDIOIT (0x01U << 22) + +#define HW_SDIO_ERRORS \ + (HW_SDIO_IT_CCRCFAIL | HW_SDIO_IT_CTIMEOUT | \ + HW_SDIO_IT_DCRCFAIL | HW_SDIO_IT_DTIMEOUT | \ + HW_SDIO_IT_RXOVERR | HW_SDIO_IT_TXUNDERR) + +#define HW_SDIO_POWER_OFF (0x00U) +#define HW_SDIO_POWER_UP (0x02U) +#define HW_SDIO_POWER_ON (0x03U) + +#define HW_SDIO_FLOW_ENABLE (0x01U << 14) +#define HW_SDIO_BUSWIDE_1B (0x00U << 11) +#define HW_SDIO_BUSWIDE_4B (0x01U << 11) +#define HW_SDIO_BUSWIDE_8B (0x02U << 11) +#define HW_SDIO_BYPASS_ENABLE (0x01U << 10) +#define HW_SDIO_IDLE_ENABLE (0x01U << 9) +#define HW_SDIO_CLK_ENABLE (0x01U << 8) + +#define HW_SDIO_SUSPEND_CMD (0x01U << 11) +#define HW_SDIO_CPSM_ENABLE (0x01U << 10) +#define HW_SDIO_WAIT_END (0x01U << 9) +#define HW_SDIO_WAIT_INT (0x01U << 8) +#define HW_SDIO_RESPONSE_NO (0x00U << 6) +#define HW_SDIO_RESPONSE_SHORT (0x01U << 6) +#define HW_SDIO_RESPONSE_LONG (0x03U << 6) + +#define HW_SDIO_DATA_LEN_MASK (0x01FFFFFFU) + +#define HW_SDIO_IO_ENABLE (0x01U << 11) +#define HW_SDIO_RWMOD_CK (0x01U << 10) +#define HW_SDIO_RWSTOP_ENABLE (0x01U << 9) +#define HW_SDIO_RWSTART_ENABLE (0x01U << 8) +#define HW_SDIO_DBLOCKSIZE_1 (0x00U << 4) +#define HW_SDIO_DBLOCKSIZE_2 (0x01U << 4) +#define HW_SDIO_DBLOCKSIZE_4 (0x02U << 4) +#define HW_SDIO_DBLOCKSIZE_8 (0x03U << 4) +#define HW_SDIO_DBLOCKSIZE_16 (0x04U << 4) +#define HW_SDIO_DBLOCKSIZE_32 (0x05U << 4) +#define HW_SDIO_DBLOCKSIZE_64 (0x06U << 4) +#define HW_SDIO_DBLOCKSIZE_128 (0x07U << 4) +#define HW_SDIO_DBLOCKSIZE_256 (0x08U << 4) +#define HW_SDIO_DBLOCKSIZE_512 (0x09U << 4) +#define HW_SDIO_DBLOCKSIZE_1024 (0x0AU << 4) +#define HW_SDIO_DBLOCKSIZE_2048 (0x0BU << 4) +#define HW_SDIO_DBLOCKSIZE_4096 (0x0CU << 4) +#define HW_SDIO_DBLOCKSIZE_8192 (0x0DU << 4) +#define HW_SDIO_DBLOCKSIZE_16384 (0x0EU << 4) +#define HW_SDIO_DMA_ENABLE (0x01U << 3) +#define HW_SDIO_STREAM_ENABLE (0x01U << 2) +#define HW_SDIO_TO_HOST (0x01U << 1) +#define HW_SDIO_DPSM_ENABLE (0x01U << 0) + +#define HW_SDIO_DATATIMEOUT (0xF0000000U) + +struct stm32_sdio +{ + volatile rt_uint32_t power; + volatile rt_uint32_t clkcr; + volatile rt_uint32_t arg; + volatile rt_uint32_t cmd; + volatile rt_uint32_t respcmd; + volatile rt_uint32_t resp1; + volatile rt_uint32_t resp2; + volatile rt_uint32_t resp3; + volatile rt_uint32_t resp4; + volatile rt_uint32_t dtimer; + volatile rt_uint32_t dlen; + volatile rt_uint32_t dctrl; + volatile rt_uint32_t dcount; + volatile rt_uint32_t sta; + volatile rt_uint32_t icr; + volatile rt_uint32_t mask; + volatile rt_uint32_t reserved0[2]; + volatile rt_uint32_t fifocnt; + volatile rt_uint32_t reserved1[13]; + volatile rt_uint32_t fifo; +}; + +typedef rt_err_t (*dma_txconfig)(rt_uint32_t *src, rt_uint32_t *dst, int size); +typedef rt_err_t (*dma_rxconfig)(rt_uint32_t *src, rt_uint32_t *dst, int size); +typedef rt_uint32_t (*sdio_clk_get)(struct stm32_sdio *hw_sdio); + +struct stm32_sdio_des +{ + struct stm32_sdio *hw_sdio; + dma_txconfig txconfig; + dma_rxconfig rxconfig; + sdio_clk_get clk_get; +}; + +struct stm32_sdio_config +{ + SDIO_TypeDef *Instance; + struct dma_config dma_rx, dma_tx; +}; + +/* stm32 sdio dirver class */ +struct stm32_sdio_class +{ + struct stm32_sdio_des *des; + const struct stm32_sdio_config *cfg; + struct rt_mmcsd_host host; + struct + { + DMA_HandleTypeDef handle_rx; + DMA_HandleTypeDef handle_tx; + } dma; +}; + +#endif From ba83d6c90e6eea4b7d3368c56bf17eee740ac71e Mon Sep 17 00:00:00 2001 From: SummerGift Date: Mon, 17 Dec 2018 10:44:30 +0800 Subject: [PATCH 03/14] [bsp][stm32] add stm32l475-atk-pandora bsp --- bsp/stm32/stm32f103-atk-nano/.config | 38 +- .../board/CubeMX_Config/Inc/main.h | 2 + .../CubeMX_Config/Inc/stm32f1xx_hal_conf.h | 2 +- .../board/CubeMX_Config/Src/main.c | 165 +- .../CubeMX_Config/Src/stm32f1xx_hal_msp.c | 123 +- .../board/CubeMX_Config/stm32f103rbt6.ioc | 52 +- bsp/stm32/stm32f103-atk-nano/board/Kconfig | 38 +- bsp/stm32/stm32f103-atk-nano/board/board.c | 13 +- bsp/stm32/stm32f103-atk-nano/rtconfig.h | 13 +- bsp/stm32/stm32f103-fire-arbitrary/.config | 42 +- .../board/CubeMX_Config/.mxproject | 8 +- .../board/CubeMX_Config/Inc/main.h | 2 + .../CubeMX_Config/Inc/stm32f1xx_hal_conf.h | 4 +- .../board/CubeMX_Config/Src/main.c | 256 ++ .../CubeMX_Config/Src/stm32f1xx_hal_msp.c | 230 +- .../board/CubeMX_Config/stm32f103zet6.ioc | 93 +- .../stm32f103-fire-arbitrary/board/Kconfig | 68 + .../stm32f103-fire-arbitrary/board/SConscript | 3 + .../stm32f103-fire-arbitrary/board/board.c | 61 +- bsp/stm32/stm32f103-fire-arbitrary/rtconfig.h | 13 +- bsp/stm32/stm32f407-atk-explorer/.config | 20 +- .../board/CubeMX_Config/.mxproject | 4 +- .../board/CubeMX_Config/CubeMX_Config.ioc | 119 +- .../board/CubeMX_Config/Inc/main.h | 2 + .../CubeMX_Config/Inc/stm32f4xx_hal_conf.h | 4 +- .../board/CubeMX_Config/Src/main.c | 245 +- .../CubeMX_Config/Src/stm32f4xx_hal_msp.c | 286 +- .../stm32f407-atk-explorer/board/Kconfig | 53 +- .../stm32f407-atk-explorer/board/SConscript | 3 + .../stm32f407-atk-explorer/board/board.c | 56 +- bsp/stm32/stm32f407-atk-explorer/rtconfig.h | 10 +- bsp/stm32/stm32f429-atk-apollo/.config | 40 +- .../board/CubeMX_Config/.mxproject | 8 +- .../board/CubeMX_Config/Inc/main.h | 2 + .../CubeMX_Config/Inc/stm32f4xx_hal_conf.h | 6 +- .../board/CubeMX_Config/STM32F429IG.ioc | 212 +- .../board/CubeMX_Config/Src/main.c | 333 +- .../CubeMX_Config/Src/stm32f4xx_hal_msp.c | 400 ++- bsp/stm32/stm32f429-atk-apollo/board/Kconfig | 52 +- .../stm32f429-atk-apollo/board/SConscript | 3 + bsp/stm32/stm32f429-atk-apollo/board/board.c | 46 +- bsp/stm32/stm32f429-atk-apollo/rtconfig.h | 13 +- bsp/stm32/stm32f429-fire-challenger/.config | 41 +- .../board/CubeMX_Config/.mxproject | 8 +- .../board/CubeMX_Config/CubeMX_Config.ioc | 116 +- .../board/CubeMX_Config/Inc/main.h | 2 + .../CubeMX_Config/Inc/stm32f4xx_hal_conf.h | 4 +- .../board/CubeMX_Config/Src/main.c | 211 +- .../CubeMX_Config/Src/stm32f4xx_hal_msp.c | 234 +- .../stm32f429-fire-challenger/board/Kconfig | 67 +- .../board/SConscript | 3 + .../stm32f429-fire-challenger/board/board.c | 14 +- .../stm32f429-fire-challenger/rtconfig.h | 13 +- bsp/stm32/stm32l475-atk-pandora/.config | 364 +++ bsp/stm32/stm32l475-atk-pandora/.gitignore | 42 + bsp/stm32/stm32l475-atk-pandora/Kconfig | 21 + bsp/stm32/stm32l475-atk-pandora/README.md | 142 + bsp/stm32/stm32l475-atk-pandora/SConscript | 14 + bsp/stm32/stm32l475-atk-pandora/SConstruct | 58 + .../applications/SConscript | 9 + .../stm32l475-atk-pandora/applications/main.c | 24 + .../board/CubeMX_Config/.mxproject | 13 + .../board/CubeMX_Config/Inc/main.h | 93 + .../CubeMX_Config/Inc/stm32l4xx_hal_conf.h | 434 +++ .../board/CubeMX_Config/Inc/stm32l4xx_it.h | 84 + .../board/CubeMX_Config/STM32L475VE.ioc | 261 ++ .../board/CubeMX_Config/Src/main.c | 777 +++++ .../CubeMX_Config/Src/stm32l4xx_hal_msp.c | 660 ++++ .../board/CubeMX_Config/Src/stm32l4xx_it.c | 217 ++ .../CubeMX_Config/Src/system_stm32l4xx.c | 353 ++ bsp/stm32/stm32l475-atk-pandora/board/Kconfig | 210 ++ .../stm32l475-atk-pandora/board/SConscript | 37 + bsp/stm32/stm32l475-atk-pandora/board/board.c | 85 + bsp/stm32/stm32l475-atk-pandora/board/board.h | 41 + .../board/linker_scripts/link.icf | 33 + .../board/linker_scripts/link.lds | 144 + .../board/linker_scripts/link.sct | 15 + .../board/ports/drv_qspi_flash.c | 77 + .../board/ports/fal_cfg.h | 34 + .../board/ports/sdcard_port.c | 75 + .../stm32l475-atk-pandora/figures/board.png | Bin 0 -> 488034 bytes bsp/stm32/stm32l475-atk-pandora/project.ewd | 2834 +++++++++++++++++ bsp/stm32/stm32l475-atk-pandora/project.ewp | 2497 +++++++++++++++ bsp/stm32/stm32l475-atk-pandora/project.eww | 10 + .../stm32l475-atk-pandora/project.uvoptx | 196 ++ .../stm32l475-atk-pandora/project.uvprojx | 1373 ++++++++ bsp/stm32/stm32l475-atk-pandora/rtconfig.h | 173 + bsp/stm32/stm32l475-atk-pandora/rtconfig.py | 133 + bsp/stm32/stm32l475-atk-pandora/template.ewp | 2031 ++++++++++++ bsp/stm32/stm32l475-atk-pandora/template.eww | 10 + .../stm32l475-atk-pandora/template.uvoptx | 196 ++ .../stm32l475-atk-pandora/template.uvprojx | 394 +++ 92 files changed, 17608 insertions(+), 412 deletions(-) create mode 100644 bsp/stm32/stm32l475-atk-pandora/.config create mode 100644 bsp/stm32/stm32l475-atk-pandora/.gitignore create mode 100644 bsp/stm32/stm32l475-atk-pandora/Kconfig create mode 100644 bsp/stm32/stm32l475-atk-pandora/README.md create mode 100644 bsp/stm32/stm32l475-atk-pandora/SConscript create mode 100644 bsp/stm32/stm32l475-atk-pandora/SConstruct create mode 100644 bsp/stm32/stm32l475-atk-pandora/applications/SConscript create mode 100644 bsp/stm32/stm32l475-atk-pandora/applications/main.c create mode 100644 bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/.mxproject create mode 100644 bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc/main.h create mode 100644 bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h create mode 100644 bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc/stm32l4xx_it.h create mode 100644 bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/STM32L475VE.ioc create mode 100644 bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/main.c create mode 100644 bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c create mode 100644 bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/stm32l4xx_it.c create mode 100644 bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/system_stm32l4xx.c create mode 100644 bsp/stm32/stm32l475-atk-pandora/board/Kconfig create mode 100644 bsp/stm32/stm32l475-atk-pandora/board/SConscript create mode 100644 bsp/stm32/stm32l475-atk-pandora/board/board.c create mode 100644 bsp/stm32/stm32l475-atk-pandora/board/board.h create mode 100644 bsp/stm32/stm32l475-atk-pandora/board/linker_scripts/link.icf create mode 100644 bsp/stm32/stm32l475-atk-pandora/board/linker_scripts/link.lds create mode 100644 bsp/stm32/stm32l475-atk-pandora/board/linker_scripts/link.sct create mode 100644 bsp/stm32/stm32l475-atk-pandora/board/ports/drv_qspi_flash.c create mode 100644 bsp/stm32/stm32l475-atk-pandora/board/ports/fal_cfg.h create mode 100644 bsp/stm32/stm32l475-atk-pandora/board/ports/sdcard_port.c create mode 100644 bsp/stm32/stm32l475-atk-pandora/figures/board.png create mode 100644 bsp/stm32/stm32l475-atk-pandora/project.ewd create mode 100644 bsp/stm32/stm32l475-atk-pandora/project.ewp create mode 100644 bsp/stm32/stm32l475-atk-pandora/project.eww create mode 100644 bsp/stm32/stm32l475-atk-pandora/project.uvoptx create mode 100644 bsp/stm32/stm32l475-atk-pandora/project.uvprojx create mode 100644 bsp/stm32/stm32l475-atk-pandora/rtconfig.h create mode 100644 bsp/stm32/stm32l475-atk-pandora/rtconfig.py create mode 100644 bsp/stm32/stm32l475-atk-pandora/template.ewp create mode 100644 bsp/stm32/stm32l475-atk-pandora/template.eww create mode 100644 bsp/stm32/stm32l475-atk-pandora/template.uvoptx create mode 100644 bsp/stm32/stm32l475-atk-pandora/template.uvprojx diff --git a/bsp/stm32/stm32f103-atk-nano/.config b/bsp/stm32/stm32f103-atk-nano/.config index efe60afe64..781bcbb652 100644 --- a/bsp/stm32/stm32f103-atk-nano/.config +++ b/bsp/stm32/stm32f103-atk-nano/.config @@ -7,6 +7,7 @@ # 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 @@ -15,6 +16,7 @@ CONFIG_RT_THREAD_PRIORITY_MAX=32 CONFIG_RT_TICK_PER_SECOND=1000 CONFIG_RT_USING_OVERFLOW_CHECK=y CONFIG_RT_USING_HOOK=y +CONFIG_RT_USING_IDLE_HOOK=y CONFIG_RT_IDEL_HOOK_LIST_SIZE=4 CONFIG_IDLE_THREAD_STACK_SIZE=256 # CONFIG_RT_USING_TIMER_SOFT is not set @@ -61,9 +63,11 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +CONFIG_RT_VER_NUM=0x40000 CONFIG_ARCH_ARM=y CONFIG_ARCH_ARM_CORTEX_M=y CONFIG_ARCH_ARM_CORTEX_M3=y +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set # # RT-Thread Components @@ -108,15 +112,18 @@ CONFIG_FINSH_ARG_MAX=10 CONFIG_RT_USING_DEVICE_IPC=y CONFIG_RT_PIPE_BUFSZ=512 CONFIG_RT_USING_SERIAL=y +CONFIG_RT_SERIAL_USING_DMA=y # CONFIG_RT_USING_CAN is not set # CONFIG_RT_USING_HWTIMER is not set # CONFIG_RT_USING_CPUTIME is not set # CONFIG_RT_USING_I2C is not set CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set # CONFIG_RT_USING_PWM is not set # CONFIG_RT_USING_MTD_NOR is not set # CONFIG_RT_USING_MTD_NAND is not set # CONFIG_RT_USING_MTD is not set +# CONFIG_RT_USING_PM is not set # CONFIG_RT_USING_RTC is not set # CONFIG_RT_USING_SDIO is not set # CONFIG_RT_USING_SPI is not set @@ -174,12 +181,15 @@ CONFIG_RT_USING_PIN=y # # 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 @@ -246,7 +256,6 @@ CONFIG_RT_USING_PIN=y # # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set -# CONFIG_PKG_USING_BEEPPLAYER is not set # # tools packages @@ -273,6 +282,7 @@ CONFIG_RT_USING_PIN=y # 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 @@ -287,6 +297,7 @@ CONFIG_RT_USING_PIN=y # 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 @@ -302,10 +313,6 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set -# -# sample package -# - # # samples: kernel and components samples # @@ -313,10 +320,6 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set # CONFIG_PKG_USING_NETWORK_SAMPLES is not set # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set - -# -# example package: hello -# # CONFIG_PKG_USING_HELLO is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F1=y @@ -329,10 +332,10 @@ CONFIG_SOC_STM32F103RB=y # # Onboard Peripheral Drivers # - -# -# Offboard Peripheral Drivers -# +CONFIG_BSP_USING_USB_TO_USART=y +# CONFIG_BSP_USING_EEPROM is not set +# CONFIG_BSP_USING_SPI_FLASH is not set +# CONFIG_BSP_USING_POT is not set # # On-chip Peripheral Drivers @@ -342,7 +345,16 @@ CONFIG_BSP_USING_UART1=y # CONFIG_BSP_USING_UART2 is not set # CONFIG_BSP_USING_UART3 is not set # CONFIG_BSP_UART_USING_DMA_RX is not set +# CONFIG_BSP_USING_TIM is not set # CONFIG_BSP_USING_SPI1 is not set # CONFIG_BSP_USING_SPI2 is not set # CONFIG_BSP_SPI_USING_DMA is not set # CONFIG_BSP_USING_I2C1 is not set +# CONFIG_BSP_USING_ADC is not set +# CONFIG_BSP_USING_ON_CHIP_FLASH is not set +# CONFIG_BSP_USING_ONCHIP_RTC is not set +# CONFIG_BSP_USING_WDT is not set + +# +# Board extended module Drivers +# diff --git a/bsp/stm32/stm32f103-atk-nano/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32f103-atk-nano/board/CubeMX_Config/Inc/main.h index d956854a25..35b4a0c569 100644 --- a/bsp/stm32/stm32f103-atk-nano/board/CubeMX_Config/Inc/main.h +++ b/bsp/stm32/stm32f103-atk-nano/board/CubeMX_Config/Inc/main.h @@ -70,6 +70,8 @@ extern "C" { /* USER CODE END EM */ +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + /* Exported functions prototypes ---------------------------------------------*/ void Error_Handler(void); diff --git a/bsp/stm32/stm32f103-atk-nano/board/CubeMX_Config/Inc/stm32f1xx_hal_conf.h b/bsp/stm32/stm32f103-atk-nano/board/CubeMX_Config/Inc/stm32f1xx_hal_conf.h index 33b73bfdd9..174f9e3828 100644 --- a/bsp/stm32/stm32f103-atk-nano/board/CubeMX_Config/Inc/stm32f1xx_hal_conf.h +++ b/bsp/stm32/stm32f103-atk-nano/board/CubeMX_Config/Inc/stm32f1xx_hal_conf.h @@ -78,7 +78,7 @@ /*#define HAL_SMARTCARD_MODULE_ENABLED */ #define HAL_SPI_MODULE_ENABLED /*#define HAL_SRAM_MODULE_ENABLED */ -/*#define HAL_TIM_MODULE_ENABLED */ +#define HAL_TIM_MODULE_ENABLED #define HAL_UART_MODULE_ENABLED /*#define HAL_USART_MODULE_ENABLED */ /*#define HAL_WWDG_MODULE_ENABLED */ diff --git a/bsp/stm32/stm32f103-atk-nano/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32f103-atk-nano/board/CubeMX_Config/Src/main.c index 72a722e235..a58f4196b4 100644 --- a/bsp/stm32/stm32f103-atk-nano/board/CubeMX_Config/Src/main.c +++ b/bsp/stm32/stm32f103-atk-nano/board/CubeMX_Config/Src/main.c @@ -70,6 +70,10 @@ RTC_HandleTypeDef hrtc; SPI_HandleTypeDef hspi2; +TIM_HandleTypeDef htim2; +TIM_HandleTypeDef htim3; +TIM_HandleTypeDef htim4; + UART_HandleTypeDef huart1; /* USER CODE BEGIN PV */ @@ -85,6 +89,9 @@ static void MX_SPI2_Init(void); static void MX_RTC_Init(void); static void MX_IWDG_Init(void); static void MX_ADC1_Init(void); +static void MX_TIM2_Init(void); +static void MX_TIM3_Init(void); +static void MX_TIM4_Init(void); /* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ @@ -128,6 +135,9 @@ int main(void) MX_RTC_Init(); MX_IWDG_Init(); MX_ADC1_Init(); + MX_TIM2_Init(); + MX_TIM3_Init(); + MX_TIM4_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ @@ -186,7 +196,7 @@ void SystemClock_Config(void) } PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_ADC; PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; - PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2; + PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { Error_Handler(); @@ -334,6 +344,159 @@ static void MX_SPI2_Init(void) } +/** + * @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_PWM_Init(&htim3) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM3_Init 2 */ + + /* USER CODE END TIM3_Init 2 */ + HAL_TIM_MspPostInit(&htim3); + +} + +/** + * @brief TIM4 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM4_Init(void) +{ + + /* USER CODE BEGIN TIM4_Init 0 */ + + /* USER CODE END TIM4_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM4_Init 1 */ + + /* USER CODE END TIM4_Init 1 */ + htim4.Instance = TIM4; + htim4.Init.Prescaler = 0; + htim4.Init.CounterMode = TIM_COUNTERMODE_UP; + htim4.Init.Period = 0; + htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim4) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM4_Init 2 */ + + /* USER CODE END TIM4_Init 2 */ + +} + /** * @brief USART1 Initialization Function * @param None diff --git a/bsp/stm32/stm32f103-atk-nano/board/CubeMX_Config/Src/stm32f1xx_hal_msp.c b/bsp/stm32/stm32f103-atk-nano/board/CubeMX_Config/Src/stm32f1xx_hal_msp.c index 18d37d8f24..a38a7f26b1 100644 --- a/bsp/stm32/stm32f103-atk-nano/board/CubeMX_Config/Src/stm32f1xx_hal_msp.c +++ b/bsp/stm32/stm32f103-atk-nano/board/CubeMX_Config/Src/stm32f1xx_hal_msp.c @@ -78,7 +78,9 @@ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ -/** + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + /** * Initializes the Global MSP. */ void HAL_MspInit(void) @@ -287,6 +289,125 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) } +/** +* @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 */ + } + else if(htim_base->Instance==TIM4) + { + /* USER CODE BEGIN TIM4_MspInit 0 */ + + /* USER CODE END TIM4_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM4_CLK_ENABLE(); + /* USER CODE BEGIN TIM4_MspInit 1 */ + + /* USER CODE END TIM4_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_GPIOC_CLK_ENABLE(); + /**TIM3 GPIO Configuration + PC6 ------> TIM3_CH1 + PC7 ------> TIM3_CH2 + */ + GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + __HAL_AFIO_REMAP_TIM3_ENABLE(); + + /* 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 */ + } + else if(htim_base->Instance==TIM4) + { + /* USER CODE BEGIN TIM4_MspDeInit 0 */ + + /* USER CODE END TIM4_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM4_CLK_DISABLE(); + /* USER CODE BEGIN TIM4_MspDeInit 1 */ + + /* USER CODE END TIM4_MspDeInit 1 */ + } + +} + /** * @brief UART MSP Initialization * This function configures the hardware resources used in this example diff --git a/bsp/stm32/stm32f103-atk-nano/board/CubeMX_Config/stm32f103rbt6.ioc b/bsp/stm32/stm32f103-atk-nano/board/CubeMX_Config/stm32f103rbt6.ioc index 9f7f2d1c35..2a53c93b0b 100644 --- a/bsp/stm32/stm32f103-atk-nano/board/CubeMX_Config/stm32f103rbt6.ioc +++ b/bsp/stm32/stm32f103-atk-nano/board/CubeMX_Config/stm32f103rbt6.ioc @@ -10,31 +10,39 @@ KeepUserPlacement=false Mcu.Family=STM32F1 Mcu.IP0=ADC1 Mcu.IP1=IWDG +Mcu.IP10=USART1 Mcu.IP2=NVIC Mcu.IP3=RCC Mcu.IP4=RTC Mcu.IP5=SPI2 Mcu.IP6=SYS -Mcu.IP7=USART1 -Mcu.IPNb=8 +Mcu.IP7=TIM2 +Mcu.IP8=TIM3 +Mcu.IP9=TIM4 +Mcu.IPNb=11 Mcu.Name=STM32F103R(8-B)Tx Mcu.Package=LQFP64 Mcu.Pin0=PC14-OSC32_IN Mcu.Pin1=PC15-OSC32_OUT -Mcu.Pin10=PA13 -Mcu.Pin11=PA14 -Mcu.Pin12=VP_IWDG_VS_IWDG -Mcu.Pin13=VP_RTC_VS_RTC_Activate -Mcu.Pin14=VP_SYS_VS_Systick +Mcu.Pin10=PA9 +Mcu.Pin11=PA10 +Mcu.Pin12=PA13 +Mcu.Pin13=PA14 +Mcu.Pin14=VP_IWDG_VS_IWDG +Mcu.Pin15=VP_RTC_VS_RTC_Activate +Mcu.Pin16=VP_SYS_VS_Systick +Mcu.Pin17=VP_TIM2_VS_ClockSourceINT +Mcu.Pin18=VP_TIM3_VS_ClockSourceINT +Mcu.Pin19=VP_TIM4_VS_ClockSourceINT Mcu.Pin2=PD0-OSC_IN Mcu.Pin3=PD1-OSC_OUT Mcu.Pin4=PB1 Mcu.Pin5=PB13 Mcu.Pin6=PB14 Mcu.Pin7=PB15 -Mcu.Pin8=PA9 -Mcu.Pin9=PA10 -Mcu.PinsNb=15 +Mcu.Pin8=PC6 +Mcu.Pin9=PC7 +Mcu.PinsNb=20 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F103RBTx @@ -70,6 +78,10 @@ PC14-OSC32_IN.Mode=LSE-External-Oscillator PC14-OSC32_IN.Signal=RCC_OSC32_IN PC15-OSC32_OUT.Mode=LSE-External-Oscillator PC15-OSC32_OUT.Signal=RCC_OSC32_OUT +PC6.Locked=true +PC6.Signal=S_TIM3_CH1 +PC7.Locked=true +PC7.Signal=S_TIM3_CH2 PCC.Checker=false PCC.Line=STM32F103 PCC.MCU=STM32F103R(8-B)Tx @@ -109,8 +121,9 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=MDK-ARM V5 ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_SPI2_Init-SPI2-false-HAL-true,5-MX_RTC_Init-RTC-false-HAL-true,6-MX_IWDG_Init-IWDG-false-HAL-true,7-MX_ADC1_Init-ADC1-false-HAL-true -RCC.ADCFreqValue=36000000 +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_SPI2_Init-SPI2-false-HAL-true,5-MX_RTC_Init-RTC-false-HAL-true,6-MX_IWDG_Init-IWDG-false-HAL-true,7-MX_ADC1_Init-ADC1-false-HAL-true,8-MX_TIM2_Init-TIM2-false-HAL-true,9-MX_TIM3_Init-TIM3-false-HAL-true,10-MX_TIM4_Init-TIM4-false-HAL-true +RCC.ADCFreqValue=12000000 +RCC.ADCPresc=RCC_ADCPCLK2_DIV6 RCC.AHBFreq_Value=72000000 RCC.APB1CLKDivider=RCC_HCLK_DIV2 RCC.APB1Freq_Value=36000000 @@ -120,7 +133,7 @@ RCC.APB2TimFreq_Value=72000000 RCC.FCLKCortexFreq_Value=72000000 RCC.FamilyName=M RCC.HCLKFreq_Value=72000000 -RCC.IPParameters=ADCFreqValue,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,MCOFreq_Value,PLLCLKFreq_Value,PLLMCOFreq_Value,PLLMUL,PLLSourceVirtual,RTCClockSelection,RTCFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,TimSysFreq_Value,USBFreq_Value,VCOOutput2Freq_Value +RCC.IPParameters=ADCFreqValue,ADCPresc,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,MCOFreq_Value,PLLCLKFreq_Value,PLLMCOFreq_Value,PLLMUL,PLLSourceVirtual,RTCClockSelection,RTCFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,TimSysFreq_Value,USBFreq_Value,VCOOutput2Freq_Value RCC.MCOFreq_Value=72000000 RCC.PLLCLKFreq_Value=72000000 RCC.PLLMCOFreq_Value=36000000 @@ -135,11 +148,18 @@ RCC.USBFreq_Value=72000000 RCC.VCOOutput2Freq_Value=8000000 SH.ADCx_IN9.0=ADC1_IN9,IN9 SH.ADCx_IN9.ConfNb=1 +SH.S_TIM3_CH1.0=TIM3_CH1,PWM Generation1 CH1 +SH.S_TIM3_CH1.ConfNb=1 +SH.S_TIM3_CH2.0=TIM3_CH2,PWM Generation2 CH2 +SH.S_TIM3_CH2.ConfNb=1 SPI2.CalculateBaudRate=18.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-PWM\ Generation1\ CH1=TIM_CHANNEL_1 +TIM3.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 +TIM3.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2 USART1.IPParameters=VirtualMode USART1.VirtualMode=VM_ASYNC VP_IWDG_VS_IWDG.Mode=IWDG_Activate @@ -148,4 +168,10 @@ VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate 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 +VP_TIM4_VS_ClockSourceINT.Mode=Internal +VP_TIM4_VS_ClockSourceINT.Signal=TIM4_VS_ClockSourceINT board=custom diff --git a/bsp/stm32/stm32f103-atk-nano/board/Kconfig b/bsp/stm32/stm32f103-atk-nano/board/Kconfig index f253c76091..2b6d6b3fc1 100644 --- a/bsp/stm32/stm32f103-atk-nano/board/Kconfig +++ b/bsp/stm32/stm32f103-atk-nano/board/Kconfig @@ -58,6 +58,43 @@ menu "On-chip Peripheral Drivers" bool "Enable UART RX DMA support" default n + menuconfig BSP_USING_TIM + bool "Enable timer" + default n + select RT_USING_HWTIMER + if BSP_USING_TIM + config BSP_USING_TIM2 + bool "Enable TIM2" + default n + + config BSP_USING_TIM3 + bool "Enable TIM3" + default n + + config BSP_USING_TIM4 + bool "Enable TIM4" + default n + endif + + menuconfig BSP_USING_PWM + bool "Enable pwm" + default n + select RT_USING_PWM + if BSP_USING_PWM + menuconfig BSP_USING_PWM3 + bool "Enable timer3 output pwm" + default n + if BSP_USING_PWM3 + config BSP_USING_PWM3_CH1 + bool "Enable PWM3 channel1" + default n + + config BSP_USING_PWM3_CH2 + bool "Enable PWM3 channel2" + default n + endif + endif + config BSP_USING_SPI1 bool "Enable SPI1 BUS" select RT_USING_SPI @@ -101,7 +138,6 @@ menu "On-chip Peripheral Drivers" config BSP_USING_ADC2 bool "Enable ADC2" default n - endif config BSP_USING_ON_CHIP_FLASH diff --git a/bsp/stm32/stm32f103-atk-nano/board/board.c b/bsp/stm32/stm32f103-atk-nano/board/board.c index b0db19b1ec..28bb36889c 100644 --- a/bsp/stm32/stm32f103-atk-nano/board/board.c +++ b/bsp/stm32/stm32f103-atk-nano/board/board.c @@ -14,13 +14,17 @@ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; /**Initializes the CPU, AHB and APB busses clocks */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE + |RCC_OSCILLATORTYPE_LSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; @@ -41,6 +45,13 @@ void SystemClock_Config(void) { Error_Handler(); } + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_ADC; + PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; + PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } } void MX_GPIO_Init(void) diff --git a/bsp/stm32/stm32f103-atk-nano/rtconfig.h b/bsp/stm32/stm32f103-atk-nano/rtconfig.h index c9087c09a6..8bae9ebc30 100644 --- a/bsp/stm32/stm32f103-atk-nano/rtconfig.h +++ b/bsp/stm32/stm32f103-atk-nano/rtconfig.h @@ -13,6 +13,7 @@ #define RT_TICK_PER_SECOND 1000 #define RT_USING_OVERFLOW_CHECK #define RT_USING_HOOK +#define RT_USING_IDLE_HOOK #define RT_IDEL_HOOK_LIST_SIZE 4 #define IDLE_THREAD_STACK_SIZE 256 #define RT_DEBUG @@ -38,6 +39,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_VER_NUM 0x40000 #define ARCH_ARM #define ARCH_ARM_CORTEX_M #define ARCH_ARM_CORTEX_M3 @@ -76,6 +78,7 @@ #define RT_USING_DEVICE_IPC #define RT_PIPE_BUFSZ 512 #define RT_USING_SERIAL +#define RT_SERIAL_USING_DMA #define RT_USING_PIN /* Using WiFi */ @@ -147,13 +150,8 @@ /* miscellaneous packages */ -/* sample package */ - /* samples: kernel and components samples */ - -/* example package: hello */ - #define SOC_FAMILY_STM32 #define SOC_SERIES_STM32F1 @@ -163,11 +161,14 @@ /* Onboard Peripheral Drivers */ -/* Offboard Peripheral Drivers */ +#define BSP_USING_USB_TO_USART /* On-chip Peripheral Drivers */ #define BSP_USING_GPIO #define BSP_USING_UART1 +/* Board extended module Drivers */ + + #endif diff --git a/bsp/stm32/stm32f103-fire-arbitrary/.config b/bsp/stm32/stm32f103-fire-arbitrary/.config index f67ab34e10..8e22229f4a 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/.config +++ b/bsp/stm32/stm32f103-fire-arbitrary/.config @@ -7,6 +7,7 @@ # 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 @@ -15,6 +16,7 @@ CONFIG_RT_THREAD_PRIORITY_MAX=32 CONFIG_RT_TICK_PER_SECOND=1000 CONFIG_RT_USING_OVERFLOW_CHECK=y CONFIG_RT_USING_HOOK=y +CONFIG_RT_USING_IDLE_HOOK=y CONFIG_RT_IDEL_HOOK_LIST_SIZE=4 CONFIG_IDLE_THREAD_STACK_SIZE=256 # CONFIG_RT_USING_TIMER_SOFT is not set @@ -61,9 +63,11 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +CONFIG_RT_VER_NUM=0x40000 CONFIG_ARCH_ARM=y CONFIG_ARCH_ARM_CORTEX_M=y CONFIG_ARCH_ARM_CORTEX_M3=y +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set # # RT-Thread Components @@ -108,15 +112,18 @@ CONFIG_FINSH_ARG_MAX=10 CONFIG_RT_USING_DEVICE_IPC=y CONFIG_RT_PIPE_BUFSZ=512 CONFIG_RT_USING_SERIAL=y +CONFIG_RT_SERIAL_USING_DMA=y # CONFIG_RT_USING_CAN is not set # CONFIG_RT_USING_HWTIMER is not set # CONFIG_RT_USING_CPUTIME is not set # CONFIG_RT_USING_I2C is not set CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set # CONFIG_RT_USING_PWM is not set # CONFIG_RT_USING_MTD_NOR is not set # CONFIG_RT_USING_MTD_NAND is not set # CONFIG_RT_USING_MTD is not set +# CONFIG_RT_USING_PM is not set # CONFIG_RT_USING_RTC is not set # CONFIG_RT_USING_SDIO is not set # CONFIG_RT_USING_SPI is not set @@ -174,12 +181,15 @@ CONFIG_RT_USING_LIBC=y # # 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 @@ -246,7 +256,6 @@ CONFIG_RT_USING_LIBC=y # # CONFIG_PKG_USING_OPENMV is not set # CONFIG_PKG_USING_MUPDF is not set -# CONFIG_PKG_USING_BEEPPLAYER is not set # # tools packages @@ -273,6 +282,7 @@ CONFIG_RT_USING_LIBC=y # 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 @@ -287,6 +297,7 @@ CONFIG_RT_USING_LIBC=y # 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 @@ -302,10 +313,6 @@ CONFIG_RT_USING_LIBC=y # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set -# -# sample package -# - # # samples: kernel and components samples # @@ -313,10 +320,6 @@ CONFIG_RT_USING_LIBC=y # CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set # CONFIG_PKG_USING_NETWORK_SAMPLES is not set # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set - -# -# example package: hello -# # CONFIG_PKG_USING_HELLO is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F1=y @@ -329,10 +332,13 @@ CONFIG_SOC_STM32F103ZE=y # # Onboard Peripheral Drivers # - -# -# Offboard Peripheral Drivers -# +CONFIG_BSP_USING_USB_TO_USART=y +# CONFIG_BSP_USING_RS485_OR_RS232 is not set +# CONFIG_BSP_USING_SPI_FLASH is not set +# CONFIG_BSP_USING_POT is not set +# CONFIG_BSP_USING_EEPROM is not set +# CONFIG_BSP_USING_ETH is not set +# CONFIG_BSP_USING_SDCARD is not set # # On-chip Peripheral Drivers @@ -342,8 +348,18 @@ CONFIG_BSP_USING_UART1=y # CONFIG_BSP_USING_UART2 is not set # CONFIG_BSP_USING_UART3 is not set # CONFIG_BSP_UART_USING_DMA_RX is not set +# CONFIG_BSP_USING_ON_CHIP_FLASH is not set # CONFIG_BSP_USING_SPI1 is not set # CONFIG_BSP_USING_SPI2 is not set # CONFIG_BSP_USING_SPI3 is not set # CONFIG_BSP_SPI_USING_DMA is not set # CONFIG_BSP_USING_I2C1 is not set +# CONFIG_BSP_USING_TIM is not set +# CONFIG_BSP_USING_ADC is not set +# CONFIG_BSP_USING_ONCHIP_RTC is not set +# CONFIG_BSP_USING_WDT is not set +# CONFIG_BSP_USING_SDIO is not set + +# +# Board extended module Drivers +# diff --git a/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/.mxproject index 6e18ecf569..cd96a5d50d 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/.mxproject +++ b/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/.mxproject @@ -1,13 +1,13 @@ [PreviousGenFiles] -HeaderPath=E:/workspace/BspFramework/rt-thread/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/Inc +HeaderPath=D:/BspFramework/rt-thread/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/Inc HeaderFiles=stm32f1xx_it.h;stm32f1xx_hal_conf.h;main.h; -SourcePath=E:/workspace/BspFramework/rt-thread/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/Src +SourcePath=D:/BspFramework/rt-thread/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/Src SourceFiles=stm32f1xx_it.c;stm32f1xx_hal_msp.c;main.c; [PreviousLibFiles] -LibFiles=Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_iwdg.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rtc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rtc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_spi.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h;Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_iwdg.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rtc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rtc_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_iwdg.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rtc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rtc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_spi.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h;Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xe.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/system_stm32f1xx.h;Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/system_stm32f1xx.c;Drivers/CMSIS/Include/arm_common_tables.h;Drivers/CMSIS/Include/arm_const_structs.h;Drivers/CMSIS/Include/arm_math.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armcc_V6.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_cmFunc.h;Drivers/CMSIS/Include/core_cmInstr.h;Drivers/CMSIS/Include/core_cmSimd.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h; +LibFiles=Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_iwdg.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rtc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rtc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_sdmmc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_sd.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_spi.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h;Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_iwdg.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rtc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rtc_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_sdmmc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_sd.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_adc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_iwdg.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rtc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rtc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_ll_sdmmc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_sd.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_spi.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_tim_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_uart.h;Drivers/STM32F1xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_def.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_rcc_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio_ex.h;Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma_ex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_dma.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_cortex.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_pwr.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash.h;Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_flash_ex.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f103xe.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/stm32f1xx.h;Drivers/CMSIS/Device/ST/STM32F1xx/Include/system_stm32f1xx.h;Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/system_stm32f1xx.c;Drivers/CMSIS/Include/arm_common_tables.h;Drivers/CMSIS/Include/arm_const_structs.h;Drivers/CMSIS/Include/arm_math.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armcc_V6.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_cmFunc.h;Drivers/CMSIS/Include/core_cmInstr.h;Drivers/CMSIS/Include/core_cmSimd.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h; [PreviousUsedKeilFiles] -SourceFiles=..\Src\main.c;..\Src\stm32f1xx_it.c;..\Src\stm32f1xx_hal_msp.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_iwdg.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rtc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rtc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../\Src/system_stm32f1xx.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_iwdg.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rtc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rtc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../\Src/system_stm32f1xx.c;../Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/system_stm32f1xx.c;null; +SourceFiles=..\Src\main.c;..\Src\stm32f1xx_it.c;..\Src\stm32f1xx_hal_msp.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_iwdg.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rtc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rtc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_sdmmc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_sd.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../\Src/system_stm32f1xx.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_iwdg.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rtc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rtc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_sdmmc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_sd.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;../Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;../\Src/system_stm32f1xx.c;../Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/system_stm32f1xx.c;null; HeaderPath=..\Drivers\STM32F1xx_HAL_Driver\Inc;..\Drivers\STM32F1xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32F1xx\Include;..\Drivers\CMSIS\Include;..\Inc; diff --git a/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/Inc/main.h index d956854a25..35b4a0c569 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/Inc/main.h +++ b/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/Inc/main.h @@ -70,6 +70,8 @@ extern "C" { /* USER CODE END EM */ +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + /* Exported functions prototypes ---------------------------------------------*/ void Error_Handler(void); diff --git a/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/Inc/stm32f1xx_hal_conf.h b/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/Inc/stm32f1xx_hal_conf.h index 33b73bfdd9..2d008d8024 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/Inc/stm32f1xx_hal_conf.h +++ b/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/Inc/stm32f1xx_hal_conf.h @@ -72,13 +72,13 @@ /*#define HAL_PWR_MODULE_ENABLED */ /*#define HAL_RCC_MODULE_ENABLED */ #define HAL_RTC_MODULE_ENABLED -/*#define HAL_SD_MODULE_ENABLED */ +#define HAL_SD_MODULE_ENABLED /*#define HAL_MMC_MODULE_ENABLED */ /*#define HAL_SDRAM_MODULE_ENABLED */ /*#define HAL_SMARTCARD_MODULE_ENABLED */ #define HAL_SPI_MODULE_ENABLED /*#define HAL_SRAM_MODULE_ENABLED */ -/*#define HAL_TIM_MODULE_ENABLED */ +#define HAL_TIM_MODULE_ENABLED #define HAL_UART_MODULE_ENABLED /*#define HAL_USART_MODULE_ENABLED */ /*#define HAL_WWDG_MODULE_ENABLED */ diff --git a/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/Src/main.c index 8af499226d..21a0786131 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/Src/main.c +++ b/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/Src/main.c @@ -68,9 +68,16 @@ IWDG_HandleTypeDef hiwdg; RTC_HandleTypeDef hrtc; +SD_HandleTypeDef hsd; + SPI_HandleTypeDef hspi1; SPI_HandleTypeDef hspi2; +TIM_HandleTypeDef htim2; +TIM_HandleTypeDef htim3; +TIM_HandleTypeDef htim4; +TIM_HandleTypeDef htim5; + UART_HandleTypeDef huart1; UART_HandleTypeDef huart2; UART_HandleTypeDef huart3; @@ -91,6 +98,11 @@ static void MX_USART3_UART_Init(void); static void MX_ADC1_Init(void); static void MX_RTC_Init(void); static void MX_IWDG_Init(void); +static void MX_TIM2_Init(void); +static void MX_TIM3_Init(void); +static void MX_TIM4_Init(void); +static void MX_TIM5_Init(void); +static void MX_SDIO_SD_Init(void); /* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ @@ -137,6 +149,11 @@ int main(void) MX_ADC1_Init(); MX_RTC_Init(); MX_IWDG_Init(); + MX_TIM2_Init(); + MX_TIM3_Init(); + MX_TIM4_Init(); + MX_TIM5_Init(); + MX_SDIO_SD_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ @@ -305,6 +322,42 @@ static void MX_RTC_Init(void) } +/** + * @brief SDIO Initialization Function + * @param None + * @retval None + */ +static void MX_SDIO_SD_Init(void) +{ + + /* USER CODE BEGIN SDIO_Init 0 */ + + /* USER CODE END SDIO_Init 0 */ + + /* USER CODE BEGIN SDIO_Init 1 */ + + /* USER CODE END SDIO_Init 1 */ + hsd.Instance = SDIO; + hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; + hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; + hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; + hsd.Init.BusWide = SDIO_BUS_WIDE_1B; + hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; + hsd.Init.ClockDiv = 0; + if (HAL_SD_Init(&hsd) != HAL_OK) + { + Error_Handler(); + } + if (HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SDIO_Init 2 */ + + /* USER CODE END SDIO_Init 2 */ + +} + /** * @brief SPI1 Initialization Function * @param None @@ -381,6 +434,208 @@ static void MX_SPI2_Init(void) } +/** + * @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_PWM_Init(&htim3) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_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 TIM4 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM4_Init(void) +{ + + /* USER CODE BEGIN TIM4_Init 0 */ + + /* USER CODE END TIM4_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM4_Init 1 */ + + /* USER CODE END TIM4_Init 1 */ + htim4.Instance = TIM4; + htim4.Init.Prescaler = 0; + htim4.Init.CounterMode = TIM_COUNTERMODE_UP; + htim4.Init.Period = 0; + htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim4) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM4_Init 2 */ + + /* USER CODE END TIM4_Init 2 */ + +} + +/** + * @brief TIM5 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM5_Init(void) +{ + + /* USER CODE BEGIN TIM5_Init 0 */ + + /* USER CODE END TIM5_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM5_Init 1 */ + + /* USER CODE END TIM5_Init 1 */ + htim5.Instance = TIM5; + htim5.Init.Prescaler = 0; + htim5.Init.CounterMode = TIM_COUNTERMODE_UP; + htim5.Init.Period = 0; + htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim5.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim5) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM5_Init 2 */ + + /* USER CODE END TIM5_Init 2 */ + +} + /** * @brief USART1 Initialization Function * @param None @@ -492,6 +747,7 @@ static void MX_GPIO_Init(void) __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); } diff --git a/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/Src/stm32f1xx_hal_msp.c b/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/Src/stm32f1xx_hal_msp.c index 4de0950dca..b2f18b01ac 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/Src/stm32f1xx_hal_msp.c +++ b/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/Src/stm32f1xx_hal_msp.c @@ -78,7 +78,9 @@ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ -/** + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + /** * Initializes the Global MSP. */ void HAL_MspInit(void) @@ -214,6 +216,90 @@ void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc) } +/** +* @brief SD MSP Initialization +* This function configures the hardware resources used in this example +* @param hsd: SD handle pointer +* @retval None +*/ +void HAL_SD_MspInit(SD_HandleTypeDef* hsd) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hsd->Instance==SDIO) + { + /* USER CODE BEGIN SDIO_MspInit 0 */ + + /* USER CODE END SDIO_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SDIO_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + /**SDIO GPIO Configuration + PC8 ------> SDIO_D0 + PC9 ------> SDIO_D1 + PC10 ------> SDIO_D2 + PC11 ------> SDIO_D3 + PC12 ------> SDIO_CK + PD2 ------> SDIO_CMD + */ + GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /* USER CODE BEGIN SDIO_MspInit 1 */ + + /* USER CODE END SDIO_MspInit 1 */ + } + +} + +/** +* @brief SD MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hsd: SD handle pointer +* @retval None +*/ + +void HAL_SD_MspDeInit(SD_HandleTypeDef* hsd) +{ + + if(hsd->Instance==SDIO) + { + /* USER CODE BEGIN SDIO_MspDeInit 0 */ + + /* USER CODE END SDIO_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SDIO_CLK_DISABLE(); + + /**SDIO GPIO Configuration + PC8 ------> SDIO_D0 + PC9 ------> SDIO_D1 + PC10 ------> SDIO_D2 + PC11 ------> SDIO_D3 + PC12 ------> SDIO_CK + PD2 ------> SDIO_CMD + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12); + + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2); + + /* USER CODE BEGIN SDIO_MspDeInit 1 */ + + /* USER CODE END SDIO_MspDeInit 1 */ + } + +} + /** * @brief SPI MSP Initialization * This function configures the hardware resources used in this example @@ -334,6 +420,148 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) } +/** +* @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 */ + } + else if(htim_base->Instance==TIM4) + { + /* USER CODE BEGIN TIM4_MspInit 0 */ + + /* USER CODE END TIM4_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM4_CLK_ENABLE(); + /* USER CODE BEGIN TIM4_MspInit 1 */ + + /* USER CODE END TIM4_MspInit 1 */ + } + else if(htim_base->Instance==TIM5) + { + /* USER CODE BEGIN TIM5_MspInit 0 */ + + /* USER CODE END TIM5_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM5_CLK_ENABLE(); + /* USER CODE BEGIN TIM5_MspInit 1 */ + + /* USER CODE END TIM5_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(); + /**TIM3 GPIO Configuration + PB0 ------> TIM3_CH3 + PB1 ------> TIM3_CH4 + PB5 ------> TIM3_CH2 + */ + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + __HAL_AFIO_REMAP_TIM3_PARTIAL(); + + /* 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 */ + } + else if(htim_base->Instance==TIM4) + { + /* USER CODE BEGIN TIM4_MspDeInit 0 */ + + /* USER CODE END TIM4_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM4_CLK_DISABLE(); + /* USER CODE BEGIN TIM4_MspDeInit 1 */ + + /* USER CODE END TIM4_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM5) + { + /* USER CODE BEGIN TIM5_MspDeInit 0 */ + + /* USER CODE END TIM5_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM5_CLK_DISABLE(); + /* USER CODE BEGIN TIM5_MspDeInit 1 */ + + /* USER CODE END TIM5_MspDeInit 1 */ + } + +} + /** * @brief UART MSP Initialization * This function configures the hardware resources used in this example diff --git a/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/stm32f103zet6.ioc b/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/stm32f103zet6.ioc index ba9498c4be..f9d2fafc6a 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/stm32f103zet6.ioc +++ b/bsp/stm32/stm32f103-fire-arbitrary/board/CubeMX_Config/stm32f103zet6.ioc @@ -10,41 +10,59 @@ KeepUserPlacement=false Mcu.Family=STM32F1 Mcu.IP0=ADC1 Mcu.IP1=IWDG -Mcu.IP10=USART3 +Mcu.IP10=TIM3 +Mcu.IP11=TIM4 +Mcu.IP12=TIM5 +Mcu.IP13=USART1 +Mcu.IP14=USART2 +Mcu.IP15=USART3 Mcu.IP2=NVIC Mcu.IP3=RCC Mcu.IP4=RTC -Mcu.IP5=SPI1 -Mcu.IP6=SPI2 -Mcu.IP7=SYS -Mcu.IP8=USART1 -Mcu.IP9=USART2 -Mcu.IPNb=11 +Mcu.IP5=SDIO +Mcu.IP6=SPI1 +Mcu.IP7=SPI2 +Mcu.IP8=SYS +Mcu.IP9=TIM2 +Mcu.IPNb=16 Mcu.Name=STM32F103Z(C-D-E)Tx Mcu.Package=LQFP144 Mcu.Pin0=PC14-OSC32_IN Mcu.Pin1=PC15-OSC32_OUT -Mcu.Pin10=PB10 -Mcu.Pin11=PB11 -Mcu.Pin12=PB13 -Mcu.Pin13=PB14 -Mcu.Pin14=PB15 -Mcu.Pin15=PA9 -Mcu.Pin16=PA10 -Mcu.Pin17=PA13 -Mcu.Pin18=PA14 -Mcu.Pin19=VP_IWDG_VS_IWDG +Mcu.Pin10=PB0 +Mcu.Pin11=PB1 +Mcu.Pin12=PB10 +Mcu.Pin13=PB11 +Mcu.Pin14=PB13 +Mcu.Pin15=PB14 +Mcu.Pin16=PB15 +Mcu.Pin17=PC8 +Mcu.Pin18=PC9 +Mcu.Pin19=PA9 Mcu.Pin2=OSC_IN -Mcu.Pin20=VP_RTC_VS_RTC_Activate -Mcu.Pin21=VP_SYS_VS_Systick +Mcu.Pin20=PA10 +Mcu.Pin21=PA13 +Mcu.Pin22=PA14 +Mcu.Pin23=PC10 +Mcu.Pin24=PC11 +Mcu.Pin25=PC12 +Mcu.Pin26=PD2 +Mcu.Pin27=PB5 +Mcu.Pin28=VP_IWDG_VS_IWDG +Mcu.Pin29=VP_RTC_VS_RTC_Activate Mcu.Pin3=OSC_OUT +Mcu.Pin30=VP_SYS_VS_Systick +Mcu.Pin31=VP_TIM2_VS_ClockSourceINT +Mcu.Pin32=VP_TIM3_VS_ClockSourceINT +Mcu.Pin33=VP_TIM4_VS_ClockSourceINT +Mcu.Pin34=VP_TIM5_VS_ClockSourceINT Mcu.Pin4=PC1 Mcu.Pin5=PA2 Mcu.Pin6=PA3 Mcu.Pin7=PA5 Mcu.Pin8=PA6 Mcu.Pin9=PA7 -Mcu.PinsNb=22 +Mcu.PinsNb=35 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F103ZETx @@ -83,6 +101,8 @@ PA7.Mode=Full_Duplex_Master PA7.Signal=SPI1_MOSI PA9.Mode=Asynchronous PA9.Signal=USART1_TX +PB0.Signal=S_TIM3_CH3 +PB1.Signal=S_TIM3_CH4 PB10.Mode=Asynchronous PB10.Signal=USART3_TX PB11.Mode=Asynchronous @@ -93,12 +113,23 @@ PB14.Mode=Full_Duplex_Master PB14.Signal=SPI2_MISO PB15.Mode=Full_Duplex_Master PB15.Signal=SPI2_MOSI +PB5.Signal=S_TIM3_CH2 PC1.Locked=true PC1.Signal=ADCx_IN11 +PC10.Mode=SD_4_bits_Wide_bus +PC10.Signal=SDIO_D2 +PC11.Mode=SD_4_bits_Wide_bus +PC11.Signal=SDIO_D3 +PC12.Mode=SD_4_bits_Wide_bus +PC12.Signal=SDIO_CK PC14-OSC32_IN.Mode=LSE-External-Oscillator PC14-OSC32_IN.Signal=RCC_OSC32_IN PC15-OSC32_OUT.Mode=LSE-External-Oscillator PC15-OSC32_OUT.Signal=RCC_OSC32_OUT +PC8.Mode=SD_4_bits_Wide_bus +PC8.Signal=SDIO_D0 +PC9.Mode=SD_4_bits_Wide_bus +PC9.Signal=SDIO_D1 PCC.Checker=false PCC.Line=STM32F103 PCC.MCU=STM32F103Z(C-D-E)Tx @@ -107,6 +138,8 @@ PCC.Seq0=0 PCC.Series=STM32F1 PCC.Temperature=25 PCC.Vdd=3.3 +PD2.Mode=SD_4_bits_Wide_bus +PD2.Signal=SDIO_CMD PinOutPanel.RotationAngle=0 ProjectManager.AskForMigrate=true ProjectManager.BackupPrevious=false @@ -134,7 +167,7 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=MDK-ARM V5 ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_SPI2_Init-SPI2-false-HAL-true,5-MX_USART2_UART_Init-USART2-false-HAL-true,6-MX_SPI1_Init-SPI1-false-HAL-true,7-MX_USART3_UART_Init-USART3-false-HAL-true,8-MX_ADC1_Init-ADC1-false-HAL-true,9-MX_RTC_Init-RTC-false-HAL-true,10-MX_IWDG_Init-IWDG-false-HAL-true +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_SPI2_Init-SPI2-false-HAL-true,5-MX_USART2_UART_Init-USART2-false-HAL-true,6-MX_SPI1_Init-SPI1-false-HAL-true,7-MX_USART3_UART_Init-USART3-false-HAL-true,8-MX_ADC1_Init-ADC1-false-HAL-true,9-MX_RTC_Init-RTC-false-HAL-true,10-MX_IWDG_Init-IWDG-false-HAL-true,11-MX_TIM2_Init-TIM2-false-HAL-true,12-MX_TIM3_Init-TIM3-false-HAL-true,13-MX_TIM4_Init-TIM4-false-HAL-true,14-MX_TIM5_Init-TIM5-false-HAL-true,15-MX_SDIO_SD_Init-SDIO-false-HAL-true RCC.ADCFreqValue=12000000 RCC.ADCPresc=RCC_ADCPCLK2_DIV6 RCC.AHBFreq_Value=72000000 @@ -166,6 +199,12 @@ RCC.USBFreq_Value=72000000 RCC.VCOOutput2Freq_Value=8000000 SH.ADCx_IN11.0=ADC1_IN11,IN11 SH.ADCx_IN11.ConfNb=1 +SH.S_TIM3_CH2.0=TIM3_CH2,PWM Generation2 CH2 +SH.S_TIM3_CH2.ConfNb=1 +SH.S_TIM3_CH3.0=TIM3_CH3,PWM Generation3 CH3 +SH.S_TIM3_CH3.ConfNb=1 +SH.S_TIM3_CH4.0=TIM3_CH4,PWM Generation4 CH4 +SH.S_TIM3_CH4.ConfNb=1 SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_4 SPI1.CalculateBaudRate=18.0 MBits/s SPI1.Direction=SPI_DIRECTION_2LINES @@ -177,6 +216,10 @@ SPI2.Direction=SPI_DIRECTION_2LINES SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate SPI2.Mode=SPI_MODE_MASTER SPI2.VirtualType=VM_MASTER +TIM3.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 +TIM3.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 +TIM3.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 +TIM3.IPParameters=Channel-PWM Generation2 CH2,Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4 USART1.IPParameters=VirtualMode USART1.VirtualMode=VM_ASYNC USART2.IPParameters=VirtualMode @@ -189,4 +232,12 @@ VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate 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 +VP_TIM4_VS_ClockSourceINT.Mode=Internal +VP_TIM4_VS_ClockSourceINT.Signal=TIM4_VS_ClockSourceINT +VP_TIM5_VS_ClockSourceINT.Mode=Internal +VP_TIM5_VS_ClockSourceINT.Signal=TIM5_VS_ClockSourceINT board=custom diff --git a/bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig b/bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig index f7f8c82880..ae55be5fab 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig +++ b/bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig @@ -24,6 +24,16 @@ menu "Onboard Peripheral Drivers" select RT_SFUD_USING_SFDP default n + config BSP_USING_RGB + bool "Enable RGB LED (timer3 channel2 - 4)" + select RT_USING_PWM + select BSP_USING_PWM + select BSP_USING_PWM3 + select BSP_USING_PWM3_CH2 + select BSP_USING_PWM3_CH3 + select BSP_USING_PWM3_CH4 + default n + config BSP_USING_POT bool "Enable potentiometer" select BSP_USING_ADC @@ -63,6 +73,13 @@ menu "Onboard Peripheral Drivers" endif + config BSP_USING_SDCARD + bool "Enable SDCARD (sdio)" + select BSP_USING_SDIO + select RT_USING_DFS + select RT_USING_DFS_ELMFAT + default n + endmenu menu "On-chip Peripheral Drivers" @@ -131,6 +148,51 @@ menu "On-chip Peripheral Drivers" default 23 endif + menuconfig BSP_USING_TIM + bool "Enable timer" + default n + select RT_USING_HWTIMER + if BSP_USING_TIM + config BSP_USING_TIM2 + bool "Enable TIM2" + default n + + config BSP_USING_TIM3 + bool "Enable TIM3" + default n + + config BSP_USING_TIM4 + bool "Enable TIM4" + default n + + config BSP_USING_TIM5 + bool "Enable TIM5" + default n + endif + + menuconfig BSP_USING_PWM + bool "Enable pwm" + default n + select RT_USING_PWM + if BSP_USING_PWM + menuconfig BSP_USING_PWM3 + bool "Enable timer3 output pwm" + default n + if BSP_USING_PWM3 + config BSP_USING_PWM3_CH2 + bool "Enable PWM3 channel2" + default n + + config BSP_USING_PWM3_CH3 + bool "Enable PWM3 channel3" + default n + + config BSP_USING_PWM3_CH4 + bool "Enable PWM3 channel4" + default n + endif + endif + menuconfig BSP_USING_ADC bool "Enable ADC" default n @@ -160,6 +222,12 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n + config BSP_USING_SDIO + bool "Enable SDIO" + select RT_USING_SDIO + select RT_USING_DFS + default n + endmenu menu "Board extended module Drivers" diff --git a/bsp/stm32/stm32f103-fire-arbitrary/board/SConscript b/bsp/stm32/stm32f103-fire-arbitrary/board/SConscript index 24b0a3b97a..30d93fa3d4 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/board/SConscript +++ b/bsp/stm32/stm32f103-fire-arbitrary/board/SConscript @@ -18,6 +18,9 @@ if GetDepend(['BSP_USING_ETH']): if GetDepend(['BSP_USING_SPI_FLASH']): src += Glob('ports/spi_flash_init.c') +if GetDepend(['BSP_USING_SDCARD']): + src += Glob('ports/sdcard_port.c') + path = [cwd] path += [cwd + '/CubeMX_Config/Inc'] path += [cwd + '/ports'] diff --git a/bsp/stm32/stm32f103-fire-arbitrary/board/board.c b/bsp/stm32/stm32f103-fire-arbitrary/board/board.c index 2d4ad3f5db..3188bdb616 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/board/board.c +++ b/bsp/stm32/stm32f103-fire-arbitrary/board/board.c @@ -13,31 +13,46 @@ void SystemClock_Config(void) { - rt_err_t ret = RT_EOK; - RCC_OscInitTypeDef RCC_OscInitStruct; - RCC_ClkInitTypeDef RCC_ClkInitStruct; + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; - RCC_OscInitStruct.HSIState = RCC_HSI_ON; - RCC_OscInitStruct.HSICalibrationValue = 16; - RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2; - RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16; - ret = HAL_RCC_OscConfig(&RCC_OscInitStruct); - RT_ASSERT(ret == HAL_OK); + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE + |RCC_OSCILLATORTYPE_LSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + RCC_OscInitStruct.HSIState = RCC_HSI_ON; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK | - RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; - RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; - RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; - RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; - RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; - ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2); - RT_ASSERT(ret == HAL_OK); - - HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/RT_TICK_PER_SECOND); - HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); - HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0); + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_ADC; + PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; + PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV6; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } } void MX_GPIO_Init(void) diff --git a/bsp/stm32/stm32f103-fire-arbitrary/rtconfig.h b/bsp/stm32/stm32f103-fire-arbitrary/rtconfig.h index fdd6a747f4..b26cc15cae 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/rtconfig.h +++ b/bsp/stm32/stm32f103-fire-arbitrary/rtconfig.h @@ -13,6 +13,7 @@ #define RT_TICK_PER_SECOND 1000 #define RT_USING_OVERFLOW_CHECK #define RT_USING_HOOK +#define RT_USING_IDLE_HOOK #define RT_IDEL_HOOK_LIST_SIZE 4 #define IDLE_THREAD_STACK_SIZE 256 #define RT_DEBUG @@ -38,6 +39,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_VER_NUM 0x40000 #define ARCH_ARM #define ARCH_ARM_CORTEX_M #define ARCH_ARM_CORTEX_M3 @@ -76,6 +78,7 @@ #define RT_USING_DEVICE_IPC #define RT_PIPE_BUFSZ 512 #define RT_USING_SERIAL +#define RT_SERIAL_USING_DMA #define RT_USING_PIN /* Using WiFi */ @@ -148,13 +151,8 @@ /* miscellaneous packages */ -/* sample package */ - /* samples: kernel and components samples */ - -/* example package: hello */ - #define SOC_FAMILY_STM32 #define SOC_SERIES_STM32F1 @@ -164,11 +162,14 @@ /* Onboard Peripheral Drivers */ -/* Offboard Peripheral Drivers */ +#define BSP_USING_USB_TO_USART /* On-chip Peripheral Drivers */ #define BSP_USING_GPIO #define BSP_USING_UART1 +/* Board extended module Drivers */ + + #endif diff --git a/bsp/stm32/stm32f407-atk-explorer/.config b/bsp/stm32/stm32f407-atk-explorer/.config index 4f44d6b3af..1b83652dcf 100644 --- a/bsp/stm32/stm32f407-atk-explorer/.config +++ b/bsp/stm32/stm32f407-atk-explorer/.config @@ -62,6 +62,7 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +CONFIG_RT_VER_NUM=0x40000 CONFIG_ARCH_ARM=y CONFIG_ARCH_ARM_CORTEX_M=y CONFIG_ARCH_ARM_CORTEX_M4=y @@ -110,6 +111,7 @@ CONFIG_FINSH_ARG_MAX=10 CONFIG_RT_USING_DEVICE_IPC=y CONFIG_RT_PIPE_BUFSZ=512 CONFIG_RT_USING_SERIAL=y +CONFIG_RT_SERIAL_USING_DMA=y # CONFIG_RT_USING_CAN is not set # CONFIG_RT_USING_HWTIMER is not set # CONFIG_RT_USING_CPUTIME is not set @@ -179,12 +181,14 @@ CONFIG_RT_USING_PIN=y # 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 @@ -293,6 +297,7 @@ CONFIG_RT_USING_PIN=y # 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 @@ -308,10 +313,6 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set -# -# sample package -# - # # samples: kernel and components samples # @@ -319,10 +320,6 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set # CONFIG_PKG_USING_NETWORK_SAMPLES is not set # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set - -# -# example package: hello -# # CONFIG_PKG_USING_HELLO is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F4=y @@ -341,6 +338,7 @@ CONFIG_BSP_USING_USB_TO_USART=y # CONFIG_BSP_USING_EEPROM is not set # CONFIG_BSP_USING_ETH is not set # CONFIG_BSP_USING_MPU6050 is not set +# CONFIG_BSP_USING_SDCARD is not set # # On-chip Peripheral Drivers @@ -350,12 +348,18 @@ CONFIG_BSP_USING_UART1=y # CONFIG_BSP_USING_UART2 is not set # CONFIG_BSP_USING_UART3 is not set # CONFIG_BSP_USING_UART6 is not set +# CONFIG_BSP_USING_TIM is not set +# CONFIG_BSP_USING_ON_CHIP_FLASH is not set # CONFIG_BSP_UART_USING_DMA_RX is not set # CONFIG_BSP_USING_SPI1 is not set # CONFIG_BSP_USING_SPI2 is not set # CONFIG_BSP_USING_SPI3 is not set # CONFIG_BSP_SPI_USING_DMA is not set +# CONFIG_BSP_USING_ADC is not set # CONFIG_BSP_USING_I2C1 is not set +# CONFIG_BSP_USING_ONCHIP_RTC is not set +# CONFIG_BSP_USING_WDT is not set +# CONFIG_BSP_USING_SDIO is not set # # Board extended module Drivers diff --git a/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/.mxproject index 5992acc289..7e119922f0 100644 --- a/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/.mxproject +++ b/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/.mxproject @@ -5,9 +5,9 @@ SourcePath=E:/workspace/BspFramework/rt-thread/bsp/stm32/stm32f407-atk-explorer/ SourceFiles=stm32f4xx_it.c;stm32f4xx_hal_msp.c;main.c; [PreviousLibFiles] -LibFiles=Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_eth.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_iwdg.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_eth.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_iwdg.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;Drivers/CMSIS/Include/arm_common_tables.h;Drivers/CMSIS/Include/arm_const_structs.h;Drivers/CMSIS/Include/arm_math.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armcc_V6.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_cmFunc.h;Drivers/CMSIS/Include/core_cmInstr.h;Drivers/CMSIS/Include/core_cmSimd.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h; +LibFiles=Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_eth.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_iwdg.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_sdmmc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sd.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_eth.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_iwdg.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_sdmmc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sd.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f407xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;Drivers/CMSIS/Include/arm_common_tables.h;Drivers/CMSIS/Include/arm_const_structs.h;Drivers/CMSIS/Include/arm_math.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armcc_V6.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_cmFunc.h;Drivers/CMSIS/Include/core_cmInstr.h;Drivers/CMSIS/Include/core_cmSimd.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h; [PreviousUsedKeilFiles] -SourceFiles=..\Src\main.c;..\Src\stm32f4xx_it.c;..\Src\stm32f4xx_hal_msp.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;../\Src/system_stm32f4xx.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;../\Src/system_stm32f4xx.c;../Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;null; +SourceFiles=..\Src\main.c;..\Src\stm32f4xx_it.c;..\Src\stm32f4xx_hal_msp.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;../\Src/system_stm32f4xx.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;../\Src/system_stm32f4xx.c;../Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;null; HeaderPath=..\Drivers\STM32F4xx_HAL_Driver\Inc;..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32F4xx\Include;..\Drivers\CMSIS\Include;..\Inc; diff --git a/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/CubeMX_Config.ioc b/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/CubeMX_Config.ioc index edf6c481c1..770acec332 100644 --- a/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/CubeMX_Config.ioc +++ b/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/CubeMX_Config.ioc @@ -12,44 +12,64 @@ KeepUserPlacement=false Mcu.Family=STM32F4 Mcu.IP0=ADC1 Mcu.IP1=ETH +Mcu.IP10=TIM2 +Mcu.IP11=TIM11 +Mcu.IP12=TIM13 +Mcu.IP13=TIM14 +Mcu.IP14=USART1 +Mcu.IP15=USART3 Mcu.IP2=IWDG Mcu.IP3=NVIC Mcu.IP4=RCC Mcu.IP5=RTC -Mcu.IP6=SPI1 -Mcu.IP7=SYS -Mcu.IP8=USART1 -Mcu.IP9=USART3 -Mcu.IPNb=10 +Mcu.IP6=SDIO +Mcu.IP7=SPI1 +Mcu.IP8=SPI2 +Mcu.IP9=SYS +Mcu.IPNb=16 Mcu.Name=STM32F407Z(E-G)Tx Mcu.Package=LQFP144 Mcu.Pin0=PC14-OSC32_IN Mcu.Pin1=PC15-OSC32_OUT -Mcu.Pin10=PC5 -Mcu.Pin11=PB10 -Mcu.Pin12=PB11 -Mcu.Pin13=PA9 -Mcu.Pin14=PA10 -Mcu.Pin15=PA13 -Mcu.Pin16=PA14 -Mcu.Pin17=PG11 -Mcu.Pin18=PG13 -Mcu.Pin19=PG14 +Mcu.Pin10=PA5 +Mcu.Pin11=PA7 +Mcu.Pin12=PC4 +Mcu.Pin13=PC5 +Mcu.Pin14=PB10 +Mcu.Pin15=PB11 +Mcu.Pin16=PB13 +Mcu.Pin17=PC8 +Mcu.Pin18=PC9 +Mcu.Pin19=PA9 Mcu.Pin2=PH0-OSC_IN -Mcu.Pin20=PB3 -Mcu.Pin21=PB4 -Mcu.Pin22=PB5 -Mcu.Pin23=VP_IWDG_VS_IWDG -Mcu.Pin24=VP_RTC_VS_RTC_Activate -Mcu.Pin25=VP_SYS_VS_Systick +Mcu.Pin20=PA10 +Mcu.Pin21=PA13 +Mcu.Pin22=PA14 +Mcu.Pin23=PC10 +Mcu.Pin24=PC11 +Mcu.Pin25=PC12 +Mcu.Pin26=PD2 +Mcu.Pin27=PG11 +Mcu.Pin28=PG13 +Mcu.Pin29=PG14 Mcu.Pin3=PH1-OSC_OUT +Mcu.Pin30=PB3 +Mcu.Pin31=PB4 +Mcu.Pin32=PB5 +Mcu.Pin33=VP_IWDG_VS_IWDG +Mcu.Pin34=VP_RTC_VS_RTC_Activate +Mcu.Pin35=VP_SYS_VS_Systick +Mcu.Pin36=VP_TIM2_VS_ClockSourceINT +Mcu.Pin37=VP_TIM11_VS_ClockSourceINT +Mcu.Pin38=VP_TIM13_VS_ClockSourceINT +Mcu.Pin39=VP_TIM14_VS_ClockSourceINT Mcu.Pin4=PC1 -Mcu.Pin5=PA1 -Mcu.Pin6=PA2 -Mcu.Pin7=PA5 -Mcu.Pin8=PA7 -Mcu.Pin9=PC4 -Mcu.PinsNb=26 +Mcu.Pin5=PC2 +Mcu.Pin6=PC3 +Mcu.Pin7=PA1 +Mcu.Pin8=PA2 +Mcu.Pin9=PA3 +Mcu.PinsNb=40 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F407ZGTx @@ -77,6 +97,7 @@ PA14.Mode=Serial_Wire PA14.Signal=SYS_JTCK-SWCLK PA2.Mode=RMII PA2.Signal=ETH_MDIO +PA3.Signal=S_TIM2_CH4 PA5.Locked=true PA5.Signal=ADCx_IN5 PA7.Mode=RMII @@ -87,6 +108,8 @@ PB10.Mode=Asynchronous PB10.Signal=USART3_TX PB11.Mode=Asynchronous PB11.Signal=USART3_RX +PB13.Mode=Full_Duplex_Master +PB13.Signal=SPI2_SCK PB3.Locked=true PB3.Mode=Full_Duplex_Master PB3.Signal=SPI1_SCK @@ -98,14 +121,28 @@ PB5.Mode=Full_Duplex_Master PB5.Signal=SPI1_MOSI PC1.Mode=RMII PC1.Signal=ETH_MDC +PC10.Mode=SD_4_bits_Wide_bus +PC10.Signal=SDIO_D2 +PC11.Mode=SD_4_bits_Wide_bus +PC11.Signal=SDIO_D3 +PC12.Mode=SD_4_bits_Wide_bus +PC12.Signal=SDIO_CK PC14-OSC32_IN.Mode=LSE-External-Oscillator PC14-OSC32_IN.Signal=RCC_OSC32_IN PC15-OSC32_OUT.Mode=LSE-External-Oscillator PC15-OSC32_OUT.Signal=RCC_OSC32_OUT +PC2.Mode=Full_Duplex_Master +PC2.Signal=SPI2_MISO +PC3.Mode=Full_Duplex_Master +PC3.Signal=SPI2_MOSI PC4.Mode=RMII PC4.Signal=ETH_RXD0 PC5.Mode=RMII PC5.Signal=ETH_RXD1 +PC8.Mode=SD_4_bits_Wide_bus +PC8.Signal=SDIO_D0 +PC9.Mode=SD_4_bits_Wide_bus +PC9.Signal=SDIO_D1 PCC.Checker=false PCC.Line=STM32F407/417 PCC.MCU=STM32F407Z(E-G)Tx @@ -114,6 +151,8 @@ PCC.Seq0=0 PCC.Series=STM32F4 PCC.Temperature=25 PCC.Vdd=3.3 +PD2.Mode=SD_4_bits_Wide_bus +PD2.Signal=SDIO_CMD PG11.Locked=true PG11.Mode=RMII PG11.Signal=ETH_TX_EN @@ -154,8 +193,8 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=MDK-ARM V5 ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_SPI1_Init-SPI1-false-HAL-true,5-MX_ETH_Init-ETH-false-HAL-true,6-MX_USART3_UART_Init-USART3-false-HAL-true,7-MX_ADC1_Init-ADC1-false-HAL-true,8-MX_RTC_Init-RTC-false-HAL-true,9-MX_IWDG_Init-IWDG-false-HAL-true -RCC.48MHZClocksFreq_Value=84000000 +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_SPI1_Init-SPI1-false-HAL-true,5-MX_ETH_Init-ETH-false-HAL-true,6-MX_USART3_UART_Init-USART3-false-HAL-true,7-MX_ADC1_Init-ADC1-false-HAL-true,8-MX_RTC_Init-RTC-false-HAL-true,9-MX_IWDG_Init-IWDG-false-HAL-true,10-MX_TIM14_Init-TIM14-false-HAL-true,11-MX_TIM13_Init-TIM13-false-HAL-true,12-MX_TIM11_Init-TIM11-false-HAL-true,13-MX_SDIO_SD_Init-SDIO-false-HAL-true,14-MX_TIM2_Init-TIM2-false-HAL-true,15-MX_SPI2_Init-SPI2-false-HAL-true +RCC.48MHZClocksFreq_Value=48000000 RCC.AHBFreq_Value=168000000 RCC.APB1CLKDivider=RCC_HCLK_DIV4 RCC.APB1Freq_Value=42000000 @@ -171,13 +210,14 @@ RCC.HCLKFreq_Value=168000000 RCC.HSE_VALUE=8000000 RCC.HSI_VALUE=16000000 RCC.I2SClocksFreq_Value=192000000 -RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQCLKFreq_Value,PLLSourceVirtual,RCC_RTC_Clock_Source,RCC_RTC_Clock_SourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S +RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQ,PLLQCLKFreq_Value,PLLSourceVirtual,RCC_RTC_Clock_Source,RCC_RTC_Clock_SourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VcooutputI2S RCC.LSI_VALUE=32000 RCC.MCO2PinFreq_Value=168000000 RCC.PLLCLKFreq_Value=168000000 RCC.PLLM=4 RCC.PLLN=168 -RCC.PLLQCLKFreq_Value=84000000 +RCC.PLLQ=7 +RCC.PLLQCLKFreq_Value=48000000 RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE RCC.RCC_RTC_Clock_Source=RCC_RTCCLKSOURCE_LSE RCC.RCC_RTC_Clock_SourceVirtual=RCC_RTCCLKSOURCE_LSE @@ -191,11 +231,20 @@ RCC.VCOOutputFreq_Value=336000000 RCC.VcooutputI2S=192000000 SH.ADCx_IN5.0=ADC1_IN5,IN5 SH.ADCx_IN5.ConfNb=1 +SH.S_TIM2_CH4.0=TIM2_CH4,PWM Generation4 CH4 +SH.S_TIM2_CH4.ConfNb=1 SPI1.CalculateBaudRate=42.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=21.0 MBits/s +SPI2.Direction=SPI_DIRECTION_2LINES +SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate +SPI2.Mode=SPI_MODE_MASTER +SPI2.VirtualType=VM_MASTER +TIM2.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 +TIM2.IPParameters=Channel-PWM Generation4 CH4 USART1.IPParameters=VirtualMode USART1.VirtualMode=VM_ASYNC USART3.IPParameters=VirtualMode @@ -206,4 +255,12 @@ VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Signal=SYS_VS_Systick +VP_TIM11_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM11_VS_ClockSourceINT.Signal=TIM11_VS_ClockSourceINT +VP_TIM13_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM13_VS_ClockSourceINT.Signal=TIM13_VS_ClockSourceINT +VP_TIM14_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM14_VS_ClockSourceINT.Signal=TIM14_VS_ClockSourceINT +VP_TIM2_VS_ClockSourceINT.Mode=Internal +VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT board=custom diff --git a/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/Inc/main.h index c9d0c58eab..7641bf3d51 100644 --- a/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/Inc/main.h +++ b/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/Inc/main.h @@ -70,6 +70,8 @@ extern "C" { /* USER CODE END EM */ +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + /* Exported functions prototypes ---------------------------------------------*/ void Error_Handler(void); diff --git a/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h b/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h index 42f834b278..37853623c2 100644 --- a/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h +++ b/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h @@ -71,10 +71,10 @@ /* #define HAL_RNG_MODULE_ENABLED */ #define HAL_RTC_MODULE_ENABLED /* #define HAL_SAI_MODULE_ENABLED */ -/* #define HAL_SD_MODULE_ENABLED */ +#define HAL_SD_MODULE_ENABLED /* #define HAL_MMC_MODULE_ENABLED */ #define HAL_SPI_MODULE_ENABLED -/* #define HAL_TIM_MODULE_ENABLED */ +#define HAL_TIM_MODULE_ENABLED #define HAL_UART_MODULE_ENABLED /* #define HAL_USART_MODULE_ENABLED */ /* #define HAL_IRDA_MODULE_ENABLED */ diff --git a/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/Src/main.c index efc54ca543..2577da8b41 100644 --- a/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/Src/main.c +++ b/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/Src/main.c @@ -70,7 +70,15 @@ IWDG_HandleTypeDef hiwdg; RTC_HandleTypeDef hrtc; +SD_HandleTypeDef hsd; + SPI_HandleTypeDef hspi1; +SPI_HandleTypeDef hspi2; + +TIM_HandleTypeDef htim2; +TIM_HandleTypeDef htim11; +TIM_HandleTypeDef htim13; +TIM_HandleTypeDef htim14; UART_HandleTypeDef huart1; UART_HandleTypeDef huart3; @@ -90,6 +98,12 @@ static void MX_USART3_UART_Init(void); static void MX_ADC1_Init(void); static void MX_RTC_Init(void); static void MX_IWDG_Init(void); +static void MX_TIM14_Init(void); +static void MX_TIM13_Init(void); +static void MX_TIM11_Init(void); +static void MX_SDIO_SD_Init(void); +static void MX_TIM2_Init(void); +static void MX_SPI2_Init(void); /* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ @@ -135,6 +149,12 @@ int main(void) MX_ADC1_Init(); MX_RTC_Init(); MX_IWDG_Init(); + MX_TIM14_Init(); + MX_TIM13_Init(); + MX_TIM11_Init(); + MX_SDIO_SD_Init(); + MX_TIM2_Init(); + MX_SPI2_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ @@ -178,7 +198,7 @@ void SystemClock_Config(void) RCC_OscInitStruct.PLL.PLLM = 4; RCC_OscInitStruct.PLL.PLLN = 168; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = 4; + RCC_OscInitStruct.PLL.PLLQ = 7; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); @@ -361,6 +381,42 @@ static void MX_RTC_Init(void) } +/** + * @brief SDIO Initialization Function + * @param None + * @retval None + */ +static void MX_SDIO_SD_Init(void) +{ + + /* USER CODE BEGIN SDIO_Init 0 */ + + /* USER CODE END SDIO_Init 0 */ + + /* USER CODE BEGIN SDIO_Init 1 */ + + /* USER CODE END SDIO_Init 1 */ + hsd.Instance = SDIO; + hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; + hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; + hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; + hsd.Init.BusWide = SDIO_BUS_WIDE_1B; + hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; + hsd.Init.ClockDiv = 0; + if (HAL_SD_Init(&hsd) != HAL_OK) + { + Error_Handler(); + } + if (HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SDIO_Init 2 */ + + /* USER CODE END SDIO_Init 2 */ + +} + /** * @brief SPI1 Initialization Function * @param None @@ -399,6 +455,192 @@ static void MX_SPI1_Init(void) } +/** + * @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_8BIT; + 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 = 10; + 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}; + TIM_OC_InitTypeDef sConfigOC = {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; + 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(); + } + if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM2_Init 2 */ + + /* USER CODE END TIM2_Init 2 */ + HAL_TIM_MspPostInit(&htim2); + +} + +/** + * @brief TIM11 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM11_Init(void) +{ + + /* USER CODE BEGIN TIM11_Init 0 */ + + /* USER CODE END TIM11_Init 0 */ + + /* USER CODE BEGIN TIM11_Init 1 */ + + /* USER CODE END TIM11_Init 1 */ + htim11.Instance = TIM11; + htim11.Init.Prescaler = 0; + htim11.Init.CounterMode = TIM_COUNTERMODE_UP; + htim11.Init.Period = 0; + htim11.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + if (HAL_TIM_Base_Init(&htim11) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM11_Init 2 */ + + /* USER CODE END TIM11_Init 2 */ + +} + +/** + * @brief TIM13 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM13_Init(void) +{ + + /* USER CODE BEGIN TIM13_Init 0 */ + + /* USER CODE END TIM13_Init 0 */ + + /* USER CODE BEGIN TIM13_Init 1 */ + + /* USER CODE END TIM13_Init 1 */ + htim13.Instance = TIM13; + htim13.Init.Prescaler = 0; + htim13.Init.CounterMode = TIM_COUNTERMODE_UP; + htim13.Init.Period = 0; + htim13.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + if (HAL_TIM_Base_Init(&htim13) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM13_Init 2 */ + + /* USER CODE END TIM13_Init 2 */ + +} + +/** + * @brief TIM14 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM14_Init(void) +{ + + /* USER CODE BEGIN TIM14_Init 0 */ + + /* USER CODE END TIM14_Init 0 */ + + /* USER CODE BEGIN TIM14_Init 1 */ + + /* USER CODE END TIM14_Init 1 */ + htim14.Instance = TIM14; + htim14.Init.Prescaler = 0; + htim14.Init.CounterMode = TIM_COUNTERMODE_UP; + htim14.Init.Period = 0; + htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + if (HAL_TIM_Base_Init(&htim14) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM14_Init 2 */ + + /* USER CODE END TIM14_Init 2 */ + +} + /** * @brief USART1 Initialization Function * @param None @@ -478,6 +720,7 @@ static void MX_GPIO_Init(void) __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); } diff --git a/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c b/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c index ba4fa3a128..258ea04acc 100644 --- a/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c +++ b/bsp/stm32/stm32f407-atk-explorer/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c @@ -78,7 +78,9 @@ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ -/** + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + /** * Initializes the Global MSP. */ void HAL_MspInit(void) @@ -310,6 +312,94 @@ void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc) } +/** +* @brief SD MSP Initialization +* This function configures the hardware resources used in this example +* @param hsd: SD handle pointer +* @retval None +*/ +void HAL_SD_MspInit(SD_HandleTypeDef* hsd) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hsd->Instance==SDIO) + { + /* USER CODE BEGIN SDIO_MspInit 0 */ + + /* USER CODE END SDIO_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SDIO_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + /**SDIO GPIO Configuration + PC8 ------> SDIO_D0 + PC9 ------> SDIO_D1 + PC10 ------> SDIO_D2 + PC11 ------> SDIO_D3 + PC12 ------> SDIO_CK + PD2 ------> SDIO_CMD + */ + GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /* USER CODE BEGIN SDIO_MspInit 1 */ + + /* USER CODE END SDIO_MspInit 1 */ + } + +} + +/** +* @brief SD MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hsd: SD handle pointer +* @retval None +*/ + +void HAL_SD_MspDeInit(SD_HandleTypeDef* hsd) +{ + + if(hsd->Instance==SDIO) + { + /* USER CODE BEGIN SDIO_MspDeInit 0 */ + + /* USER CODE END SDIO_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SDIO_CLK_DISABLE(); + + /**SDIO GPIO Configuration + PC8 ------> SDIO_D0 + PC9 ------> SDIO_D1 + PC10 ------> SDIO_D2 + PC11 ------> SDIO_D3 + PC12 ------> SDIO_CK + PD2 ------> SDIO_CMD + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12); + + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2); + + /* USER CODE BEGIN SDIO_MspDeInit 1 */ + + /* USER CODE END SDIO_MspDeInit 1 */ + } + +} + /** * @brief SPI MSP Initialization * This function configures the hardware resources used in this example @@ -348,6 +438,39 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) /* 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_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_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_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI2_MspInit 1 */ + + /* USER CODE END SPI2_MspInit 1 */ + } } @@ -382,6 +505,167 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) /* 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==TIM11) + { + /* USER CODE BEGIN TIM11_MspInit 0 */ + + /* USER CODE END TIM11_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM11_CLK_ENABLE(); + /* USER CODE BEGIN TIM11_MspInit 1 */ + + /* USER CODE END TIM11_MspInit 1 */ + } + else if(htim_base->Instance==TIM13) + { + /* USER CODE BEGIN TIM13_MspInit 0 */ + + /* USER CODE END TIM13_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM13_CLK_ENABLE(); + /* USER CODE BEGIN TIM13_MspInit 1 */ + + /* USER CODE END TIM13_MspInit 1 */ + } + else if(htim_base->Instance==TIM14) + { + /* USER CODE BEGIN TIM14_MspInit 0 */ + + /* USER CODE END TIM14_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM14_CLK_ENABLE(); + /* USER CODE BEGIN TIM14_MspInit 1 */ + + /* USER CODE END TIM14_MspInit 1 */ + } + +} + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(htim->Instance==TIM2) + { + /* USER CODE BEGIN TIM2_MspPostInit 0 */ + + /* USER CODE END TIM2_MspPostInit 0 */ + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**TIM2 GPIO Configuration + PA3 ------> TIM2_CH4 + */ + GPIO_InitStruct.Pin = 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_TIM2; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM2_MspPostInit 1 */ + + /* USER CODE END TIM2_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==TIM11) + { + /* USER CODE BEGIN TIM11_MspDeInit 0 */ + + /* USER CODE END TIM11_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM11_CLK_DISABLE(); + /* USER CODE BEGIN TIM11_MspDeInit 1 */ + + /* USER CODE END TIM11_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM13) + { + /* USER CODE BEGIN TIM13_MspDeInit 0 */ + + /* USER CODE END TIM13_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM13_CLK_DISABLE(); + /* USER CODE BEGIN TIM13_MspDeInit 1 */ + + /* USER CODE END TIM13_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM14) + { + /* USER CODE BEGIN TIM14_MspDeInit 0 */ + + /* USER CODE END TIM14_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM14_CLK_DISABLE(); + /* USER CODE BEGIN TIM14_MspDeInit 1 */ + + /* USER CODE END TIM14_MspDeInit 1 */ + } } diff --git a/bsp/stm32/stm32f407-atk-explorer/board/Kconfig b/bsp/stm32/stm32f407-atk-explorer/board/Kconfig index c34e98a24c..319cb49c92 100644 --- a/bsp/stm32/stm32f407-atk-explorer/board/Kconfig +++ b/bsp/stm32/stm32f407-atk-explorer/board/Kconfig @@ -45,6 +45,13 @@ menu "Onboard Peripheral Drivers" select BSP_USING_I2C1 select PKG_USING_MPU6XXX + config BSP_USING_SDCARD + bool "Enable SDCARD (sdio)" + select BSP_USING_SDIO + select RT_USING_DFS + select RT_USING_DFS_ELMFAT + default n + endmenu menu "On-chip Peripheral Drivers" @@ -73,7 +80,40 @@ menu "On-chip Peripheral Drivers" bool "Enable UART6" select RT_USING_SERIAL default n - + + menuconfig BSP_USING_TIM + bool "Enable timer" + default n + select RT_USING_HWTIMER + if BSP_USING_TIM + config BSP_USING_TIM11 + bool "Enable TIM11" + default n + + config BSP_USING_TIM13 + bool "Enable TIM13" + default n + + config BSP_USING_TIM14 + bool "Enable TIM14" + default n + endif + + menuconfig BSP_USING_PWM + bool "Enable pwm" + default n + select RT_USING_PWM + if BSP_USING_PWM + menuconfig BSP_USING_PWM2 + bool "Enable timer2 output pwm" + default n + if BSP_USING_PWM2 + config BSP_USING_PWM2_CH4 + bool "Enable PWM2 channel4" + default n + endif + endif + config BSP_USING_ON_CHIP_FLASH bool "Enable on-chip FLASH" default n @@ -92,11 +132,6 @@ menu "On-chip Peripheral Drivers" select RT_USING_SPI default n - config BSP_USING_SPI3 - bool "Enable SPI3 BUS" - select RT_USING_SPI - default n - config BSP_SPI_USING_DMA bool "Enable SPI DMA support" default n @@ -147,6 +182,12 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n + config BSP_USING_SDIO + bool "Enable SDIO" + select RT_USING_SDIO + select RT_USING_DFS + default n + endmenu menu "Board extended module Drivers" diff --git a/bsp/stm32/stm32f407-atk-explorer/board/SConscript b/bsp/stm32/stm32f407-atk-explorer/board/SConscript index ee12fe4ce6..65f3b2aad6 100644 --- a/bsp/stm32/stm32f407-atk-explorer/board/SConscript +++ b/bsp/stm32/stm32f407-atk-explorer/board/SConscript @@ -18,6 +18,9 @@ if GetDepend(['BSP_USING_ETH']): if GetDepend(['BSP_USING_SPI_FLASH']): src += Glob('ports/spi_flash_init.c') +if GetDepend(['BSP_USING_SDCARD']): + src += Glob('ports/sdcard_port.c') + path = [cwd] path += [cwd + '/CubeMX_Config/Inc'] path += [cwd + '/ports'] diff --git a/bsp/stm32/stm32f407-atk-explorer/board/board.c b/bsp/stm32/stm32f407-atk-explorer/board/board.c index 4e400eea6a..52145fe832 100644 --- a/bsp/stm32/stm32f407-atk-explorer/board/board.c +++ b/bsp/stm32/stm32f407-atk-explorer/board/board.c @@ -12,34 +12,33 @@ void SystemClock_Config(void) { + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; - RCC_OscInitTypeDef RCC_OscInitStruct; - RCC_ClkInitTypeDef RCC_ClkInitStruct; - - /**Configure the main internal regulator output voltage - */ + /**Configure the main internal regulator output voltage + */ __HAL_RCC_PWR_CLK_ENABLE(); - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - - /**Initializes the CPU, AHB and APB busses clocks - */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; - RCC_OscInitStruct.HSIState = RCC_HSI_ON; - RCC_OscInitStruct.HSICalibrationValue = 16; + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE + |RCC_OSCILLATORTYPE_LSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; - RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; - RCC_OscInitStruct.PLL.PLLM = 8; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 4; RCC_OscInitStruct.PLL.PLLN = 168; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = 4; + RCC_OscInitStruct.PLL.PLLQ = 7; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { - _Error_Handler(__FILE__, __LINE__); + Error_Handler(); } - - /**Initializes the CPU, AHB and APB busses clocks - */ + /**Initializes the CPU, AHB and APB busses clocks + */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; @@ -49,19 +48,14 @@ void SystemClock_Config(void) if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { - _Error_Handler(__FILE__, __LINE__); + Error_Handler(); + } + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); } - - /**Configure the Systick interrupt time - */ - HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); - - /**Configure the Systick - */ - HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); - - /* SysTick_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } void MX_GPIO_Init(void) { diff --git a/bsp/stm32/stm32f407-atk-explorer/rtconfig.h b/bsp/stm32/stm32f407-atk-explorer/rtconfig.h index 948a7a65d7..e628397b54 100644 --- a/bsp/stm32/stm32f407-atk-explorer/rtconfig.h +++ b/bsp/stm32/stm32f407-atk-explorer/rtconfig.h @@ -38,6 +38,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_VER_NUM 0x40000 #define ARCH_ARM #define ARCH_ARM_CORTEX_M #define ARCH_ARM_CORTEX_M4 @@ -76,6 +77,7 @@ #define RT_USING_DEVICE_IPC #define RT_PIPE_BUFSZ 512 #define RT_USING_SERIAL +#define RT_SERIAL_USING_DMA #define RT_USING_PIN /* Using WiFi */ @@ -147,16 +149,8 @@ /* miscellaneous packages */ -/* sample package */ - /* samples: kernel and components samples */ - -/* example package: hello */ - - -/* rtpkgs online packages */ - #define SOC_FAMILY_STM32 #define SOC_SERIES_STM32F4 diff --git a/bsp/stm32/stm32f429-atk-apollo/.config b/bsp/stm32/stm32f429-atk-apollo/.config index 1ad45f888b..99e2a7651d 100644 --- a/bsp/stm32/stm32f429-atk-apollo/.config +++ b/bsp/stm32/stm32f429-atk-apollo/.config @@ -62,6 +62,7 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +CONFIG_RT_VER_NUM=0x40000 CONFIG_ARCH_ARM=y CONFIG_ARCH_ARM_CORTEX_M=y CONFIG_ARCH_ARM_CORTEX_M4=y @@ -110,6 +111,7 @@ CONFIG_FINSH_ARG_MAX=10 CONFIG_RT_USING_DEVICE_IPC=y CONFIG_RT_PIPE_BUFSZ=512 CONFIG_RT_USING_SERIAL=y +CONFIG_RT_SERIAL_USING_DMA=y # CONFIG_RT_USING_CAN is not set # CONFIG_RT_USING_HWTIMER is not set # CONFIG_RT_USING_CPUTIME is not set @@ -179,12 +181,14 @@ CONFIG_RT_USING_PIN=y # 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 @@ -278,6 +282,7 @@ CONFIG_RT_USING_PIN=y # 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 @@ -292,6 +297,7 @@ CONFIG_RT_USING_PIN=y # 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 @@ -307,10 +313,6 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set -# -# sample package -# - # # samples: kernel and components samples # @@ -318,30 +320,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set # CONFIG_PKG_USING_NETWORK_SAMPLES is not set # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set - -# -# example package: hello -# # CONFIG_PKG_USING_HELLO is not set - -# -# Privated Packages of RealThread -# -# CONFIG_PKG_USING_CODEC is not set -# CONFIG_PKG_USING_PLAYER is not set -# CONFIG_PKG_USING_PERSIMMON_SRC is not set - -# -# Network Utilities -# -# CONFIG_PKG_USING_WICED is not set -# CONFIG_PKG_USING_CLOUDSDK is not set -# CONFIG_PKG_USING_COREMARK is not set -# CONFIG_PKG_USING_POWER_MANAGER is not set -# CONFIG_PKG_USING_RT_OTA is not set -# CONFIG_PKG_USING_RDBD_SRC is not set -# CONFIG_PKG_USING_RTINSIGHT is not set -# CONFIG_PKG_USING_SMARTCONFIG is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F4=y @@ -360,6 +339,7 @@ CONFIG_BSP_USING_USB_TO_USART=y # CONFIG_BSP_USING_SPI_FLASH is not set # CONFIG_BSP_USING_MPU9250 is not set # CONFIG_BSP_USING_ETH is not set +# CONFIG_BSP_USING_SDCARD is not set # # On-chip Peripheral Drivers @@ -369,11 +349,17 @@ CONFIG_BSP_USING_UART1=y # CONFIG_BSP_USING_UART2 is not set # CONFIG_BSP_USING_UART3 is not set # CONFIG_BSP_UART_USING_DMA_RX is not set +# CONFIG_BSP_USING_ON_CHIP_FLASH is not set # CONFIG_BSP_USING_SPI1 is not set # CONFIG_BSP_USING_SPI2 is not set # CONFIG_BSP_USING_SPI5 is not set # CONFIG_BSP_SPI_USING_DMA is not set # CONFIG_BSP_USING_I2C1 is not set +# CONFIG_BSP_USING_TIM is not set +# CONFIG_BSP_USING_ADC is not set +# CONFIG_BSP_USING_ONCHIP_RTC is not set +# CONFIG_BSP_USING_WDT is not set +# CONFIG_BSP_USING_SDIO is not set # # Board extended module Drivers diff --git a/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/.mxproject index 77224685af..f86413cb62 100644 --- a/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/.mxproject +++ b/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/.mxproject @@ -1,16 +1,16 @@ [PreviousGenFiles] -HeaderPath=D:/BspFramework/rt-thread/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/Inc +HeaderPath=E:/workspace/BspFramework/rt-thread/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/Inc HeaderFiles=stm32f4xx_it.h;stm32f4xx_hal_conf.h;main.h; -SourcePath=D:/BspFramework/rt-thread/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/Src +SourcePath=E:/workspace/BspFramework/rt-thread/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/Src SourceFiles=stm32f4xx_it.c;stm32f4xx_hal_msp.c;main.c; [PreviousLibFiles] -LibFiles=Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_eth.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fmc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sdram.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_iwdg.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_eth.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fmc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sdram.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_iwdg.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f429xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;Drivers/CMSIS/Include/arm_common_tables.h;Drivers/CMSIS/Include/arm_const_structs.h;Drivers/CMSIS/Include/arm_math.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armcc_V6.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_cmFunc.h;Drivers/CMSIS/Include/core_cmInstr.h;Drivers/CMSIS/Include/core_cmSimd.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h; +LibFiles=Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_eth.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fmc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sdram.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_iwdg.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_sdmmc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sd.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_eth.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fmc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sdram.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_iwdg.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_sdmmc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sd.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f429xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;Drivers/CMSIS/Include/arm_common_tables.h;Drivers/CMSIS/Include/arm_const_structs.h;Drivers/CMSIS/Include/arm_math.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armcc_V6.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_cmFunc.h;Drivers/CMSIS/Include/core_cmInstr.h;Drivers/CMSIS/Include/core_cmSimd.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h; [] SourceFiles=;; [PreviousUsedKeilFiles] -SourceFiles=..\Src\main.c;..\Src\stm32f4xx_it.c;..\Src\stm32f4xx_hal_msp.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;../\Src/system_stm32f4xx.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;../\Src/system_stm32f4xx.c;../Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;null; +SourceFiles=..\Src\main.c;..\Src\stm32f4xx_it.c;..\Src\stm32f4xx_hal_msp.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;../\Src/system_stm32f4xx.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;../\Src/system_stm32f4xx.c;../Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;E:/workspace/BspFramework/rt-thread/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config//MDK-ARM/startup_stm32f429xx.s; HeaderPath=..\Drivers\STM32F4xx_HAL_Driver\Inc;..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32F4xx\Include;..\Drivers\CMSIS\Include;..\Inc; diff --git a/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/Inc/main.h index 9d41187606..f1494d6236 100644 --- a/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/Inc/main.h +++ b/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/Inc/main.h @@ -70,6 +70,8 @@ extern "C" { /* USER CODE END EM */ +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + /* Exported functions prototypes ---------------------------------------------*/ void Error_Handler(void); diff --git a/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h b/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h index 9058fdf15a..eb06eacdbb 100644 --- a/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h +++ b/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h @@ -71,10 +71,10 @@ /* #define HAL_RNG_MODULE_ENABLED */ #define HAL_RTC_MODULE_ENABLED /* #define HAL_SAI_MODULE_ENABLED */ -/* #define HAL_SD_MODULE_ENABLED */ +#define HAL_SD_MODULE_ENABLED /* #define HAL_MMC_MODULE_ENABLED */ -/* #define HAL_SPI_MODULE_ENABLED */ -/* #define HAL_TIM_MODULE_ENABLED */ +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED #define HAL_UART_MODULE_ENABLED /* #define HAL_USART_MODULE_ENABLED */ /* #define HAL_IRDA_MODULE_ENABLED */ diff --git a/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/STM32F429IG.ioc b/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/STM32F429IG.ioc index 57498627a0..f73131a428 100644 --- a/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/STM32F429IG.ioc +++ b/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/STM32F429IG.ioc @@ -12,77 +12,105 @@ KeepUserPlacement=false Mcu.Family=STM32F4 Mcu.IP0=ADC1 Mcu.IP1=ETH +Mcu.IP10=SPI5 +Mcu.IP11=SYS +Mcu.IP12=TIM2 +Mcu.IP13=TIM11 +Mcu.IP14=TIM13 +Mcu.IP15=TIM14 +Mcu.IP16=USART1 Mcu.IP2=FMC Mcu.IP3=IWDG Mcu.IP4=NVIC Mcu.IP5=RCC Mcu.IP6=RTC -Mcu.IP7=SYS -Mcu.IP8=USART1 -Mcu.IPNb=9 +Mcu.IP7=SDIO +Mcu.IP8=SPI1 +Mcu.IP9=SPI2 +Mcu.IPNb=17 Mcu.Name=STM32F429I(E-G)Tx Mcu.Package=LQFP176 Mcu.Pin0=PC14/OSC32_IN Mcu.Pin1=PC15/OSC32_OUT -Mcu.Pin10=PC0 -Mcu.Pin11=PC1 -Mcu.Pin12=PC2 -Mcu.Pin13=PC3 -Mcu.Pin14=PA1 -Mcu.Pin15=PA2 -Mcu.Pin16=PA5 -Mcu.Pin17=PA7 -Mcu.Pin18=PC4 -Mcu.Pin19=PC5 +Mcu.Pin10=PF9 +Mcu.Pin11=PH0/OSC_IN +Mcu.Pin12=PH1/OSC_OUT +Mcu.Pin13=PC0 +Mcu.Pin14=PC1 +Mcu.Pin15=PC2 +Mcu.Pin16=PC3 +Mcu.Pin17=PA1 +Mcu.Pin18=PA2 +Mcu.Pin19=PA3 Mcu.Pin2=PF0 -Mcu.Pin20=PF11 -Mcu.Pin21=PF12 -Mcu.Pin22=PF13 -Mcu.Pin23=PF14 -Mcu.Pin24=PF15 -Mcu.Pin25=PG0 -Mcu.Pin26=PG1 -Mcu.Pin27=PE7 -Mcu.Pin28=PE8 -Mcu.Pin29=PE9 +Mcu.Pin20=PA5 +Mcu.Pin21=PA6 +Mcu.Pin22=PA7 +Mcu.Pin23=PC4 +Mcu.Pin24=PC5 +Mcu.Pin25=PF11 +Mcu.Pin26=PF12 +Mcu.Pin27=PF13 +Mcu.Pin28=PF14 +Mcu.Pin29=PF15 Mcu.Pin3=PF1 -Mcu.Pin30=PE10 -Mcu.Pin31=PE11 -Mcu.Pin32=PE12 -Mcu.Pin33=PE13 -Mcu.Pin34=PE14 -Mcu.Pin35=PE15 -Mcu.Pin36=PB11 -Mcu.Pin37=PD8 -Mcu.Pin38=PD9 -Mcu.Pin39=PD10 +Mcu.Pin30=PG0 +Mcu.Pin31=PG1 +Mcu.Pin32=PE7 +Mcu.Pin33=PE8 +Mcu.Pin34=PE9 +Mcu.Pin35=PE10 +Mcu.Pin36=PE11 +Mcu.Pin37=PE12 +Mcu.Pin38=PE13 +Mcu.Pin39=PE14 Mcu.Pin4=PF2 -Mcu.Pin40=PD14 -Mcu.Pin41=PD15 -Mcu.Pin42=PG2 -Mcu.Pin43=PG4 -Mcu.Pin44=PG5 -Mcu.Pin45=PG8 -Mcu.Pin46=PA9 -Mcu.Pin47=PA10 -Mcu.Pin48=PA13 -Mcu.Pin49=PA14 +Mcu.Pin40=PE15 +Mcu.Pin41=PB10 +Mcu.Pin42=PB11 +Mcu.Pin43=PB14 +Mcu.Pin44=PB15 +Mcu.Pin45=PD8 +Mcu.Pin46=PD9 +Mcu.Pin47=PD10 +Mcu.Pin48=PD14 +Mcu.Pin49=PD15 Mcu.Pin5=PF3 -Mcu.Pin50=PD0 -Mcu.Pin51=PD1 -Mcu.Pin52=PG13 -Mcu.Pin53=PG14 -Mcu.Pin54=PG15 -Mcu.Pin55=PE0 -Mcu.Pin56=PE1 -Mcu.Pin57=VP_IWDG_VS_IWDG -Mcu.Pin58=VP_RTC_VS_RTC_Activate -Mcu.Pin59=VP_SYS_VS_Systick +Mcu.Pin50=PG2 +Mcu.Pin51=PG4 +Mcu.Pin52=PG5 +Mcu.Pin53=PG8 +Mcu.Pin54=PC8 +Mcu.Pin55=PC9 +Mcu.Pin56=PA9 +Mcu.Pin57=PA10 +Mcu.Pin58=PA13 +Mcu.Pin59=PA14 Mcu.Pin6=PF4 +Mcu.Pin60=PC10 +Mcu.Pin61=PC11 +Mcu.Pin62=PC12 +Mcu.Pin63=PD0 +Mcu.Pin64=PD1 +Mcu.Pin65=PD2 +Mcu.Pin66=PG13 +Mcu.Pin67=PG14 +Mcu.Pin68=PG15 +Mcu.Pin69=PB3 Mcu.Pin7=PF5 -Mcu.Pin8=PH0/OSC_IN -Mcu.Pin9=PH1/OSC_OUT -Mcu.PinsNb=60 +Mcu.Pin70=PB5 +Mcu.Pin71=PE0 +Mcu.Pin72=PE1 +Mcu.Pin73=VP_IWDG_VS_IWDG +Mcu.Pin74=VP_RTC_VS_RTC_Activate +Mcu.Pin75=VP_SYS_VS_Systick +Mcu.Pin76=VP_TIM2_VS_ClockSourceINT +Mcu.Pin77=VP_TIM11_VS_ClockSourceINT +Mcu.Pin78=VP_TIM13_VS_ClockSourceINT +Mcu.Pin79=VP_TIM14_VS_ClockSourceINT +Mcu.Pin8=PF7 +Mcu.Pin9=PF8 +Mcu.PinsNb=80 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F429IGTx @@ -109,16 +137,36 @@ PA14.Mode=Serial_Wire PA14.Signal=SYS_JTCK-SWCLK PA2.Mode=RMII PA2.Signal=ETH_MDIO +PA3.Locked=true +PA3.Signal=S_TIM2_CH4 PA5.Signal=ADCx_IN5 +PA6.Mode=Full_Duplex_Master +PA6.Signal=SPI1_MISO PA7.Mode=RMII PA7.Signal=ETH_CRS_DV PA9.Mode=Asynchronous PA9.Signal=USART1_TX +PB10.Mode=Full_Duplex_Master +PB10.Signal=SPI2_SCK PB11.Mode=RMII PB11.Signal=ETH_TX_EN +PB14.Mode=Full_Duplex_Master +PB14.Signal=SPI2_MISO +PB15.Mode=Full_Duplex_Master +PB15.Signal=SPI2_MOSI +PB3.Mode=Full_Duplex_Master +PB3.Signal=SPI1_SCK +PB5.Mode=Full_Duplex_Master +PB5.Signal=SPI1_MOSI PC0.Signal=FMC_SDNWE PC1.Mode=RMII PC1.Signal=ETH_MDC +PC10.Mode=SD_4_bits_Wide_bus +PC10.Signal=SDIO_D2 +PC11.Mode=SD_4_bits_Wide_bus +PC11.Signal=SDIO_D3 +PC12.Mode=SD_4_bits_Wide_bus +PC12.Signal=SDIO_CK PC14/OSC32_IN.Mode=LSE-External-Oscillator PC14/OSC32_IN.Signal=RCC_OSC32_IN PC15/OSC32_OUT.Mode=LSE-External-Oscillator @@ -131,6 +179,10 @@ PC4.Mode=RMII PC4.Signal=ETH_RXD0 PC5.Mode=RMII PC5.Signal=ETH_RXD1 +PC8.Mode=SD_4_bits_Wide_bus +PC8.Signal=SDIO_D0 +PC9.Mode=SD_4_bits_Wide_bus +PC9.Signal=SDIO_D1 PCC.Checker=false PCC.Line=STM32F429/439 PCC.MCU=STM32F429I(E-G)Tx @@ -144,6 +196,8 @@ PD1.Signal=FMC_D3_DA3 PD10.Signal=FMC_D15_DA15 PD14.Signal=FMC_D0_DA0 PD15.Signal=FMC_D1_DA1 +PD2.Mode=SD_4_bits_Wide_bus +PD2.Signal=SDIO_CMD PD8.Signal=FMC_D13_DA13 PD9.Signal=FMC_D14_DA14 PE0.Signal=FMC_NBL0 @@ -168,6 +222,12 @@ PF2.Signal=FMC_A2 PF3.Signal=FMC_A3 PF4.Signal=FMC_A4 PF5.Signal=FMC_A5 +PF7.Mode=Full_Duplex_Master +PF7.Signal=SPI5_SCK +PF8.Mode=Full_Duplex_Master +PF8.Signal=SPI5_MISO +PF9.Mode=Full_Duplex_Master +PF9.Signal=SPI5_MOSI PG0.Signal=FMC_A10 PG1.Signal=FMC_A11 PG13.Locked=true @@ -212,8 +272,8 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=MDK-ARM V5 ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_ETH_Init-ETH-false-HAL-true,5-MX_FMC_Init-FMC-false-HAL-true,6-MX_RTC_Init-RTC-false-HAL-true,7-MX_IWDG_Init-IWDG-false-HAL-true,8-MX_ADC1_Init-ADC1-false-HAL-true -RCC.48MHZClocksFreq_Value=90000000 +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_ETH_Init-ETH-false-HAL-true,5-MX_FMC_Init-FMC-false-HAL-true,6-MX_RTC_Init-RTC-false-HAL-true,7-MX_IWDG_Init-IWDG-false-HAL-true,8-MX_ADC1_Init-ADC1-false-HAL-true,9-MX_TIM11_Init-TIM11-false-HAL-true,10-MX_TIM13_Init-TIM13-false-HAL-true,11-MX_TIM14_Init-TIM14-false-HAL-true,12-MX_SDIO_SD_Init-SDIO-false-HAL-true,13-MX_TIM2_Init-TIM2-false-HAL-true,14-MX_SPI1_Init-SPI1-false-HAL-true,15-MX_SPI2_Init-SPI2-false-HAL-true,16-MX_SPI5_Init-SPI5-false-HAL-true +RCC.48MHZClocksFreq_Value=45000000 RCC.AHBFreq_Value=180000000 RCC.APB1CLKDivider=RCC_HCLK_DIV4 RCC.APB1Freq_Value=45000000 @@ -229,16 +289,19 @@ RCC.HCLKFreq_Value=180000000 RCC.HSE_VALUE=25000000 RCC.HSI_VALUE=16000000 RCC.I2SClocksFreq_Value=160000000 -RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LCDTFTFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQCLKFreq_Value,PLLSourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SAI_AClocksFreq_Value,SAI_BClocksFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAIOutputFreq_Value,VCOSAIOutputFreq_ValueQ,VCOSAIOutputFreq_ValueR,VcooutputI2S,VcooutputI2SQ +RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LCDTFTFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQ,PLLQCLKFreq_Value,PLLSourceVirtual,RCC_RTC_Clock_Source,RCC_RTC_Clock_SourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SAI_AClocksFreq_Value,SAI_BClocksFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAIOutputFreq_Value,VCOSAIOutputFreq_ValueQ,VCOSAIOutputFreq_ValueR,VcooutputI2S,VcooutputI2SQ RCC.LCDTFTFreq_Value=20416666.666666668 RCC.LSI_VALUE=32000 RCC.MCO2PinFreq_Value=180000000 RCC.PLLCLKFreq_Value=180000000 RCC.PLLM=15 RCC.PLLN=216 -RCC.PLLQCLKFreq_Value=90000000 +RCC.PLLQ=8 +RCC.PLLQCLKFreq_Value=45000000 RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE -RCC.RTCFreq_Value=32000 +RCC.RCC_RTC_Clock_Source=RCC_RTCCLKSOURCE_LSE +RCC.RCC_RTC_Clock_SourceVirtual=RCC_RTCCLKSOURCE_LSE +RCC.RTCFreq_Value=32768 RCC.RTCHSEDivFreq_Value=12500000 RCC.SAI_AClocksFreq_Value=20416666.666666668 RCC.SAI_BClocksFreq_Value=20416666.666666668 @@ -328,6 +391,25 @@ SH.FMC_SDNRAS.0=FMC_SDNRAS,13b-sda1 SH.FMC_SDNRAS.ConfNb=1 SH.FMC_SDNWE.0=FMC_SDNWE,13b-sda1 SH.FMC_SDNWE.ConfNb=1 +SH.S_TIM2_CH4.0=TIM2_CH4,PWM Generation4 CH4 +SH.S_TIM2_CH4.ConfNb=1 +SPI1.CalculateBaudRate=45.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=22.5 MBits/s +SPI2.Direction=SPI_DIRECTION_2LINES +SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate +SPI2.Mode=SPI_MODE_MASTER +SPI2.VirtualType=VM_MASTER +SPI5.CalculateBaudRate=45.0 MBits/s +SPI5.Direction=SPI_DIRECTION_2LINES +SPI5.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate +SPI5.Mode=SPI_MODE_MASTER +SPI5.VirtualType=VM_MASTER +TIM2.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 +TIM2.IPParameters=Channel-PWM Generation4 CH4 USART1.IPParameters=VirtualMode USART1.VirtualMode=VM_ASYNC VP_IWDG_VS_IWDG.Mode=IWDG_Activate @@ -336,4 +418,12 @@ VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Signal=SYS_VS_Systick +VP_TIM11_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM11_VS_ClockSourceINT.Signal=TIM11_VS_ClockSourceINT +VP_TIM13_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM13_VS_ClockSourceINT.Signal=TIM13_VS_ClockSourceINT +VP_TIM14_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM14_VS_ClockSourceINT.Signal=TIM14_VS_ClockSourceINT +VP_TIM2_VS_ClockSourceINT.Mode=Internal +VP_TIM2_VS_ClockSourceINT.Signal=TIM2_VS_ClockSourceINT board=custom diff --git a/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/Src/main.c index 04c57b6696..76ce5a89e6 100644 --- a/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/Src/main.c +++ b/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/Src/main.c @@ -70,6 +70,17 @@ IWDG_HandleTypeDef hiwdg; RTC_HandleTypeDef hrtc; +SD_HandleTypeDef hsd; + +SPI_HandleTypeDef hspi1; +SPI_HandleTypeDef hspi2; +SPI_HandleTypeDef hspi5; + +TIM_HandleTypeDef htim2; +TIM_HandleTypeDef htim11; +TIM_HandleTypeDef htim13; +TIM_HandleTypeDef htim14; + UART_HandleTypeDef huart1; SDRAM_HandleTypeDef hsdram1; @@ -88,6 +99,14 @@ static void MX_FMC_Init(void); static void MX_RTC_Init(void); static void MX_IWDG_Init(void); static void MX_ADC1_Init(void); +static void MX_TIM11_Init(void); +static void MX_TIM13_Init(void); +static void MX_TIM14_Init(void); +static void MX_SDIO_SD_Init(void); +static void MX_TIM2_Init(void); +static void MX_SPI1_Init(void); +static void MX_SPI2_Init(void); +static void MX_SPI5_Init(void); /* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ @@ -132,6 +151,14 @@ int main(void) MX_RTC_Init(); MX_IWDG_Init(); MX_ADC1_Init(); + MX_TIM11_Init(); + MX_TIM13_Init(); + MX_TIM14_Init(); + MX_SDIO_SD_Init(); + MX_TIM2_Init(); + MX_SPI1_Init(); + MX_SPI2_Init(); + MX_SPI5_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ @@ -165,15 +192,17 @@ void SystemClock_Config(void) __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /**Initializes the CPU, AHB and APB busses clocks */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE + |RCC_OSCILLATORTYPE_LSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; RCC_OscInitStruct.LSIState = RCC_LSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 15; RCC_OscInitStruct.PLL.PLLN = 216; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = 4; + RCC_OscInitStruct.PLL.PLLQ = 8; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); @@ -198,7 +227,7 @@ void SystemClock_Config(void) Error_Handler(); } PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; - PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); @@ -362,6 +391,304 @@ static void MX_RTC_Init(void) } +/** + * @brief SDIO Initialization Function + * @param None + * @retval None + */ +static void MX_SDIO_SD_Init(void) +{ + + /* USER CODE BEGIN SDIO_Init 0 */ + + /* USER CODE END SDIO_Init 0 */ + + /* USER CODE BEGIN SDIO_Init 1 */ + + /* USER CODE END SDIO_Init 1 */ + hsd.Instance = SDIO; + hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; + hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; + hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; + hsd.Init.BusWide = SDIO_BUS_WIDE_1B; + hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; + hsd.Init.ClockDiv = 0; + if (HAL_SD_Init(&hsd) != HAL_OK) + { + Error_Handler(); + } + if (HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SDIO_Init 2 */ + + /* USER CODE END SDIO_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_8BIT; + 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 = 10; + 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_8BIT; + 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 = 10; + if (HAL_SPI_Init(&hspi2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI2_Init 2 */ + + /* USER CODE END SPI2_Init 2 */ + +} + +/** + * @brief SPI5 Initialization Function + * @param None + * @retval None + */ +static void MX_SPI5_Init(void) +{ + + /* USER CODE BEGIN SPI5_Init 0 */ + + /* USER CODE END SPI5_Init 0 */ + + /* USER CODE BEGIN SPI5_Init 1 */ + + /* USER CODE END SPI5_Init 1 */ + /* SPI5 parameter configuration*/ + hspi5.Instance = SPI5; + hspi5.Init.Mode = SPI_MODE_MASTER; + hspi5.Init.Direction = SPI_DIRECTION_2LINES; + hspi5.Init.DataSize = SPI_DATASIZE_8BIT; + hspi5.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi5.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi5.Init.NSS = SPI_NSS_SOFT; + hspi5.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi5.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi5.Init.TIMode = SPI_TIMODE_DISABLE; + hspi5.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi5.Init.CRCPolynomial = 10; + if (HAL_SPI_Init(&hspi5) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI5_Init 2 */ + + /* USER CODE END SPI5_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}; + TIM_OC_InitTypeDef sConfigOC = {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; + 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(); + } + if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM2_Init 2 */ + + /* USER CODE END TIM2_Init 2 */ + HAL_TIM_MspPostInit(&htim2); + +} + +/** + * @brief TIM11 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM11_Init(void) +{ + + /* USER CODE BEGIN TIM11_Init 0 */ + + /* USER CODE END TIM11_Init 0 */ + + /* USER CODE BEGIN TIM11_Init 1 */ + + /* USER CODE END TIM11_Init 1 */ + htim11.Instance = TIM11; + htim11.Init.Prescaler = 0; + htim11.Init.CounterMode = TIM_COUNTERMODE_UP; + htim11.Init.Period = 0; + htim11.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + if (HAL_TIM_Base_Init(&htim11) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM11_Init 2 */ + + /* USER CODE END TIM11_Init 2 */ + +} + +/** + * @brief TIM13 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM13_Init(void) +{ + + /* USER CODE BEGIN TIM13_Init 0 */ + + /* USER CODE END TIM13_Init 0 */ + + /* USER CODE BEGIN TIM13_Init 1 */ + + /* USER CODE END TIM13_Init 1 */ + htim13.Instance = TIM13; + htim13.Init.Prescaler = 0; + htim13.Init.CounterMode = TIM_COUNTERMODE_UP; + htim13.Init.Period = 0; + htim13.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + if (HAL_TIM_Base_Init(&htim13) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM13_Init 2 */ + + /* USER CODE END TIM13_Init 2 */ + +} + +/** + * @brief TIM14 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM14_Init(void) +{ + + /* USER CODE BEGIN TIM14_Init 0 */ + + /* USER CODE END TIM14_Init 0 */ + + /* USER CODE BEGIN TIM14_Init 1 */ + + /* USER CODE END TIM14_Init 1 */ + htim14.Instance = TIM14; + htim14.Init.Prescaler = 0; + htim14.Init.CounterMode = TIM_COUNTERMODE_UP; + htim14.Init.Period = 0; + htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + if (HAL_TIM_Base_Init(&htim14) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM14_Init 2 */ + + /* USER CODE END TIM14_Init 2 */ + +} + /** * @brief USART1 Initialization Function * @param None diff --git a/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c b/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c index be70559b9c..5d3dcf0a51 100644 --- a/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c +++ b/bsp/stm32/stm32f429-atk-apollo/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c @@ -78,7 +78,9 @@ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ -/** + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + /** * Initializes the Global MSP. */ void HAL_MspInit(void) @@ -320,6 +322,402 @@ void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc) } +/** +* @brief SD MSP Initialization +* This function configures the hardware resources used in this example +* @param hsd: SD handle pointer +* @retval None +*/ +void HAL_SD_MspInit(SD_HandleTypeDef* hsd) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hsd->Instance==SDIO) + { + /* USER CODE BEGIN SDIO_MspInit 0 */ + + /* USER CODE END SDIO_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SDIO_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + /**SDIO GPIO Configuration + PC8 ------> SDIO_D0 + PC9 ------> SDIO_D1 + PC10 ------> SDIO_D2 + PC11 ------> SDIO_D3 + PC12 ------> SDIO_CK + PD2 ------> SDIO_CMD + */ + GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /* USER CODE BEGIN SDIO_MspInit 1 */ + + /* USER CODE END SDIO_MspInit 1 */ + } + +} + +/** +* @brief SD MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hsd: SD handle pointer +* @retval None +*/ + +void HAL_SD_MspDeInit(SD_HandleTypeDef* hsd) +{ + + if(hsd->Instance==SDIO) + { + /* USER CODE BEGIN SDIO_MspDeInit 0 */ + + /* USER CODE END SDIO_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SDIO_CLK_DISABLE(); + + /**SDIO GPIO Configuration + PC8 ------> SDIO_D0 + PC9 ------> SDIO_D1 + PC10 ------> SDIO_D2 + PC11 ------> SDIO_D3 + PC12 ------> SDIO_CK + PD2 ------> SDIO_CMD + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12); + + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2); + + /* USER CODE BEGIN SDIO_MspDeInit 1 */ + + /* USER CODE END SDIO_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_GPIOB_CLK_ENABLE(); + /**SPI1 GPIO Configuration + PA6 ------> SPI1_MISO + PB3 ------> SPI1_SCK + PB5 ------> SPI1_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + HAL_GPIO_Init(GPIOB, &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_GPIOB_CLK_ENABLE(); + /**SPI2 GPIO Configuration + PB10 ------> SPI2_SCK + PB14 ------> SPI2_MISO + PB15 ------> SPI2_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_14|GPIO_PIN_15; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI2_MspInit 1 */ + + /* USER CODE END SPI2_MspInit 1 */ + } + else if(hspi->Instance==SPI5) + { + /* USER CODE BEGIN SPI5_MspInit 0 */ + + /* USER CODE END SPI5_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SPI5_CLK_ENABLE(); + + __HAL_RCC_GPIOF_CLK_ENABLE(); + /**SPI5 GPIO Configuration + PF7 ------> SPI5_SCK + PF8 ------> SPI5_MISO + PF9 ------> SPI5_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI5; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI5_MspInit 1 */ + + /* USER CODE END SPI5_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 + PB3 ------> SPI1_SCK + PB5 ------> SPI1_MOSI + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_6); + + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_3|GPIO_PIN_5); + + /* 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 + PB10 ------> SPI2_SCK + PB14 ------> SPI2_MISO + PB15 ------> SPI2_MOSI + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10|GPIO_PIN_14|GPIO_PIN_15); + + /* USER CODE BEGIN SPI2_MspDeInit 1 */ + + /* USER CODE END SPI2_MspDeInit 1 */ + } + else if(hspi->Instance==SPI5) + { + /* USER CODE BEGIN SPI5_MspDeInit 0 */ + + /* USER CODE END SPI5_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI5_CLK_DISABLE(); + + /**SPI5 GPIO Configuration + PF7 ------> SPI5_SCK + PF8 ------> SPI5_MISO + PF9 ------> SPI5_MOSI + */ + HAL_GPIO_DeInit(GPIOF, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9); + + /* USER CODE BEGIN SPI5_MspDeInit 1 */ + + /* USER CODE END SPI5_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==TIM11) + { + /* USER CODE BEGIN TIM11_MspInit 0 */ + + /* USER CODE END TIM11_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM11_CLK_ENABLE(); + /* USER CODE BEGIN TIM11_MspInit 1 */ + + /* USER CODE END TIM11_MspInit 1 */ + } + else if(htim_base->Instance==TIM13) + { + /* USER CODE BEGIN TIM13_MspInit 0 */ + + /* USER CODE END TIM13_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM13_CLK_ENABLE(); + /* USER CODE BEGIN TIM13_MspInit 1 */ + + /* USER CODE END TIM13_MspInit 1 */ + } + else if(htim_base->Instance==TIM14) + { + /* USER CODE BEGIN TIM14_MspInit 0 */ + + /* USER CODE END TIM14_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM14_CLK_ENABLE(); + /* USER CODE BEGIN TIM14_MspInit 1 */ + + /* USER CODE END TIM14_MspInit 1 */ + } + +} + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(htim->Instance==TIM2) + { + /* USER CODE BEGIN TIM2_MspPostInit 0 */ + + /* USER CODE END TIM2_MspPostInit 0 */ + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**TIM2 GPIO Configuration + PA3 ------> TIM2_CH4 + */ + GPIO_InitStruct.Pin = 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_TIM2; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM2_MspPostInit 1 */ + + /* USER CODE END TIM2_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==TIM11) + { + /* USER CODE BEGIN TIM11_MspDeInit 0 */ + + /* USER CODE END TIM11_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM11_CLK_DISABLE(); + /* USER CODE BEGIN TIM11_MspDeInit 1 */ + + /* USER CODE END TIM11_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM13) + { + /* USER CODE BEGIN TIM13_MspDeInit 0 */ + + /* USER CODE END TIM13_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM13_CLK_DISABLE(); + /* USER CODE BEGIN TIM13_MspDeInit 1 */ + + /* USER CODE END TIM13_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM14) + { + /* USER CODE BEGIN TIM14_MspDeInit 0 */ + + /* USER CODE END TIM14_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM14_CLK_DISABLE(); + /* USER CODE BEGIN TIM14_MspDeInit 1 */ + + /* USER CODE END TIM14_MspDeInit 1 */ + } + +} + /** * @brief UART MSP Initialization * This function configures the hardware resources used in this example diff --git a/bsp/stm32/stm32f429-atk-apollo/board/Kconfig b/bsp/stm32/stm32f429-atk-apollo/board/Kconfig index 161ccf19a9..9d85754053 100644 --- a/bsp/stm32/stm32f429-atk-apollo/board/Kconfig +++ b/bsp/stm32/stm32f429-atk-apollo/board/Kconfig @@ -16,7 +16,7 @@ menu "Onboard Peripheral Drivers" bool "Enable COM2 (uart2 pin conflict with Ethernet)" select BSP_USING_UART2 default n - + config BSP_USING_COM3 bool "Enable COM3 (uart3)" select BSP_USING_UART3 @@ -32,7 +32,7 @@ menu "Onboard Peripheral Drivers" select RT_USING_SFUD select RT_SFUD_USING_SFDP default n - + config BSP_USING_MPU9250 bool "Enable MPU 9250 (i2c1)" select BSP_USING_I2C1 @@ -50,7 +50,14 @@ menu "Onboard Peripheral Drivers" hex default 0x00 endif - + + config BSP_USING_SDCARD + bool "Enable SDCARD (sdio)" + select BSP_USING_SDIO + select RT_USING_DFS + select RT_USING_DFS_ELMFAT + default n + endmenu menu "On-chip Peripheral Drivers" @@ -120,6 +127,39 @@ menu "On-chip Peripheral Drivers" default 117 endif + menuconfig BSP_USING_TIM + bool "Enable timer" + default n + select RT_USING_HWTIMER + if BSP_USING_TIM + config BSP_USING_TIM11 + bool "Enable TIM11" + default n + + config BSP_USING_TIM13 + bool "Enable TIM13" + default n + + config BSP_USING_TIM14 + bool "Enable TIM14" + default n + endif + + menuconfig BSP_USING_PWM + bool "Enable pwm" + default n + select RT_USING_PWM + if BSP_USING_PWM + menuconfig BSP_USING_PWM2 + bool "Enable timer2 output pwm" + default n + if BSP_USING_PWM2 + config BSP_USING_PWM2_CH4 + bool "Enable PWM2 channel4" + default n + endif + endif + menuconfig BSP_USING_ADC bool "Enable ADC" default n @@ -149,6 +189,12 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n + config BSP_USING_SDIO + bool "Enable SDIO" + select RT_USING_SDIO + select RT_USING_DFS + default n + endmenu menu "Board extended module Drivers" diff --git a/bsp/stm32/stm32f429-atk-apollo/board/SConscript b/bsp/stm32/stm32f429-atk-apollo/board/SConscript index e67a62e1e8..bfe1107e3f 100644 --- a/bsp/stm32/stm32f429-atk-apollo/board/SConscript +++ b/bsp/stm32/stm32f429-atk-apollo/board/SConscript @@ -18,6 +18,9 @@ if GetDepend(['BSP_USING_ETH']): if GetDepend(['BSP_USING_SPI_FLASH']): src += Glob('ports/spi_flash_init.c') +if GetDepend(['BSP_USING_SDCARD']): + src += Glob('ports/sdcard_port.c') + path = [cwd] path += [cwd + '/CubeMX_Config/Inc'] path += [cwd + '/ports'] diff --git a/bsp/stm32/stm32f429-atk-apollo/board/board.c b/bsp/stm32/stm32f429-atk-apollo/board/board.c index 030926aa8e..91cde7a95d 100644 --- a/bsp/stm32/stm32f429-atk-apollo/board/board.c +++ b/bsp/stm32/stm32f429-atk-apollo/board/board.c @@ -14,54 +14,56 @@ */ void SystemClock_Config(void) { + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; - RCC_OscInitTypeDef RCC_OscInitStruct; - RCC_ClkInitTypeDef RCC_ClkInitStruct; - RCC_PeriphCLKInitTypeDef PeriphClkInitStruct; - + /**Configure the main internal regulator output voltage + */ __HAL_RCC_PWR_CLK_ENABLE(); - __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); - - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE + |RCC_OSCILLATORTYPE_LSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; - RCC_OscInitStruct.PLL.PLLM = 25; - RCC_OscInitStruct.PLL.PLLN = 360; + RCC_OscInitStruct.PLL.PLLM = 15; + RCC_OscInitStruct.PLL.PLLN = 216; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 8; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } - + /**Activate the Over-Drive mode + */ + if (HAL_PWREx_EnableOverDrive() != HAL_OK) + { + Error_Handler(); + } + /**Initializes the CPU, AHB and APB busses clocks + */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) { Error_Handler(); } - - PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; - PeriphClkInitStruct.PLLSAI.PLLSAIN = 260; - PeriphClkInitStruct.PLLSAI.PLLSAIR = 2; - PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_2; + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) { Error_Handler(); } - - HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/RT_TICK_PER_SECOND); - - HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); - - /* SysTick_IRQn interrupt configuration */ - HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); } /** Pinout Configuration diff --git a/bsp/stm32/stm32f429-atk-apollo/rtconfig.h b/bsp/stm32/stm32f429-atk-apollo/rtconfig.h index d236ab8d53..f3f451258a 100644 --- a/bsp/stm32/stm32f429-atk-apollo/rtconfig.h +++ b/bsp/stm32/stm32f429-atk-apollo/rtconfig.h @@ -39,6 +39,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_VER_NUM 0x40000 #define ARCH_ARM #define ARCH_ARM_CORTEX_M #define ARCH_ARM_CORTEX_M4 @@ -76,6 +77,7 @@ #define RT_USING_DEVICE_IPC #define RT_PIPE_BUFSZ 512 #define RT_USING_SERIAL +#define RT_SERIAL_USING_DMA #define RT_USING_PIN /* Using WiFi */ @@ -147,19 +149,8 @@ /* miscellaneous packages */ -/* sample package */ - /* samples: kernel and components samples */ - -/* example package: hello */ - - -/* Privated Packages of RealThread */ - - -/* Network Utilities */ - #define SOC_FAMILY_STM32 #define SOC_SERIES_STM32F4 diff --git a/bsp/stm32/stm32f429-fire-challenger/.config b/bsp/stm32/stm32f429-fire-challenger/.config index 8bab59ba52..5165730ff4 100644 --- a/bsp/stm32/stm32f429-fire-challenger/.config +++ b/bsp/stm32/stm32f429-fire-challenger/.config @@ -62,6 +62,7 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +CONFIG_RT_VER_NUM=0x40000 CONFIG_ARCH_ARM=y CONFIG_ARCH_ARM_CORTEX_M=y CONFIG_ARCH_ARM_CORTEX_M4=y @@ -110,6 +111,7 @@ CONFIG_FINSH_ARG_MAX=10 CONFIG_RT_USING_DEVICE_IPC=y CONFIG_RT_PIPE_BUFSZ=512 CONFIG_RT_USING_SERIAL=y +CONFIG_RT_SERIAL_USING_DMA=y # CONFIG_RT_USING_CAN is not set # CONFIG_RT_USING_HWTIMER is not set # CONFIG_RT_USING_CPUTIME is not set @@ -179,12 +181,14 @@ CONFIG_RT_USING_PIN=y # 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 @@ -278,6 +282,7 @@ CONFIG_RT_USING_PIN=y # 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 @@ -292,6 +297,7 @@ CONFIG_RT_USING_PIN=y # 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 @@ -307,10 +313,6 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set -# -# sample package -# - # # samples: kernel and components samples # @@ -318,30 +320,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set # CONFIG_PKG_USING_NETWORK_SAMPLES is not set # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set - -# -# example package: hello -# # CONFIG_PKG_USING_HELLO is not set - -# -# Privated Packages of RealThread -# -# CONFIG_PKG_USING_CODEC is not set -# CONFIG_PKG_USING_PLAYER is not set -# CONFIG_PKG_USING_PERSIMMON_SRC is not set - -# -# Network Utilities -# -# CONFIG_PKG_USING_WICED is not set -# CONFIG_PKG_USING_CLOUDSDK is not set -# CONFIG_PKG_USING_COREMARK is not set -# CONFIG_PKG_USING_POWER_MANAGER is not set -# CONFIG_PKG_USING_RT_OTA is not set -# CONFIG_PKG_USING_RDBD_SRC is not set -# CONFIG_PKG_USING_RTINSIGHT is not set -# CONFIG_PKG_USING_SMARTCONFIG is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F4=y @@ -359,6 +338,8 @@ CONFIG_BSP_USING_USB_TO_USART=y # CONFIG_BSP_USING_SPI_FLASH is not set # CONFIG_BSP_USING_MPU6050 is not set # CONFIG_BSP_USING_ETH is not set +# CONFIG_BSP_USING_POT is not set +# CONFIG_BSP_USING_SDCARD is not set # # On-chip Peripheral Drivers @@ -368,11 +349,17 @@ CONFIG_BSP_USING_UART1=y # CONFIG_BSP_USING_UART2 is not set # CONFIG_BSP_USING_UART3 is not set # CONFIG_BSP_UART_USING_DMA_RX is not set +# CONFIG_BSP_USING_ON_CHIP_FLASH is not set # CONFIG_BSP_USING_SPI1 is not set # CONFIG_BSP_USING_SPI2 is not set # CONFIG_BSP_USING_SPI5 is not set # CONFIG_BSP_SPI_USING_DMA is not set +# CONFIG_BSP_USING_TIM is not set +# CONFIG_BSP_USING_ADC is not set # CONFIG_BSP_USING_I2C1 is not set +# CONFIG_BSP_USING_ONCHIP_RTC is not set +# CONFIG_BSP_USING_WDT is not set +# CONFIG_BSP_USING_SDIO is not set # # Board extended module Drivers diff --git a/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/.mxproject index ed2f57d7ca..9bddc2835f 100644 --- a/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/.mxproject +++ b/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/.mxproject @@ -1,13 +1,13 @@ [PreviousGenFiles] -HeaderPath=E:/workspace/BspFramework/rt-thread/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Inc +HeaderPath=D:/BspFramework/rt-thread/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Inc HeaderFiles=stm32f4xx_it.h;stm32f4xx_hal_conf.h;main.h; -SourcePath=E:/workspace/BspFramework/rt-thread/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Src +SourcePath=D:/BspFramework/rt-thread/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Src SourceFiles=stm32f4xx_it.c;stm32f4xx_hal_msp.c;main.c; [PreviousLibFiles] -LibFiles=Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_eth.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fmc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sdram.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_iwdg.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_eth.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fmc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sdram.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_iwdg.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f429xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;Drivers/CMSIS/Include/arm_common_tables.h;Drivers/CMSIS/Include/arm_const_structs.h;Drivers/CMSIS/Include/arm_math.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armcc_V6.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_cmFunc.h;Drivers/CMSIS/Include/core_cmInstr.h;Drivers/CMSIS/Include/core_cmSimd.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h; +LibFiles=Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_eth.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fmc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sdram.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_iwdg.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_sdmmc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sd.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_adc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_eth.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_fmc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sdram.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_iwdg.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rtc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_ll_sdmmc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_sd.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_spi.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_tim_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_uart.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_rcc_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_flash_ramfunc.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_gpio_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_dma.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_pwr_ex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_cortex.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal.h;Drivers/STM32F4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32F4xx_HAL_Driver/Inc/stm32f4xx_hal_def.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f429xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Include/system_stm32f4xx.h;Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;Drivers/CMSIS/Include/arm_common_tables.h;Drivers/CMSIS/Include/arm_const_structs.h;Drivers/CMSIS/Include/arm_math.h;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armcc_V6.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_cmFunc.h;Drivers/CMSIS/Include/core_cmInstr.h;Drivers/CMSIS/Include/core_cmSimd.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h; [PreviousUsedKeilFiles] -SourceFiles=..\Src\main.c;..\Src\stm32f4xx_it.c;..\Src\stm32f4xx_hal_msp.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;../\Src/system_stm32f4xx.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;../\Src/system_stm32f4xx.c;../Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;E:/workspace/BspFramework/rt-thread/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config//MDK-ARM/startup_stm32f429xx.s; +SourceFiles=..\Src\main.c;..\Src\stm32f4xx_it.c;..\Src\stm32f4xx_hal_msp.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;../\Src/system_stm32f4xx.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c;../Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c;../\Src/system_stm32f4xx.c;../Drivers/CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c;null; HeaderPath=..\Drivers\STM32F4xx_HAL_Driver\Inc;..\Drivers\STM32F4xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32F4xx\Include;..\Drivers\CMSIS\Include;..\Inc; diff --git a/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/CubeMX_Config.ioc b/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/CubeMX_Config.ioc index 9e40ddce40..0757e09ae6 100644 --- a/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/CubeMX_Config.ioc +++ b/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/CubeMX_Config.ioc @@ -12,15 +12,20 @@ KeepUserPlacement=false Mcu.Family=STM32F4 Mcu.IP0=ADC1 Mcu.IP1=ETH +Mcu.IP10=TIM5 +Mcu.IP11=TIM11 +Mcu.IP12=TIM13 +Mcu.IP13=TIM14 +Mcu.IP14=USART1 Mcu.IP2=FMC Mcu.IP3=IWDG Mcu.IP4=NVIC Mcu.IP5=RCC Mcu.IP6=RTC -Mcu.IP7=SPI5 -Mcu.IP8=SYS -Mcu.IP9=USART1 -Mcu.IPNb=10 +Mcu.IP7=SDIO +Mcu.IP8=SPI5 +Mcu.IP9=SYS +Mcu.IPNb=15 Mcu.Name=STM32F429I(E-G)Tx Mcu.Package=LQFP176 Mcu.Pin0=PC14/OSC32_IN @@ -58,34 +63,47 @@ Mcu.Pin37=PB11 Mcu.Pin38=PH6 Mcu.Pin39=PH7 Mcu.Pin4=PF2 -Mcu.Pin40=PD8 -Mcu.Pin41=PD9 -Mcu.Pin42=PD10 -Mcu.Pin43=PD14 -Mcu.Pin44=PD15 -Mcu.Pin45=PG4 -Mcu.Pin46=PG5 -Mcu.Pin47=PG8 -Mcu.Pin48=PA9 -Mcu.Pin49=PA10 +Mcu.Pin40=PH10 +Mcu.Pin41=PH11 +Mcu.Pin42=PH12 +Mcu.Pin43=PD8 +Mcu.Pin44=PD9 +Mcu.Pin45=PD10 +Mcu.Pin46=PD14 +Mcu.Pin47=PD15 +Mcu.Pin48=PG4 +Mcu.Pin49=PG5 Mcu.Pin5=PF3 -Mcu.Pin50=PA13 -Mcu.Pin51=PA14 -Mcu.Pin52=PD0 -Mcu.Pin53=PD1 -Mcu.Pin54=PG13 -Mcu.Pin55=PG14 -Mcu.Pin56=PG15 -Mcu.Pin57=PE0 -Mcu.Pin58=PE1 -Mcu.Pin59=VP_IWDG_VS_IWDG +Mcu.Pin50=PG8 +Mcu.Pin51=PC8 +Mcu.Pin52=PC9 +Mcu.Pin53=PA9 +Mcu.Pin54=PA10 +Mcu.Pin55=PA13 +Mcu.Pin56=PA14 +Mcu.Pin57=PC10 +Mcu.Pin58=PC11 +Mcu.Pin59=PC12 Mcu.Pin6=PF4 -Mcu.Pin60=VP_RTC_VS_RTC_Activate -Mcu.Pin61=VP_SYS_VS_Systick +Mcu.Pin60=PD0 +Mcu.Pin61=PD1 +Mcu.Pin62=PD2 +Mcu.Pin63=PG13 +Mcu.Pin64=PG14 +Mcu.Pin65=PG15 +Mcu.Pin66=PE0 +Mcu.Pin67=PE1 +Mcu.Pin68=VP_IWDG_VS_IWDG +Mcu.Pin69=VP_RTC_VS_RTC_Activate Mcu.Pin7=PF5 +Mcu.Pin70=VP_SYS_VS_Systick +Mcu.Pin71=VP_TIM5_VS_ClockSourceINT +Mcu.Pin72=VP_TIM11_VS_ClockSourceINT +Mcu.Pin73=VP_TIM13_VS_ClockSourceINT +Mcu.Pin74=VP_TIM14_VS_ClockSourceINT Mcu.Pin8=PF7 Mcu.Pin9=PF8 -Mcu.PinsNb=62 +Mcu.PinsNb=75 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F429IGTx @@ -121,6 +139,12 @@ PB11.Signal=ETH_TX_EN PC0.Signal=FMC_SDNWE PC1.Mode=RMII PC1.Signal=ETH_MDC +PC10.Mode=SD_4_bits_Wide_bus +PC10.Signal=SDIO_D2 +PC11.Mode=SD_4_bits_Wide_bus +PC11.Signal=SDIO_D3 +PC12.Mode=SD_4_bits_Wide_bus +PC12.Signal=SDIO_CK PC14/OSC32_IN.Mode=LSE-External-Oscillator PC14/OSC32_IN.Signal=RCC_OSC32_IN PC15/OSC32_OUT.Mode=LSE-External-Oscillator @@ -131,6 +155,10 @@ PC4.Mode=RMII PC4.Signal=ETH_RXD0 PC5.Mode=RMII PC5.Signal=ETH_RXD1 +PC8.Mode=SD_4_bits_Wide_bus +PC8.Signal=SDIO_D0 +PC9.Mode=SD_4_bits_Wide_bus +PC9.Signal=SDIO_D1 PCC.Checker=false PCC.Line=STM32F429/439 PCC.MCU=STM32F429I(E-G)Tx @@ -144,6 +172,8 @@ PD1.Signal=FMC_D3_DA3 PD10.Signal=FMC_D15_DA15 PD14.Signal=FMC_D0_DA0 PD15.Signal=FMC_D1_DA1 +PD2.Mode=SD_4_bits_Wide_bus +PD2.Signal=SDIO_CMD PD8.Signal=FMC_D13_DA13 PD9.Signal=FMC_D14_DA14 PE0.Signal=FMC_NBL0 @@ -192,6 +222,10 @@ PH0/OSC_IN.Mode=HSE-External-Oscillator PH0/OSC_IN.Signal=RCC_OSC_IN PH1/OSC_OUT.Mode=HSE-External-Oscillator PH1/OSC_OUT.Signal=RCC_OSC_OUT +PH10.Locked=true +PH10.Signal=S_TIM5_CH1 +PH11.Signal=S_TIM5_CH2 +PH12.Signal=S_TIM5_CH3 PH6.Mode=SdramChipSelect2_1 PH6.Signal=FMC_SDNE1 PH7.Mode=SdramChipSelect2_1 @@ -223,8 +257,8 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=MDK-ARM V5 ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_ETH_Init-ETH-false-HAL-true,5-MX_SPI5_Init-SPI5-false-HAL-true,6-MX_FMC_Init-FMC-false-HAL-true,7-MX_ADC1_Init-ADC1-false-HAL-true,8-MX_RTC_Init-RTC-false-HAL-true,9-MX_IWDG_Init-IWDG-false-HAL-true -RCC.48MHZClocksFreq_Value=90000000 +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_ETH_Init-ETH-false-HAL-true,5-MX_SPI5_Init-SPI5-false-HAL-true,6-MX_FMC_Init-FMC-false-HAL-true,7-MX_ADC1_Init-ADC1-false-HAL-true,8-MX_RTC_Init-RTC-false-HAL-true,9-MX_IWDG_Init-IWDG-false-HAL-true,10-MX_TIM14_Init-TIM14-false-HAL-true,11-MX_TIM13_Init-TIM13-false-HAL-true,12-MX_TIM11_Init-TIM11-false-HAL-true,13-MX_SDIO_SD_Init-SDIO-false-HAL-true,14-MX_TIM5_Init-TIM5-false-HAL-true +RCC.48MHZClocksFreq_Value=45000000 RCC.AHBFreq_Value=180000000 RCC.APB1CLKDivider=RCC_HCLK_DIV4 RCC.APB1Freq_Value=45000000 @@ -240,16 +274,18 @@ RCC.HCLKFreq_Value=180000000 RCC.HSE_VALUE=25000000 RCC.HSI_VALUE=16000000 RCC.I2SClocksFreq_Value=160000000 -RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LCDTFTFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQCLKFreq_Value,PLLSourceVirtual,RCC_RTC_Clock_Source,RTCFreq_Value,RTCHSEDivFreq_Value,SAI_AClocksFreq_Value,SAI_BClocksFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAIOutputFreq_Value,VCOSAIOutputFreq_ValueQ,VCOSAIOutputFreq_ValueR,VcooutputI2S,VcooutputI2SQ +RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2CLKDivider,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LCDTFTFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQ,PLLQCLKFreq_Value,PLLSourceVirtual,RCC_RTC_Clock_Source,RCC_RTC_Clock_SourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SAI_AClocksFreq_Value,SAI_BClocksFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAIOutputFreq_Value,VCOSAIOutputFreq_ValueQ,VCOSAIOutputFreq_ValueR,VcooutputI2S,VcooutputI2SQ RCC.LCDTFTFreq_Value=20416666.666666668 RCC.LSI_VALUE=32000 RCC.MCO2PinFreq_Value=180000000 RCC.PLLCLKFreq_Value=180000000 RCC.PLLM=15 RCC.PLLN=216 -RCC.PLLQCLKFreq_Value=90000000 +RCC.PLLQ=8 +RCC.PLLQCLKFreq_Value=45000000 RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE RCC.RCC_RTC_Clock_Source=RCC_RTCCLKSOURCE_LSE +RCC.RCC_RTC_Clock_SourceVirtual=RCC_RTCCLKSOURCE_LSE RCC.RTCFreq_Value=32768 RCC.RTCHSEDivFreq_Value=12500000 RCC.SAI_AClocksFreq_Value=20416666.666666668 @@ -338,11 +374,21 @@ SH.FMC_SDNRAS.0=FMC_SDNRAS,12b-sda1 SH.FMC_SDNRAS.ConfNb=1 SH.FMC_SDNWE.0=FMC_SDNWE,12b-sda1 SH.FMC_SDNWE.ConfNb=1 +SH.S_TIM5_CH1.0=TIM5_CH1,PWM Generation1 CH1 +SH.S_TIM5_CH1.ConfNb=1 +SH.S_TIM5_CH2.0=TIM5_CH2,PWM Generation2 CH2 +SH.S_TIM5_CH2.ConfNb=1 +SH.S_TIM5_CH3.0=TIM5_CH3,PWM Generation3 CH3 +SH.S_TIM5_CH3.ConfNb=1 SPI5.CalculateBaudRate=45.0 MBits/s SPI5.Direction=SPI_DIRECTION_2LINES SPI5.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate SPI5.Mode=SPI_MODE_MASTER SPI5.VirtualType=VM_MASTER +TIM5.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 +TIM5.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 +TIM5.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 +TIM5.IPParameters=Channel-PWM Generation1 CH1,Channel-PWM Generation2 CH2,Channel-PWM Generation3 CH3 USART1.IPParameters=VirtualMode USART1.VirtualMode=VM_ASYNC VP_IWDG_VS_IWDG.Mode=IWDG_Activate @@ -351,4 +397,12 @@ VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Signal=SYS_VS_Systick +VP_TIM11_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM11_VS_ClockSourceINT.Signal=TIM11_VS_ClockSourceINT +VP_TIM13_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM13_VS_ClockSourceINT.Signal=TIM13_VS_ClockSourceINT +VP_TIM14_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM14_VS_ClockSourceINT.Signal=TIM14_VS_ClockSourceINT +VP_TIM5_VS_ClockSourceINT.Mode=Internal +VP_TIM5_VS_ClockSourceINT.Signal=TIM5_VS_ClockSourceINT board=custom diff --git a/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Inc/main.h index 9d41187606..f1494d6236 100644 --- a/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Inc/main.h +++ b/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Inc/main.h @@ -70,6 +70,8 @@ extern "C" { /* USER CODE END EM */ +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + /* Exported functions prototypes ---------------------------------------------*/ void Error_Handler(void); diff --git a/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h b/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h index 884f137629..eb06eacdbb 100644 --- a/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h +++ b/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h @@ -71,10 +71,10 @@ /* #define HAL_RNG_MODULE_ENABLED */ #define HAL_RTC_MODULE_ENABLED /* #define HAL_SAI_MODULE_ENABLED */ -/* #define HAL_SD_MODULE_ENABLED */ +#define HAL_SD_MODULE_ENABLED /* #define HAL_MMC_MODULE_ENABLED */ #define HAL_SPI_MODULE_ENABLED -/* #define HAL_TIM_MODULE_ENABLED */ +#define HAL_TIM_MODULE_ENABLED #define HAL_UART_MODULE_ENABLED /* #define HAL_USART_MODULE_ENABLED */ /* #define HAL_IRDA_MODULE_ENABLED */ diff --git a/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Src/main.c index f458d370ad..fc5ca269ae 100644 --- a/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Src/main.c +++ b/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Src/main.c @@ -70,8 +70,15 @@ IWDG_HandleTypeDef hiwdg; RTC_HandleTypeDef hrtc; +SD_HandleTypeDef hsd; + SPI_HandleTypeDef hspi5; +TIM_HandleTypeDef htim5; +TIM_HandleTypeDef htim11; +TIM_HandleTypeDef htim13; +TIM_HandleTypeDef htim14; + UART_HandleTypeDef huart1; SDRAM_HandleTypeDef hsdram1; @@ -90,6 +97,11 @@ static void MX_FMC_Init(void); static void MX_ADC1_Init(void); static void MX_RTC_Init(void); static void MX_IWDG_Init(void); +static void MX_TIM14_Init(void); +static void MX_TIM13_Init(void); +static void MX_TIM11_Init(void); +static void MX_SDIO_SD_Init(void); +static void MX_TIM5_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ @@ -134,6 +146,11 @@ int main(void) MX_ADC1_Init(); MX_RTC_Init(); MX_IWDG_Init(); + MX_TIM14_Init(); + MX_TIM13_Init(); + MX_TIM11_Init(); + MX_SDIO_SD_Init(); + MX_TIM5_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ @@ -175,7 +192,7 @@ void SystemClock_Config(void) RCC_OscInitStruct.PLL.PLLM = 15; RCC_OscInitStruct.PLL.PLLN = 216; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = 4; + RCC_OscInitStruct.PLL.PLLQ = 8; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); @@ -364,6 +381,42 @@ static void MX_RTC_Init(void) } +/** + * @brief SDIO Initialization Function + * @param None + * @retval None + */ +static void MX_SDIO_SD_Init(void) +{ + + /* USER CODE BEGIN SDIO_Init 0 */ + + /* USER CODE END SDIO_Init 0 */ + + /* USER CODE BEGIN SDIO_Init 1 */ + + /* USER CODE END SDIO_Init 1 */ + hsd.Instance = SDIO; + hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; + hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; + hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; + hsd.Init.BusWide = SDIO_BUS_WIDE_1B; + hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; + hsd.Init.ClockDiv = 0; + if (HAL_SD_Init(&hsd) != HAL_OK) + { + Error_Handler(); + } + if (HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SDIO_Init 2 */ + + /* USER CODE END SDIO_Init 2 */ + +} + /** * @brief SPI5 Initialization Function * @param None @@ -402,6 +455,162 @@ static void MX_SPI5_Init(void) } +/** + * @brief TIM5 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM5_Init(void) +{ + + /* USER CODE BEGIN TIM5_Init 0 */ + + /* USER CODE END TIM5_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + TIM_OC_InitTypeDef sConfigOC = {0}; + + /* USER CODE BEGIN TIM5_Init 1 */ + + /* USER CODE END TIM5_Init 1 */ + htim5.Instance = TIM5; + htim5.Init.Prescaler = 0; + htim5.Init.CounterMode = TIM_COUNTERMODE_UP; + htim5.Init.Period = 0; + htim5.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + if (HAL_TIM_Base_Init(&htim5) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim5, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_Init(&htim5) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim5, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_ConfigChannel(&htim5, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM5_Init 2 */ + + /* USER CODE END TIM5_Init 2 */ + HAL_TIM_MspPostInit(&htim5); + +} + +/** + * @brief TIM11 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM11_Init(void) +{ + + /* USER CODE BEGIN TIM11_Init 0 */ + + /* USER CODE END TIM11_Init 0 */ + + /* USER CODE BEGIN TIM11_Init 1 */ + + /* USER CODE END TIM11_Init 1 */ + htim11.Instance = TIM11; + htim11.Init.Prescaler = 0; + htim11.Init.CounterMode = TIM_COUNTERMODE_UP; + htim11.Init.Period = 0; + htim11.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + if (HAL_TIM_Base_Init(&htim11) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM11_Init 2 */ + + /* USER CODE END TIM11_Init 2 */ + +} + +/** + * @brief TIM13 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM13_Init(void) +{ + + /* USER CODE BEGIN TIM13_Init 0 */ + + /* USER CODE END TIM13_Init 0 */ + + /* USER CODE BEGIN TIM13_Init 1 */ + + /* USER CODE END TIM13_Init 1 */ + htim13.Instance = TIM13; + htim13.Init.Prescaler = 0; + htim13.Init.CounterMode = TIM_COUNTERMODE_UP; + htim13.Init.Period = 0; + htim13.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + if (HAL_TIM_Base_Init(&htim13) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM13_Init 2 */ + + /* USER CODE END TIM13_Init 2 */ + +} + +/** + * @brief TIM14 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM14_Init(void) +{ + + /* USER CODE BEGIN TIM14_Init 0 */ + + /* USER CODE END TIM14_Init 0 */ + + /* USER CODE BEGIN TIM14_Init 1 */ + + /* USER CODE END TIM14_Init 1 */ + htim14.Instance = TIM14; + htim14.Init.Prescaler = 0; + htim14.Init.CounterMode = TIM_COUNTERMODE_UP; + htim14.Init.Period = 0; + htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + if (HAL_TIM_Base_Init(&htim14) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM14_Init 2 */ + + /* USER CODE END TIM14_Init 2 */ + +} + /** * @brief USART1 Initialization Function * @param None diff --git a/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c b/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c index 77f1396dbe..ff0bd06d02 100644 --- a/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c +++ b/bsp/stm32/stm32f429-fire-challenger/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c @@ -78,7 +78,9 @@ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ -/** + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + /** * Initializes the Global MSP. */ void HAL_MspInit(void) @@ -320,6 +322,94 @@ void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc) } +/** +* @brief SD MSP Initialization +* This function configures the hardware resources used in this example +* @param hsd: SD handle pointer +* @retval None +*/ +void HAL_SD_MspInit(SD_HandleTypeDef* hsd) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hsd->Instance==SDIO) + { + /* USER CODE BEGIN SDIO_MspInit 0 */ + + /* USER CODE END SDIO_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SDIO_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + /**SDIO GPIO Configuration + PC8 ------> SDIO_D0 + PC9 ------> SDIO_D1 + PC10 ------> SDIO_D2 + PC11 ------> SDIO_D3 + PC12 ------> SDIO_CK + PD2 ------> SDIO_CMD + */ + GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /* USER CODE BEGIN SDIO_MspInit 1 */ + + /* USER CODE END SDIO_MspInit 1 */ + } + +} + +/** +* @brief SD MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hsd: SD handle pointer +* @retval None +*/ + +void HAL_SD_MspDeInit(SD_HandleTypeDef* hsd) +{ + + if(hsd->Instance==SDIO) + { + /* USER CODE BEGIN SDIO_MspDeInit 0 */ + + /* USER CODE END SDIO_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SDIO_CLK_DISABLE(); + + /**SDIO GPIO Configuration + PC8 ------> SDIO_D0 + PC9 ------> SDIO_D1 + PC10 ------> SDIO_D2 + PC11 ------> SDIO_D3 + PC12 ------> SDIO_CK + PD2 ------> SDIO_CMD + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12); + + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2); + + /* USER CODE BEGIN SDIO_MspDeInit 1 */ + + /* USER CODE END SDIO_MspDeInit 1 */ + } + +} + /** * @brief SPI MSP Initialization * This function configures the hardware resources used in this example @@ -390,6 +480,148 @@ void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) } +/** +* @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==TIM5) + { + /* USER CODE BEGIN TIM5_MspInit 0 */ + + /* USER CODE END TIM5_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM5_CLK_ENABLE(); + /* USER CODE BEGIN TIM5_MspInit 1 */ + + /* USER CODE END TIM5_MspInit 1 */ + } + else if(htim_base->Instance==TIM11) + { + /* USER CODE BEGIN TIM11_MspInit 0 */ + + /* USER CODE END TIM11_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM11_CLK_ENABLE(); + /* USER CODE BEGIN TIM11_MspInit 1 */ + + /* USER CODE END TIM11_MspInit 1 */ + } + else if(htim_base->Instance==TIM13) + { + /* USER CODE BEGIN TIM13_MspInit 0 */ + + /* USER CODE END TIM13_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM13_CLK_ENABLE(); + /* USER CODE BEGIN TIM13_MspInit 1 */ + + /* USER CODE END TIM13_MspInit 1 */ + } + else if(htim_base->Instance==TIM14) + { + /* USER CODE BEGIN TIM14_MspInit 0 */ + + /* USER CODE END TIM14_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM14_CLK_ENABLE(); + /* USER CODE BEGIN TIM14_MspInit 1 */ + + /* USER CODE END TIM14_MspInit 1 */ + } + +} + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(htim->Instance==TIM5) + { + /* USER CODE BEGIN TIM5_MspPostInit 0 */ + + /* USER CODE END TIM5_MspPostInit 0 */ + + __HAL_RCC_GPIOH_CLK_ENABLE(); + /**TIM5 GPIO Configuration + PH10 ------> TIM5_CH1 + PH11 ------> TIM5_CH2 + PH12 ------> TIM5_CH3 + */ + GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF2_TIM5; + HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM5_MspPostInit 1 */ + + /* USER CODE END TIM5_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==TIM5) + { + /* USER CODE BEGIN TIM5_MspDeInit 0 */ + + /* USER CODE END TIM5_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM5_CLK_DISABLE(); + /* USER CODE BEGIN TIM5_MspDeInit 1 */ + + /* USER CODE END TIM5_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM11) + { + /* USER CODE BEGIN TIM11_MspDeInit 0 */ + + /* USER CODE END TIM11_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM11_CLK_DISABLE(); + /* USER CODE BEGIN TIM11_MspDeInit 1 */ + + /* USER CODE END TIM11_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM13) + { + /* USER CODE BEGIN TIM13_MspDeInit 0 */ + + /* USER CODE END TIM13_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM13_CLK_DISABLE(); + /* USER CODE BEGIN TIM13_MspDeInit 1 */ + + /* USER CODE END TIM13_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM14) + { + /* USER CODE BEGIN TIM14_MspDeInit 0 */ + + /* USER CODE END TIM14_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM14_CLK_DISABLE(); + /* USER CODE BEGIN TIM14_MspDeInit 1 */ + + /* USER CODE END TIM14_MspDeInit 1 */ + } + +} + /** * @brief UART MSP Initialization * This function configures the hardware resources used in this example diff --git a/bsp/stm32/stm32f429-fire-challenger/board/Kconfig b/bsp/stm32/stm32f429-fire-challenger/board/Kconfig index ecc175f4f5..0323f139ce 100644 --- a/bsp/stm32/stm32f429-fire-challenger/board/Kconfig +++ b/bsp/stm32/stm32f429-fire-challenger/board/Kconfig @@ -44,11 +44,29 @@ menu "Onboard Peripheral Drivers" default 0x00 endif + config BSP_USING_RGB + bool "Enable RGB LED (timer5 channel1 - 3)" + select RT_USING_PWM + select BSP_USING_PWM + select BSP_USING_PWM5 + select BSP_USING_PWM5_CH1 + select BSP_USING_PWM5_CH2 + select BSP_USING_PWM5_CH3 + default n + config BSP_USING_POT bool "Enable potentiometer" select BSP_USING_ADC select BSP_USING_ADC1 - default n + default n + + config BSP_USING_SDCARD + bool "Enable SDCARD (sdio)" + select BSP_USING_SDIO + select RT_USING_DFS + select RT_USING_DFS_ELMFAT + select RT_USING_PIN + default n endmenu @@ -101,6 +119,47 @@ menu "On-chip Peripheral Drivers" bool "Enable SPI DMA support" default n + menuconfig BSP_USING_TIM + bool "Enable timer" + default n + select RT_USING_HWTIMER + if BSP_USING_TIM + config BSP_USING_TIM11 + bool "Enable TIM11" + default n + + config BSP_USING_TIM13 + bool "Enable TIM13" + default n + + config BSP_USING_TIM14 + bool "Enable TIM14" + default n + endif + + menuconfig BSP_USING_PWM + bool "Enable pwm" + default n + select RT_USING_PWM + if BSP_USING_PWM + menuconfig BSP_USING_PWM5 + bool "Enable timer5 output pwm" + default n + if BSP_USING_PWM5 + config BSP_USING_PWM5_CH1 + bool "Enable PWM5 channel1" + default n + + config BSP_USING_PWM5_CH2 + bool "Enable PWM5 channel2" + default n + + config BSP_USING_PWM5_CH3 + bool "Enable PWM5 channel3" + default n + endif + endif + menuconfig BSP_USING_ADC bool "Enable ADC" default n @@ -148,6 +207,12 @@ menu "On-chip Peripheral Drivers" select RT_USING_WDT default n + config BSP_USING_SDIO + bool "Enable SDIO" + select RT_USING_SDIO + select RT_USING_DFS + default n + endmenu menu "Board extended module Drivers" diff --git a/bsp/stm32/stm32f429-fire-challenger/board/SConscript b/bsp/stm32/stm32f429-fire-challenger/board/SConscript index 7345e4e191..530a967740 100644 --- a/bsp/stm32/stm32f429-fire-challenger/board/SConscript +++ b/bsp/stm32/stm32f429-fire-challenger/board/SConscript @@ -18,6 +18,9 @@ if GetDepend(['BSP_USING_ETH']): if GetDepend(['BSP_USING_SPI_FLASH']): src += Glob('ports/spi_flash_init.c') +if GetDepend(['BSP_USING_SDCARD']): + src += Glob('ports/sdcard_port.c') + path = [cwd] path += [cwd + '/CubeMX_Config/Inc'] path += [cwd + '/ports'] diff --git a/bsp/stm32/stm32f429-fire-challenger/board/board.c b/bsp/stm32/stm32f429-fire-challenger/board/board.c index 623e1e0f04..77961c793c 100644 --- a/bsp/stm32/stm32f429-fire-challenger/board/board.c +++ b/bsp/stm32/stm32f429-fire-challenger/board/board.c @@ -14,6 +14,7 @@ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; /**Configure the main internal regulator output voltage */ @@ -21,14 +22,17 @@ void SystemClock_Config(void) __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /**Initializes the CPU, AHB and APB busses clocks */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE + |RCC_OSCILLATORTYPE_LSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 15; RCC_OscInitStruct.PLL.PLLN = 216; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; - RCC_OscInitStruct.PLL.PLLQ = 4; + RCC_OscInitStruct.PLL.PLLQ = 8; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); @@ -52,6 +56,12 @@ void SystemClock_Config(void) { Error_Handler(); } + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } } void MX_GPIO_Init(void) diff --git a/bsp/stm32/stm32f429-fire-challenger/rtconfig.h b/bsp/stm32/stm32f429-fire-challenger/rtconfig.h index 1357a79922..83dbf4c0d3 100644 --- a/bsp/stm32/stm32f429-fire-challenger/rtconfig.h +++ b/bsp/stm32/stm32f429-fire-challenger/rtconfig.h @@ -39,6 +39,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_VER_NUM 0x40000 #define ARCH_ARM #define ARCH_ARM_CORTEX_M #define ARCH_ARM_CORTEX_M4 @@ -77,6 +78,7 @@ #define RT_USING_DEVICE_IPC #define RT_PIPE_BUFSZ 512 #define RT_USING_SERIAL +#define RT_SERIAL_USING_DMA #define RT_USING_PIN /* Using WiFi */ @@ -148,19 +150,8 @@ /* miscellaneous packages */ -/* sample package */ - /* samples: kernel and components samples */ - -/* example package: hello */ - - -/* Privated Packages of RealThread */ - - -/* Network Utilities */ - #define SOC_FAMILY_STM32 #define SOC_SERIES_STM32F4 diff --git a/bsp/stm32/stm32l475-atk-pandora/.config b/bsp/stm32/stm32l475-atk-pandora/.config new file mode 100644 index 0000000000..7d6a640f6b --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/.config @@ -0,0 +1,364 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=4 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=1000 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDEL_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +# CONFIG_RT_USING_TIMER_SOFT is not set +CONFIG_RT_DEBUG=y +# CONFIG_RT_DEBUG_INIT_CONFIG is not set +# CONFIG_RT_DEBUG_THREAD_CONFIG is not set +# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set +# CONFIG_RT_DEBUG_IPC_CONFIG is not set +# CONFIG_RT_DEBUG_TIMER_CONFIG is not set +# CONFIG_RT_DEBUG_IRQ_CONFIG is not set +# CONFIG_RT_DEBUG_MEM_CONFIG is not set +# CONFIG_RT_DEBUG_SLAB_CONFIG is not set +# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set +# CONFIG_RT_DEBUG_MODULE_CONFIG is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +# CONFIG_RT_USING_MEMHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +# CONFIG_RT_USING_MEMTRACE is not set +CONFIG_RT_USING_HEAP=y + +# +# Kernel Device Object +# +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_INTERRUPT_INFO is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=256 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +CONFIG_RT_VER_NUM=0x40000 +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_CORTEX_M=y +CONFIG_ARCH_ARM_CORTEX_M4=y +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 + +# +# C++ features +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Command shell +# +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_CMD_SIZE=80 +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_USING_MSH_DEFAULT=y +CONFIG_FINSH_USING_MSH_ONLY=y +CONFIG_FINSH_ARG_MAX=10 + +# +# Device virtual file system +# +# CONFIG_RT_USING_DFS is not set + +# +# Device Drivers +# +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_PIPE_BUFSZ=512 +CONFIG_RT_USING_SERIAL=y +CONFIG_RT_SERIAL_USING_DMA=y +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_MTD is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set + +# +# Using WiFi +# +# CONFIG_RT_USING_WIFI is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# POSIX layer and C standard library +# +# CONFIG_RT_USING_LIBC is not set +# CONFIG_RT_USING_PTHREADS is not set + +# +# Network +# + +# +# Socket abstraction layer +# +# CONFIG_RT_USING_SAL is not set + +# +# light weight TCP/IP stack +# +# CONFIG_RT_USING_LWIP is not set + +# +# Modbus master and slave stack +# +# CONFIG_RT_USING_MODBUS is not set + +# +# AT commands +# +# CONFIG_RT_USING_AT is not set + +# +# VBUS(Virtual Software BUS) +# +# CONFIG_RT_USING_VBUS is not set + +# +# Utilities +# +# CONFIG_RT_USING_LOGTRACE is not set +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set + +# +# ARM CMSIS +# +# CONFIG_RT_USING_CMSIS_OS is not set +# CONFIG_RT_USING_RTT_CMSIS is not set +# CONFIG_RT_USING_LWP is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_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_PERSIMMON is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_FAL is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# 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 + +# +# 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_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32L4=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_STM32L475VE=y + +# +# Onboard Peripheral Drivers +# +CONFIG_BSP_USING_STLINK_TO_USART=y +# CONFIG_BSP_USING_QSPI_FLASH is not set +# CONFIG_BSP_USING_SDCARD is not set + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART1=y +# CONFIG_BSP_USING_UART2 is not set +# CONFIG_BSP_USING_UART3 is not set +# CONFIG_BSP_UART_USING_DMA_RX is not set +# CONFIG_BSP_USING_ON_CHIP_FLASH is not set +# CONFIG_BSP_USING_SPI1 is not set +# CONFIG_BSP_USING_SPI2 is not set +# CONFIG_BSP_SPI_USING_DMA is not set +# CONFIG_BSP_USING_QSPI is not set +# CONFIG_BSP_QSPI_USING_DMA is not set +# CONFIG_BSP_USING_I2C1 is not set +# CONFIG_BSP_USING_I2C2 is not set +# CONFIG_BSP_USING_I2C3 is not set +# CONFIG_BSP_USING_TIM is not set +# CONFIG_BSP_USING_PWM is not set +# CONFIG_BSP_USING_ADC is not set +# CONFIG_BSP_USING_ONCHIP_RTC is not set +# CONFIG_BSP_USING_WDT is not set + +# +# Board extended module Drivers +# diff --git a/bsp/stm32/stm32l475-atk-pandora/.gitignore b/bsp/stm32/stm32l475-atk-pandora/.gitignore new file mode 100644 index 0000000000..7221bde019 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/.gitignore @@ -0,0 +1,42 @@ +*.pyc +*.map +*.dblite +*.elf +*.bin +*.hex +*.axf +*.exe +*.pdb +*.idb +*.ilk +*.old +build +Debug +documentation/html +packages/ +*~ +*.o +*.obj +*.out +*.bak +*.dep +*.lib +*.i +*.d +.DS_Stor* +.config 3 +.config 4 +.config 5 +Midea-X1 +*.uimg +GPATH +GRTAGS +GTAGS +.vscode +JLinkLog.txt +JLinkSettings.ini +DebugConfig/ +RTE/ +settings/ +*.uvguix* +cconfig.h diff --git a/bsp/stm32/stm32l475-atk-pandora/Kconfig b/bsp/stm32/stm32l475-atk-pandora/Kconfig new file mode 100644 index 0000000000..d174bcc585 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/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/stm32l475-atk-pandora/README.md b/bsp/stm32/stm32l475-atk-pandora/README.md new file mode 100644 index 0000000000..70a28eda25 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/README.md @@ -0,0 +1,142 @@ +# STM32L475 潘多拉开发板 BSP 说明 + +## 简介 + +本文档为 RT-Thread 开发团队为 STM32L475 潘多拉开发板提供的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。 + +## 开发板介绍 + +潘多拉 STM32L475 是正点原子推出的一款基于 ARM Cortex-M4 内核的开发板,最高主频为 80Mhz,该开发板具有丰富的板载资源,可以充分发挥 STM32L475 的芯片性能。 + +开发板外观如下图所示: + +![board](figures/board.png) + +该开发板常用 **板载资源** 如下: + +- MCU:STM32L475VET6,主频 80MHz,512KB FLASH ,128KB RAM +- 外部 FLASH:W25Q128(SPI,16MB) +- 常用外设 + - RGB 状态指示灯:1个,(红、绿、蓝三色) + - 按键:4个,KEY_UP(兼具唤醒功能,PC13),K0(PD10),K1(PD9),K2(PD8) + - 红外发射头,红外接收头 + - 有源蜂鸣器:1个 + - 光环境传感器:1个 + - 贴片电机:1个 + - 六轴传感器:1个 + - 高性能音频解码芯片:1个 + - 温湿度传感器(AHT10):1个 + - TFTLCD 显示屏:1个 + - WIFI 模块(AP6181):1个 + - 板载 ST LINK V2.1 功能 +- 常用接口:SD 卡接口、USB OTG Micro USB 接口 +- 调试接口,ST-LINK Micro USB 接口 + +开发板更多详细信息请参考正点原子 [STM32 潘多拉开发板介绍](https://eboard.taobao.com/index.htm)。 + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **板载外设** | **支持情况** | **备注** | +| :----------------- | :----------: | :------------------------------------- | +| 板载 ST-LINK 转串口 | 支持 | | +| QSPI_FLASH | 支持 | | +| SD卡 | 支持 | | +| 贴片电机 | 暂不支持 |即将支持 | +| 温湿度传感器 | 暂不支持 |即将支持 | +| 六轴传感器 | 暂不支持 |即将支持 | +| 光环境传感器 | 暂不支持 |即将支持 | +| 音频解码 | 不支持 | | +| TFTLCD | 不支持 | | +| **片上外设** | **支持情况** | **备注** | +| GPIO | 支持 | | +| UART | 支持 | | +| SPI | 支持 | | +| QSPI | 支持 | | +| I2C | 支持 | | +| TIM | 支持 | | +| ADC | 支持 | | +| RTC | 支持 | | +| WDT | 支持 | | +| PWM | 支持 | | +| USB Device | 暂不支持 | 即将支持 | +| USB Host | 暂不支持 | 即将支持 | +| **扩展模块** | **支持情况** | **备注** | +| ATK-ESP8266 模块 | 暂不支持 | 即将支持 | +| enc28j60 模块 | 暂不支持 | 即将支持 | + +使用该开发板的更多高级功能请参考 RT-Thread 代码仓库: [RT-Thread IoT-Board SDK](https://github.com/RT-Thread/IoT_Board)。 + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + + +### 快速上手 + +本 BSP 为开发者提供 MDK4、MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用数据线连接开发板到 PC,打开电源开关。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用板载 ST-LINK 下载程序,只需一根 USB 线连接开发板,点击下载按钮即可下载程序到开发板 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,观察开发板上 LED 的运行效果,红色 LED 会周期性闪烁。 + +连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息: + + +```bash + \ | / +- RT - Thread Operating System + / | \ 3.1.1 build Nov 19 2018 + 2006 - 2018 Copyright by rt-thread team +msh > +``` +### 进阶使用 + +此 BSP 默认只开启了 GPIO 和 串口1 的功能,如果需使用 SD 卡、Flash 等更多高级功能,需要利用 ENV 工具对BSP 进行配置,步骤如下: + +1. 在 bsp 下打开 env 工具。 + +2. 输入`menuconfig`命令配置工程,配置好之后保存退出。 + +3. 输入`pkgs --update`命令更新软件包。 + +4. 输入`scons --target=mdk4/mdk5/iar` 命令重新生成工程。 + +本章节更多详细的介绍请参考 [BSP 进阶使用指南](../docs/BSP进阶使用指南.md)。 + +## 注意事项 + +暂无 + +## 联系人信息 + +维护人: + +- [SummerGift](https://github.com/SummerGGift) \ No newline at end of file diff --git a/bsp/stm32/stm32l475-atk-pandora/SConscript b/bsp/stm32/stm32l475-atk-pandora/SConscript new file mode 100644 index 0000000000..fe0ae941ae --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/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/stm32l475-atk-pandora/SConstruct b/bsp/stm32/stm32l475-atk-pandora/SConstruct new file mode 100644 index 0000000000..f28e552248 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/SConstruct @@ -0,0 +1,58 @@ +import os +import sys +import rtconfig + +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') +else: + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + +sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] +try: + from building import * +except: + print('Cannot found RT-Thread root directory, please check RTT_ROOT') + print(RTT_ROOT) + exit(-1) + +TARGET = 'rt-thread.' + rtconfig.TARGET_EXT + +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +if rtconfig.PLATFORM == 'iar': + env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = ['$LINK $SOURCES $LINKFLAGS -o $TARGET --map rt-thread.map']) + +Export('RTT_ROOT') +Export('rtconfig') + +SDK_ROOT = os.path.abspath('./') + +if os.path.exists(SDK_ROOT + '/libraries'): + libraries_path_prefix = SDK_ROOT + '/libraries' +else: + libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries' + +SDK_LIB = libraries_path_prefix +Export('SDK_LIB') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +stm32_library = 'STM32L4xx_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/stm32l475-atk-pandora/applications/SConscript b/bsp/stm32/stm32l475-atk-pandora/applications/SConscript new file mode 100644 index 0000000000..4939638d41 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/applications/SConscript @@ -0,0 +1,9 @@ +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [str(Dir('#')), cwd] + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/stm32/stm32l475-atk-pandora/applications/main.c b/bsp/stm32/stm32l475-atk-pandora/applications/main.c new file mode 100644 index 0000000000..a802fd07e8 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/applications/main.c @@ -0,0 +1,24 @@ +/* + * 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 + +int main(void) +{ + int count = 1; + while (count++) + { + rt_pin_write(LED0_PIN, !rt_pin_read(LED0_PIN)); + rt_thread_mdelay(500); + } + return RT_EOK; +} diff --git a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/.mxproject new file mode 100644 index 0000000000..19b0ffa4c5 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/.mxproject @@ -0,0 +1,13 @@ +[PreviousGenFiles] +HeaderPath=D:/BspFramework/rt-thread/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc +HeaderFiles=stm32l4xx_it.h;stm32l4xx_hal_conf.h;main.h; +SourcePath=D:/BspFramework/rt-thread/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src +SourceFiles=stm32l4xx_it.c;stm32l4xx_hal_msp.c;main.c; + +[PreviousLibFiles] +LibFiles=Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_iwdg.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_qspi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rtc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rtc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_iwdg.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_qspi.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_iwdg.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_qspi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rtc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rtc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l475xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/system_stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.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\stm32l4xx_it.c;..\Src\stm32l4xx_hal_msp.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_iwdg.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_qspi.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;../\Src/system_stm32l4xx.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_iwdg.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_qspi.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;../\Src/system_stm32l4xx.c;../Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;null; +HeaderPath=..\Drivers\STM32L4xx_HAL_Driver\Inc;..\Drivers\STM32L4xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32L4xx\Include;..\Drivers\CMSIS\Include;..\Inc; + diff --git a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc/main.h new file mode 100644 index 0000000000..9c54f82425 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc/main.h @@ -0,0 +1,93 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l4xx_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 -----------------------------------------------------------*/ +/* 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/stm32l475-atk-pandora/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h new file mode 100644 index 0000000000..f67587d479 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc/stm32l4xx_hal_conf.h @@ -0,0 +1,434 @@ +/** + ****************************************************************************** + * @file stm32l4xx_hal_conf.h + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2018 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32L4xx_HAL_CONF_H +#define __STM32L4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ + +#define HAL_MODULE_ENABLED +#define HAL_ADC_MODULE_ENABLED +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_CAN_MODULE_ENABLED */ +/*#define HAL_COMP_MODULE_ENABLED */ +/*#define HAL_CRC_MODULE_ENABLED */ +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_DAC_MODULE_ENABLED */ +/*#define HAL_DCMI_MODULE_ENABLED */ +/*#define HAL_DMA2D_MODULE_ENABLED */ +/*#define HAL_DFSDM_MODULE_ENABLED */ +/*#define HAL_DSI_MODULE_ENABLED */ +/*#define HAL_FIREWALL_MODULE_ENABLED */ +/*#define HAL_GFXMMU_MODULE_ENABLED */ +/*#define HAL_HCD_MODULE_ENABLED */ +/*#define HAL_HASH_MODULE_ENABLED */ +/*#define HAL_I2S_MODULE_ENABLED */ +/*#define HAL_IRDA_MODULE_ENABLED */ +#define HAL_IWDG_MODULE_ENABLED +/*#define HAL_LTDC_MODULE_ENABLED */ +/*#define HAL_LCD_MODULE_ENABLED */ +/*#define HAL_LPTIM_MODULE_ENABLED */ +/*#define HAL_NAND_MODULE_ENABLED */ +/*#define HAL_NOR_MODULE_ENABLED */ +/*#define HAL_OPAMP_MODULE_ENABLED */ +/*#define HAL_OSPI_MODULE_ENABLED */ +/*#define HAL_OSPI_MODULE_ENABLED */ +/*#define HAL_PCD_MODULE_ENABLED */ +/*#define HAL_QSPI_MODULE_ENABLED */ +#define HAL_QSPI_MODULE_ENABLED +/*#define HAL_RNG_MODULE_ENABLED */ +#define HAL_RTC_MODULE_ENABLED +/*#define HAL_SAI_MODULE_ENABLED */ +/*#define HAL_SD_MODULE_ENABLED */ +/*#define HAL_SMBUS_MODULE_ENABLED */ +/*#define HAL_SMARTCARD_MODULE_ENABLED */ +#define HAL_SPI_MODULE_ENABLED +/*#define HAL_SRAM_MODULE_ENABLED */ +/*#define HAL_SWPMI_MODULE_ENABLED */ +#define HAL_TIM_MODULE_ENABLED +/*#define HAL_TSC_MODULE_ENABLED */ +#define HAL_UART_MODULE_ENABLED +/*#define HAL_USART_MODULE_ENABLED */ +/*#define HAL_WWDG_MODULE_ENABLED */ +/*#define HAL_EXTI_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_I2C_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 + +/* ########################## Oscillator Values adaptation ####################*/ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal Multiple Speed oscillator (MSI) default value. + * This value is the default MSI range value after Reset. + */ +#if !defined (MSI_VALUE) + #define MSI_VALUE ((uint32_t)4000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* MSI_VALUE */ +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal High Speed oscillator (HSI48) value for USB FS, SDMMC and RNG. + * This internal oscillator is mainly dedicated to provide a high precision clock to + * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. + * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency + * which is subject to manufacturing process variations. + */ +#if !defined (HSI48_VALUE) + #define HSI48_VALUE ((uint32_t)48000000U) /*!< Value of the Internal High Speed oscillator for USB FS/SDMMC/RNG in Hz. + The real value my vary depending on manufacturing process variations.*/ +#endif /* HSI48_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature.*/ + +/** + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External oscillator in Hz*/ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for SAI1 peripheral + * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source + * frequency. + */ +#if !defined (EXTERNAL_SAI1_CLOCK_VALUE) + #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)2097000U) /*!< Value of the SAI1 External clock source in Hz*/ +#endif /* EXTERNAL_SAI1_CLOCK_VALUE */ + +/** + * @brief External clock source for SAI2 peripheral + * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source + * frequency. + */ +#if !defined (EXTERNAL_SAI2_CLOCK_VALUE) + #define EXTERNAL_SAI2_CLOCK_VALUE ((uint32_t)2097000U) /*!< Value of the SAI2 External clock source in Hz*/ +#endif /* EXTERNAL_SAI2_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ + +#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 0U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver + * Activated: CRC code is present inside driver + * Deactivated: CRC code cleaned from driver + */ + +#define USE_SPI_CRC 0U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32l4xx_hal_rcc.h" + #include "stm32l4xx_hal_rcc_ex.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32l4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32l4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32l4xx_hal_dma.h" + #include "stm32l4xx_hal_dma_ex.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32l4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32l4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32l4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32l4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED + #include "stm32l4xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32l4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32l4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32l4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32l4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32l4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32l4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_FIREWALL_MODULE_ENABLED + #include "stm32l4xx_hal_firewall.h" +#endif /* HAL_FIREWALL_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32l4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32l4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32l4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32l4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32l4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32l4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32l4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LCD_MODULE_ENABLED + #include "stm32l4xx_hal_lcd.h" +#endif /* HAL_LCD_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32l4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32l4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_OPAMP_MODULE_ENABLED + #include "stm32l4xx_hal_opamp.h" +#endif /* HAL_OPAMP_MODULE_ENABLED */ + +#ifdef HAL_OSPI_MODULE_ENABLED + #include "stm32l4xx_hal_ospi.h" +#endif /* HAL_OSPI_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32l4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32l4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32l4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32l4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32l4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32l4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + #include "stm32l4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32l4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_SWPMI_MODULE_ENABLED + #include "stm32l4xx_hal_swpmi.h" +#endif /* HAL_SWPMI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32l4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_TSC_MODULE_ENABLED + #include "stm32l4xx_hal_tsc.h" +#endif /* HAL_TSC_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32l4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32l4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32l4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32l4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32l4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32l4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32l4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_GFXMMU_MODULE_ENABLED + #include "stm32l4xx_hal_gfxmmu.h" +#endif /* HAL_GFXMMU_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((char *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(char *file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L4xx_HAL_CONF_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc/stm32l4xx_it.h b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc/stm32l4xx_it.h new file mode 100644 index 0000000000..29156563cb --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Inc/stm32l4xx_it.h @@ -0,0 +1,84 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32l4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32L4xx_IT_H +#define __STM32L4xx_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L4xx_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/STM32L475VE.ioc b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/STM32L475VE.ioc new file mode 100644 index 0000000000..1ab8ead3de --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/STM32L475VE.ioc @@ -0,0 +1,261 @@ +#MicroXplorer Configuration settings - do not modify +ADC1.Channel-15\#ChannelRegularConversion=ADC_CHANNEL_14 +ADC1.IPParameters=Rank-15\#ChannelRegularConversion,Channel-15\#ChannelRegularConversion,SamplingTime-15\#ChannelRegularConversion,OffsetNumber-15\#ChannelRegularConversion,NbrOfConversionFlag,master +ADC1.NbrOfConversionFlag=1 +ADC1.OffsetNumber-15\#ChannelRegularConversion=ADC_OFFSET_NONE +ADC1.Rank-15\#ChannelRegularConversion=1 +ADC1.SamplingTime-15\#ChannelRegularConversion=ADC_SAMPLETIME_2CYCLES_5 +ADC1.master=1 +File.Version=6 +KeepUserPlacement=false +Mcu.Family=STM32L4 +Mcu.IP0=ADC1 +Mcu.IP1=IWDG +Mcu.IP10=TIM15 +Mcu.IP11=TIM16 +Mcu.IP12=TIM17 +Mcu.IP13=USART1 +Mcu.IP14=USART2 +Mcu.IP2=NVIC +Mcu.IP3=QUADSPI +Mcu.IP4=RCC +Mcu.IP5=RTC +Mcu.IP6=SPI1 +Mcu.IP7=SPI2 +Mcu.IP8=SYS +Mcu.IP9=TIM4 +Mcu.IPNb=15 +Mcu.Name=STM32L475V(C-E-G)Tx +Mcu.Package=LQFP100 +Mcu.Pin0=PC14-OSC32_IN (PC14) +Mcu.Pin1=PC15-OSC32_OUT (PC15) +Mcu.Pin10=PE10 +Mcu.Pin11=PE11 +Mcu.Pin12=PE12 +Mcu.Pin13=PE13 +Mcu.Pin14=PE14 +Mcu.Pin15=PE15 +Mcu.Pin16=PB13 +Mcu.Pin17=PB14 +Mcu.Pin18=PB15 +Mcu.Pin19=PA9 +Mcu.Pin2=PH0-OSC_IN (PH0) +Mcu.Pin20=PA10 +Mcu.Pin21=PA13 (JTMS-SWDIO) +Mcu.Pin22=PA14 (JTCK-SWCLK) +Mcu.Pin23=PB7 +Mcu.Pin24=PB8 +Mcu.Pin25=VP_IWDG_VS_IWDG +Mcu.Pin26=VP_RTC_VS_RTC_Activate +Mcu.Pin27=VP_SYS_VS_Systick +Mcu.Pin28=VP_TIM4_VS_ClockSourceINT +Mcu.Pin29=VP_TIM15_VS_ClockSourceINT +Mcu.Pin3=PH1-OSC_OUT (PH1) +Mcu.Pin30=VP_TIM16_VS_ClockSourceINT +Mcu.Pin31=VP_TIM17_VS_ClockSourceINT +Mcu.Pin4=PA2 +Mcu.Pin5=PA3 +Mcu.Pin6=PA5 +Mcu.Pin7=PA6 +Mcu.Pin8=PA7 +Mcu.Pin9=PC5 +Mcu.PinsNb=32 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32L475VETx +MxCube.Version=5.0.0 +MxDb.Version=DB.5.0.0 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false +PA10.Mode=Asynchronous +PA10.Signal=USART1_RX +PA13\ (JTMS-SWDIO).Mode=Serial_Wire +PA13\ (JTMS-SWDIO).Signal=SYS_JTMS-SWDIO +PA14\ (JTCK-SWCLK).Mode=Serial_Wire +PA14\ (JTCK-SWCLK).Signal=SYS_JTCK-SWCLK +PA2.Mode=Asynchronous +PA2.Signal=USART2_TX +PA3.Mode=Asynchronous +PA3.Signal=USART2_RX +PA5.Mode=Full_Duplex_Master +PA5.Signal=SPI1_SCK +PA6.Mode=Full_Duplex_Master +PA6.Signal=SPI1_MISO +PA7.Mode=Full_Duplex_Master +PA7.Signal=SPI1_MOSI +PA9.Mode=Asynchronous +PA9.Signal=USART1_TX +PB13.Locked=true +PB13.Mode=Full_Duplex_Master +PB13.Signal=SPI2_SCK +PB14.Locked=true +PB14.Mode=Full_Duplex_Master +PB14.Signal=SPI2_MISO +PB15.Locked=true +PB15.Mode=Full_Duplex_Master +PB15.Signal=SPI2_MOSI +PB7.Locked=true +PB7.Signal=S_TIM4_CH2 +PB8.Locked=true +PB8.Signal=S_TIM4_CH3 +PC14-OSC32_IN\ (PC14).Mode=LSE-External-Oscillator +PC14-OSC32_IN\ (PC14).Signal=RCC_OSC32_IN +PC15-OSC32_OUT\ (PC15).Mode=LSE-External-Oscillator +PC15-OSC32_OUT\ (PC15).Signal=RCC_OSC32_OUT +PC5.Signal=ADCx_IN14 +PCC.Checker=true +PCC.Line=STM32L4x5 +PCC.MCU=STM32L475V(C-E-G)Tx +PCC.PartNumber=STM32L475VETx +PCC.Seq0=0 +PCC.Series=STM32L4 +PCC.Temperature=25 +PCC.Vdd=null +PE10.Mode=Single Bank +PE10.Signal=QUADSPI_CLK +PE11.Mode=Single Bank +PE11.Signal=QUADSPI_NCS +PE12.Locked=true +PE12.Mode=Single Bank +PE12.Signal=QUADSPI_BK1_IO0 +PE13.Locked=true +PE13.Mode=Single Bank +PE13.Signal=QUADSPI_BK1_IO1 +PE14.Locked=true +PE14.Mode=Single Bank +PE14.Signal=QUADSPI_BK1_IO2 +PE15.Locked=true +PE15.Mode=Single Bank +PE15.Signal=QUADSPI_BK1_IO3 +PH0-OSC_IN\ (PH0).Mode=HSE-External-Oscillator +PH0-OSC_IN\ (PH0).Signal=RCC_OSC_IN +PH1-OSC_OUT\ (PH1).Mode=HSE-External-Oscillator +PH1-OSC_OUT\ (PH1).Signal=RCC_OSC_OUT +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32L475VETx +ProjectManager.FirmwarePackage=STM32Cube FW_L4 V1.13.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=STM32L475VE.ioc +ProjectManager.ProjectName=STM32L475VE +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=MDK-ARM V5 +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_USART2_UART_Init-USART2-false-HAL-true,5-MX_QUADSPI_Init-QUADSPI-false-HAL-true,6-MX_SPI1_Init-SPI1-false-HAL-true,7-MX_SPI2_Init-SPI2-false-HAL-true,8-MX_RTC_Init-RTC-false-HAL-true,9-MX_ADC1_Init-ADC1-false-HAL-true,10-MX_IWDG_Init-IWDG-false-HAL-true,11-MX_TIM17_Init-TIM17-false-HAL-true,12-MX_TIM16_Init-TIM16-false-HAL-true,13-MX_TIM15_Init-TIM15-false-HAL-true,14-MX_TIM4_Init-TIM4-false-HAL-true +RCC.ADCFreq_Value=32000000 +RCC.AHBFreq_Value=80000000 +RCC.APB1Freq_Value=80000000 +RCC.APB1TimFreq_Value=80000000 +RCC.APB2Freq_Value=80000000 +RCC.APB2TimFreq_Value=80000000 +RCC.CortexFreq_Value=80000000 +RCC.DFSDMFreq_Value=80000000 +RCC.FCLKCortexFreq_Value=80000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=80000000 +RCC.HSE_VALUE=8000000 +RCC.HSI_VALUE=16000000 +RCC.I2C1Freq_Value=80000000 +RCC.I2C2Freq_Value=80000000 +RCC.I2C3Freq_Value=80000000 +RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,DFSDMFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,MSI_VALUE,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PLLSAI2PoutputFreq_Value,PLLSAI2RoutputFreq_Value,PLLSourceVirtual,PWRFreq_Value,RNGFreq_Value,RTCClockSelection,RTCFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMCFreq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value,VCOSAI2OutputFreq_Value +RCC.LPTIM1Freq_Value=80000000 +RCC.LPTIM2Freq_Value=80000000 +RCC.LPUART1Freq_Value=80000000 +RCC.LSCOPinFreq_Value=32000 +RCC.LSI_VALUE=32000 +RCC.MCO1PinFreq_Value=80000000 +RCC.MSI_VALUE=4000000 +RCC.PLLN=20 +RCC.PLLPoutputFreq_Value=22857142.85714286 +RCC.PLLQoutputFreq_Value=80000000 +RCC.PLLRCLKFreq_Value=80000000 +RCC.PLLSAI1PoutputFreq_Value=9142857.142857144 +RCC.PLLSAI1QoutputFreq_Value=32000000 +RCC.PLLSAI1RoutputFreq_Value=32000000 +RCC.PLLSAI2PoutputFreq_Value=9142857.142857144 +RCC.PLLSAI2RoutputFreq_Value=32000000 +RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE +RCC.PWRFreq_Value=80000000 +RCC.RNGFreq_Value=32000000 +RCC.RTCClockSelection=RCC_RTCCLKSOURCE_LSE +RCC.RTCFreq_Value=32768 +RCC.SAI1Freq_Value=9142857.142857144 +RCC.SAI2Freq_Value=9142857.142857144 +RCC.SDMMCFreq_Value=32000000 +RCC.SWPMI1Freq_Value=80000000 +RCC.SYSCLKFreq_VALUE=80000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.UART4Freq_Value=80000000 +RCC.UART5Freq_Value=80000000 +RCC.USART1Freq_Value=80000000 +RCC.USART2Freq_Value=80000000 +RCC.USART3Freq_Value=80000000 +RCC.USBFreq_Value=32000000 +RCC.VCOInputFreq_Value=8000000 +RCC.VCOOutputFreq_Value=160000000 +RCC.VCOSAI1OutputFreq_Value=64000000 +RCC.VCOSAI2OutputFreq_Value=64000000 +SH.ADCx_IN14.0=ADC1_IN14,IN14-Single-Ended +SH.ADCx_IN14.ConfNb=1 +SH.S_TIM4_CH2.0=TIM4_CH2,PWM Generation2 CH2 +SH.S_TIM4_CH2.ConfNb=1 +SH.S_TIM4_CH3.0=TIM4_CH3,PWM Generation3 CH3 +SH.S_TIM4_CH3.ConfNb=1 +SPI1.CalculateBaudRate=40.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=40.0 MBits/s +SPI2.Direction=SPI_DIRECTION_2LINES +SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate +SPI2.Mode=SPI_MODE_MASTER +SPI2.VirtualType=VM_MASTER +TIM4.Channel-PWM\ Generation2\ CH2=TIM_CHANNEL_2 +TIM4.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 +TIM4.IPParameters=Channel-PWM Generation3 CH3,Channel-PWM Generation2 CH2 +USART1.IPParameters=VirtualMode-Asynchronous +USART1.VirtualMode-Asynchronous=VM_ASYNC +USART2.IPParameters=VirtualMode-Asynchronous +USART2.VirtualMode-Asynchronous=VM_ASYNC +VP_IWDG_VS_IWDG.Mode=IWDG_Activate +VP_IWDG_VS_IWDG.Signal=IWDG_VS_IWDG +VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled +VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +VP_TIM15_VS_ClockSourceINT.Mode=Internal +VP_TIM15_VS_ClockSourceINT.Signal=TIM15_VS_ClockSourceINT +VP_TIM16_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM16_VS_ClockSourceINT.Signal=TIM16_VS_ClockSourceINT +VP_TIM17_VS_ClockSourceINT.Mode=Enable_Timer +VP_TIM17_VS_ClockSourceINT.Signal=TIM17_VS_ClockSourceINT +VP_TIM4_VS_ClockSourceINT.Mode=Internal +VP_TIM4_VS_ClockSourceINT.Signal=TIM4_VS_ClockSourceINT +board=custom diff --git a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/main.c new file mode 100644 index 0000000000..105588b186 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/main.c @@ -0,0 +1,777 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +ADC_HandleTypeDef hadc1; + +IWDG_HandleTypeDef hiwdg; + +QSPI_HandleTypeDef hqspi; + +RTC_HandleTypeDef hrtc; + +SPI_HandleTypeDef hspi1; +SPI_HandleTypeDef hspi2; + +TIM_HandleTypeDef htim4; +TIM_HandleTypeDef htim15; +TIM_HandleTypeDef htim16; +TIM_HandleTypeDef htim17; + +UART_HandleTypeDef huart1; +UART_HandleTypeDef huart2; + +/* USER CODE BEGIN PV */ +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_USART1_UART_Init(void); +static void MX_USART2_UART_Init(void); +static void MX_QUADSPI_Init(void); +static void MX_SPI1_Init(void); +static void MX_SPI2_Init(void); +static void MX_RTC_Init(void); +static void MX_ADC1_Init(void); +static void MX_IWDG_Init(void); +static void MX_TIM17_Init(void); +static void MX_TIM16_Init(void); +static void MX_TIM15_Init(void); +static void MX_TIM4_Init(void); +/* USER CODE BEGIN PFP */ +/* Private function prototypes -----------------------------------------------*/ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_USART1_UART_Init(); + MX_USART2_UART_Init(); + MX_QUADSPI_Init(); + MX_SPI1_Init(); + MX_SPI2_Init(); + MX_RTC_Init(); + MX_ADC1_Init(); + MX_IWDG_Init(); + MX_TIM17_Init(); + MX_TIM16_Init(); + MX_TIM15_Init(); + MX_TIM4_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 LSE Drive Capability + */ + HAL_PWR_EnableBkUpAccess(); + __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW); + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE + |RCC_OSCILLATORTYPE_LSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 1; + RCC_OscInitStruct.PLL.PLLN = 20; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7; + 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_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART1 + |RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_ADC; + PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_PLLSAI1; + PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; + PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_HSE; + PeriphClkInit.PLLSAI1.PLLSAI1M = 1; + PeriphClkInit.PLLSAI1.PLLSAI1N = 8; + PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV7; + PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV2; + PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV2; + PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_ADC1CLK; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } + /**Configure the main internal regulator output voltage + */ + if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != 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_MultiModeTypeDef multimode = {0}; + ADC_ChannelConfTypeDef sConfig = {0}; + + /* USER CODE BEGIN ADC1_Init 1 */ + + /* USER CODE END ADC1_Init 1 */ + /**Common config + */ + hadc1.Instance = ADC1; + hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; + 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.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.OversamplingMode = DISABLE; + if (HAL_ADC_Init(&hadc1) != HAL_OK) + { + Error_Handler(); + } + /**Configure the ADC multi-mode + */ + multimode.Mode = ADC_MODE_INDEPENDENT; + if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK) + { + Error_Handler(); + } + /**Configure Regular Channel + */ + sConfig.Channel = ADC_CHANNEL_14; + sConfig.Rank = ADC_REGULAR_RANK_1; + sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; + sConfig.SingleDiff = ADC_SINGLE_ENDED; + sConfig.OffsetNumber = ADC_OFFSET_NONE; + sConfig.Offset = 0; + if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN ADC1_Init 2 */ + + /* USER CODE END ADC1_Init 2 */ + +} + +/** + * @brief IWDG Initialization Function + * @param None + * @retval None + */ +static void MX_IWDG_Init(void) +{ + + /* USER CODE BEGIN IWDG_Init 0 */ + + /* USER CODE END IWDG_Init 0 */ + + /* USER CODE BEGIN IWDG_Init 1 */ + + /* USER CODE END IWDG_Init 1 */ + hiwdg.Instance = IWDG; + hiwdg.Init.Prescaler = IWDG_PRESCALER_4; + hiwdg.Init.Window = 4095; + hiwdg.Init.Reload = 4095; + if (HAL_IWDG_Init(&hiwdg) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN IWDG_Init 2 */ + + /* USER CODE END IWDG_Init 2 */ + +} + +/** + * @brief QUADSPI Initialization Function + * @param None + * @retval None + */ +static void MX_QUADSPI_Init(void) +{ + + /* USER CODE BEGIN QUADSPI_Init 0 */ + + /* USER CODE END QUADSPI_Init 0 */ + + /* USER CODE BEGIN QUADSPI_Init 1 */ + + /* USER CODE END QUADSPI_Init 1 */ + /* QUADSPI parameter configuration*/ + hqspi.Instance = QUADSPI; + hqspi.Init.ClockPrescaler = 255; + hqspi.Init.FifoThreshold = 1; + hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_NONE; + hqspi.Init.FlashSize = 1; + hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_1_CYCLE; + hqspi.Init.ClockMode = QSPI_CLOCK_MODE_0; + if (HAL_QSPI_Init(&hqspi) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN QUADSPI_Init 2 */ + + /* USER CODE END QUADSPI_Init 2 */ + +} + +/** + * @brief RTC Initialization Function + * @param None + * @retval None + */ +static void MX_RTC_Init(void) +{ + + /* USER CODE BEGIN RTC_Init 0 */ + + /* USER CODE END RTC_Init 0 */ + + /* USER CODE BEGIN RTC_Init 1 */ + + /* USER CODE END RTC_Init 1 */ + /**Initialize RTC Only + */ + hrtc.Instance = RTC; + hrtc.Init.HourFormat = RTC_HOURFORMAT_24; + hrtc.Init.AsynchPrediv = 127; + hrtc.Init.SynchPrediv = 255; + hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; + hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE; + hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; + hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; + if (HAL_RTC_Init(&hrtc) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN RTC_Init 2 */ + + /* USER CODE END RTC_Init 2 */ + +} + +/** + * @brief SPI1 Initialization Function + * @param None + * @retval None + */ +static void MX_SPI1_Init(void) +{ + + /* USER CODE BEGIN SPI1_Init 0 */ + + /* USER CODE END SPI1_Init 0 */ + + /* USER CODE BEGIN SPI1_Init 1 */ + + /* USER CODE END SPI1_Init 1 */ + /* SPI1 parameter configuration*/ + hspi1.Instance = SPI1; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_4BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.NSS = SPI_NSS_SOFT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 7; + hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + if (HAL_SPI_Init(&hspi1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI1_Init 2 */ + + /* USER CODE END SPI1_Init 2 */ + +} + +/** + * @brief SPI2 Initialization Function + * @param None + * @retval None + */ +static void MX_SPI2_Init(void) +{ + + /* USER CODE BEGIN SPI2_Init 0 */ + + /* USER CODE END SPI2_Init 0 */ + + /* USER CODE BEGIN SPI2_Init 1 */ + + /* USER CODE END SPI2_Init 1 */ + /* SPI2 parameter configuration*/ + hspi2.Instance = SPI2; + hspi2.Init.Mode = SPI_MODE_MASTER; + hspi2.Init.Direction = SPI_DIRECTION_2LINES; + hspi2.Init.DataSize = SPI_DATASIZE_4BIT; + hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi2.Init.NSS = SPI_NSS_SOFT; + hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi2.Init.TIMode = SPI_TIMODE_DISABLE; + hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi2.Init.CRCPolynomial = 7; + hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi2.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + if (HAL_SPI_Init(&hspi2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI2_Init 2 */ + + /* USER CODE END SPI2_Init 2 */ + +} + +/** + * @brief TIM4 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM4_Init(void) +{ + + /* USER CODE BEGIN TIM4_Init 0 */ + + /* USER CODE END TIM4_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + TIM_OC_InitTypeDef sConfigOC = {0}; + + /* USER CODE BEGIN TIM4_Init 1 */ + + /* USER CODE END TIM4_Init 1 */ + htim4.Instance = TIM4; + htim4.Init.Prescaler = 0; + htim4.Init.CounterMode = TIM_COUNTERMODE_UP; + htim4.Init.Period = 0; + htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim4) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_Init(&htim4) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 0; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) + { + Error_Handler(); + } + if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_3) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM4_Init 2 */ + + /* USER CODE END TIM4_Init 2 */ + HAL_TIM_MspPostInit(&htim4); + +} + +/** + * @brief TIM15 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM15_Init(void) +{ + + /* USER CODE BEGIN TIM15_Init 0 */ + + /* USER CODE END TIM15_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM15_Init 1 */ + + /* USER CODE END TIM15_Init 1 */ + htim15.Instance = TIM15; + htim15.Init.Prescaler = 0; + htim15.Init.CounterMode = TIM_COUNTERMODE_UP; + htim15.Init.Period = 0; + htim15.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim15.Init.RepetitionCounter = 0; + htim15.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim15) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim15, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim15, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM15_Init 2 */ + + /* USER CODE END TIM15_Init 2 */ + +} + +/** + * @brief TIM16 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM16_Init(void) +{ + + /* USER CODE BEGIN TIM16_Init 0 */ + + /* USER CODE END TIM16_Init 0 */ + + /* USER CODE BEGIN TIM16_Init 1 */ + + /* USER CODE END TIM16_Init 1 */ + htim16.Instance = TIM16; + htim16.Init.Prescaler = 0; + htim16.Init.CounterMode = TIM_COUNTERMODE_UP; + htim16.Init.Period = 0; + htim16.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim16.Init.RepetitionCounter = 0; + htim16.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim16) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM16_Init 2 */ + + /* USER CODE END TIM16_Init 2 */ + +} + +/** + * @brief TIM17 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM17_Init(void) +{ + + /* USER CODE BEGIN TIM17_Init 0 */ + + /* USER CODE END TIM17_Init 0 */ + + /* USER CODE BEGIN TIM17_Init 1 */ + + /* USER CODE END TIM17_Init 1 */ + htim17.Instance = TIM17; + htim17.Init.Prescaler = 0; + htim17.Init.CounterMode = TIM_COUNTERMODE_UP; + htim17.Init.Period = 0; + htim17.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim17.Init.RepetitionCounter = 0; + htim17.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim17) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM17_Init 2 */ + + /* USER CODE END TIM17_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_8B; + huart1.Init.StopBits = UART_STOPBITS_1; + huart1.Init.Parity = UART_PARITY_NONE; + huart1.Init.Mode = UART_MODE_TX_RX; + huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart1.Init.OverSampling = UART_OVERSAMPLING_16; + huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + if (HAL_UART_Init(&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_8B; + 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.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + if (HAL_UART_Init(&huart2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART2_Init 2 */ + + /* USER CODE END USART2_Init 2 */ + +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOE_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + while(1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(char *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/stm32l475-atk-pandora/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c new file mode 100644 index 0000000000..bfcfd2d7bd --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/stm32l4xx_hal_msp.c @@ -0,0 +1,660 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : stm32l4xx_hal_msp.c + * Description : This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +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_GPIOC_CLK_ENABLE(); + /**ADC1 GPIO Configuration + PC5 ------> ADC1_IN14 + */ + GPIO_InitStruct.Pin = GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG_ADC_CONTROL; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOC, &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 + PC5 ------> ADC1_IN14 + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_5); + + /* USER CODE BEGIN ADC1_MspDeInit 1 */ + + /* USER CODE END ADC1_MspDeInit 1 */ + } + +} + +/** +* @brief QSPI MSP Initialization +* This function configures the hardware resources used in this example +* @param hqspi: QSPI handle pointer +* @retval None +*/ +void HAL_QSPI_MspInit(QSPI_HandleTypeDef* hqspi) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hqspi->Instance==QUADSPI) + { + /* USER CODE BEGIN QUADSPI_MspInit 0 */ + + /* USER CODE END QUADSPI_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_QSPI_CLK_ENABLE(); + + __HAL_RCC_GPIOE_CLK_ENABLE(); + /**QUADSPI GPIO Configuration + PE10 ------> QUADSPI_CLK + PE11 ------> QUADSPI_NCS + PE12 ------> QUADSPI_BK1_IO0 + PE13 ------> QUADSPI_BK1_IO1 + PE14 ------> QUADSPI_BK1_IO2 + PE15 ------> QUADSPI_BK1_IO3 + */ + GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13 + |GPIO_PIN_14|GPIO_PIN_15; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF10_QUADSPI; + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + /* USER CODE BEGIN QUADSPI_MspInit 1 */ + + /* USER CODE END QUADSPI_MspInit 1 */ + } + +} + +/** +* @brief QSPI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hqspi: QSPI handle pointer +* @retval None +*/ + +void HAL_QSPI_MspDeInit(QSPI_HandleTypeDef* hqspi) +{ + + if(hqspi->Instance==QUADSPI) + { + /* USER CODE BEGIN QUADSPI_MspDeInit 0 */ + + /* USER CODE END QUADSPI_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_QSPI_CLK_DISABLE(); + + /**QUADSPI GPIO Configuration + PE10 ------> QUADSPI_CLK + PE11 ------> QUADSPI_NCS + PE12 ------> QUADSPI_BK1_IO0 + PE13 ------> QUADSPI_BK1_IO1 + PE14 ------> QUADSPI_BK1_IO2 + PE15 ------> QUADSPI_BK1_IO3 + */ + HAL_GPIO_DeInit(GPIOE, GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13 + |GPIO_PIN_14|GPIO_PIN_15); + + /* USER CODE BEGIN QUADSPI_MspDeInit 1 */ + + /* USER CODE END QUADSPI_MspDeInit 1 */ + } + +} + +/** +* @brief RTC MSP Initialization +* This function configures the hardware resources used in this example +* @param hrtc: RTC handle pointer +* @retval None +*/ +void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc) +{ + + if(hrtc->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspInit 0 */ + + /* USER CODE END RTC_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_RTC_ENABLE(); + /* USER CODE BEGIN RTC_MspInit 1 */ + + /* USER CODE END RTC_MspInit 1 */ + } + +} + +/** +* @brief RTC MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hrtc: RTC handle pointer +* @retval None +*/ + +void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc) +{ + + if(hrtc->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspDeInit 0 */ + + /* USER CODE END RTC_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_RTC_DISABLE(); + /* USER CODE BEGIN RTC_MspDeInit 1 */ + + /* USER CODE END RTC_MspDeInit 1 */ + } + +} + +/** +* @brief SPI MSP Initialization +* This function configures the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspInit 0 */ + + /* USER CODE END SPI1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SPI1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**SPI1 GPIO Configuration + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI1_MspInit 1 */ + + /* USER CODE END SPI1_MspInit 1 */ + } + else if(hspi->Instance==SPI2) + { + /* USER CODE BEGIN SPI2_MspInit 0 */ + + /* USER CODE END SPI2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SPI2_CLK_ENABLE(); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**SPI2 GPIO Configuration + PB13 ------> SPI2_SCK + PB14 ------> SPI2_MISO + PB15 ------> SPI2_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI2_MspInit 1 */ + + /* USER CODE END SPI2_MspInit 1 */ + } + +} + +/** +* @brief SPI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ + +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) +{ + + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspDeInit 0 */ + + /* USER CODE END SPI1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI1_CLK_DISABLE(); + + /**SPI1 GPIO Configuration + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); + + /* 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 + PB13 ------> SPI2_SCK + PB14 ------> SPI2_MISO + PB15 ------> SPI2_MOSI + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15); + + /* 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==TIM4) + { + /* USER CODE BEGIN TIM4_MspInit 0 */ + + /* USER CODE END TIM4_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM4_CLK_ENABLE(); + /* USER CODE BEGIN TIM4_MspInit 1 */ + + /* USER CODE END TIM4_MspInit 1 */ + } + else if(htim_base->Instance==TIM15) + { + /* USER CODE BEGIN TIM15_MspInit 0 */ + + /* USER CODE END TIM15_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM15_CLK_ENABLE(); + /* USER CODE BEGIN TIM15_MspInit 1 */ + + /* USER CODE END TIM15_MspInit 1 */ + } + else if(htim_base->Instance==TIM16) + { + /* USER CODE BEGIN TIM16_MspInit 0 */ + + /* USER CODE END TIM16_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM16_CLK_ENABLE(); + /* USER CODE BEGIN TIM16_MspInit 1 */ + + /* USER CODE END TIM16_MspInit 1 */ + } + else if(htim_base->Instance==TIM17) + { + /* USER CODE BEGIN TIM17_MspInit 0 */ + + /* USER CODE END TIM17_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM17_CLK_ENABLE(); + /* USER CODE BEGIN TIM17_MspInit 1 */ + + /* USER CODE END TIM17_MspInit 1 */ + } + +} + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(htim->Instance==TIM4) + { + /* USER CODE BEGIN TIM4_MspPostInit 0 */ + + /* USER CODE END TIM4_MspPostInit 0 */ + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**TIM4 GPIO Configuration + PB7 ------> TIM4_CH2 + PB8 ------> TIM4_CH3 + */ + GPIO_InitStruct.Pin = GPIO_PIN_7|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_AF2_TIM4; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM4_MspPostInit 1 */ + + /* USER CODE END TIM4_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==TIM4) + { + /* USER CODE BEGIN TIM4_MspDeInit 0 */ + + /* USER CODE END TIM4_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM4_CLK_DISABLE(); + /* USER CODE BEGIN TIM4_MspDeInit 1 */ + + /* USER CODE END TIM4_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM15) + { + /* USER CODE BEGIN TIM15_MspDeInit 0 */ + + /* USER CODE END TIM15_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM15_CLK_DISABLE(); + /* USER CODE BEGIN TIM15_MspDeInit 1 */ + + /* USER CODE END TIM15_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM16) + { + /* USER CODE BEGIN TIM16_MspDeInit 0 */ + + /* USER CODE END TIM16_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM16_CLK_DISABLE(); + /* USER CODE BEGIN TIM16_MspDeInit 1 */ + + /* USER CODE END TIM16_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM17) + { + /* USER CODE BEGIN TIM17_MspDeInit 0 */ + + /* USER CODE END TIM17_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM17_CLK_DISABLE(); + /* USER CODE BEGIN TIM17_MspDeInit 1 */ + + /* USER CODE END TIM17_MspDeInit 1 */ + } + +} + +/** +* @brief UART MSP Initialization +* This function configures the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspInit(UART_HandleTypeDef* huart) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(huart->Instance==USART1) + { + /* USER CODE BEGIN USART1_MspInit 0 */ + + /* USER CODE END USART1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN USART1_MspInit 1 */ + + /* USER CODE END USART1_MspInit 1 */ + } + else if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspInit 0 */ + + /* USER CODE END USART2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART2_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART2; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN USART2_MspInit 1 */ + + /* USER CODE END USART2_MspInit 1 */ + } + +} + +/** +* @brief UART MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ + +void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) +{ + + if(huart->Instance==USART1) + { + /* USER CODE BEGIN USART1_MspDeInit 0 */ + + /* USER CODE END USART1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART1_CLK_DISABLE(); + + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); + + /* USER CODE BEGIN USART1_MspDeInit 1 */ + + /* USER CODE END USART1_MspDeInit 1 */ + } + else if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspDeInit 0 */ + + /* USER CODE END USART2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART2_CLK_DISABLE(); + + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3); + + /* USER CODE BEGIN USART2_MspDeInit 1 */ + + /* USER CODE END USART2_MspDeInit 1 */ + } + +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/stm32l4xx_it.c b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/stm32l4xx_it.c new file mode 100644 index 0000000000..ab5c0b7d8e --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/stm32l4xx_it.c @@ -0,0 +1,217 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32l4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32l4xx_it.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex-M4 Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } +} + +/** + * @brief This function handles Prefetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVCall_IRQn 0 */ + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32L4xx 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_stm32l4xx.s). */ +/******************************************************************************/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/system_stm32l4xx.c b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/system_stm32l4xx.c new file mode 100644 index 0000000000..c76fe45ee1 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/board/CubeMX_Config/Src/system_stm32l4xx.c @@ -0,0 +1,353 @@ +/** + ****************************************************************************** + * @file system_stm32l4xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32l4xx.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 MSI (4 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32l4xx.s" file, to + * configure the system clock before to branch to main program. + * + * This file configures the system clock as follows: + *============================================================================= + *----------------------------------------------------------------------------- + * System Clock source | MSI + *----------------------------------------------------------------------------- + * SYSCLK(Hz) | 4000000 + *----------------------------------------------------------------------------- + * HCLK(Hz) | 4000000 + *----------------------------------------------------------------------------- + * AHB Prescaler | 1 + *----------------------------------------------------------------------------- + * APB1 Prescaler | 1 + *----------------------------------------------------------------------------- + * APB2 Prescaler | 1 + *----------------------------------------------------------------------------- + * PLL_M | 1 + *----------------------------------------------------------------------------- + * PLL_N | 8 + *----------------------------------------------------------------------------- + * PLL_P | 7 + *----------------------------------------------------------------------------- + * PLL_Q | 2 + *----------------------------------------------------------------------------- + * PLL_R | 2 + *----------------------------------------------------------------------------- + * PLLSAI1_P | NA + *----------------------------------------------------------------------------- + * PLLSAI1_Q | NA + *----------------------------------------------------------------------------- + * PLLSAI1_R | NA + *----------------------------------------------------------------------------- + * PLLSAI2_P | NA + *----------------------------------------------------------------------------- + * PLLSAI2_Q | NA + *----------------------------------------------------------------------------- + * PLLSAI2_R | NA + *----------------------------------------------------------------------------- + * Require 48MHz for USB OTG FS, | Disabled + * SDIO and RNG clock | + *----------------------------------------------------------------------------- + *============================================================================= + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32l4xx_system + * @{ + */ + +/** @addtogroup STM32L4xx_System_Private_Includes + * @{ + */ + +#include "stm32l4xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (MSI_VALUE) + #define MSI_VALUE 4000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* MSI_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_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 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_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 = 4000000U; + + const uint8_t AHBPrescTable[16] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U, 6U, 7U, 8U, 9U}; + const uint8_t APBPrescTable[8] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U}; + const uint32_t MSIRangeTable[12] = {100000U, 200000U, 400000U, 800000U, 1000000U, 2000000U, \ + 4000000U, 8000000U, 16000000U, 24000000U, 32000000U, 48000000U}; +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system. + * @param None + * @retval None + */ + +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ + #endif + + /* Reset the RCC clock configuration to the default reset state ------------*/ + /* Set MSION bit */ + RCC->CR |= RCC_CR_MSION; + + /* Reset CFGR register */ + RCC->CFGR = 0x00000000U; + + /* Reset HSEON, CSSON , HSION, and PLLON bits */ + RCC->CR &= 0xEAF6FFFFU; + + /* Reset PLLCFGR register */ + RCC->PLLCFGR = 0x00001000U; + + /* Reset HSEBYP bit */ + RCC->CR &= 0xFFFBFFFFU; + + /* Disable all interrupts */ + RCC->CIER = 0x00000000U; + + /* 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 MSI, SystemCoreClock will contain the MSI_VALUE(*) + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***) + * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) MSI_VALUE is a constant defined in stm32l4xx_hal.h file (default value + * 4 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSI_VALUE is a constant defined in stm32l4xx_hal.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (***) HSE_VALUE is a constant defined in stm32l4xx_hal.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 = 0U, msirange = 0U, pllvco = 0U, pllr = 2U, pllsource = 0U, pllm = 2U; + + /* Get MSI Range frequency--------------------------------------------------*/ + if((RCC->CR & RCC_CR_MSIRGSEL) == RESET) + { /* MSISRANGE from RCC_CSR applies */ + msirange = (RCC->CSR & RCC_CSR_MSISRANGE) >> 8U; + } + else + { /* MSIRANGE from RCC_CR applies */ + msirange = (RCC->CR & RCC_CR_MSIRANGE) >> 4U; + } + /*MSI frequency range in HZ*/ + msirange = MSIRangeTable[msirange]; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) + { + case 0x00: /* MSI used as system clock source */ + SystemCoreClock = msirange; + break; + + case 0x04: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + + case 0x08: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + + case 0x0C: /* PLL used as system clock source */ + /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN + SYSCLK = PLL_VCO / PLLR + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> 4U) + 1U ; + + switch (pllsource) + { + case 0x02: /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm); + break; + + case 0x03: /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm); + break; + + default: /* MSI used as PLL clock source */ + pllvco = (msirange / pllm); + break; + } + pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 8U); + pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 25U) + 1U) * 2U; + SystemCoreClock = pllvco/pllr; + break; + + default: + SystemCoreClock = msirange; + break; + } + /* Compute HCLK clock frequency --------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4U)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32l475-atk-pandora/board/Kconfig b/bsp/stm32/stm32l475-atk-pandora/board/Kconfig new file mode 100644 index 0000000000..61f2c7db74 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/board/Kconfig @@ -0,0 +1,210 @@ +menu "Hardware Drivers Config" + +config SOC_STM32L475VE + bool + select SOC_SERIES_STM32L4 + default y + +menu "Onboard Peripheral Drivers" + + config BSP_USING_STLINK_TO_USART + bool "Enable STLINK TO USART (uart1)" + select BSP_USING_UART1 + default y + + config BSP_USING_QSPI_FLASH + bool "Enable QSPI FLASH" + select BSP_USING_QSPI + select RT_USING_SFUD + select RT_SFUD_USING_QSPI + default n + + config BSP_USING_SDCARD + bool "Enable SDCARD (spi1)" + select BSP_USING_SPI1 + select BSP_SPI_USING_DMA + select RT_USING_SPI_MSD + select RT_USING_DFS + select RT_USING_DFS_ELMFAT + default n + +endmenu + +menu "On-chip Peripheral Drivers" + + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default y + + config BSP_USING_UART1 + bool "Enable UART1" + select RT_USING_SERIAL + default y + + config BSP_USING_UART2 + bool "Enable UART2" + select RT_USING_SERIAL + default n + + config BSP_USING_UART3 + bool "Enable UART3" + select RT_USING_SERIAL + default n + + config BSP_UART_USING_DMA_RX + bool "Enable UART RX DMA support" + default n + + config BSP_USING_ON_CHIP_FLASH + bool "Enable on-chip FLASH" + default n + + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + select RT_USING_SPI + default n + + config BSP_USING_SPI2 + bool "Enable SPI2 BUS" + select RT_USING_SPI + default n + + config BSP_SPI_USING_DMA + bool "Enable SPI DMA support" + default n + + config BSP_USING_QSPI + bool "Enable QSPI BUS" + select RT_USING_QSPI + select RT_USING_SPI + default n + + config BSP_QSPI_USING_DMA + bool "Enable QSPI DMA support" + default n + + menuconfig BSP_USING_I2C1 + bool "Enable I2C1 BUS (software simulation)" + default n + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + if BSP_USING_I2C1 + config BSP_I2C1_SCL_PIN + int "i2c1 scl pin number" + range 1 176 + default 15 + config BSP_I2C1_SDA_PIN + int "I2C1 sda pin number" + range 1 176 + default 16 + endif + + menuconfig BSP_USING_I2C2 + bool "Enable I2C2 BUS (software simulation)" + default n + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + if BSP_USING_I2C2 + config BSP_I2C2_SCL_PIN + int "i2c2 scl pin number" + range 1 176 + default 47 + config BSP_I2C2_SDA_PIN + int "I2C2 sda pin number" + range 1 176 + default 48 + endif + + menuconfig BSP_USING_I2C3 + bool "Enable I2C3 BUS (software simulation)" + default n + select RT_USING_I2CS + select RT_USING_I2C_BITOPS + select RT_USING_PIN + if BSP_USING_I2C3 + config BSP_I2C3_SCL_PIN + int "i2c3 scl pin number" + range 1 176 + default 92 + config BSP_I2C3_SDA_PIN + int "I2C3 sda pin number" + range 1 176 + default 93 + endif + + menuconfig BSP_USING_TIM + bool "Enable timer" + default n + select RT_USING_HWTIMER + if BSP_USING_TIM + config BSP_USING_TIM15 + bool "Enable TIM15" + default n + + config BSP_USING_TIM16 + bool "Enable TIM16" + default n + + config BSP_USING_TIM17 + bool "Enable TIM17" + default n + endif + + menuconfig BSP_USING_PWM + bool "Enable pwm" + default n + select RT_USING_PWM + if BSP_USING_PWM + menuconfig BSP_USING_PWM4 + bool "Enable timer4 output pwm" + default n + if BSP_USING_PWM4 + config BSP_USING_PWM4_CH2 + bool "Enable PWM4 channel2" + default n + + config BSP_USING_PWM4_CH3 + bool "Enable PWM4 channel3" + default n + endif + endif + + menuconfig BSP_USING_ADC + bool "Enable ADC" + default n + select RT_USING_ADC + if BSP_USING_ADC + config BSP_USING_ADC1 + bool "Enable ADC1" + default n + + config BSP_USING_ADC2 + bool "Enable ADC2" + default n + + config BSP_USING_ADC3 + bool "Enable ADC3" + default n + endif + + config BSP_USING_ONCHIP_RTC + bool "Enable RTC" + select RT_USING_RTC + select RT_USING_LIBC + default n + + config BSP_USING_WDT + bool "Enable Watchdog Timer" + select RT_USING_WDT + default n + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/stm32/stm32l475-atk-pandora/board/SConscript b/bsp/stm32/stm32l475-atk-pandora/board/SConscript new file mode 100644 index 0000000000..fb51c3cc0a --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/board/SConscript @@ -0,0 +1,37 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +CubeMX_Config/Src/stm32l4xx_hal_msp.c +''') + +if GetDepend(['BSP_USING_QSPI_FLASH']): + src += Glob('ports/drv_qspi_flash.c') + +if GetDepend(['BSP_USING_SDCARD']): + src += Glob('ports/sdcard_port.c') + +path = [cwd] +path += [cwd + '/CubeMX_Config/Inc'] +path += [cwd + '/ports'] + +startup_path_prefix = SDK_LIB + +if rtconfig.CROSS_TOOL == 'gcc': + src += [startup_path_prefix + '/STM32L4xx_HAL/CMSIS/Device/ST/STM32L4xx/Source/Templates/gcc/startup_stm32l475xx.s'] +elif rtconfig.CROSS_TOOL == 'keil': + src += [startup_path_prefix + '/STM32L4xx_HAL/CMSIS/Device/ST/STM32L4xx/Source/Templates/arm/startup_stm32l475xx.s'] +elif rtconfig.CROSS_TOOL == 'iar': + src += [startup_path_prefix + '/STM32L4xx_HAL/CMSIS/Device/ST/STM32L4xx/Source/Templates/iar/startup_stm32l475xx.s'] + +CPPDEFINES = ['STM32L475xx'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') diff --git a/bsp/stm32/stm32l475-atk-pandora/board/board.c b/bsp/stm32/stm32l475-atk-pandora/board/board.c new file mode 100644 index 0000000000..4c6d7f61ea --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/board/board.c @@ -0,0 +1,85 @@ +/* + * File : board.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2009 RT-Thread Develop Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2009-01-05 Bernard first implementation + */ + +#include + +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 1; + RCC_OscInitStruct.PLL.PLLN = 20; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7; + 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_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2; + PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } + /**Configure the main internal regulator output voltage + */ + if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) + { + Error_Handler(); + } +} + +void MX_GPIO_Init(void) +{ + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOE_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + +} + +#ifdef RT_USING_PIN +int board_pin_init(void) +{ + rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); + return 0; +} +INIT_BOARD_EXPORT(board_pin_init); +#endif /* RT_USING_PIN */ diff --git a/bsp/stm32/stm32l475-atk-pandora/board/board.h b/bsp/stm32/stm32l475-atk-pandora/board/board.h new file mode 100644 index 0000000000..43ea79b4e4 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/board/board.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-5 SummerGift change to new framework + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include +#include "drv_common.h" + +#ifdef BSP_USING_GPIO +#include "drv_gpio.h" +#endif + +#define STM32_SRAM1_SIZE (96) +#define STM32_SRAM1_START (0x20000000) +#define STM32_SRAM1_END (STM32_SRAM1_START + STM32_SRAM1_SIZE * 1024) + +#define STM32_FLASH_START_ADRESS ((uint32_t)0x08000000) +#define STM32_FLASH_SIZE (512 * 1024) +#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE)) + +#define HEAP_BEGIN STM32_SRAM1_START +#define HEAP_END STM32_SRAM1_END + +/* Board Pin definitions */ +#define LED0_PIN GET_PIN(E, 7) +#define LED1_PIN GET_PIN(E, 8) + +void SystemClock_Config(void); +void MX_GPIO_Init(void); + +#endif + diff --git a/bsp/stm32/stm32l475-atk-pandora/board/linker_scripts/link.icf b/bsp/stm32/stm32l475-atk-pandora/board/linker_scripts/link.icf new file mode 100644 index 0000000000..11d1d86df5 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/board/linker_scripts/link.icf @@ -0,0 +1,33 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF; +define symbol __ICFEDIT_region_RAM1_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM1_end__ = 0x20017FFF; +define symbol __ICFEDIT_region_RAM2_start__ = 0x10000000; +define symbol __ICFEDIT_region_RAM2_end__ = 0x10007FFF; + +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x0400; +define symbol __ICFEDIT_size_heap__ = 0x0000; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM1_region = mem:[from __ICFEDIT_region_RAM1_start__ to __ICFEDIT_region_RAM1_end__]; +define region RAM2_region = mem:[from __ICFEDIT_region_RAM2_start__ to __ICFEDIT_region_RAM2_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 RAM1_region { section .sram }; +place in RAM2_region { readwrite, block CSTACK}; diff --git a/bsp/stm32/stm32l475-atk-pandora/board/linker_scripts/link.lds b/bsp/stm32/stm32l475-atk-pandora/board/linker_scripts/link.lds new file mode 100644 index 0000000000..91149a6a2f --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/board/linker_scripts/link.lds @@ -0,0 +1,144 @@ +/* + * linker script for STM32L4XX with GNU ld + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08000000, LENGTH = 512k /* 512KB flash */ + RAM1 (rw) : ORIGIN = 0x20000000, LENGTH = 96k /* 96K sram */ + RAM2 (rw) : ORIGIN = 0x10000000, LENGTH = 32k /* 32K 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 = . ; + } >RAM2 + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } >RAM2 + + __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) + } > RAM2 + __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/stm32l475-atk-pandora/board/linker_scripts/link.sct b/bsp/stm32/stm32l475-atk-pandora/board/linker_scripts/link.sct new file mode 100644 index 0000000000..ea1ec95c67 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/board/linker_scripts/link.sct @@ -0,0 +1,15 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00080000 { ; load region size_region + ER_IROM1 0x08000000 0x00080000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_IRAM2 0x10000000 0x00008000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/bsp/stm32/stm32l475-atk-pandora/board/ports/drv_qspi_flash.c b/bsp/stm32/stm32l475-atk-pandora/board/ports/drv_qspi_flash.c new file mode 100644 index 0000000000..1b9120a5c5 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/board/ports/drv_qspi_flash.c @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-27 zylx change to new framework + */ + +#include +#include +#include +#include +#include + +#ifdef BSP_USING_QSPI_FLASH + +#include "spi_flash.h" +#include "spi_flash_sfud.h" + +char w25qxx_read_status_register2(struct rt_qspi_device *device) +{ + /* 0x35 read status register2 */ + char instruction = 0x35, status; + + rt_qspi_send_then_recv(device, &instruction, 1, &status, 1); + + return status; +} + +void w25qxx_write_enable(struct rt_qspi_device *device) +{ + /* 0x06 write enable */ + char instruction = 0x06; + + rt_qspi_send(device, &instruction, 1); +} + +void w25qxx_enter_qspi_mode(struct rt_qspi_device *device) +{ + char status = 0; + /* 0x38 enter qspi mode */ + char instruction = 0x38; + char write_status2_buf[2] = {0}; + + /* 0x31 write status register2 */ + write_status2_buf[0] = 0x31; + + status = w25qxx_read_status_register2(device); + if (!(status & 0x02)) + { + status |= 1 << 1; + w25qxx_write_enable(device); + write_status2_buf[1] = status; + rt_qspi_send(device, &write_status2_buf, 2); + rt_qspi_send(device, &instruction, 1); + rt_kprintf("flash already enter qspi mode\n"); + rt_thread_mdelay(10); + } +} + +static int rt_hw_qspi_flash_with_sfud_init(void) +{ + stm32_qspi_bus_attach_device("qspi1", "qspi10", RT_NULL, 4, w25qxx_enter_qspi_mode, RT_NULL); + + /* init w25q128 */ + if (RT_NULL == rt_sfud_flash_probe("w25q128", "qspi10")) + { + return -RT_ERROR; + } + + return RT_EOK; +} +INIT_COMPONENT_EXPORT(rt_hw_qspi_flash_with_sfud_init); + +#endif/* BSP_USING_QSPI_FLASH */ diff --git a/bsp/stm32/stm32l475-atk-pandora/board/ports/fal_cfg.h b/bsp/stm32/stm32l475-atk-pandora/board/ports/fal_cfg.h new file mode 100644 index 0000000000..d7a1db25e9 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/board/ports/fal_cfg.h @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-12-5 SummerGift first version + */ + +#ifndef _FAL_CFG_H_ +#define _FAL_CFG_H_ + +#include +#include + +extern const struct fal_flash_dev stm32_onchip_flash; + +/* flash device table */ +#define FAL_FLASH_DEV_TABLE \ +{ \ + &stm32_onchip_flash, \ +} +/* ====================== Partition Configuration ========================== */ +#ifdef FAL_PART_HAS_TABLE_CFG + +/* partition table */ +#define FAL_PART_TABLE \ +{ \ + {FAL_PART_MAGIC_WROD, "app", "onchip_flash", 0, 496 * 1024, 0}, \ + {FAL_PART_MAGIC_WROD, "param", "onchip_flash", 496* 1024, 16 * 1024, 0}, \ +} +#endif /* FAL_PART_HAS_TABLE_CFG */ +#endif /* _FAL_CFG_H_ */ diff --git a/bsp/stm32/stm32l475-atk-pandora/board/ports/sdcard_port.c b/bsp/stm32/stm32l475-atk-pandora/board/ports/sdcard_port.c new file mode 100644 index 0000000000..8fdd588372 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/board/ports/sdcard_port.c @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-12-14 balanceTWK add sdcard port file + */ + +#include + +#ifdef RT_USING_DFS + +#include +#include +#include +#include "drv_spi.h" +#include "spi_msd.h" + +#define DBG_ENABLE +#define DBG_SECTION_NAME "app.card" +#define DBG_COLOR + +#define DBG_LEVEL DBG_INFO +#include + +void sd_mount(void *parameter) +{ + while (1) + { + rt_thread_mdelay(500); + if(rt_device_find("sd0") != RT_NULL) + { + if (dfs_mount("sd0", "/", "elm", 0, 0) == RT_EOK) + { + LOG_I("sd card mount to '/'"); + break; + } + else + { + LOG_W("sd card mount to '/' failed!"); + } + } + } +} + +int stm32_sdcard_mount(void) +{ + rt_thread_t tid; + + tid = rt_thread_create("sd_mount", sd_mount, RT_NULL, + 1024, RT_THREAD_PRIORITY_MAX - 2, 20); + if (tid != RT_NULL) + { + rt_thread_startup(tid); + } + else + { + LOG_E("create sd_mount thread err!"); + } + return RT_EOK; +} +INIT_APP_EXPORT(stm32_sdcard_mount); + +static int rt_hw_spi1_tfcard(void) +{ + __HAL_RCC_GPIOC_CLK_ENABLE(); + rt_hw_spi_device_attach("spi1", "spi10", GPIOC, GPIO_PIN_3); + return msd_init("sd0", "spi10"); +} +INIT_DEVICE_EXPORT(rt_hw_spi1_tfcard); + +#endif + diff --git a/bsp/stm32/stm32l475-atk-pandora/figures/board.png b/bsp/stm32/stm32l475-atk-pandora/figures/board.png new file mode 100644 index 0000000000000000000000000000000000000000..3d8f0a6e269c6a3c4ff9dfb7f5bf2cbaa1e416ba GIT binary patch literal 488034 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

=AQ8fIpn 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

  • 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

    b(tk;qDvx9c{*c!SO$Ur5tIj`Qml__ANR|BIr_E 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

    I&I8wx$d?0%TWyoiUi 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

    ZRnYJ=O%Y8icFxd2{HngMK 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

    gjZvCR|KaAd=RUb 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 Q9Obz{6*U#=Uctiu3x-Ul6#xJL literal 0 HcmV?d00001 diff --git a/bsp/stm32/stm32l475-atk-pandora/project.ewd b/bsp/stm32/stm32l475-atk-pandora/project.ewd new file mode 100644 index 0000000000..4b27053590 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/project.ewd @@ -0,0 +1,2834 @@ + + + 3 + + rt-thread + + ARM + + 1 + + C-SPY + 2 + + 29 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\IARProbe\IarProbePlugin.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 29 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 6 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\IARProbe\IarProbePlugin.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/bsp/stm32/stm32l475-atk-pandora/project.ewp b/bsp/stm32/stm32l475-atk-pandora/project.ewp new file mode 100644 index 0000000000..268f4f0e33 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/project.ewp @@ -0,0 +1,2497 @@ + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 29 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 29 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + + Applications + + $PROJ_DIR$\applications\main.c + + + + Drivers + + $PROJ_DIR$\board\board.c + + + $PROJ_DIR$\board\CubeMX_Config\Src\stm32l4xx_hal_msp.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\iar\startup_stm32l475xx.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\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-M4 + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\cortex-m4\context_iar.S + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\backtrace.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\div0.c + + + $PROJ_DIR$\..\..\..\libcpu\arm\common\showmem.c + + + + DeviceDrivers + + $PROJ_DIR$\..\..\..\components\drivers\misc\pin.c + + + $PROJ_DIR$\..\..\..\components\drivers\serial\serial.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\completion.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\dataqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\pipe.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringblk_buf.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\ringbuffer.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\waitqueue.c + + + $PROJ_DIR$\..\..\..\components\drivers\src\workqueue.c + + + + finsh + + $PROJ_DIR$\..\..\..\components\finsh\shell.c + + + $PROJ_DIR$\..\..\..\components\finsh\symbol.c + + + $PROJ_DIR$\..\..\..\components\finsh\cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_cmd.c + + + $PROJ_DIR$\..\..\..\components\finsh\msh_file.c + + + + STM32_HAL + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\system_stm32l4xx.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_can.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_comp.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dcmi.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dfsdm.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dfsdm_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma2d.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dsi.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_exti.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_firewall.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ramfunc.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gfxmmu.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_hash.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_hash_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_hcd.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_irda.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_iwdg.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_lcd.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_lptim.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_ltdc.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_ltdc_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_nand.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_nor.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_opamp.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_opamp_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_ospi.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pcd.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pcd_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_qspi.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rng.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rtc.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rtc_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sai.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sai_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sd.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sd_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_smartcard.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_smartcard_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_smbus.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sram.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_swpmi.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tsc.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart_ex.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_wwdg.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_adc.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_comp.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_crc.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_crs.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_dac.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_dma.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_dma2d.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_exti.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_fmc.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_gpio.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_i2c.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_lptim.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_lpuart.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_opamp.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_pwr.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_rcc.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_rng.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_rtc.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_sdmmc.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_spi.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_swpmi.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_tim.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_usart.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_usb.c + + + $PROJ_DIR$\..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_utils.c + + + diff --git a/bsp/stm32/stm32l475-atk-pandora/project.eww b/bsp/stm32/stm32l475-atk-pandora/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/stm32/stm32l475-atk-pandora/project.uvoptx b/bsp/stm32/stm32l475-atk-pandora/project.uvoptx new file mode 100644 index 0000000000..4c989e2d13 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/project.uvoptx @@ -0,0 +1,196 @@ + + + + 1.0 + +

    ### uVision Project, (C) Keil Software
    + + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + ST-LINKIII-KEIL_SWO + -U066EFF495056867767053013 -O206 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L475VETx$CMSIS\Flash\STM32L4xx_512.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32L4xx_512 -FL080000 -FS08000000 -FP0($$Device:STM32L475VETx$CMSIS\Flash\STM32L4xx_512.FLM) + + + 0 + JL2CM3 + -U -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L475VETx$CMSIS\Flash\STM32L4xx_512.FLM) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 0 + 2 + 10000000 + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + + diff --git a/bsp/stm32/stm32l475-atk-pandora/project.uvprojx b/bsp/stm32/stm32l475-atk-pandora/project.uvprojx new file mode 100644 index 0000000000..0c9187ff6d --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/project.uvprojx @@ -0,0 +1,1373 @@ + + + 2.1 +
    ### uVision Project, (C) Keil Software
    + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32L475VETx + STMicroelectronics + Keil.STM32L4xx_DFP.2.0.0 + http://www.keil.com/pack + IRAM(0x20000000,0x00018000) IRAM2(0x10000000,0x00008000) IROM(0x08000000,0x00080000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L475VETx$CMSIS\Flash\STM32L4xx_512.FLM)) + 0 + $$Device:STM32L475VETx$Drivers\CMSIS\Device\ST\STM32L4xx\Include\stm32l4xx.h + + + + + + + + + + $$Device:STM32L475VETx$CMSIS\SVD\STM32L4x5.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 1 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x18000 + + + 1 + 0x8000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x18000 + + + 0 + 0x10000000 + 0x8000 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + USE_HAL_DRIVER, STM32L475xx + + .;applications;board;board\CubeMX_Config\Inc;..\libraries\HAL_Drivers;..\libraries\HAL_Drivers\config;..\..\..\include;..\..\..\libcpu\arm\cortex-m4;..\..\..\libcpu\arm\common;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Inc;..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Include;..\libraries\STM32L4xx_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) + + + + + + + + Applications + + + main.c + 1 + applications\main.c + + + + + Drivers + + + board.c + 1 + board\board.c + + + + + stm32l4xx_hal_msp.c + 1 + board\CubeMX_Config\Src\stm32l4xx_hal_msp.c + + + + + startup_stm32l475xx.s + 2 + ..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\arm\startup_stm32l475xx.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 + + + + + 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-M4 + + + cpuport.c + 1 + ..\..\..\libcpu\arm\cortex-m4\cpuport.c + + + + + context_rvds.S + 2 + ..\..\..\libcpu\arm\cortex-m4\context_rvds.S + + + + + backtrace.c + 1 + ..\..\..\libcpu\arm\common\backtrace.c + + + + + div0.c + 1 + ..\..\..\libcpu\arm\common\div0.c + + + + + showmem.c + 1 + ..\..\..\libcpu\arm\common\showmem.c + + + + + DeviceDrivers + + + pin.c + 1 + ..\..\..\components\drivers\misc\pin.c + + + + + serial.c + 1 + ..\..\..\components\drivers\serial\serial.c + + + + + completion.c + 1 + ..\..\..\components\drivers\src\completion.c + + + + + dataqueue.c + 1 + ..\..\..\components\drivers\src\dataqueue.c + + + + + pipe.c + 1 + ..\..\..\components\drivers\src\pipe.c + + + + + ringblk_buf.c + 1 + ..\..\..\components\drivers\src\ringblk_buf.c + + + + + ringbuffer.c + 1 + ..\..\..\components\drivers\src\ringbuffer.c + + + + + waitqueue.c + 1 + ..\..\..\components\drivers\src\waitqueue.c + + + + + workqueue.c + 1 + ..\..\..\components\drivers\src\workqueue.c + + + + + finsh + + + shell.c + 1 + ..\..\..\components\finsh\shell.c + + + + + symbol.c + 1 + ..\..\..\components\finsh\symbol.c + + + + + cmd.c + 1 + ..\..\..\components\finsh\cmd.c + + + + + msh.c + 1 + ..\..\..\components\finsh\msh.c + + + + + msh_cmd.c + 1 + ..\..\..\components\finsh\msh_cmd.c + + + + + msh_file.c + 1 + ..\..\..\components\finsh\msh_file.c + + + + + STM32_HAL + + + system_stm32l4xx.c + 1 + ..\libraries\STM32L4xx_HAL\CMSIS\Device\ST\STM32L4xx\Source\Templates\system_stm32l4xx.c + + + + + stm32l4xx_hal.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c + + + + + stm32l4xx_hal_adc.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc.c + + + + + stm32l4xx_hal_adc_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc_ex.c + + + + + stm32l4xx_hal_can.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_can.c + + + + + stm32l4xx_hal_comp.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_comp.c + + + + + stm32l4xx_hal_cortex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c + + + + + stm32l4xx_hal_crc.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc.c + + + + + stm32l4xx_hal_crc_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_crc_ex.c + + + + + stm32l4xx_hal_cryp.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp.c + + + + + stm32l4xx_hal_cryp_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cryp_ex.c + + + + + stm32l4xx_hal_dac.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac.c + + + + + stm32l4xx_hal_dac_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac_ex.c + + + + + stm32l4xx_hal_dcmi.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dcmi.c + + + + + stm32l4xx_hal_dfsdm.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dfsdm.c + + + + + stm32l4xx_hal_dfsdm_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dfsdm_ex.c + + + + + stm32l4xx_hal_dma.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c + + + + + stm32l4xx_hal_dma2d.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma2d.c + + + + + stm32l4xx_hal_dma_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c + + + + + stm32l4xx_hal_dsi.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dsi.c + + + + + stm32l4xx_hal_exti.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_exti.c + + + + + stm32l4xx_hal_firewall.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_firewall.c + + + + + stm32l4xx_hal_flash.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash.c + + + + + stm32l4xx_hal_flash_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ex.c + + + + + stm32l4xx_hal_flash_ramfunc.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ramfunc.c + + + + + stm32l4xx_hal_gfxmmu.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gfxmmu.c + + + + + stm32l4xx_hal_gpio.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c + + + + + stm32l4xx_hal_hash.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_hash.c + + + + + stm32l4xx_hal_hash_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_hash_ex.c + + + + + stm32l4xx_hal_hcd.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_hcd.c + + + + + stm32l4xx_hal_i2c.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c.c + + + + + stm32l4xx_hal_i2c_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c_ex.c + + + + + stm32l4xx_hal_irda.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_irda.c + + + + + stm32l4xx_hal_iwdg.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_iwdg.c + + + + + stm32l4xx_hal_lcd.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_lcd.c + + + + + stm32l4xx_hal_lptim.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_lptim.c + + + + + stm32l4xx_hal_ltdc.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_ltdc.c + + + + + stm32l4xx_hal_ltdc_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_ltdc_ex.c + + + + + stm32l4xx_hal_nand.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_nand.c + + + + + stm32l4xx_hal_nor.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_nor.c + + + + + stm32l4xx_hal_opamp.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_opamp.c + + + + + stm32l4xx_hal_opamp_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_opamp_ex.c + + + + + stm32l4xx_hal_ospi.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_ospi.c + + + + + stm32l4xx_hal_pcd.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pcd.c + + + + + stm32l4xx_hal_pcd_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pcd_ex.c + + + + + stm32l4xx_hal_pwr.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c + + + + + stm32l4xx_hal_pwr_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c + + + + + stm32l4xx_hal_qspi.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_qspi.c + + + + + stm32l4xx_hal_rcc.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c + + + + + stm32l4xx_hal_rcc_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c + + + + + stm32l4xx_hal_rng.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rng.c + + + + + stm32l4xx_hal_rtc.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rtc.c + + + + + stm32l4xx_hal_rtc_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rtc_ex.c + + + + + stm32l4xx_hal_sai.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sai.c + + + + + stm32l4xx_hal_sai_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sai_ex.c + + + + + stm32l4xx_hal_sd.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sd.c + + + + + stm32l4xx_hal_sd_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sd_ex.c + + + + + stm32l4xx_hal_smartcard.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_smartcard.c + + + + + stm32l4xx_hal_smartcard_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_smartcard_ex.c + + + + + stm32l4xx_hal_smbus.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_smbus.c + + + + + stm32l4xx_hal_spi.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi.c + + + + + stm32l4xx_hal_spi_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi_ex.c + + + + + stm32l4xx_hal_sram.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_sram.c + + + + + stm32l4xx_hal_swpmi.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_swpmi.c + + + + + stm32l4xx_hal_tim.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim.c + + + + + stm32l4xx_hal_tim_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim_ex.c + + + + + stm32l4xx_hal_tsc.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tsc.c + + + + + stm32l4xx_hal_uart.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c + + + + + stm32l4xx_hal_uart_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c + + + + + stm32l4xx_hal_usart.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart.c + + + + + stm32l4xx_hal_usart_ex.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_usart_ex.c + + + + + stm32l4xx_hal_wwdg.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_wwdg.c + + + + + stm32l4xx_ll_adc.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_adc.c + + + + + stm32l4xx_ll_comp.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_comp.c + + + + + stm32l4xx_ll_crc.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_crc.c + + + + + stm32l4xx_ll_crs.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_crs.c + + + + + stm32l4xx_ll_dac.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_dac.c + + + + + stm32l4xx_ll_dma.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_dma.c + + + + + stm32l4xx_ll_dma2d.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_dma2d.c + + + + + stm32l4xx_ll_exti.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_exti.c + + + + + stm32l4xx_ll_fmc.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_fmc.c + + + + + stm32l4xx_ll_gpio.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_gpio.c + + + + + stm32l4xx_ll_i2c.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_i2c.c + + + + + stm32l4xx_ll_lptim.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_lptim.c + + + + + stm32l4xx_ll_lpuart.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_lpuart.c + + + + + stm32l4xx_ll_opamp.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_opamp.c + + + + + stm32l4xx_ll_pwr.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_pwr.c + + + + + stm32l4xx_ll_rcc.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_rcc.c + + + + + stm32l4xx_ll_rng.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_rng.c + + + + + stm32l4xx_ll_rtc.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_rtc.c + + + + + stm32l4xx_ll_sdmmc.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_sdmmc.c + + + + + stm32l4xx_ll_spi.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_spi.c + + + + + stm32l4xx_ll_swpmi.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_swpmi.c + + + + + stm32l4xx_ll_tim.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_tim.c + + + + + stm32l4xx_ll_usart.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_usart.c + + + + + stm32l4xx_ll_usb.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_usb.c + + + + + stm32l4xx_ll_utils.c + 1 + ..\libraries\STM32L4xx_HAL\STM32L4xx_HAL_Driver\Src\stm32l4xx_ll_utils.c + + + + + + + + + + + +
    diff --git a/bsp/stm32/stm32l475-atk-pandora/rtconfig.h b/bsp/stm32/stm32l475-atk-pandora/rtconfig.h new file mode 100644 index 0000000000..82891ef0a0 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/rtconfig.h @@ -0,0 +1,173 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* Automatically generated file; DO NOT EDIT. */ +/* RT-Thread Configuration */ + +/* RT-Thread Kernel */ + +#define RT_NAME_MAX 8 +#define RT_ALIGN_SIZE 4 +#define RT_THREAD_PRIORITY_32 +#define RT_THREAD_PRIORITY_MAX 32 +#define RT_TICK_PER_SECOND 1000 +#define RT_USING_OVERFLOW_CHECK +#define RT_USING_HOOK +#define RT_USING_IDLE_HOOK +#define RT_IDEL_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 +#define RT_DEBUG + +/* 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 256 +#define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_VER_NUM 0x40000 +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M4 + +/* RT-Thread Components */ + +#define RT_USING_COMPONENTS_INIT +#define RT_USING_USER_MAIN +#define RT_MAIN_THREAD_STACK_SIZE 2048 +#define RT_MAIN_THREAD_PRIORITY 10 + +/* C++ features */ + + +/* Command shell */ + +#define RT_USING_FINSH +#define FINSH_THREAD_NAME "tshell" +#define FINSH_USING_HISTORY +#define FINSH_HISTORY_LINES 5 +#define FINSH_USING_SYMTAB +#define FINSH_USING_DESCRIPTION +#define FINSH_THREAD_PRIORITY 20 +#define FINSH_THREAD_STACK_SIZE 4096 +#define FINSH_CMD_SIZE 80 +#define FINSH_USING_MSH +#define FINSH_USING_MSH_DEFAULT +#define FINSH_USING_MSH_ONLY +#define FINSH_ARG_MAX 10 + +/* Device virtual file system */ + + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_PIPE_BUFSZ 512 +#define RT_USING_SERIAL +#define RT_SERIAL_USING_DMA +#define RT_USING_PIN + +/* Using WiFi */ + + +/* Using USB */ + + +/* POSIX layer and C standard library */ + + +/* Network */ + +/* Socket abstraction layer */ + + +/* light weight TCP/IP stack */ + + +/* Modbus master and slave stack */ + + +/* AT commands */ + + +/* VBUS(Virtual Software BUS) */ + + +/* Utilities */ + + +/* ARM CMSIS */ + + +/* RT-Thread online packages */ + +/* IoT - internet of things */ + + +/* Wi-Fi */ + +/* Marvell WiFi */ + + +/* Wiced WiFi */ + + +/* IoT Cloud */ + + +/* security packages */ + + +/* language packages */ + + +/* multimedia packages */ + + +/* tools packages */ + + +/* system packages */ + + +/* peripheral libraries and drivers */ + + +/* miscellaneous packages */ + + +/* samples: kernel and components samples */ + +#define SOC_FAMILY_STM32 +#define SOC_SERIES_STM32L4 + +/* Hardware Drivers Config */ + +#define SOC_STM32L475VE + +/* Onboard Peripheral Drivers */ + +#define BSP_USING_STLINK_TO_USART + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART1 + +/* Board extended module Drivers */ + + +#endif diff --git a/bsp/stm32/stm32l475-atk-pandora/rtconfig.py b/bsp/stm32/stm32l475-atk-pandora/rtconfig.py new file mode 100644 index 0000000000..50c1d8a0f7 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/rtconfig.py @@ -0,0 +1,133 @@ +import os + +# toolchains options +ARCH='arm' +CPU='cortex-m4' +CROSS_TOOL='gcc' + +# bsp lib config +BSP_LIBRARY_TYPE = None + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') + +# cross_tool provides the cross compiler +# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = r'C:\Users\XXYYZZ' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armcc' + EXEC_PATH = r'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iar' + EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' + +if PLATFORM == 'gcc': + # toolchains + PREFIX = 'arm-none-eabi-' + CC = PREFIX + 'gcc' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + DEVICE = ' -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -std=c99 -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rt-thread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M4.fp ' + CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict --scatter "board\linker_scripts\link.sct"' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' + + CFLAGS += ' -D__MICROLIB ' + AFLAGS += ' --pd "__MICROLIB SETA 1" ' + LFLAGS += ' --library_type=microlib ' + EXEC_PATH += '/ARM/ARMCC/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iar': + # toolchains + CC = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M4' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu Cortex-M4' + AFLAGS += ' --fpu VFPv4_sp' + AFLAGS += ' -S' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' diff --git a/bsp/stm32/stm32l475-atk-pandora/template.ewp b/bsp/stm32/stm32l475-atk-pandora/template.ewp new file mode 100644 index 0000000000..f390ad7bc1 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/template.ewp @@ -0,0 +1,2031 @@ + + + 3 + + rt-thread + + ARM + + 1 + + General + 3 + + 29 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 1 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 1 + + + + + + + BILINK + 0 + + + + + Release + + ARM + + 0 + + General + 3 + + 29 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICCARM + 2 + + 34 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AARM + 2 + + 10 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OBJCOPY + 0 + + 1 + 1 + 0 + + + + + + + + + CUSTOM + 3 + + + + 0 + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + ILINK + 0 + + 20 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + IARCHIVE + 0 + + 0 + 1 + 0 + + + + + + + BILINK + 0 + + + + diff --git a/bsp/stm32/stm32l475-atk-pandora/template.eww b/bsp/stm32/stm32l475-atk-pandora/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/stm32/stm32l475-atk-pandora/template.uvoptx b/bsp/stm32/stm32l475-atk-pandora/template.uvoptx new file mode 100644 index 0000000000..4c989e2d13 --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/template.uvoptx @@ -0,0 +1,196 @@ + + + + 1.0 + +
    ### uVision Project, (C) Keil Software
    + + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + ST-LINKIII-KEIL_SWO + -U066EFF495056867767053013 -O206 -SF4000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P2 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L475VETx$CMSIS\Flash\STM32L4xx_512.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0STM32L4xx_512 -FL080000 -FS08000000 -FP0($$Device:STM32L475VETx$CMSIS\Flash\STM32L4xx_512.FLM) + + + 0 + JL2CM3 + -U -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32L475VETx$CMSIS\Flash\STM32L4xx_512.FLM) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 0 + 2 + 10000000 + + + + + + Source Group 1 + 0 + 0 + 0 + 0 + + +
    diff --git a/bsp/stm32/stm32l475-atk-pandora/template.uvprojx b/bsp/stm32/stm32l475-atk-pandora/template.uvprojx new file mode 100644 index 0000000000..10c78ed37e --- /dev/null +++ b/bsp/stm32/stm32l475-atk-pandora/template.uvprojx @@ -0,0 +1,394 @@ + + + + 2.1 + +
    ### uVision Project, (C) Keil Software
    + + + + rt-thread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32L475VETx + STMicroelectronics + Keil.STM32L4xx_DFP.2.0.0 + http://www.keil.com/pack + IRAM(0x20000000,0x00018000) IRAM2(0x10000000,0x00008000) IROM(0x08000000,0x00080000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32L475VETx$CMSIS\Flash\STM32L4xx_512.FLM)) + 0 + $$Device:STM32L475VETx$Drivers\CMSIS\Device\ST\STM32L4xx\Include\stm32l4xx.h + + + + + + + + + + $$Device:STM32L475VETx$CMSIS\SVD\STM32L4x5.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rt-thread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + "" () + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 1 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 4 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x18000 + + + 1 + 0x8000000 + 0x80000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x80000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x18000 + + + 0 + 0x10000000 + 0x8000 + + + + + + 1 + 1 + 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 + + + + + + + + + + + Source Group 1 + + + + + + + + + + + +
    From 87e351538c4092899d0244ef751112a552e16076 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Mon, 17 Dec 2018 10:46:07 +0800 Subject: [PATCH 04/14] [bsp][stm32] add sdcard port file --- .../board/ports/sdcard_port.c | 65 ++++++++++++++++ .../board/ports/sdcard_port.c | 65 ++++++++++++++++ .../board/ports/sdcard_port.c | 65 ++++++++++++++++ .../board/ports/sdcard_port.c | 76 +++++++++++++++++++ 4 files changed, 271 insertions(+) create mode 100644 bsp/stm32/stm32f103-fire-arbitrary/board/ports/sdcard_port.c create mode 100644 bsp/stm32/stm32f407-atk-explorer/board/ports/sdcard_port.c create mode 100644 bsp/stm32/stm32f429-atk-apollo/board/ports/sdcard_port.c create mode 100644 bsp/stm32/stm32f429-fire-challenger/board/ports/sdcard_port.c diff --git a/bsp/stm32/stm32f103-fire-arbitrary/board/ports/sdcard_port.c b/bsp/stm32/stm32f103-fire-arbitrary/board/ports/sdcard_port.c new file mode 100644 index 0000000000..617379fd4e --- /dev/null +++ b/bsp/stm32/stm32f103-fire-arbitrary/board/ports/sdcard_port.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-12-13 balanceTWK add sdcard port file + */ + +#include + +#ifdef RT_USING_DFS + +#include +#include +#include + +#define DBG_ENABLE +#define DBG_SECTION_NAME "app.card" +#define DBG_COLOR + +#define DBG_LEVEL DBG_INFO +#include + +void sd_mount(void *parameter) +{ + while (1) + { + rt_thread_mdelay(500); + if(rt_device_find("sd0") != RT_NULL) + { + if (dfs_mount("sd0", "/", "elm", 0, 0) == RT_EOK) + { + LOG_I("sd card mount to '/'"); + break; + } + else + { + LOG_W("sd card mount to '/' failed!"); + } + } + } +} + +int stm32_sdcard_mount(void) +{ + rt_thread_t tid; + + tid = rt_thread_create("sd_mount", sd_mount, RT_NULL, + 1024, RT_THREAD_PRIORITY_MAX - 2, 20); + if (tid != RT_NULL) + { + rt_thread_startup(tid); + } + else + { + LOG_E("create sd_mount thread err!"); + } + return RT_EOK; +} +INIT_APP_EXPORT(stm32_sdcard_mount); + +#endif + diff --git a/bsp/stm32/stm32f407-atk-explorer/board/ports/sdcard_port.c b/bsp/stm32/stm32f407-atk-explorer/board/ports/sdcard_port.c new file mode 100644 index 0000000000..617379fd4e --- /dev/null +++ b/bsp/stm32/stm32f407-atk-explorer/board/ports/sdcard_port.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-12-13 balanceTWK add sdcard port file + */ + +#include + +#ifdef RT_USING_DFS + +#include +#include +#include + +#define DBG_ENABLE +#define DBG_SECTION_NAME "app.card" +#define DBG_COLOR + +#define DBG_LEVEL DBG_INFO +#include + +void sd_mount(void *parameter) +{ + while (1) + { + rt_thread_mdelay(500); + if(rt_device_find("sd0") != RT_NULL) + { + if (dfs_mount("sd0", "/", "elm", 0, 0) == RT_EOK) + { + LOG_I("sd card mount to '/'"); + break; + } + else + { + LOG_W("sd card mount to '/' failed!"); + } + } + } +} + +int stm32_sdcard_mount(void) +{ + rt_thread_t tid; + + tid = rt_thread_create("sd_mount", sd_mount, RT_NULL, + 1024, RT_THREAD_PRIORITY_MAX - 2, 20); + if (tid != RT_NULL) + { + rt_thread_startup(tid); + } + else + { + LOG_E("create sd_mount thread err!"); + } + return RT_EOK; +} +INIT_APP_EXPORT(stm32_sdcard_mount); + +#endif + diff --git a/bsp/stm32/stm32f429-atk-apollo/board/ports/sdcard_port.c b/bsp/stm32/stm32f429-atk-apollo/board/ports/sdcard_port.c new file mode 100644 index 0000000000..617379fd4e --- /dev/null +++ b/bsp/stm32/stm32f429-atk-apollo/board/ports/sdcard_port.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-12-13 balanceTWK add sdcard port file + */ + +#include + +#ifdef RT_USING_DFS + +#include +#include +#include + +#define DBG_ENABLE +#define DBG_SECTION_NAME "app.card" +#define DBG_COLOR + +#define DBG_LEVEL DBG_INFO +#include + +void sd_mount(void *parameter) +{ + while (1) + { + rt_thread_mdelay(500); + if(rt_device_find("sd0") != RT_NULL) + { + if (dfs_mount("sd0", "/", "elm", 0, 0) == RT_EOK) + { + LOG_I("sd card mount to '/'"); + break; + } + else + { + LOG_W("sd card mount to '/' failed!"); + } + } + } +} + +int stm32_sdcard_mount(void) +{ + rt_thread_t tid; + + tid = rt_thread_create("sd_mount", sd_mount, RT_NULL, + 1024, RT_THREAD_PRIORITY_MAX - 2, 20); + if (tid != RT_NULL) + { + rt_thread_startup(tid); + } + else + { + LOG_E("create sd_mount thread err!"); + } + return RT_EOK; +} +INIT_APP_EXPORT(stm32_sdcard_mount); + +#endif + diff --git a/bsp/stm32/stm32f429-fire-challenger/board/ports/sdcard_port.c b/bsp/stm32/stm32f429-fire-challenger/board/ports/sdcard_port.c new file mode 100644 index 0000000000..e29a0b8557 --- /dev/null +++ b/bsp/stm32/stm32f429-fire-challenger/board/ports/sdcard_port.c @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-12-13 balanceTWK add sdcard port file + */ + +#include + +#ifdef RT_USING_DFS + +#include +#include +#include +#include "drv_gpio.h" + +#define DBG_ENABLE +#define DBG_SECTION_NAME "app.card" +#define DBG_COLOR + +#define DBG_LEVEL DBG_INFO +#include + +#define WIFI_RESET_PIN GET_PIN(G, 9) + +int ewm1062_disable(void) +{ + rt_pin_mode(WIFI_RESET_PIN, PIN_MODE_OUTPUT); + rt_pin_write(WIFI_RESET_PIN,PIN_LOW); + return RT_EOK; +} +INIT_BOARD_EXPORT(ewm1062_disable); + +void sd_mount(void *parameter) +{ + while (1) + { + rt_thread_mdelay(500); + if(rt_device_find("sd0") != RT_NULL) + { + if (dfs_mount("sd0", "/", "elm", 0, 0) == RT_EOK) + { + LOG_I("sd card mount to '/'"); + break; + } + else + { + LOG_W("sd card mount to '/' failed!"); + } + } + } +} + +int stm32_sdcard_mount(void) +{ + rt_thread_t tid; + + tid = rt_thread_create("sd_mount", sd_mount, RT_NULL, + 1024, RT_THREAD_PRIORITY_MAX - 2, 20); + if (tid != RT_NULL) + { + rt_thread_startup(tid); + } + else + { + LOG_E("create sd_mount thread err!"); + } + return RT_EOK; +} +INIT_APP_EXPORT(stm32_sdcard_mount); + +#endif + From 355783c5faf4a1b594a07b51bff2f605af2c015d Mon Sep 17 00:00:00 2001 From: SummerGift Date: Mon, 17 Dec 2018 11:49:57 +0800 Subject: [PATCH 05/14] [bsp][stm32] modify doc for atk-pandora --- bsp/stm32/README.md | 1 + bsp/stm32/stm32l475-atk-pandora/board/Kconfig | 5 ----- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/bsp/stm32/README.md b/bsp/stm32/README.md index a973b8732d..1ffe207b1a 100644 --- a/bsp/stm32/README.md +++ b/bsp/stm32/README.md @@ -9,6 +9,7 @@ STM32 系列 BSP 目前支持情况如下表所示: | [stm32f407-atk-explorer](stm32f407-atk-explorer/) | 正点原子 F407 探索者开发板 | | [stm32f429-atk-apollo](stm32f429-atk-apollo/) | 正点原子 F429 阿波罗开发板 | | [stm32f429-fire-challenger](stm32f429-fire-challenger/) | 野火 F429 挑战者开发板 | +| [stm32l475-atk-pandora](stm32l475-atk-pandora/) | 正点原子 L475 潘多拉 IoT 开发板 | 了解每个 BSP 的详细情况可以阅读该 BSP 下的 readme 文件,如需使用 BSP 更多功能可参考 docs 文件夹下提供的说明文档: diff --git a/bsp/stm32/stm32l475-atk-pandora/board/Kconfig b/bsp/stm32/stm32l475-atk-pandora/board/Kconfig index 61f2c7db74..a389b5beca 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/Kconfig +++ b/bsp/stm32/stm32l475-atk-pandora/board/Kconfig @@ -47,11 +47,6 @@ menu "On-chip Peripheral Drivers" select RT_USING_SERIAL default n - config BSP_USING_UART3 - bool "Enable UART3" - select RT_USING_SERIAL - default n - config BSP_UART_USING_DMA_RX bool "Enable UART RX DMA support" default n From 9cd881bf056c63ab10739f2eb7bef5b9e22254fa Mon Sep 17 00:00:00 2001 From: SummerGift Date: Tue, 18 Dec 2018 10:37:57 +0800 Subject: [PATCH 06/14] [bsp][stm32] fix some error --- bsp/stm32/stm32f103-fire-arbitrary/board/ports/sdcard_port.c | 4 ++-- bsp/stm32/stm32l475-atk-pandora/board/linker_scripts/link.icf | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/bsp/stm32/stm32f103-fire-arbitrary/board/ports/sdcard_port.c b/bsp/stm32/stm32f103-fire-arbitrary/board/ports/sdcard_port.c index 617379fd4e..16c7a9e454 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/board/ports/sdcard_port.c +++ b/bsp/stm32/stm32f103-fire-arbitrary/board/ports/sdcard_port.c @@ -10,7 +10,7 @@ #include -#ifdef RT_USING_DFS +#ifdef BSP_USING_SDCARD #include #include @@ -61,5 +61,5 @@ int stm32_sdcard_mount(void) } INIT_APP_EXPORT(stm32_sdcard_mount); -#endif +#endif /* BSP_USING_SDCARD */ diff --git a/bsp/stm32/stm32l475-atk-pandora/board/linker_scripts/link.icf b/bsp/stm32/stm32l475-atk-pandora/board/linker_scripts/link.icf index 11d1d86df5..b89cc8fa4d 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/linker_scripts/link.icf +++ b/bsp/stm32/stm32l475-atk-pandora/board/linker_scripts/link.icf @@ -30,4 +30,4 @@ place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; place in ROM_region { readonly }; place in RAM1_region { section .sram }; -place in RAM2_region { readwrite, block CSTACK}; +place in RAM2_region { readwrite, last block CSTACK}; From cf7292d4e4ebe5be08b6ffad5ebc3d023b568498 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Tue, 18 Dec 2018 14:07:38 +0800 Subject: [PATCH 07/14] [bsp][stm32] SD card micro BSP_USING_SDCARD --- bsp/stm32/stm32f407-atk-explorer/board/ports/sdcard_port.c | 4 ++-- bsp/stm32/stm32f429-atk-apollo/board/ports/sdcard_port.c | 4 ++-- bsp/stm32/stm32f429-fire-challenger/board/ports/sdcard_port.c | 4 ++-- bsp/stm32/stm32l475-atk-pandora/board/ports/sdcard_port.c | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/bsp/stm32/stm32f407-atk-explorer/board/ports/sdcard_port.c b/bsp/stm32/stm32f407-atk-explorer/board/ports/sdcard_port.c index 617379fd4e..3026357b5c 100644 --- a/bsp/stm32/stm32f407-atk-explorer/board/ports/sdcard_port.c +++ b/bsp/stm32/stm32f407-atk-explorer/board/ports/sdcard_port.c @@ -10,7 +10,7 @@ #include -#ifdef RT_USING_DFS +#ifdef BSP_USING_SDCARD #include #include @@ -61,5 +61,5 @@ int stm32_sdcard_mount(void) } INIT_APP_EXPORT(stm32_sdcard_mount); -#endif +#endif /* BSP_USING_SDCARD */ diff --git a/bsp/stm32/stm32f429-atk-apollo/board/ports/sdcard_port.c b/bsp/stm32/stm32f429-atk-apollo/board/ports/sdcard_port.c index 617379fd4e..3026357b5c 100644 --- a/bsp/stm32/stm32f429-atk-apollo/board/ports/sdcard_port.c +++ b/bsp/stm32/stm32f429-atk-apollo/board/ports/sdcard_port.c @@ -10,7 +10,7 @@ #include -#ifdef RT_USING_DFS +#ifdef BSP_USING_SDCARD #include #include @@ -61,5 +61,5 @@ int stm32_sdcard_mount(void) } INIT_APP_EXPORT(stm32_sdcard_mount); -#endif +#endif /* BSP_USING_SDCARD */ diff --git a/bsp/stm32/stm32f429-fire-challenger/board/ports/sdcard_port.c b/bsp/stm32/stm32f429-fire-challenger/board/ports/sdcard_port.c index e29a0b8557..0a84162150 100644 --- a/bsp/stm32/stm32f429-fire-challenger/board/ports/sdcard_port.c +++ b/bsp/stm32/stm32f429-fire-challenger/board/ports/sdcard_port.c @@ -10,7 +10,7 @@ #include -#ifdef RT_USING_DFS +#ifdef BSP_USING_SDCARD #include #include @@ -72,5 +72,5 @@ int stm32_sdcard_mount(void) } INIT_APP_EXPORT(stm32_sdcard_mount); -#endif +#endif /* BSP_USING_SDCARD */ diff --git a/bsp/stm32/stm32l475-atk-pandora/board/ports/sdcard_port.c b/bsp/stm32/stm32l475-atk-pandora/board/ports/sdcard_port.c index 8fdd588372..9d40589756 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/ports/sdcard_port.c +++ b/bsp/stm32/stm32l475-atk-pandora/board/ports/sdcard_port.c @@ -10,7 +10,7 @@ #include -#ifdef RT_USING_DFS +#ifdef BSP_USING_SDCARD #include #include @@ -71,5 +71,5 @@ static int rt_hw_spi1_tfcard(void) } INIT_DEVICE_EXPORT(rt_hw_spi1_tfcard); -#endif +#endif /* BSP_USING_SDCARD */ From d830b6cbf8ccb11ad246661c68d145e6bf4d0b71 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Thu, 20 Dec 2018 14:00:33 +0800 Subject: [PATCH 08/14] [bsp][stm32] modify drv_config.h --- bsp/stm32/libraries/HAL_Drivers/drv_config.h | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_config.h b/bsp/stm32/libraries/HAL_Drivers/drv_config.h index f6bcdedb2c..5667b6d05d 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drv_config.h @@ -18,10 +18,16 @@ #include "f1/uart_config.h" #include "f1/spi_config.h" #include "f1/adc_config.h" +#include "f1/tim_config.h" +#include "f1/sdio_config.h" +#include "f1/pwm_config.h" #elif defined(SOC_SERIES_STM32F4) #include "f4/uart_config.h" #include "f4/spi_config.h" #include "f4/adc_config.h" +#include "f4/tim_config.h" +#include "f4/sdio_config.h" +#include "f4/pwm_config.h" #elif defined(SOC_SERIES_STM32F7) #include "f7/uart_config.h" #include "f7/spi_config.h" @@ -30,6 +36,8 @@ #include "l4/uart_config.h" #include "l4/spi_config.h" #include "l4/adc_config.h" +#include "l4/tim_config.h" +#include "l4/pwm_config.h" #endif #endif From 63dbe799120efbed2db25cf3d169086ff389b613 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Thu, 20 Dec 2018 14:50:07 +0800 Subject: [PATCH 09/14] [bsp][stm32] Sync SConscript --- bsp/stm32/libraries/STM32F1xx_HAL/SConscript | 113 ++++++++------- bsp/stm32/libraries/STM32F4xx_HAL/SConscript | 124 +++++++++------- bsp/stm32/libraries/STM32L4xx_HAL/SConscript | 143 ++++++++----------- 3 files changed, 196 insertions(+), 184 deletions(-) diff --git a/bsp/stm32/libraries/STM32F1xx_HAL/SConscript b/bsp/stm32/libraries/STM32F1xx_HAL/SConscript index 4ee2fabd48..37101b6c74 100644 --- a/bsp/stm32/libraries/STM32F1xx_HAL/SConscript +++ b/bsp/stm32/libraries/STM32F1xx_HAL/SConscript @@ -8,69 +8,80 @@ cwd = GetCurrentDir() # The set of source files associated with this SConscript file. src = Split(""" CMSIS/Device/ST/STM32F1xx/Source/Templates/system_stm32f1xx.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_crc.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_irda.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_iwdg.c STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rtc.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rtc_ex.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_smartcard.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi_ex.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_usart.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_wwdg.c STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_adc.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_crc.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_dac.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_dma.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_exti.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_fsmc.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_gpio.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_i2c.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_pwr.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_rcc.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_rtc.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_sdmmc.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_spi.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_tim.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_usart.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_usb.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_utils.c STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cec.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_can.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dac.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dac_ex.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_eth.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_hcd.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2s.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_mmc.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_sd.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_nand.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pccard.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_nor.c STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_sram.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pcd.c -STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pcd_ex.c """) -#device options + +if GetDepend(['RT_USING_PIN']): + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c'] + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c'] + +if GetDepend(['RT_USING_SERIAL']): + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c'] + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_usart.c'] + +if GetDepend(['RT_USING_I2C']): + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2c.c'] + +if GetDepend(['RT_USING_SPI']): + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi.c'] + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_spi_ex.c'] + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_spi.c'] + +if GetDepend(['RT_USING_USB_HOST']) or GetDepend(['RT_USING_USB_DEVICE']): + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pcd.c'] + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pcd_ex.c'] + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_ll_usb.c'] + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_hcd.c'] + +if GetDepend(['RT_USING_CAN']): + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_can.c'] + +if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']): + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c'] + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c'] + +if GetDepend(['BSP_USING_ETH']): + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_eth.c'] + +if GetDepend(['RT_USING_ADC']): + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc.c'] + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_adc_ex.c'] + +if GetDepend(['RT_USING_RTC']): + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rtc.c'] + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rtc_ex.c'] + +if GetDepend(['RT_USING_WDT']): + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_iwdg.c'] + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_wwdg.c'] + +if GetDepend(['RT_USING_SDIO']): + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_mmc.c'] + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_sd.c'] + +if GetDepend(['RT_USING_AUDIO']): + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_i2s.c'] + +if GetDepend(['RT_USING_MTD_NOR']): + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_nor.c'] + +if GetDepend(['RT_USING_MTD_NAND']): + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_nand.c'] + +if GetDepend(['BSP_USING_ON_CHIP_FLASH']): + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c'] + src += ['STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c'] path = [cwd + '/CMSIS/Device/ST/STM32F1xx/Include', - cwd + '/STM32F1xx_HAL_Driver/Inc', + cwd + '/STM32F1xx_HAL_Driver/Inc', cwd + '/CMSIS/Include'] if GetDepend(['RT_USING_RTT_CMSIS']): diff --git a/bsp/stm32/libraries/STM32F4xx_HAL/SConscript b/bsp/stm32/libraries/STM32F4xx_HAL/SConscript index 9b16e71735..375bf546f8 100644 --- a/bsp/stm32/libraries/STM32F4xx_HAL/SConscript +++ b/bsp/stm32/libraries/STM32F4xx_HAL/SConscript @@ -9,74 +9,92 @@ cwd = GetCurrentDir() src = Split(''' CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_can.c STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cec.c STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_crc.c STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cryp.c STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cryp_ex.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac_ex.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dcmi.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dcmi_ex.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dfsdm.c STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.c STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dsi.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_fmpi2c.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_fmpi2c_ex.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hash.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hash_ex.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hcd.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s_ex.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_irda.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_lptim.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc_ex.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nand.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nor.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pccard.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd_ex.c STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_qspi.c STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rng.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sai.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sai_ex.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_smartcard.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spdifrx.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sram.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_usart.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_wwdg.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fsmc.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c -STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c ''') +if GetDepend(['RT_USING_PIN']): + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c'] + +if GetDepend(['RT_USING_SERIAL']): + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c'] + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_usart.c'] + +if GetDepend(['RT_USING_I2C']): + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c'] + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c'] + +if GetDepend(['RT_USING_SPI']): + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c'] + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_qspi.c'] + +if GetDepend(['RT_USING_USB_HOST']) or GetDepend(['RT_USING_USB_DEVICE']): + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pccard.c'] + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c'] + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd_ex.c'] + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hcd.c'] + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c'] + +if GetDepend(['RT_USING_CAN']): + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_can.c'] + +if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']): + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c'] + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c'] + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_lptim.c'] + +if GetDepend(['BSP_USING_ETH']): + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c'] + +if GetDepend(['RT_USING_ADC']): + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c'] + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c'] + +if GetDepend(['RT_USING_RTC']): + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c'] + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c'] + +if GetDepend(['RT_USING_WDT']): + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c'] + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_wwdg.c'] + +if GetDepend(['RT_USING_SDIO']): + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c'] + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.c'] + +if GetDepend(['RT_USING_AUDIO']): + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s.c'] + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s_ex.c'] + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sai.c'] + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sai_ex.c'] + +if GetDepend(['RT_USING_MTD_NOR']): + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nor.c'] + +if GetDepend(['RT_USING_MTD_NAND']): + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nand.c'] + +if GetDepend(['BSP_USING_SDRAM']): + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c'] + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fsmc.c'] + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c'] + +if GetDepend(['BSP_USING_ON_CHIP_FLASH']): + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c'] + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c'] + src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c'] + path = [cwd + '/STM32F4xx_HAL_Driver/Inc', cwd + '/CMSIS/Device/ST/STM32F4xx/Include', cwd + '/CMSIS/Include'] diff --git a/bsp/stm32/libraries/STM32L4xx_HAL/SConscript b/bsp/stm32/libraries/STM32L4xx_HAL/SConscript index f8baad95d4..5d6f0d9032 100644 --- a/bsp/stm32/libraries/STM32L4xx_HAL/SConscript +++ b/bsp/stm32/libraries/STM32L4xx_HAL/SConscript @@ -9,103 +9,86 @@ cwd = GetCurrentDir() src = Split(''' CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_can.c STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_comp.c STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_crc.c STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_crc_ex.c STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cryp.c STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cryp_ex.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dac.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dac_ex.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dcmi.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dfsdm.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dfsdm_ex.c STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma2d.c STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dsi.c STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_firewall.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gfxmmu.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_hash.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_hash_ex.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_hcd.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_irda.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_iwdg.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_lcd.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_lptim.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_ltdc.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_ltdc_ex.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_nand.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_nor.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_opamp.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_opamp_ex.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_ospi.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd_ex.c STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_qspi.c STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rng.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc_ex.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sai.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sai_ex.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sd.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sd_ex.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_smartcard.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_smartcard_ex.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_smbus.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sram.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_swpmi.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tsc.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_usart.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_usart_ex.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_wwdg.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_adc.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_comp.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_crc.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_crs.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_dac.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_dma.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_dma2d.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_exti.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_fmc.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_gpio.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_i2c.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_lptim.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_lpuart.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_opamp.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_pwr.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_rcc.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_rng.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_rtc.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_sdmmc.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_spi.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_swpmi.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_tim.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_usart.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_usb.c -STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_utils.c ''') +if GetDepend(['RT_USING_PIN']): + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c'] + +if GetDepend(['RT_USING_SERIAL']): + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c'] + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c'] + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_usart.c'] + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_usart_ex.c'] + +if GetDepend(['RT_USING_I2C']): + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c'] + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c'] + +if GetDepend(['RT_USING_SPI']): + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c'] + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c'] + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_qspi.c'] + +if GetDepend(['RT_USING_USB_HOST']) or GetDepend(['RT_USING_USB_DEVICE']): + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_hcd.c'] + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c'] + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd_ex.c'] + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_ll_usb.c'] + +if GetDepend(['RT_USING_CAN']): + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_can.c'] + +if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']): + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_lptim.c'] + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c'] + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c'] + +if GetDepend(['RT_USING_ADC']): + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c'] + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c'] + +if GetDepend(['RT_USING_RTC']): + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc.c'] + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rtc_ex.c'] + +if GetDepend(['RT_USING_WDT']): + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_iwdg.c'] + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_wwdg.c'] + +if GetDepend(['RT_USING_SDIO']): + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sd.c'] + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sd_ex.c'] + +if GetDepend(['RT_USING_AUDIO']): + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sai.c'] + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_sai_ex.c'] + +if GetDepend(['RT_USING_MTD_NOR']): + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_nor.c'] + +if GetDepend(['RT_USING_MTD_NAND']): + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_nand.c'] + +if GetDepend(['BSP_USING_ON_CHIP_FLASH']): + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c'] + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c'] + src += ['STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c'] + path = [cwd + '/STM32L4xx_HAL_Driver/Inc', cwd + '/CMSIS/Device/ST/STM32L4xx/Include', cwd + '/CMSIS/Include'] From d5c7d8d41fe3a1d7b82bb16b42096660036bf451 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Thu, 20 Dec 2018 14:52:32 +0800 Subject: [PATCH 10/14] [bsp][stm32] Sync kconfig --- bsp/stm32/libraries/templates/stm32f7xx/board/Kconfig | 4 ---- bsp/stm32/stm32f103-atk-nano/board/Kconfig | 4 ---- bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig | 4 ---- bsp/stm32/stm32f407-atk-explorer/board/Kconfig | 4 ---- bsp/stm32/stm32f429-atk-apollo/board/Kconfig | 4 ---- bsp/stm32/stm32f429-fire-challenger/board/Kconfig | 4 ---- bsp/stm32/stm32l475-atk-pandora/board/Kconfig | 4 ---- 7 files changed, 28 deletions(-) diff --git a/bsp/stm32/libraries/templates/stm32f7xx/board/Kconfig b/bsp/stm32/libraries/templates/stm32f7xx/board/Kconfig index a15665c848..02454235c7 100644 --- a/bsp/stm32/libraries/templates/stm32f7xx/board/Kconfig +++ b/bsp/stm32/libraries/templates/stm32f7xx/board/Kconfig @@ -21,10 +21,6 @@ menu "On-chip Peripheral Drivers" select RT_USING_SERIAL default y - config BSP_UART_USING_DMA_RX - bool "Enable UART RX DMA support" - default n - config BSP_USING_SPI1 bool "Enable SPI1 BUS" select RT_USING_SPI diff --git a/bsp/stm32/stm32f103-atk-nano/board/Kconfig b/bsp/stm32/stm32f103-atk-nano/board/Kconfig index 2b6d6b3fc1..20cbf0ccc6 100644 --- a/bsp/stm32/stm32f103-atk-nano/board/Kconfig +++ b/bsp/stm32/stm32f103-atk-nano/board/Kconfig @@ -54,10 +54,6 @@ menu "On-chip Peripheral Drivers" select RT_USING_SERIAL default n - config BSP_UART_USING_DMA_RX - bool "Enable UART RX DMA support" - default n - menuconfig BSP_USING_TIM bool "Enable timer" default n diff --git a/bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig b/bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig index ae55be5fab..4227ae9bf5 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig +++ b/bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig @@ -103,10 +103,6 @@ menu "On-chip Peripheral Drivers" bool "Enable UART3" select RT_USING_SERIAL default n - - config BSP_UART_USING_DMA_RX - bool "Enable UART RX DMA support" - default n config BSP_USING_ON_CHIP_FLASH bool "Enable on-chip FLASH" diff --git a/bsp/stm32/stm32f407-atk-explorer/board/Kconfig b/bsp/stm32/stm32f407-atk-explorer/board/Kconfig index 319cb49c92..0f22133a55 100644 --- a/bsp/stm32/stm32f407-atk-explorer/board/Kconfig +++ b/bsp/stm32/stm32f407-atk-explorer/board/Kconfig @@ -118,10 +118,6 @@ menu "On-chip Peripheral Drivers" bool "Enable on-chip FLASH" default n - config BSP_UART_USING_DMA_RX - bool "Enable UART RX DMA support" - default n - config BSP_USING_SPI1 bool "Enable SPI1 BUS" select RT_USING_SPI diff --git a/bsp/stm32/stm32f429-atk-apollo/board/Kconfig b/bsp/stm32/stm32f429-atk-apollo/board/Kconfig index 9d85754053..c88b1efec9 100644 --- a/bsp/stm32/stm32f429-atk-apollo/board/Kconfig +++ b/bsp/stm32/stm32f429-atk-apollo/board/Kconfig @@ -82,10 +82,6 @@ menu "On-chip Peripheral Drivers" select RT_USING_SERIAL default n - config BSP_UART_USING_DMA_RX - bool "Enable UART RX DMA support" - default y - config BSP_USING_ON_CHIP_FLASH bool "Enable on-chip FLASH" default n diff --git a/bsp/stm32/stm32f429-fire-challenger/board/Kconfig b/bsp/stm32/stm32f429-fire-challenger/board/Kconfig index 0323f139ce..e1c6928049 100644 --- a/bsp/stm32/stm32f429-fire-challenger/board/Kconfig +++ b/bsp/stm32/stm32f429-fire-challenger/board/Kconfig @@ -92,10 +92,6 @@ menu "On-chip Peripheral Drivers" select RT_USING_SERIAL default n - config BSP_UART_USING_DMA_RX - bool "Enable UART RX DMA support" - default n - config BSP_USING_ON_CHIP_FLASH bool "Enable on-chip FLASH" default n diff --git a/bsp/stm32/stm32l475-atk-pandora/board/Kconfig b/bsp/stm32/stm32l475-atk-pandora/board/Kconfig index a389b5beca..cf4bf952f4 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/Kconfig +++ b/bsp/stm32/stm32l475-atk-pandora/board/Kconfig @@ -46,10 +46,6 @@ menu "On-chip Peripheral Drivers" bool "Enable UART2" select RT_USING_SERIAL default n - - config BSP_UART_USING_DMA_RX - bool "Enable UART RX DMA support" - default n config BSP_USING_ON_CHIP_FLASH bool "Enable on-chip FLASH" From 938bbb030d5c94e845257e46e020d6bbab8b4fea Mon Sep 17 00:00:00 2001 From: SummerGift Date: Thu, 20 Dec 2018 14:53:46 +0800 Subject: [PATCH 11/14] [bsp][stm32] optimize main func --- .../libraries/templates/stm32f10x/applications/main.c | 11 ++++++++++- bsp/stm32/libraries/templates/stm32f10x/board/board.c | 9 --------- bsp/stm32/libraries/templates/stm32f10x/board/board.h | 6 ------ .../libraries/templates/stm32f4xx/applications/main.c | 11 ++++++++++- bsp/stm32/libraries/templates/stm32f4xx/board/board.c | 9 --------- bsp/stm32/libraries/templates/stm32f4xx/board/board.h | 6 ------ .../libraries/templates/stm32l4xx/applications/main.c | 11 ++++++++++- bsp/stm32/libraries/templates/stm32l4xx/board/board.c | 9 --------- bsp/stm32/libraries/templates/stm32l4xx/board/board.h | 6 ------ bsp/stm32/stm32f103-atk-nano/applications/main.c | 11 ++++++++++- bsp/stm32/stm32f103-atk-nano/board/board.c | 9 +-------- bsp/stm32/stm32f103-atk-nano/board/board.h | 7 ------- .../stm32f103-fire-arbitrary/applications/main.c | 11 ++++++++++- bsp/stm32/stm32f103-fire-arbitrary/board/board.c | 11 ----------- bsp/stm32/stm32f103-fire-arbitrary/board/board.h | 7 ------- bsp/stm32/stm32f407-atk-explorer/applications/main.c | 11 ++++++++++- bsp/stm32/stm32f407-atk-explorer/board/board.c | 11 ----------- bsp/stm32/stm32f407-atk-explorer/board/board.h | 7 ------- bsp/stm32/stm32f429-atk-apollo/applications/main.c | 11 ++++++++++- bsp/stm32/stm32f429-atk-apollo/board/board.c | 11 ----------- bsp/stm32/stm32f429-atk-apollo/board/board.h | 9 --------- .../stm32f429-fire-challenger/applications/main.c | 11 ++++++++++- bsp/stm32/stm32f429-fire-challenger/board/board.c | 11 ----------- bsp/stm32/stm32f429-fire-challenger/board/board.h | 8 -------- bsp/stm32/stm32l475-atk-pandora/applications/main.c | 11 ++++++++++- bsp/stm32/stm32l475-atk-pandora/board/board.c | 9 --------- bsp/stm32/stm32l475-atk-pandora/board/board.h | 8 -------- 27 files changed, 91 insertions(+), 161 deletions(-) diff --git a/bsp/stm32/libraries/templates/stm32f10x/applications/main.c b/bsp/stm32/libraries/templates/stm32f10x/applications/main.c index 87a07a6246..7c40c1518d 100644 --- a/bsp/stm32/libraries/templates/stm32f10x/applications/main.c +++ b/bsp/stm32/libraries/templates/stm32f10x/applications/main.c @@ -11,14 +11,23 @@ #include #include #include +#include "drv_gpio.h" +/* defined the LED0 pin: PB1 */ +#define LED0_PIN GET_PIN(B, 1) 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, !rt_pin_read(LED0_PIN)); + 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/libraries/templates/stm32f10x/board/board.c b/bsp/stm32/libraries/templates/stm32f10x/board/board.c index ac55193461..36c127c5b7 100644 --- a/bsp/stm32/libraries/templates/stm32f10x/board/board.c +++ b/bsp/stm32/libraries/templates/stm32f10x/board/board.c @@ -51,12 +51,3 @@ void MX_GPIO_Init(void) __HAL_RCC_GPIOA_CLK_ENABLE(); } - -#ifdef RT_USING_PIN -// int board_pin_init(void) -// { -// rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); -// return 0; -// } -// INIT_BOARD_EXPORT(board_pin_init); -#endif /* RT_USING_PIN */ diff --git a/bsp/stm32/libraries/templates/stm32f10x/board/board.h b/bsp/stm32/libraries/templates/stm32f10x/board/board.h index cc2079f0e7..1c00e71dca 100644 --- a/bsp/stm32/libraries/templates/stm32f10x/board/board.h +++ b/bsp/stm32/libraries/templates/stm32f10x/board/board.h @@ -15,12 +15,6 @@ #include #include "drv_common.h" -#ifdef BSP_USING_GPIO -#include "drv_gpio.h" -/* Board Pin definitions */ -// #define LED0_PIN GET_PIN(C, 0) -#endif - /* Internal SRAM memory size[Kbytes] <8-64>, Default: 64*/ #define STM32_SRAM_SIZE 20 #define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024) diff --git a/bsp/stm32/libraries/templates/stm32f4xx/applications/main.c b/bsp/stm32/libraries/templates/stm32f4xx/applications/main.c index 87a07a6246..7c40c1518d 100644 --- a/bsp/stm32/libraries/templates/stm32f4xx/applications/main.c +++ b/bsp/stm32/libraries/templates/stm32f4xx/applications/main.c @@ -11,14 +11,23 @@ #include #include #include +#include "drv_gpio.h" +/* defined the LED0 pin: PB1 */ +#define LED0_PIN GET_PIN(B, 1) 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, !rt_pin_read(LED0_PIN)); + 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/libraries/templates/stm32f4xx/board/board.c b/bsp/stm32/libraries/templates/stm32f4xx/board/board.c index 928bbdbbde..b3cf3b0754 100644 --- a/bsp/stm32/libraries/templates/stm32f4xx/board/board.c +++ b/bsp/stm32/libraries/templates/stm32f4xx/board/board.c @@ -56,12 +56,3 @@ void MX_GPIO_Init(void) __HAL_RCC_GPIOA_CLK_ENABLE(); } - -#ifdef RT_USING_PIN -// int board_pin_init(void) -// { -// rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); -// return 0; -// } -// INIT_BOARD_EXPORT(board_pin_init); -#endif /* RT_USING_PIN */ diff --git a/bsp/stm32/libraries/templates/stm32f4xx/board/board.h b/bsp/stm32/libraries/templates/stm32f4xx/board/board.h index 8cb36267f7..f7944b4ed7 100644 --- a/bsp/stm32/libraries/templates/stm32f4xx/board/board.h +++ b/bsp/stm32/libraries/templates/stm32f4xx/board/board.h @@ -15,12 +15,6 @@ #include #include "drv_common.h" -#ifdef BSP_USING_GPIO -#include "drv_gpio.h" -/* Board Pin definitions */ -// #define LED0_PIN GET_PIN(C, 0) -#endif - #define STM32_SRAM_SIZE 128 #define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024) diff --git a/bsp/stm32/libraries/templates/stm32l4xx/applications/main.c b/bsp/stm32/libraries/templates/stm32l4xx/applications/main.c index 87a07a6246..7c40c1518d 100644 --- a/bsp/stm32/libraries/templates/stm32l4xx/applications/main.c +++ b/bsp/stm32/libraries/templates/stm32l4xx/applications/main.c @@ -11,14 +11,23 @@ #include #include #include +#include "drv_gpio.h" +/* defined the LED0 pin: PB1 */ +#define LED0_PIN GET_PIN(B, 1) 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, !rt_pin_read(LED0_PIN)); + 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/libraries/templates/stm32l4xx/board/board.c b/bsp/stm32/libraries/templates/stm32l4xx/board/board.c index d0e25eaf04..5f8113f4d7 100644 --- a/bsp/stm32/libraries/templates/stm32l4xx/board/board.c +++ b/bsp/stm32/libraries/templates/stm32l4xx/board/board.c @@ -66,12 +66,3 @@ void MX_GPIO_Init(void) __HAL_RCC_GPIOA_CLK_ENABLE(); } - -#ifdef RT_USING_PIN -// int board_pin_init(void) -// { -// rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); -// return 0; -// } -// INIT_BOARD_EXPORT(board_pin_init); -#endif /* RT_USING_PIN */ diff --git a/bsp/stm32/libraries/templates/stm32l4xx/board/board.h b/bsp/stm32/libraries/templates/stm32l4xx/board/board.h index 2b3e8b6cb1..29e1ba4267 100644 --- a/bsp/stm32/libraries/templates/stm32l4xx/board/board.h +++ b/bsp/stm32/libraries/templates/stm32l4xx/board/board.h @@ -15,12 +15,6 @@ #include #include "drv_common.h" -#ifdef BSP_USING_GPIO -#include "drv_gpio.h" -/* Board Pin definitions */ -// #define LED0_PIN GET_PIN(C, 0) -#endif - #define STM32_SRAM_SIZE 96 #define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024) diff --git a/bsp/stm32/stm32f103-atk-nano/applications/main.c b/bsp/stm32/stm32f103-atk-nano/applications/main.c index 61f0263ca2..e5b96d8280 100644 --- a/bsp/stm32/stm32f103-atk-nano/applications/main.c +++ b/bsp/stm32/stm32f103-atk-nano/applications/main.c @@ -11,14 +11,23 @@ #include #include #include +#include "drv_gpio.h" +/* defined the LED0 pin: PC0 */ +#define LED0_PIN GET_PIN(C, 0) 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, !rt_pin_read(LED0_PIN)); + 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/stm32f103-atk-nano/board/board.c b/bsp/stm32/stm32f103-atk-nano/board/board.c index 28bb36889c..981fffc85e 100644 --- a/bsp/stm32/stm32f103-atk-nano/board/board.c +++ b/bsp/stm32/stm32f103-atk-nano/board/board.c @@ -62,11 +62,4 @@ void MX_GPIO_Init(void) __HAL_RCC_GPIOA_CLK_ENABLE(); } -#ifdef RT_USING_PIN -int board_pin_init(void) -{ - rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); - return 0; -} -INIT_BOARD_EXPORT(board_pin_init); -#endif /* RT_USING_PIN */ + diff --git a/bsp/stm32/stm32f103-atk-nano/board/board.h b/bsp/stm32/stm32f103-atk-nano/board/board.h index 410414c202..a22d23632a 100644 --- a/bsp/stm32/stm32f103-atk-nano/board/board.h +++ b/bsp/stm32/stm32f103-atk-nano/board/board.h @@ -15,13 +15,6 @@ #include #include "drv_common.h" -#ifdef BSP_USING_GPIO -#include "drv_gpio.h" -/* Board Pin definitions */ -#define LED0_PIN GET_PIN(C, 0) -#define LED1_PIN GET_PIN(C, 1) -#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)) diff --git a/bsp/stm32/stm32f103-fire-arbitrary/applications/main.c b/bsp/stm32/stm32f103-fire-arbitrary/applications/main.c index 2042a40378..4024c1ae3f 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/applications/main.c +++ b/bsp/stm32/stm32f103-fire-arbitrary/applications/main.c @@ -11,14 +11,23 @@ #include #include #include +#include "drv_gpio.h" +/* defined the LED0 pin: PF7 */ +#define LED0_PIN GET_PIN(F, 7) 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, !rt_pin_read(LED0_PIN)); + 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/stm32f103-fire-arbitrary/board/board.c b/bsp/stm32/stm32f103-fire-arbitrary/board/board.c index 3188bdb616..829addae08 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/board/board.c +++ b/bsp/stm32/stm32f103-fire-arbitrary/board/board.c @@ -63,14 +63,3 @@ void MX_GPIO_Init(void) __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); } - -#ifdef RT_USING_PIN -int board_pin_init(void) -{ - rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); - rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); - - return 0; -} -INIT_BOARD_EXPORT(board_pin_init); -#endif /* RT_USING_PIN */ diff --git a/bsp/stm32/stm32f103-fire-arbitrary/board/board.h b/bsp/stm32/stm32f103-fire-arbitrary/board/board.h index fc77f71a95..d0718d5525 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/board/board.h +++ b/bsp/stm32/stm32f103-fire-arbitrary/board/board.h @@ -15,13 +15,6 @@ #include #include "drv_common.h" -#ifdef BSP_USING_GPIO -#include "drv_gpio.h" -/* Board Pin definitions */ -#define LED0_PIN GET_PIN(F, 7) -#define LED1_PIN GET_PIN(F, 8) -#endif - /* Internal SRAM memory size[Kbytes] <8-64>, Default: 64*/ #define STM32_SRAM_SIZE 64 #define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024) diff --git a/bsp/stm32/stm32f407-atk-explorer/applications/main.c b/bsp/stm32/stm32f407-atk-explorer/applications/main.c index 5d7f42bdab..b7bd6a1249 100644 --- a/bsp/stm32/stm32f407-atk-explorer/applications/main.c +++ b/bsp/stm32/stm32f407-atk-explorer/applications/main.c @@ -12,14 +12,23 @@ #include #include #include +#include "drv_gpio.h" +/* defined the LED0 pin: PF9 */ +#define LED0_PIN GET_PIN(F, 9) 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(LED1_PIN, !rt_pin_read(LED1_PIN)); + 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/stm32f407-atk-explorer/board/board.c b/bsp/stm32/stm32f407-atk-explorer/board/board.c index 52145fe832..cea8c7fff9 100644 --- a/bsp/stm32/stm32f407-atk-explorer/board/board.c +++ b/bsp/stm32/stm32f407-atk-explorer/board/board.c @@ -67,14 +67,3 @@ void MX_GPIO_Init(void) __HAL_RCC_GPIOB_CLK_ENABLE(); } - -#ifdef RT_USING_PIN -int board_pin_init(void) -{ - rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); - rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); - - return 0; -} -INIT_BOARD_EXPORT(board_pin_init); -#endif /* RT_USING_PIN */ diff --git a/bsp/stm32/stm32f407-atk-explorer/board/board.h b/bsp/stm32/stm32f407-atk-explorer/board/board.h index 4dab0eddd3..77928f7f80 100644 --- a/bsp/stm32/stm32f407-atk-explorer/board/board.h +++ b/bsp/stm32/stm32f407-atk-explorer/board/board.h @@ -15,13 +15,6 @@ #include #include "drv_common.h" -#ifdef BSP_USING_GPIO -#include "drv_gpio.h" -/* Board Pin definitions */ -#define LED0_PIN GET_PIN(F, 9) -#define LED1_PIN GET_PIN(F, 10) -#endif - #define STM32_SRAM_SIZE (128) #define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024) diff --git a/bsp/stm32/stm32f429-atk-apollo/applications/main.c b/bsp/stm32/stm32f429-atk-apollo/applications/main.c index 768cedfae7..7c40c1518d 100644 --- a/bsp/stm32/stm32f429-atk-apollo/applications/main.c +++ b/bsp/stm32/stm32f429-atk-apollo/applications/main.c @@ -11,14 +11,23 @@ #include #include #include +#include "drv_gpio.h" +/* defined the LED0 pin: PB1 */ +#define LED0_PIN GET_PIN(B, 1) 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(LED1_PIN, !rt_pin_read(LED1_PIN)); + 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/stm32f429-atk-apollo/board/board.c b/bsp/stm32/stm32f429-atk-apollo/board/board.c index 91cde7a95d..a0d2cd17a5 100644 --- a/bsp/stm32/stm32f429-atk-apollo/board/board.c +++ b/bsp/stm32/stm32f429-atk-apollo/board/board.c @@ -77,14 +77,3 @@ void MX_GPIO_Init(void) __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); } - -#ifdef RT_USING_PIN -int board_pin_init(void) -{ - rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); - rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); - - return 0; -} -INIT_BOARD_EXPORT(board_pin_init); -#endif /* RT_USING_PIN */ diff --git a/bsp/stm32/stm32f429-atk-apollo/board/board.h b/bsp/stm32/stm32f429-atk-apollo/board/board.h index 5d59b9bd77..8be558340c 100644 --- a/bsp/stm32/stm32f429-atk-apollo/board/board.h +++ b/bsp/stm32/stm32f429-atk-apollo/board/board.h @@ -15,10 +15,6 @@ #include #include "drv_common.h" -#ifdef BSP_USING_GPIO -#include "drv_gpio.h" -#endif - #define STM32_SRAM_SIZE (192) #define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024) @@ -39,12 +35,7 @@ extern int __bss_end; #define HEAP_END STM32_SRAM_END -/* Board Pin definitions */ -#define LED0_PIN GET_PIN(B, 1) -#define LED1_PIN GET_PIN(B, 0) - void SystemClock_Config(void); void MX_GPIO_Init(void); #endif - diff --git a/bsp/stm32/stm32f429-fire-challenger/applications/main.c b/bsp/stm32/stm32f429-fire-challenger/applications/main.c index 582e5ed887..cee539b083 100644 --- a/bsp/stm32/stm32f429-fire-challenger/applications/main.c +++ b/bsp/stm32/stm32f429-fire-challenger/applications/main.c @@ -12,14 +12,23 @@ #include #include #include +#include "drv_gpio.h" +/* defined the LED0 pin: PH10 */ +#define LED0_PIN GET_PIN(H, 10) 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(LED1_PIN, !rt_pin_read(LED1_PIN)); + 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/stm32f429-fire-challenger/board/board.c b/bsp/stm32/stm32f429-fire-challenger/board/board.c index 77961c793c..19559f4059 100644 --- a/bsp/stm32/stm32f429-fire-challenger/board/board.c +++ b/bsp/stm32/stm32f429-fire-challenger/board/board.c @@ -76,14 +76,3 @@ void MX_GPIO_Init(void) __HAL_RCC_GPIOG_CLK_ENABLE(); } - -#ifdef RT_USING_PIN -int board_pin_init(void) -{ - rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); - rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); - - return 0; -} -INIT_BOARD_EXPORT(board_pin_init); -#endif /* RT_USING_PIN */ diff --git a/bsp/stm32/stm32f429-fire-challenger/board/board.h b/bsp/stm32/stm32f429-fire-challenger/board/board.h index 4348bb5fb7..69a99bf672 100644 --- a/bsp/stm32/stm32f429-fire-challenger/board/board.h +++ b/bsp/stm32/stm32f429-fire-challenger/board/board.h @@ -15,10 +15,6 @@ #include #include "drv_common.h" -#ifdef BSP_USING_GPIO -#include "drv_gpio.h" -#endif - #define STM32_SRAM_SIZE (192) #define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024) @@ -39,10 +35,6 @@ extern int __bss_end; #define HEAP_END STM32_SRAM_END -/* Board Pin definitions */ -#define LED0_PIN GET_PIN(H, 10) -#define LED1_PIN GET_PIN(H, 11) - void SystemClock_Config(void); void MX_GPIO_Init(void); diff --git a/bsp/stm32/stm32l475-atk-pandora/applications/main.c b/bsp/stm32/stm32l475-atk-pandora/applications/main.c index a802fd07e8..208dd4525f 100644 --- a/bsp/stm32/stm32l475-atk-pandora/applications/main.c +++ b/bsp/stm32/stm32l475-atk-pandora/applications/main.c @@ -11,14 +11,23 @@ #include #include #include +#include "drv_gpio.h" +/* defined the LED0 pin: PE7 */ +#define LED0_PIN GET_PIN(E, 7) 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, !rt_pin_read(LED0_PIN)); + 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/stm32l475-atk-pandora/board/board.c b/bsp/stm32/stm32l475-atk-pandora/board/board.c index 4c6d7f61ea..78eb82025c 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/board.c +++ b/bsp/stm32/stm32l475-atk-pandora/board/board.c @@ -74,12 +74,3 @@ void MX_GPIO_Init(void) __HAL_RCC_GPIOB_CLK_ENABLE(); } - -#ifdef RT_USING_PIN -int board_pin_init(void) -{ - rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); - return 0; -} -INIT_BOARD_EXPORT(board_pin_init); -#endif /* RT_USING_PIN */ diff --git a/bsp/stm32/stm32l475-atk-pandora/board/board.h b/bsp/stm32/stm32l475-atk-pandora/board/board.h index 43ea79b4e4..df4023b4bb 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/board.h +++ b/bsp/stm32/stm32l475-atk-pandora/board/board.h @@ -15,10 +15,6 @@ #include #include "drv_common.h" -#ifdef BSP_USING_GPIO -#include "drv_gpio.h" -#endif - #define STM32_SRAM1_SIZE (96) #define STM32_SRAM1_START (0x20000000) #define STM32_SRAM1_END (STM32_SRAM1_START + STM32_SRAM1_SIZE * 1024) @@ -30,10 +26,6 @@ #define HEAP_BEGIN STM32_SRAM1_START #define HEAP_END STM32_SRAM1_END -/* Board Pin definitions */ -#define LED0_PIN GET_PIN(E, 7) -#define LED1_PIN GET_PIN(E, 8) - void SystemClock_Config(void); void MX_GPIO_Init(void); From 08bc2b3f5d2a6cd3d46b5d4770bfacdc0ed9ba0a Mon Sep 17 00:00:00 2001 From: SummerGift Date: Thu, 20 Dec 2018 15:04:19 +0800 Subject: [PATCH 12/14] [bsp][stm32] fix flash bug --- .../HAL_Drivers/drv_flash/drv_flash_f4.c | 16 +++++++++++++--- .../HAL_Drivers/drv_flash/drv_flash_l4.c | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_flash/drv_flash_f4.c b/bsp/stm32/libraries/HAL_Drivers/drv_flash/drv_flash_f4.c index 8cbfc040b6..fd704f7362 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_flash/drv_flash_f4.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_flash/drv_flash_f4.c @@ -91,22 +91,30 @@ static rt_uint32_t GetSector(rt_uint32_t Address) { sector = FLASH_SECTOR_7; } +#if defined(FLASH_SECTOR_8) else if((Address < ADDR_FLASH_SECTOR_9) && (Address >= ADDR_FLASH_SECTOR_8)) { sector = FLASH_SECTOR_8; } +#endif +#if defined(FLASH_SECTOR_9) else if((Address < ADDR_FLASH_SECTOR_10) && (Address >= ADDR_FLASH_SECTOR_9)) { sector = FLASH_SECTOR_9; } +#endif +#if defined(FLASH_SECTOR_10) else if((Address < ADDR_FLASH_SECTOR_11) && (Address >= ADDR_FLASH_SECTOR_10)) { sector = FLASH_SECTOR_10; } +#endif +#if defined(FLASH_SECTOR_11) else if((Address < ADDR_FLASH_SECTOR_12) && (Address >= ADDR_FLASH_SECTOR_11)) { sector = FLASH_SECTOR_11; } +#endif #if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx)|| defined(STM32F439xx) || defined(STM32F469xx) || defined(STM32F479xx) else if((Address < ADDR_FLASH_SECTOR_13) && (Address >= ADDR_FLASH_SECTOR_12)) { @@ -219,7 +227,7 @@ int stm32_flash_write(long offset, const rt_uint8_t *buf, size_t size) HAL_FLASH_Unlock(); - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR); + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); for (size_t i = 0; i < size; i++, addr++, buf++) { @@ -278,17 +286,19 @@ int stm32_flash_erase(long offset, size_t size) /* Unlock the Flash to enable the flash control register access */ HAL_FLASH_Unlock(); + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); + /* Get the 1st sector to erase */ FirstSector = GetSector(addr); /* Get the number of sector to erase from 1st sector*/ - NbOfSectors = GetSector(addr + size) - FirstSector + 1; + NbOfSectors = GetSector(addr + size - 1) - FirstSector + 1; /* Fill EraseInit structure*/ EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS; EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3; EraseInitStruct.Sector = FirstSector; EraseInitStruct.NbSectors = NbOfSectors; - if (HAL_FLASHEx_Erase(&EraseInitStruct, &SECTORError) != HAL_OK) + if (HAL_FLASHEx_Erase(&EraseInitStruct, (uint32_t *)&SECTORError) != HAL_OK) { result = -RT_ERROR; goto __exit; diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_flash/drv_flash_l4.c b/bsp/stm32/libraries/HAL_Drivers/drv_flash/drv_flash_l4.c index caafce2466..37fce587a9 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_flash/drv_flash_l4.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_flash/drv_flash_l4.c @@ -244,7 +244,7 @@ int stm32_flash_erase(long offset, size_t size) /* Get the 1st page to erase */ FirstPage = GetPage(addr); /* Get the number of pages to erase from 1st page */ - NbOfPages = GetPage(addr + size) - FirstPage + 1; + NbOfPages = GetPage(addr + size - 1) - FirstPage + 1; /* Get the bank */ BankNumber = GetBank(addr); /* Fill EraseInit structure*/ From 8f9c72b05e6320a591c4b620800b9b293151edc5 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Thu, 20 Dec 2018 15:56:18 +0800 Subject: [PATCH 13/14] =?UTF-8?q?=E3=80=90=E6=9B=B4=E6=96=B0=E3=80=91?= =?UTF-8?q?=EF=BC=9Amenuconfig=20=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bsp/stm32/libraries/templates/stm32f10x/.config | 5 ++++- bsp/stm32/libraries/templates/stm32f10x/rtconfig.h | 1 + bsp/stm32/libraries/templates/stm32f4xx/.config | 5 ++++- bsp/stm32/libraries/templates/stm32f4xx/rtconfig.h | 1 + bsp/stm32/libraries/templates/stm32f7xx/.config | 12 ++++++++---- bsp/stm32/libraries/templates/stm32f7xx/rtconfig.h | 11 +++++++++-- bsp/stm32/libraries/templates/stm32l4xx/.config | 5 ++++- bsp/stm32/libraries/templates/stm32l4xx/rtconfig.h | 1 + 8 files changed, 32 insertions(+), 9 deletions(-) diff --git a/bsp/stm32/libraries/templates/stm32f10x/.config b/bsp/stm32/libraries/templates/stm32f10x/.config index 4a931cf1e2..b74dd34859 100644 --- a/bsp/stm32/libraries/templates/stm32f10x/.config +++ b/bsp/stm32/libraries/templates/stm32f10x/.config @@ -62,6 +62,7 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +CONFIG_RT_VER_NUM=0x40000 CONFIG_ARCH_ARM=y CONFIG_ARCH_ARM_CORTEX_M=y CONFIG_ARCH_ARM_CORTEX_M3=y @@ -180,12 +181,14 @@ CONFIG_RT_USING_PIN=y # 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 @@ -278,6 +281,7 @@ CONFIG_RT_USING_PIN=y # 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 @@ -340,7 +344,6 @@ CONFIG_SOC_STM32F103RB=y # CONFIG_BSP_USING_GPIO=y CONFIG_BSP_USING_UART1=y -# CONFIG_BSP_UART_USING_DMA_RX is not set # CONFIG_BSP_USING_SPI1 is not set # CONFIG_BSP_SPI_USING_DMA is not set # CONFIG_BSP_USING_I2C1 is not set diff --git a/bsp/stm32/libraries/templates/stm32f10x/rtconfig.h b/bsp/stm32/libraries/templates/stm32f10x/rtconfig.h index ed7bf5a5f7..908c0d760d 100644 --- a/bsp/stm32/libraries/templates/stm32f10x/rtconfig.h +++ b/bsp/stm32/libraries/templates/stm32f10x/rtconfig.h @@ -38,6 +38,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_VER_NUM 0x40000 #define ARCH_ARM #define ARCH_ARM_CORTEX_M #define ARCH_ARM_CORTEX_M3 diff --git a/bsp/stm32/libraries/templates/stm32f4xx/.config b/bsp/stm32/libraries/templates/stm32f4xx/.config index 935757f65a..ed06540dab 100644 --- a/bsp/stm32/libraries/templates/stm32f4xx/.config +++ b/bsp/stm32/libraries/templates/stm32f4xx/.config @@ -62,6 +62,7 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +CONFIG_RT_VER_NUM=0x40000 CONFIG_ARCH_ARM=y CONFIG_ARCH_ARM_CORTEX_M=y CONFIG_ARCH_ARM_CORTEX_M4=y @@ -180,12 +181,14 @@ CONFIG_RT_USING_PIN=y # 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 @@ -279,6 +282,7 @@ CONFIG_RT_USING_PIN=y # 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 @@ -341,7 +345,6 @@ CONFIG_SOC_STM32F407ZG=y # CONFIG_BSP_USING_GPIO=y CONFIG_BSP_USING_UART1=y -# CONFIG_BSP_UART_USING_DMA_RX is not set # CONFIG_BSP_USING_SPI1 is not set # CONFIG_BSP_SPI_USING_DMA is not set # CONFIG_BSP_USING_I2C1 is not set diff --git a/bsp/stm32/libraries/templates/stm32f4xx/rtconfig.h b/bsp/stm32/libraries/templates/stm32f4xx/rtconfig.h index 21d3064ad0..b8700de08d 100644 --- a/bsp/stm32/libraries/templates/stm32f4xx/rtconfig.h +++ b/bsp/stm32/libraries/templates/stm32f4xx/rtconfig.h @@ -38,6 +38,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_VER_NUM 0x40000 #define ARCH_ARM #define ARCH_ARM_CORTEX_M #define ARCH_ARM_CORTEX_M4 diff --git a/bsp/stm32/libraries/templates/stm32f7xx/.config b/bsp/stm32/libraries/templates/stm32f7xx/.config index 1491b26f9a..5b2fbd74ae 100644 --- a/bsp/stm32/libraries/templates/stm32f7xx/.config +++ b/bsp/stm32/libraries/templates/stm32f7xx/.config @@ -62,9 +62,10 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=128 CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +CONFIG_RT_VER_NUM=0x40000 CONFIG_ARCH_ARM=y CONFIG_ARCH_ARM_CORTEX_M=y -CONFIG_ARCH_ARM_CORTEX_M4=y +CONFIG_ARCH_ARM_CORTEX_M7=y # CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set # @@ -110,6 +111,7 @@ CONFIG_FINSH_ARG_MAX=10 CONFIG_RT_USING_DEVICE_IPC=y CONFIG_RT_PIPE_BUFSZ=512 CONFIG_RT_USING_SERIAL=y +CONFIG_RT_SERIAL_USING_DMA=y # CONFIG_RT_USING_CAN is not set # CONFIG_RT_USING_HWTIMER is not set # CONFIG_RT_USING_CPUTIME is not set @@ -179,12 +181,14 @@ CONFIG_RT_USING_PIN=y # 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 @@ -278,6 +282,7 @@ CONFIG_RT_USING_PIN=y # 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 @@ -324,12 +329,12 @@ CONFIG_RT_USING_PIN=y # # CONFIG_PKG_USING_HELLO is not set CONFIG_SOC_FAMILY_STM32=y -CONFIG_SOC_SERIES_STM32F4=y +CONFIG_SOC_SERIES_STM32F7=y # # Hardware Drivers Config # -CONFIG_SOC_STM32F407ZG=y +CONFIG_SOC_STM32F767IG=y # # Onboard Peripheral Drivers @@ -340,7 +345,6 @@ CONFIG_SOC_STM32F407ZG=y # CONFIG_BSP_USING_GPIO=y CONFIG_BSP_USING_UART1=y -# CONFIG_BSP_UART_USING_DMA_RX is not set # CONFIG_BSP_USING_SPI1 is not set # CONFIG_BSP_SPI_USING_DMA is not set # CONFIG_BSP_USING_I2C1 is not set diff --git a/bsp/stm32/libraries/templates/stm32f7xx/rtconfig.h b/bsp/stm32/libraries/templates/stm32f7xx/rtconfig.h index 01f98d0c58..f1dff62d4b 100644 --- a/bsp/stm32/libraries/templates/stm32f7xx/rtconfig.h +++ b/bsp/stm32/libraries/templates/stm32f7xx/rtconfig.h @@ -39,6 +39,9 @@ #define RT_CONSOLEBUF_SIZE 128 #define RT_CONSOLE_DEVICE_NAME "uart1" #define RT_VER_NUM 0x40000 +#define ARCH_ARM +#define ARCH_ARM_CORTEX_M +#define ARCH_ARM_CORTEX_M7 /* RT-Thread Components */ @@ -74,6 +77,7 @@ #define RT_USING_DEVICE_IPC #define RT_PIPE_BUFSZ 512 #define RT_USING_SERIAL +#define RT_SERIAL_USING_DMA #define RT_USING_PIN /* Using WiFi */ @@ -105,6 +109,9 @@ /* Utilities */ +/* ARM CMSIS */ + + /* RT-Thread online packages */ /* IoT - internet of things */ @@ -149,6 +156,8 @@ /* example package: hello */ +#define SOC_FAMILY_STM32 +#define SOC_SERIES_STM32F7 /* Hardware Drivers Config */ @@ -156,8 +165,6 @@ /* Onboard Peripheral Drivers */ -#define BSP_USING_USB_TO_USART - /* On-chip Peripheral Drivers */ #define BSP_USING_GPIO diff --git a/bsp/stm32/libraries/templates/stm32l4xx/.config b/bsp/stm32/libraries/templates/stm32l4xx/.config index 233ed0577f..2ace5a3beb 100644 --- a/bsp/stm32/libraries/templates/stm32l4xx/.config +++ b/bsp/stm32/libraries/templates/stm32l4xx/.config @@ -62,6 +62,7 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=256 CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +CONFIG_RT_VER_NUM=0x40000 CONFIG_ARCH_ARM=y CONFIG_ARCH_ARM_CORTEX_M=y CONFIG_ARCH_ARM_CORTEX_M4=y @@ -180,12 +181,14 @@ CONFIG_RT_USING_PIN=y # 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 @@ -279,6 +282,7 @@ CONFIG_RT_USING_PIN=y # 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 @@ -341,7 +345,6 @@ CONFIG_SOC_STM32L475VE=y # CONFIG_BSP_USING_GPIO=y CONFIG_BSP_USING_UART1=y -# CONFIG_BSP_UART_USING_DMA_RX is not set # CONFIG_BSP_USING_SPI1 is not set # CONFIG_BSP_SPI_USING_DMA is not set # CONFIG_BSP_USING_I2C1 is not set diff --git a/bsp/stm32/libraries/templates/stm32l4xx/rtconfig.h b/bsp/stm32/libraries/templates/stm32l4xx/rtconfig.h index 1b16eff99f..512a1832ce 100644 --- a/bsp/stm32/libraries/templates/stm32l4xx/rtconfig.h +++ b/bsp/stm32/libraries/templates/stm32l4xx/rtconfig.h @@ -38,6 +38,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 256 #define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_VER_NUM 0x40000 #define ARCH_ARM #define ARCH_ARM_CORTEX_M #define ARCH_ARM_CORTEX_M4 From 96fcf5dc291e9ce459d92e4aabb3bd9bfa48eb2c Mon Sep 17 00:00:00 2001 From: SummerGift Date: Thu, 20 Dec 2018 16:08:57 +0800 Subject: [PATCH 14/14] [bsp][stm32] update templates Kconfig --- bsp/stm32/libraries/templates/stm32f10x/board/Kconfig | 4 ---- bsp/stm32/libraries/templates/stm32f4xx/board/Kconfig | 4 ---- bsp/stm32/libraries/templates/stm32l4xx/board/Kconfig | 4 ---- 3 files changed, 12 deletions(-) diff --git a/bsp/stm32/libraries/templates/stm32f10x/board/Kconfig b/bsp/stm32/libraries/templates/stm32f10x/board/Kconfig index 20427606ef..39a000d371 100644 --- a/bsp/stm32/libraries/templates/stm32f10x/board/Kconfig +++ b/bsp/stm32/libraries/templates/stm32f10x/board/Kconfig @@ -21,10 +21,6 @@ menu "On-chip Peripheral Drivers" select RT_USING_SERIAL default y - config BSP_UART_USING_DMA_RX - bool "Enable UART RX DMA support" - default n - config BSP_USING_SPI1 bool "Enable SPI1 BUS" select RT_USING_SPI diff --git a/bsp/stm32/libraries/templates/stm32f4xx/board/Kconfig b/bsp/stm32/libraries/templates/stm32f4xx/board/Kconfig index 7889393544..5ba6059541 100644 --- a/bsp/stm32/libraries/templates/stm32f4xx/board/Kconfig +++ b/bsp/stm32/libraries/templates/stm32f4xx/board/Kconfig @@ -21,10 +21,6 @@ menu "On-chip Peripheral Drivers" select RT_USING_SERIAL default y - config BSP_UART_USING_DMA_RX - bool "Enable UART RX DMA support" - default n - config BSP_USING_SPI1 bool "Enable SPI1 BUS" select RT_USING_SPI diff --git a/bsp/stm32/libraries/templates/stm32l4xx/board/Kconfig b/bsp/stm32/libraries/templates/stm32l4xx/board/Kconfig index 2f87aceeb5..5d0299fe3b 100644 --- a/bsp/stm32/libraries/templates/stm32l4xx/board/Kconfig +++ b/bsp/stm32/libraries/templates/stm32l4xx/board/Kconfig @@ -21,10 +21,6 @@ menu "On-chip Peripheral Drivers" select RT_USING_SERIAL default y - config BSP_UART_USING_DMA_RX - bool "Enable UART RX DMA support" - default n - config BSP_USING_SPI1 bool "Enable SPI1 BUS" select RT_USING_SPI