From d023fb47bac22377c73805b74ad85ed3a6ff7aea Mon Sep 17 00:00:00 2001 From: SummerGift Date: Tue, 8 Jan 2019 11:58:09 +0800 Subject: [PATCH 01/15] [bsp][stm32] add all series dma_config files --- .../HAL_Drivers/config/f0/dma_config.h | 42 +++ .../HAL_Drivers/config/f1/dma_config.h | 94 ++++++ .../HAL_Drivers/config/f4/dma_config.h | 267 ++++++++++++++++ .../HAL_Drivers/config/f7/dma_config.h | 285 ++++++++++++++++++ .../HAL_Drivers/config/l4/dma_config.h | 173 +++++++++++ 5 files changed, 861 insertions(+) create mode 100644 bsp/stm32/libraries/HAL_Drivers/config/f0/dma_config.h create mode 100644 bsp/stm32/libraries/HAL_Drivers/config/f1/dma_config.h create mode 100644 bsp/stm32/libraries/HAL_Drivers/config/f4/dma_config.h create mode 100644 bsp/stm32/libraries/HAL_Drivers/config/f7/dma_config.h create mode 100644 bsp/stm32/libraries/HAL_Drivers/config/l4/dma_config.h diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f0/dma_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f0/dma_config.h new file mode 100644 index 0000000000..a883c86fdc --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/config/f0/dma_config.h @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-01-05 zylx first version + */ + +#ifndef __DMA_CONFIG_H__ +#define __DMA_CONFIG_H__ + +#include + +/* dma1 channel1 */ + +/* dma1 channel1 */ + +/* dma1 channel2-3 DMA2 channel1-2 */ +#if defined(BSP_UART1_RX_USING_DMA) && !defined(UART1_RX_DMA_CHANNEL) +#define USART1_DMA_RX_IRQHandler DMA1_Ch2_3_DMA2_Ch1_2_IRQHandler +#define USART1_RX_DMA_RCC RCC_AHBENR_DMA1EN +#define USART1_RX_DMA_INSTANCE DMA1_Channel3 +#define USART1_RX_DMA_IRQ DMA1_Ch2_3_DMA2_Ch1_2_IRQn + +#endif +/* dma1 channel2-3 DMA2 channel1-2 */ + +/* dma1 channel4-7 DMA2 channel3-5 */ +#if defined(BSP_UART2_RX_USING_DMA) && !defined(UART2_RX_DMA_CHANNEL) +#define USART2_DMA_RX_IRQHandler DMA1_Ch4_7_DMA2_Ch3_5_IRQHandler +#define USART2_RX_DMA_RCC RCC_AHBENR_DMA1EN +#define USART2_RX_DMA_INSTANCE DMA1_Channel5 +#define USART2_RX_DMA_IRQ DMA1_Ch4_7_DMA2_Ch3_5_IRQn + +#endif +/* dma1 channel4-7 DMA2 channel3-5 */ + + + +#endif /* __DMA_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f1/dma_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f1/dma_config.h new file mode 100644 index 0000000000..d073838d44 --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/config/f1/dma_config.h @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-01-02 SummerGift first version + */ + +#ifndef __DMA_CONFIG_H__ +#define __DMA_CONFIG_H__ + +#include + +/* DMA1 channel1 */ +/* DMA1 channel2 */ +#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_CHANNEL) +#define SPI1_DMA_RX_IRQHandler DMA1_Channel2_IRQHandler +#define SPI1_RX_DMA_RCC RCC_AHBENR_DMA1EN +#define SPI1_RX_DMA_INSTANCE DMA1_Channel2 +#define SPI1_RX_DMA_IRQ DMA1_Channel2_IRQn +#endif + +/* DMA1 channel3 */ +#if defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_CHANNEL) +#define SPI1_DMA_TX_IRQHandler DMA1_Channel3_IRQHandler +#define SPI1_TX_DMA_RCC RCC_AHBENR_DMA1EN +#define SPI1_TX_DMA_INSTANCE DMA1_Channel3 +#define SPI1_TX_DMA_IRQ DMA1_Channel3_IRQn + +#elif defined(BSP_UART3_RX_USING_DMA) && !defined(UART3_RX_DMA_CHANNEL) +#define USART3_DMA_RX_IRQHandler DMA1_Channel3_IRQHandler +#define USART3_RX_DMA_RCC RCC_AHBENR_DMA1EN +#define USART3_RX_DMA_INSTANCE DMA1_Channel3 +#define USART3_RX_DMA_IRQ DMA1_Channel3_IRQn +#endif + +/* DMA1 channel4 */ +#if defined(BSP_SPI2_RX_USING_DMA) && !defined(SPI2_RX_DMA_CHANNEL) +#define SPI2_DMA_RX_IRQHandler DMA1_Channel4_IRQHandler +#define SPI2_RX_DMA_RCC RCC_AHBENR_DMA1EN +#define SPI2_RX_DMA_INSTANCE DMA1_Channel4 +#define SPI2_RX_DMA_IRQ DMA1_Channel4_IRQn +#endif + +/* DMA1 channel5 */ +#if defined(BSP_SPI2_TX_USING_DMA) && !defined(SPI2_TX_DMA_CHANNEL) +#define SPI2_DMA_TX_IRQHandler DMA1_Channel5_IRQHandler +#define SPI2_TX_DMA_RCC RCC_AHBENR_DMA1EN +#define SPI2_TX_DMA_INSTANCE DMA1_Channel5 +#define SPI2_TX_DMA_IRQ DMA1_Channel5_IRQn + +#elif defined(BSP_UART1_RX_USING_DMA) && !defined(UART1_RX_DMA_CHANNEL) +#define USART1_DMA_RX_IRQHandler DMA1_Channel5_IRQHandler +#define USART1_RX_DMA_RCC RCC_AHBENR_DMA1EN +#define USART1_RX_DMA_INSTANCE DMA1_Channel5 +#define USART1_RX_DMA_IRQ DMA1_Channel5_IRQn +#endif + +/* DMA1 channel6 */ +#if defined(BSP_UART2_RX_USING_DMA) && !defined(UART2_RX_DMA_CHANNEL) +#define USART2_DMA_RX_IRQHandler DMA1_Channel6_IRQHandler +#define USART2_RX_DMA_RCC RCC_AHBENR_DMA1EN +#define USART2_RX_DMA_INSTANCE DMA1_Channel6 +#define USART2_RX_DMA_IRQ DMA1_Channel6_IRQn +#endif + + +/* DMA1 channel7 */ + +/* DMA2 channel1 */ +#if defined(BSP_SPI3_RX_USING_DMA) && !defined(SPI3_RX_DMA_CHANNEL) +#define SPI3_DMA_RX_IRQHandler DMA2_Channel1_IRQHandler +#define SPI3_RX_DMA_RCC RCC_AHBENR_DMA2EN +#define SPI3_RX_DMA_INSTANCE DMA2_Channel1 +#define SPI3_RX_DMA_IRQ DMA2_Channel1_IRQn +#endif + +/* DMA2 channel2 */ +#if defined(BSP_SPI3_TX_USING_DMA) && !defined(SPI3_TX_DMA_CHANNEL) +#define SPI3_DMA_TX_IRQHandler DMA2_Channel2_IRQHandler +#define SPI3_TX_DMA_RCC RCC_AHBENR_DMA2EN +#define SPI3_TX_DMA_INSTANCE DMA2_Channel2 +#define SPI3_TX_DMA_IRQ DMA2_Channel2_IRQn +/* DMA1 channel4 */ +#endif + +/* DMA2 channel3 */ +/* DMA2 channel4 */ +/* DMA2 channel5 */ + + +#endif /* __DMA_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f4/dma_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f4/dma_config.h new file mode 100644 index 0000000000..e8cec06fa7 --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/config/f4/dma_config.h @@ -0,0 +1,267 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-01-02 zylx first version + */ + +#ifndef __DMA_CONFIG_H__ +#define __DMA_CONFIG_H__ + +#include + +/* dma1 stream0 */ +#if defined(BSP_SPI3_RX_USING_DMA) && !defined(SPI3_RX_DMA_CHANNEL) + +#define SPI3_DMA_RX_IRQHandler DMA1_Stream0_IRQHandler +#define SPI3_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI3_RX_DMA_INSTANCE DMA1_Stream0 +#define SPI3_RX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI3_RX_DMA_IRQ DMA1_Stream0_IRQn + +#elif defined(BSP_UART5_RX_USING_DMA) && !defined(UART5_RX_DMA_CHANNEL) +#define UART5_DMA_RX_IRQHandler DMA1_Stream0_IRQHandler +#define UART5_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define UART5_RX_DMA_INSTANCE DMA1_Stream0 +#define UART5_RX_DMA_CHANNEL DMA_CHANNEL_4 +#define UART5_RX_DMA_IRQ DMA1_Stream0_IRQn + +#endif +/* dma1 stream0 */ + +/* dma1 stream1 */ +#if defined(BSP_UART3_RX_USING_DMA) && !defined(UART3_RX_DMA_CHANNEL) +#define UART3_DMA_RX_IRQHandler DMA1_Stream1_IRQHandler +#define UART3_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define UART3_RX_DMA_INSTANCE DMA1_Stream1 +#define UART3_RX_DMA_CHANNEL DMA_CHANNEL_4 +#define UART3_RX_DMA_IRQ DMA1_Stream1_IRQn + +#endif +/* dma1 stream1 */ + +/* dma1 stream2 */ +#if defined(BSP_SPI3_RX_USING_DMA) && !defined(SPI3_RX_DMA_CHANNEL) + +#define SPI3_DMA_RX_IRQHandler DMA1_Stream2_IRQHandler +#define SPI3_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI3_RX_DMA_INSTANCE DMA1_Stream2 +#define SPI3_RX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI3_RX_DMA_IRQ DMA1_Stream2_IRQn + +#elif defined(BSP_UART4_RX_USING_DMA) && !defined(UART4_RX_DMA_CHANNEL) +#define UART4_DMA_RX_IRQHandler DMA1_Stream2_IRQHandler +#define UART4_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define UART4_RX_DMA_INSTANCE DMA1_Stream2 +#define UART4_RX_DMA_CHANNEL DMA_CHANNEL_4 +#define UART4_RX_DMA_IRQ DMA1_Stream2_IRQn + +#endif +/* dma1 stream2 */ + +/* dma1 stream3 */ +#if defined(BSP_SPI2_RX_USING_DMA) && !defined(SPI2_RX_DMA_CHANNEL) + +#define SPI2_DMA_RX_IRQHandler DMA1_Stream3_IRQHandler +#define SPI2_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI2_RX_DMA_INSTANCE DMA1_Stream3 +#define SPI2_RX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI2_RX_DMA_IRQ DMA1_Stream3_IRQn + +#endif +/* dma1 stream3 */ + +/* dma1 stream4 */ +#if defined(BSP_SPI2_TX_USING_DMA) && !defined(SPI2_TX_DMA_CHANNEL) + +#define SPI2_DMA_TX_IRQHandler DMA1_Stream4_IRQHandler +#define SPI2_TX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI2_TX_DMA_INSTANCE DMA1_Stream4 +#define SPI2_TX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI2_TX_DMA_IRQ DMA1_Stream4_IRQn + +#endif +/* dma1 stream4 */ + +/* dma1 stream5 */ +#if defined(BSP_SPI3_TX_USING_DMA) && !defined(SPI3_TX_DMA_CHANNEL) + +#define SPI3_DMA_TX_IRQHandler DMA1_Stream5_IRQHandler +#define SPI3_TX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI3_TX_DMA_INSTANCE DMA1_Stream5 +#define SPI3_TX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI3_TX_DMA_IRQ DMA1_Stream5_IRQn + +#elif defined(BSP_UART2_RX_USING_DMA) && !defined(UART2_RX_DMA_CHANNEL) +#define UART2_DMA_RX_IRQHandler DMA1_Stream5_IRQHandler +#define UART2_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define UART2_RX_DMA_INSTANCE DMA1_Stream5 +#define UART2_RX_DMA_CHANNEL DMA_CHANNEL_4 +#define UART2_RX_DMA_IRQ DMA1_Stream5_IRQn + +#endif +/* dma1 stream5 */ + +/* dma1 stream6 */ +/* dma1 stream6 */ + +/* dma1 stream7 */ +#if defined(BSP_SPI3_TX_USING_DMA) && !defined(SPI3_TX_DMA_CHANNEL) + +#define SPI3_DMA_TX_IRQHandler DMA1_Stream7_IRQHandler +#define SPI3_TX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI3_TX_DMA_INSTANCE DMA1_Stream7 +#define SPI3_TX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI3_TX_DMA_IRQ DMA1_Stream7_IRQn + +#endif +/* dma1 stream7 */ + +/* dma2 stream0 */ +#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_CHANNEL) + +#define SPI1_DMA_RX_IRQHandler DMA2_Stream0_IRQHandler +#define SPI1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI1_RX_DMA_INSTANCE DMA2_Stream0 +#define SPI1_RX_DMA_CHANNEL DMA_CHANNEL_3 +#define SPI1_RX_DMA_IRQ DMA2_Stream0_IRQn + +#elif defined(BSP_SPI4_TX_USING_DMA) && !defined(SPI4_TX_DMA_CHANNEL) + +#define SPI4_DMA_TX_IRQHandler DMA2_Stream0_IRQHandler +#define SPI4_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI4_TX_DMA_INSTANCE DMA2_Stream0 +#define SPI4_TX_DMA_CHANNEL DMA_CHANNEL_4 +#define SPI4_TX_DMA_IRQ DMA2_Stream0_IRQn + +#endif +/* dma2 stream0 */ + +/* dma2 stream1 */ +#if defined(BSP_SPI4_TX_USING_DMA) && !defined(SPI4_TX_DMA_CHANNEL) + +#define SPI4_DMA_TX_IRQHandler DMA2_Stream1_IRQHandler +#define SPI4_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI4_TX_DMA_INSTANCE DMA2_Stream1 +#define SPI4_TX_DMA_CHANNEL DMA_CHANNEL_4 +#define SPI4_TX_DMA_IRQ DMA2_Stream1_IRQn + +#endif +/* dma2 stream1 */ + +/* dma2 stream2 */ +#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_CHANNEL) + +#define SPI1_DMA_RX_IRQHandler DMA2_Stream2_IRQHandler +#define SPI1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI1_RX_DMA_INSTANCE DMA2_Stream2 +#define SPI1_RX_DMA_CHANNEL DMA_CHANNEL_3 +#define SPI1_RX_DMA_IRQ DMA2_Stream2_IRQn + +#elif defined(BSP_UART1_RX_USING_DMA) && !defined(USART1_RX_DMA_CHANNEL) + +#define USART1_DMA_RX_IRQHandler DMA2_Stream2_IRQHandler +#define USART1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define USART1_RX_DMA_INSTANCE DMA2_Stream2 +#define USART1_RX_DMA_CHANNEL DMA_CHANNEL_4 +#define USART1_RX_DMA_IRQ DMA2_Stream2_IRQn + +#endif +/* dma2 stream2 */ + +/* dma2 stream3 */ +#if defined(BSP_SPI5_RX_USING_DMA) && !defined(SPI5_RX_DMA_CHANNEL) + +#define SPI5_DMA_RX_IRQHandler DMA2_Stream3_IRQHandler +#define SPI5_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI5_RX_DMA_INSTANCE DMA2_Stream3 +#define SPI5_RX_DMA_CHANNEL DMA_CHANNEL_2 +#define SPI5_RX_DMA_IRQ DMA2_Stream3_IRQn + +#elif defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_CHANNEL) + +#define SPI1_DMA_TX_IRQHandler DMA2_Stream3_IRQHandler +#define SPI1_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI1_TX_DMA_INSTANCE DMA2_Stream3 +#define SPI1_TX_DMA_CHANNEL DMA_CHANNEL_3 +#define SPI1_TX_DMA_IRQ DMA2_Stream3_IRQn + +#elif defined(BSP_SPI4_TX_USING_DMA) && !defined(SPI4_TX_DMA_CHANNEL) + +#define SPI4_DMA_TX_IRQHandler DMA2_Stream3_IRQHandler +#define SPI4_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI4_TX_DMA_INSTANCE DMA2_Stream3 +#define SPI4_TX_DMA_CHANNEL DMA_CHANNEL_5 +#define SPI4_TX_DMA_IRQ DMA2_Stream3_IRQn + +#endif +/* dma2 stream3 */ + +/* dma2 stream4 */ +#if defined(BSP_SPI5_TX_USING_DMA) && !defined(SPI5_TX_DMA_CHANNEL) + +#define SPI5_DMA_TX_IRQHandler DMA2_Stream4_IRQHandler +#define SPI5_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI5_TX_DMA_INSTANCE DMA2_Stream4 +#define SPI5_TX_DMA_CHANNEL DMA_CHANNEL_2 +#define SPI5_TX_DMA_IRQ DMA2_Stream4_IRQn + +#elif defined(BSP_SPI4_TX_USING_DMA) && !defined(SPI4_TX_DMA_CHANNEL) + +#define SPI4_DMA_TX_IRQHandler DMA2_Stream4_IRQHandler +#define SPI4_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI4_TX_DMA_INSTANCE DMA2_Stream4 +#define SPI4_TX_DMA_CHANNEL DMA_CHANNEL_5 +#define SPI4_TX_DMA_IRQ DMA2_Stream4_IRQn + +#endif +/* dma2 stream4 */ + +/* dma2 stream5 */ +#if defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_CHANNEL) + +#define SPI1_DMA_TX_IRQHandler DMA2_Stream5_IRQHandler +#define SPI1_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI1_TX_DMA_INSTANCE DMA2_Stream5 +#define SPI1_TX_DMA_CHANNEL DMA_CHANNEL_3 +#define SPI1_TX_DMA_IRQ DMA2_Stream5_IRQn + +#elif defined(BSP_UART1_RX_USING_DMA) && !defined(USART1_RX_DMA_CHANNEL) + +#define USART1_DMA_RX_IRQHandler DMA2_Stream5_IRQHandler +#define USART1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define USART1_RX_DMA_INSTANCE DMA2_Stream5 +#define USART1_RX_DMA_CHANNEL DMA_CHANNEL_4 +#define USART1_RX_DMA_IRQ DMA2_Stream5_IRQn + +#elif defined(BSP_SPI5_RX_USING_DMA) && !defined(SPI5_RX_DMA_CHANNEL) + +#define SPI5_DMA_RX_IRQHandler DMA2_Stream5_IRQHandler +#define SPI5_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI5_RX_DMA_INSTANCE DMA2_Stream5 +#define SPI5_RX_DMA_CHANNEL DMA_CHANNEL_7 +#define SPI5_RX_DMA_IRQ DMA2_Stream5_IRQn + +#endif + +/* dma2 stream5 */ + +/* dma2 stream6 */ +#if defined(BSP_SPI5_TX_USING_DMA) && !defined(SPI5_TX_DMA_CHANNEL) + +#define SPI5_DMA_TX_IRQHandler DMA2_Stream6_IRQHandler +#define SPI5_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI5_TX_DMA_INSTANCE DMA2_Stream6 +#define SPI5_TX_DMA_CHANNEL DMA_CHANNEL_7 +#define SPI5_TX_DMA_IRQ DMA2_Stream6_IRQn + +#endif +/* dma2 stream6 */ + +/* dma2 stream7 */ +/* dma2 stream7 */ + +#endif /* __DMA_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f7/dma_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f7/dma_config.h new file mode 100644 index 0000000000..5ff276900b --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/config/f7/dma_config.h @@ -0,0 +1,285 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-01-02 zylx first version + */ + +#ifndef __DMA_CONFIG_H__ +#define __DMA_CONFIG_H__ + +#include + +/* dma1 stream0 */ +#if defined(BSP_SPI3_RX_USING_DMA) && !defined(SPI3_RX_DMA_CHANNEL) + +#define SPI3_DMA_RX_IRQHandler DMA1_Stream0_IRQHandler +#define SPI3_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI3_RX_DMA_INSTANCE DMA1_Stream0 +#define SPI3_RX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI3_RX_DMA_IRQ DMA1_Stream0_IRQn + +#elif defined(BSP_UART5_RX_USING_DMA) && !defined(UART5_RX_DMA_CHANNEL) +#define UART5_DMA_RX_IRQHandler DMA1_Stream0_IRQHandler +#define UART5_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define UART5_RX_DMA_INSTANCE DMA1_Stream0 +#define UART5_RX_DMA_CHANNEL DMA_CHANNEL_4 +#define UART5_RX_DMA_IRQ DMA1_Stream0_IRQn + +#endif +/* dma1 stream0 */ + +/* dma1 stream1 */ +#if defined(BSP_UART3_RX_USING_DMA) && !defined(UART3_RX_DMA_CHANNEL) +#define UART3_DMA_RX_IRQHandler DMA1_Stream1_IRQHandler +#define UART3_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define UART3_RX_DMA_INSTANCE DMA1_Stream1 +#define UART3_RX_DMA_CHANNEL DMA_CHANNEL_4 +#define UART3_RX_DMA_IRQ DMA1_Stream1_IRQn + +#endif +/* dma1 stream1 */ + +/* dma1 stream2 */ +#if defined(BSP_SPI3_RX_USING_DMA) && !defined(SPI3_RX_DMA_CHANNEL) + +#define SPI3_DMA_RX_IRQHandler DMA1_Stream2_IRQHandler +#define SPI3_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI3_RX_DMA_INSTANCE DMA1_Stream2 +#define SPI3_RX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI3_RX_DMA_IRQ DMA1_Stream2_IRQn + +#elif defined(BSP_UART4_RX_USING_DMA) && !defined(UART4_RX_DMA_CHANNEL) +#define UART4_DMA_RX_IRQHandler DMA1_Stream2_IRQHandler +#define UART4_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define UART4_RX_DMA_INSTANCE DMA1_Stream2 +#define UART4_RX_DMA_CHANNEL DMA_CHANNEL_4 +#define UART4_RX_DMA_IRQ DMA1_Stream2_IRQn + +#endif +/* dma1 stream2 */ + +/* dma1 stream3 */ +#if defined(BSP_SPI2_RX_USING_DMA) && !defined(SPI2_RX_DMA_CHANNEL) + +#define SPI2_DMA_RX_IRQHandler DMA1_Stream3_IRQHandler +#define SPI2_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI2_RX_DMA_INSTANCE DMA1_Stream3 +#define SPI2_RX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI2_RX_DMA_IRQ DMA1_Stream3_IRQn + +#endif +/* dma1 stream3 */ + +/* dma1 stream4 */ +#if defined(BSP_SPI2_TX_USING_DMA) && !defined(SPI2_TX_DMA_CHANNEL) + +#define SPI2_DMA_TX_IRQHandler DMA1_Stream4_IRQHandler +#define SPI2_TX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI2_TX_DMA_INSTANCE DMA1_Stream4 +#define SPI2_TX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI2_TX_DMA_IRQ DMA1_Stream4_IRQn + +#endif +/* dma1 stream4 */ + +/* dma1 stream5 */ +#if defined(BSP_SPI3_TX_USING_DMA) && !defined(SPI3_TX_DMA_CHANNEL) + +#define SPI3_DMA_TX_IRQHandler DMA1_Stream5_IRQHandler +#define SPI3_TX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI3_TX_DMA_INSTANCE DMA1_Stream5 +#define SPI3_TX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI3_TX_DMA_IRQ DMA1_Stream5_IRQn + +#elif defined(BSP_UART2_RX_USING_DMA) && !defined(UART2_RX_DMA_CHANNEL) +#define UART2_DMA_RX_IRQHandler DMA1_Stream5_IRQHandler +#define UART2_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define UART2_RX_DMA_INSTANCE DMA1_Stream5 +#define UART2_RX_DMA_CHANNEL DMA_CHANNEL_4 +#define UART2_RX_DMA_IRQ DMA1_Stream5_IRQn + +#endif +/* dma1 stream5 */ + +/* dma1 stream6 */ +/* dma1 stream6 */ + +/* dma1 stream7 */ +#if defined(BSP_SPI3_TX_USING_DMA) && !defined(SPI3_TX_DMA_CHANNEL) + +#define SPI3_DMA_TX_IRQHandler DMA1_Stream7_IRQHandler +#define SPI3_TX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI3_TX_DMA_INSTANCE DMA1_Stream7 +#define SPI3_TX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI3_TX_DMA_IRQ DMA1_Stream7_IRQn + +#endif +/* dma1 stream7 */ + +/* dma2 stream0 */ +#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_CHANNEL) + +#define SPI1_DMA_RX_IRQHandler DMA2_Stream0_IRQHandler +#define SPI1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI1_RX_DMA_INSTANCE DMA2_Stream0 +#define SPI1_RX_DMA_CHANNEL DMA_CHANNEL_3 +#define SPI1_RX_DMA_IRQ DMA2_Stream0_IRQn + +#elif defined(BSP_SPI4_RX_USING_DMA) && !defined(SPI4_RX_DMA_CHANNEL) + +#define SPI4_DMA_RX_IRQHandler DMA2_Stream0_IRQHandler +#define SPI4_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI4_RX_DMA_INSTANCE DMA2_Stream0 +#define SPI4_RX_DMA_CHANNEL DMA_CHANNEL_4 +#define SPI4_RX_DMA_IRQ DMA2_Stream0_IRQn + +#endif +/* dma2 stream0 */ + +/* dma2 stream1 */ +#if defined(BSP_SPI4_TX_USING_DMA) && !defined(SPI4_TX_DMA_CHANNEL) + +#define SPI4_DMA_TX_IRQHandler DMA2_Stream1_IRQHandler +#define SPI4_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI4_TX_DMA_INSTANCE DMA2_Stream1 +#define SPI4_TX_DMA_CHANNEL DMA_CHANNEL_4 +#define SPI4_TX_DMA_IRQ DMA2_Stream1_IRQn + +#endif +/* dma2 stream1 */ + +/* dma2 stream2 */ +#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_CHANNEL) + +#define SPI1_DMA_RX_IRQHandler DMA2_Stream2_IRQHandler +#define SPI1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI1_RX_DMA_INSTANCE DMA2_Stream2 +#define SPI1_RX_DMA_CHANNEL DMA_CHANNEL_3 +#define SPI1_RX_DMA_IRQ DMA2_Stream2_IRQn + +#elif defined(BSP_UART1_RX_USING_DMA) && !defined(USART1_RX_DMA_CHANNEL) + +#define USART1_DMA_RX_IRQHandler DMA2_Stream2_IRQHandler +#define USART1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define USART1_RX_DMA_INSTANCE DMA2_Stream2 +#define USART1_RX_DMA_CHANNEL DMA_CHANNEL_4 +#define USART1_RX_DMA_IRQ DMA2_Stream2_IRQn + +#elif defined(BSP_QSPI_USING_DMA) && !defined(QSPI_DMA_CHANNEL) + +#define QSPI_DMA_IRQHandler DMA2_Stream2_IRQHandler +#define QSPI_DMA_RCC RCC_AHB1ENR_DMA2EN +#define QSPI_DMA_INSTANCE DMA2_Stream2 +#define QSPI_DMA_CHANNEL DMA_CHANNEL_11 +#define QSPI_DMA_IRQ DMA2_Stream2_IRQn + +#endif +/* dma2 stream2 */ + +/* dma2 stream3 */ +#if defined(BSP_SPI5_RX_USING_DMA) && !defined(SPI5_RX_DMA_CHANNEL) + +#define SPI5_DMA_RX_IRQHandler DMA2_Stream3_IRQHandler +#define SPI5_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI5_RX_DMA_INSTANCE DMA2_Stream3 +#define SPI5_RX_DMA_CHANNEL DMA_CHANNEL_2 +#define SPI5_RX_DMA_IRQ DMA2_Stream3_IRQn + +#elif defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_CHANNEL) + +#define SPI1_DMA_TX_IRQHandler DMA2_Stream3_IRQHandler +#define SPI1_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI1_TX_DMA_INSTANCE DMA2_Stream3 +#define SPI1_TX_DMA_CHANNEL DMA_CHANNEL_3 +#define SPI1_TX_DMA_IRQ DMA2_Stream3_IRQn + +#elif defined(BSP_SPI4_RX_USING_DMA) && !defined(SPI4_RX_DMA_CHANNEL) + +#define SPI4_DMA_RX_IRQHandler DMA2_Stream3_IRQHandler +#define SPI4_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI4_RX_DMA_INSTANCE DMA2_Stream3 +#define SPI4_RX_DMA_CHANNEL DMA_CHANNEL_5 +#define SPI4_RX_DMA_IRQ DMA2_Stream3_IRQn + +#endif +/* dma2 stream3 */ + +/* dma2 stream4 */ +#if defined(BSP_SPI5_TX_USING_DMA) && !defined(SPI5_TX_DMA_CHANNEL) + +#define SPI5_DMA_TX_IRQHandler DMA2_Stream4_IRQHandler +#define SPI5_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI5_TX_DMA_INSTANCE DMA2_Stream4 +#define SPI5_TX_DMA_CHANNEL DMA_CHANNEL_2 +#define SPI5_TX_DMA_IRQ DMA2_Stream4_IRQn + +#elif defined(BSP_SPI4_TX_USING_DMA) && !defined(SPI4_TX_DMA_CHANNEL) + +#define SPI4_DMA_TX_IRQHandler DMA2_Stream4_IRQHandler +#define SPI4_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI4_TX_DMA_INSTANCE DMA2_Stream4 +#define SPI4_TX_DMA_CHANNEL DMA_CHANNEL_5 +#define SPI4_TX_DMA_IRQ DMA2_Stream4_IRQn + +#endif +/* dma2 stream4 */ + +/* dma2 stream5 */ +#if defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_CHANNEL) + +#define SPI1_DMA_TX_IRQHandler DMA2_Stream5_IRQHandler +#define SPI1_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI1_TX_DMA_INSTANCE DMA2_Stream5 +#define SPI1_TX_DMA_CHANNEL DMA_CHANNEL_3 +#define SPI1_TX_DMA_IRQ DMA2_Stream5_IRQn + +#elif defined(BSP_UART1_RX_USING_DMA) && !defined(USART1_RX_DMA_CHANNEL) + +#define USART1_DMA_RX_IRQHandler DMA2_Stream5_IRQHandler +#define USART1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define USART1_RX_DMA_INSTANCE DMA2_Stream5 +#define USART1_RX_DMA_CHANNEL DMA_CHANNEL_4 +#define USART1_RX_DMA_IRQ DMA2_Stream5_IRQn + +#elif defined(BSP_SPI5_RX_USING_DMA) && !defined(SPI5_RX_DMA_CHANNEL) + +#define SPI5_DMA_RX_IRQHandler DMA2_Stream5_IRQHandler +#define SPI5_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI5_RX_DMA_INSTANCE DMA2_Stream5 +#define SPI5_RX_DMA_CHANNEL DMA_CHANNEL_7 +#define SPI5_RX_DMA_IRQ DMA2_Stream5_IRQn + +#endif + +/* dma2 stream5 */ + +/* dma2 stream6 */ +#if defined(BSP_SPI5_TX_USING_DMA) && !defined(SPI5_TX_DMA_CHANNEL) + +#define SPI5_DMA_TX_IRQHandler DMA2_Stream6_IRQHandler +#define SPI5_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI5_TX_DMA_INSTANCE DMA2_Stream6 +#define SPI5_TX_DMA_CHANNEL DMA_CHANNEL_7 +#define SPI5_TX_DMA_IRQ DMA2_Stream6_IRQn + +#endif +/* dma2 stream6 */ + +/* dma2 stream7 */ +#if defined(BSP_QSPI_USING_DMA) && !defined(QSPI_DMA_CHANNEL) + +#define QSPI_DMA_IRQHandler DMA2_Stream7_IRQHandler +#define QSPI_DMA_RCC RCC_AHB1ENR_DMA2EN +#define QSPI_DMA_INSTANCE DMA2_Stream7 +#define QSPI_DMA_CHANNEL DMA_CHANNEL_3 +#define QSPI_DMA_IRQ DMA2_Stream7_IRQn + +#endif + +/* dma2 stream7 */ + +#endif /* __DMA_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/l4/dma_config.h b/bsp/stm32/libraries/HAL_Drivers/config/l4/dma_config.h new file mode 100644 index 0000000000..84495c2c5a --- /dev/null +++ b/bsp/stm32/libraries/HAL_Drivers/config/l4/dma_config.h @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-01-05 zylx first version + */ + +#ifndef __DMA_CONFIG_H__ +#define __DMA_CONFIG_H__ + +#include + +/* dma1 channel1 */ + + + +/* dma1 channel1 */ + +/* dma1 channel2 */ +#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_REQUEST) + +#define SPI1_DMA_RX_IRQHandler DMA1_Channel2_IRQHandler +#define SPI1_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI1_RX_DMA_INSTANCE DMA1_Channel2 +#define SPI1_RX_DMA_REQUEST DMA_REQUEST_1 +#define SPI1_RX_DMA_IRQ DMA1_Channel2_IRQn + +#endif +/* dma1 channel2 */ + +/* dma1 channel3 */ +#if defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_REQUEST) + +#define SPI1_DMA_TX_IRQHandler DMA1_Channel3_IRQHandler +#define SPI1_TX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI1_TX_DMA_INSTANCE DMA1_Channel3 +#define SPI1_TX_DMA_REQUEST DMA_REQUEST_1 +#define SPI1_TX_DMA_IRQ DMA1_Channel3_IRQn + +#endif +/* dma1 channel3 */ + +/* dma1 channel4 */ +#if defined(BSP_UART1_TX_USING_DMA) && !defined(USART1_TX_DMA_REQUEST) + +#define USART1_DMA_TX_IRQHandler DMA1_Channel4_IRQHandler +#define USART1_TX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define USART1_TX_DMA_INSTANCE DMA1_Channel4 +#define USART1_TX_DMA_REQUEST DMA_REQUEST_2 +#define USART1_TX_DMA_IRQ DMA1_Channel4_IRQn + +#endif +/* dma1 channel4 */ + +/* dma1 channel5 */ +#if defined(BSP_UART1_RX_USING_DMA) && !defined(USART1_RX_DMA_REQUEST) + +#define USART1_DMA_RX_IRQHandler DMA1_Channel5_IRQHandler +#define USART1_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define USART1_RX_DMA_INSTANCE DMA1_Channel5 +#define USART1_RX_DMA_REQUEST DMA_REQUEST_2 +#define USART1_RX_DMA_IRQ DMA1_Channel5_IRQn + +#elif defined(BSP_QSPI_USING_DMA) && !defined(QSPI_DMA_CHANNEL) + +#define QSPI_DMA_IRQHandler DMA1_Channel5_IRQHandler +#define QSPI_DMA_RCC RCC_AHB1ENR_DMA1EN +#define QSPI_DMA_INSTANCE DMA1_Channel5 +#define QSPI_DMA_CHANNEL DMA_REQUEST_5 +#define QSPI_DMA_IRQ DMA1_Channel5_IRQn + +#endif +/* dma1 channel5 */ + +/* dma1 channel6 */ +/* dma1 channel6 */ + +/* dma1 channel7 */ + + + +/* dma1 channel7 */ + +/* dma2 channel1 */ +#if defined(BSP_UART5_TX_USING_DMA) && !defined(UART5_TX_DMA_REQUEST) + +#define UART5_DMA_TX_IRQHandler DMA2_Channel1_IRQHandler +#define UART5_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define UART5_TX_DMA_INSTANCE DMA2_Channel1 +#define UART5_TX_DMA_REQUEST DMA_REQUEST_2 +#define UART5_TX_DMA_IRQ DMA2_Channel1_IRQn + +#endif +/* dma2 channel1 */ + +/* dma2 channel2 */ +#if defined(BSP_UART5_RX_USING_DMA) && !defined(UART5_RX_DMA_REQUEST) + +#define UART5_DMA_RX_IRQHandler DMA2_Channel2_IRQHandler +#define UART5_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define UART5_RX_DMA_INSTANCE DMA2_Channel2 +#define UART5_RX_DMA_REQUEST DMA_REQUEST_2 +#define UART5_RX_DMA_IRQ DMA2_Channel2_IRQn + +#endif +/* dma2 channel2 */ + +/* dma2 channel3 */ +#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_REQUEST) + +#define SPI1_DMA_RX_IRQHandler DMA2_Channel3_IRQHandler +#define SPI1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI1_RX_DMA_INSTANCE DMA2_Channel3 +#define SPI1_RX_DMA_REQUEST DMA_REQUEST_4 +#define SPI1_RX_DMA_IRQ DMA2_Channel3_IRQn + +#endif +/* dma2 channel3 */ + +/* dma2 channel4 */ +#if defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_REQUEST) + +#define SPI1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler +#define SPI1_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI1_TX_DMA_INSTANCE DMA2_Channel4 +#define SPI1_TX_DMA_REQUEST DMA_REQUEST_4 +#define SPI1_TX_DMA_IRQ DMA2_Channel4_IRQn + +#endif +/* dma2 channel4 */ + +/* dma2 channel5 */ + + + +/* dma2 channel5 */ + +/* dma2 channel6 */ +#if defined(BSP_UART1_TX_USING_DMA) && !defined(USART1_TX_DMA_REQUEST) + +#define USART1_DMA_TX_IRQHandler DMA2_Channel6_IRQHandler +#define USART1_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define USART1_TX_DMA_INSTANCE DMA2_Channel6 +#define USART1_TX_DMA_REQUEST DMA_REQUEST_2 +#define USART1_TX_DMA_IRQ DMA2_Channel6_IRQn + +#endif +/* dma2 channel6 */ + +/* dma2 channel7 */ +#if defined(BSP_UART1_RX_USING_DMA) && !defined(USART1_RX_DMA_REQUEST) + +#define USART1_DMA_RX_IRQHandler DMA2_Channel7_IRQHandler +#define USART1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define USART1_RX_DMA_INSTANCE DMA2_Channel7 +#define USART1_RX_DMA_REQUEST DMA_REQUEST_2 +#define USART1_RX_DMA_IRQ DMA2_Channel7_IRQn + +#elif defined(BSP_QSPI_USING_DMA) && !defined(QSPI_DMA_CHANNEL) + +#define QSPI_DMA_IRQHandler DMA2_Channel7_IRQHandler +#define QSPI_DMA_RCC RCC_AHB1ENR_DMA2EN +#define QSPI_DMA_INSTANCE DMA2_Channel7 +#define QSPI_DMA_CHANNEL DMA_REQUEST_3 +#define QSPI_DMA_IRQ DMA2_Channel7_IRQn + +#endif +/* dma2 channel7 */ + +#endif /* __DMA_CONFIG_H__ */ From 574492a2820f3d38d8e1738065a3c0b6709bb0d9 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Tue, 8 Jan 2019 11:58:57 +0800 Subject: [PATCH 02/15] [bsp][stm32] Modify the DMA implementation --- .../HAL_Drivers/config/f0/uart_config.h | 52 +- .../HAL_Drivers/config/f1/spi_config.h | 127 +++-- .../HAL_Drivers/config/f1/uart_config.h | 147 +++-- .../HAL_Drivers/config/f4/spi_config.h | 231 +++++--- .../HAL_Drivers/config/f4/uart_config.h | 153 ++++-- .../HAL_Drivers/config/f7/qspi_config.h | 9 +- .../HAL_Drivers/config/f7/spi_config.h | 245 +++++---- .../HAL_Drivers/config/f7/uart_config.h | 153 ++++-- .../HAL_Drivers/config/l4/qspi_config.h | 7 +- .../HAL_Drivers/config/l4/spi_config.h | 52 +- .../HAL_Drivers/config/l4/uart_config.h | 64 ++- bsp/stm32/libraries/HAL_Drivers/drv_config.h | 5 + bsp/stm32/libraries/HAL_Drivers/drv_dma.h | 5 +- bsp/stm32/libraries/HAL_Drivers/drv_qspi.c | 14 +- bsp/stm32/libraries/HAL_Drivers/drv_spi.c | 501 ++++++++++-------- bsp/stm32/libraries/HAL_Drivers/drv_spi.h | 14 +- bsp/stm32/libraries/HAL_Drivers/drv_usart.c | 100 ++-- bsp/stm32/libraries/HAL_Drivers/drv_usart.h | 38 +- 18 files changed, 1169 insertions(+), 748 deletions(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f0/uart_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f0/uart_config.h index 44cbe30039..64ad12adf4 100644 --- a/bsp/stm32/libraries/HAL_Drivers/config/f0/uart_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/config/f0/uart_config.h @@ -15,34 +15,46 @@ #if defined(BSP_USING_UART1) #ifndef UART1_CONFIG -#define UART1_CONFIG \ - { \ - .name = "uart1", \ - .Instance = USART1, \ - .irq_type = USART1_IRQn, \ - .dma.Instance = DMA1_Channel3, \ - .dma_rcc = RCC_AHBENR_DMA1EN, \ - .dma_irq = DMA1_Ch2_3_DMA2_Ch1_2_IRQn, \ +#define UART1_CONFIG \ + { \ + .name = "uart1", \ + .Instance = USART1, \ + .irq_type = USART1_IRQn, \ } - -#define USART1_RX_DMA_ISR DMA1_Ch2_3_DMA2_Ch1_2_IRQHandler #endif /* UART1_CONFIG */ #endif /* BSP_USING_UART1 */ +#if defined(BSP_UART1_RX_USING_DMA) +#ifndef UART1_DMA_CONFIG +#define UART1_DMA_CONFIG \ + { \ + .Instance = USART1_RX_DMA_INSTANCE, \ + .dma_rcc = USART1_RX_DMA_RCC, \ + .dma_irq = USART1_RX_DMA_IRQ, \ + } +#endif /* UART1_DMA_CONFIG */ +#endif /* BSP_UART1_RX_USING_DMA */ + #if defined(BSP_USING_UART2) #ifndef UART2_CONFIG -#define UART2_CONFIG \ - { \ - .name = "uart2", \ - .Instance = USART2, \ - .irq_type = USART2_IRQn, \ - .dma.Instance = DMA1_Channel3, \ - .dma_rcc = RCC_AHBENR_DMA1EN, \ - .dma_irq = DMA1_Ch2_3_DMA2_Ch1_2_IRQn, \ +#define UART2_CONFIG \ + { \ + .name = "uart2", \ + .Instance = USART2, \ + .irq_type = USART2_IRQn, \ } - -#define USART2_RX_DMA_ISR DMA1_Ch2_3_DMA2_Ch1_2_IRQHandler #endif /* UART2_CONFIG */ #endif /* BSP_USING_UART2 */ + +#if defined(BSP_UART2_RX_USING_DMA) +#ifndef UART2_DMA_CONFIG +#define UART2_DMA_CONFIG \ + { \ + .Instance = USART2_RX_DMA_INSTANCE, \ + .dma_rcc = USART2_RX_DMA_RCC, \ + .dma_irq = USART2_RX_DMA_IRQ, \ + } +#endif /* UART2_DMA_CONFIG */ +#endif /* BSP_UART2_RX_USING_DMA */ #endif /* __UART_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f1/spi_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f1/spi_config.h index a910847e39..b77ce5ef3b 100644 --- a/bsp/stm32/libraries/HAL_Drivers/config/f1/spi_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/config/f1/spi_config.h @@ -5,7 +5,8 @@ * * Change Logs: * Date Author Notes - * 2018-11-06 SummerGift change to new framework + * 2018-11-06 SummerGift first version + * 2019-01-05 SummerGift modify DMA support */ #ifndef __SPI_CONFIG_H__ @@ -14,55 +15,101 @@ #include #ifdef BSP_USING_SPI1 -#define SPI1_BUS_CONFIG \ - { \ - .Instance = SPI1, \ - .bus_name = "spi1", \ - .dma_rx.dma_rcc = RCC_AHBENR_DMA1EN, \ - .dma_tx.dma_rcc = RCC_AHBENR_DMA1EN, \ - .dma_rx.Instance = DMA1_Channel2, \ - .dma_rx.dma_irq = DMA1_Channel2_IRQn, \ - .dma_tx.Instance = DMA1_Channel3, \ - .dma_tx.dma_irq = DMA1_Channel3_IRQn, \ +#ifndef SPI1_BUS_CONFIG +#define SPI1_BUS_CONFIG \ + { \ + .Instance = SPI1, \ + .bus_name = "spi1", \ } +#endif /* SPI1_BUS_CONFIG */ +#endif /* BSP_USING_SPI1 */ + +#ifdef BSP_SPI1_TX_USING_DMA +#ifndef SPI1_TX_DMA_CONFIG +#define SPI1_TX_DMA_CONFIG \ + { \ + .dma_rcc = SPI1_TX_DMA_RCC, \ + .Instance = SPI1_TX_DMA_INSTANCE, \ + .dma_irq = SPI1_TX_DMA_IRQ, \ + } +#endif /* SPI1_TX_DMA_CONFIG */ +#endif /* BSP_SPI1_TX_USING_DMA */ -#define SPI1_DMA_RX_IRQHandler DMA1_Channel2_IRQHandler -#define SPI1_DMA_TX_IRQHandler DMA1_Channel3_IRQHandler -#endif +#ifdef BSP_SPI1_RX_USING_DMA +#ifndef SPI1_RX_DMA_CONFIG +#define SPI1_RX_DMA_CONFIG \ + { \ + .dma_rcc = SPI1_RX_DMA_RCC, \ + .Instance = SPI1_RX_DMA_INSTANCE, \ + .dma_irq = SPI1_RX_DMA_IRQ, \ + } +#endif /* SPI1_RX_DMA_CONFIG */ +#endif /* BSP_SPI1_RX_USING_DMA */ #ifdef BSP_USING_SPI2 -#define SPI2_BUS_CONFIG \ - { \ - .Instance = SPI2, \ - .bus_name = "spi2", \ - .dma_rx.dma_rcc = RCC_AHBENR_DMA1EN, \ - .dma_tx.dma_rcc = RCC_AHBENR_DMA1EN, \ - .dma_rx.Instance = DMA1_Channel4, \ - .dma_rx.dma_irq = DMA1_Channel4_IRQn, \ - .dma_tx.Instance = DMA1_Channel5, \ - .dma_tx.dma_irq = DMA1_Channel5_IRQn, \ +#ifndef SPI2_BUS_CONFIG +#define SPI2_BUS_CONFIG \ + { \ + .Instance = SPI2, \ + .bus_name = "spi2", \ } +#endif /* SPI2_BUS_CONFIG */ +#endif /* BSP_USING_SPI2 */ -#define SPI2_DMA_RX_IRQHandler DMA1_Channel4_IRQHandler -#define SPI2_DMA_TX_IRQHandler DMA1_Channel5_IRQHandler -#endif +#ifdef BSP_SPI2_TX_USING_DMA +#ifndef SPI2_TX_DMA_CONFIG +#define SPI2_TX_DMA_CONFIG \ + { \ + .dma_rcc = SPI2_TX_DMA_RCC, \ + .Instance = SPI2_TX_DMA_INSTANCE, \ + .dma_irq = SPI2_TX_DMA_IRQ, \ + } +#endif /* SPI2_TX_DMA_CONFIG */ +#endif /* BSP_SPI2_TX_USING_DMA */ + +#ifdef BSP_SPI2_RX_USING_DMA +#ifndef SPI2_RX_DMA_CONFIG +#define SPI2_RX_DMA_CONFIG \ + { \ + .dma_rcc = SPI2_RX_DMA_RCC, \ + .Instance = SPI2_RX_DMA_INSTANCE, \ + .dma_irq = SPI2_RX_DMA_IRQ, \ + } +#endif /* SPI2_RX_DMA_CONFIG */ +#endif /* BSP_SPI2_RX_USING_DMA */ #ifdef BSP_USING_SPI3 -#define SPI3_BUS_CONFIG \ - { \ - .Instance = SPI3, \ - .bus_name = "spi3", \ - .dma_rx.dma_rcc = RCC_AHBENR_DMA2EN, \ - .dma_tx.dma_rcc = RCC_AHBENR_DMA2EN, \ - .dma_rx.Instance = DMA2_Channel1, \ - .dma_rx.dma_irq = DMA2_Channel1_IRQn, \ - .dma_tx.Instance = DMA2_Channel2, \ - .dma_tx.dma_irq = DMA2_Channel2_IRQn, \ +#ifndef SPI3_BUS_CONFIG +#define SPI3_BUS_CONFIG \ + { \ + .Instance = SPI3, \ + .bus_name = "spi3", \ } +#endif /* SPI3_BUS_CONFIG */ +#endif /* BSP_USING_SPI3 */ -#define SPI3_DMA_RX_IRQHandler DMA2_Channel1_IRQHandler -#define SPI3_DMA_TX_IRQHandler DMA2_Channel2_IRQHandler -#endif +#ifdef BSP_SPI3_TX_USING_DMA +#ifndef SPI3_TX_DMA_CONFIG +#define SPI3_TX_DMA_CONFIG \ + { \ + .dma_rcc = SPI3_TX_DMA_RCC, \ + .Instance = SPI3_TX_DMA_INSTANCE, \ + .dma_irq = SPI3_TX_DMA_IRQ, \ + } +#endif /* SPI3_TX_DMA_CONFIG */ +#endif /* BSP_SPI3_TX_USING_DMA */ + +#ifdef BSP_SPI3_RX_USING_DMA +#ifndef SPI3_RX_DMA_CONFIG +#define SPI3_RX_DMA_CONFIG \ + { \ + .dma_rcc = SPI3_RX_DMA_RCC, \ + .Instance = SPI3_RX_DMA_INSTANCE, \ + .dma_irq = SPI3_RX_DMA_IRQ, \ + } +#endif /* SPI3_RX_DMA_CONFIG */ +#endif /* BSP_SPI3_RX_USING_DMA */ + #endif /*__SPI_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f1/uart_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f1/uart_config.h index fd7482f4e6..f7c5f41f9b 100644 --- a/bsp/stm32/libraries/HAL_Drivers/config/f1/uart_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/config/f1/uart_config.h @@ -5,81 +5,122 @@ * * Change Logs: * Date Author Notes - * 2018-10-30 BalanceTWK change to new framework + * 2018-10-30 BalanceTWK first version + * 2019-01-05 SummerGift modify DMA support */ #ifndef __UART_CONFIG_H__ #define __UART_CONFIG_H__ #include +#include "dma_config.h" #if defined(BSP_USING_UART1) -#define UART1_CONFIG \ - { \ - .name = "uart1", \ - .Instance = USART1, \ - .irq_type = USART1_IRQn, \ - .dma.channel.Instance = DMA1_Channel5, \ - .dma_rcc = RCC_AHBENR_DMA1EN, \ - .dma_irq = DMA1_Channel5_IRQn, \ +#ifndef UART1_CONFIG +#define UART1_CONFIG \ + { \ + .name = "uart1", \ + .Instance = USART1, \ + .irq_type = USART1_IRQn, \ } +#endif /* UART1_CONFIG */ +#endif /* BSP_USING_UART1 */ -#define USART1_RX_DMA_ISR DMA1_Channel5_IRQHandler -#endif +#if defined(BSP_UART1_RX_USING_DMA) +#ifndef UART1_DMA_CONFIG +#define UART1_DMA_CONFIG \ + { \ + .Instance = USART1_RX_DMA_INSTANCE, \ + .dma_rcc = USART1_RX_DMA_RCC, \ + .dma_irq = USART1_RX_DMA_IRQ, \ + } +#endif /* UART1_DMA_CONFIG */ +#endif /* BSP_UART1_RX_USING_DMA */ #if defined(BSP_USING_UART2) - -#define UART2_CONFIG \ - { \ - .name = "uart2", \ - .Instance = USART2, \ - .irq_type = USART2_IRQn, \ - .dma.channel.Instance = DMA1_Channel6, \ - .dma_rcc = RCC_AHBENR_DMA1EN, \ - .dma_irq = DMA1_Channel6_IRQn, \ +#ifndef UART2_CONFIG +#define UART2_CONFIG \ + { \ + .name = "uart2", \ + .Instance = USART2, \ + .irq_type = USART2_IRQn, \ } +#endif /* UART2_CONFIG */ +#endif /* BSP_USING_UART2 */ + +#if defined(BSP_UART2_RX_USING_DMA) +#ifndef UART2_DMA_CONFIG +#define UART2_DMA_CONFIG \ + { \ + .Instance = USART2_RX_DMA_INSTANCE, \ + .dma_rcc = USART2_RX_DMA_RCC, \ + .dma_irq = USART2_RX_DMA_IRQ, \ + } +#endif /* UART2_DMA_CONFIG */ +#endif /* BSP_UART2_RX_USING_DMA */ -#define USART2_RX_DMA_ISR DMA1_Channel6_IRQHandler -#endif - #if defined(BSP_USING_UART3) - -#define UART3_CONFIG \ - { \ - .name = "uart3", \ - .Instance = USART3, \ - .irq_type = USART3_IRQn, \ - .dma.channel.Instance = DMA1_Channel3, \ - .dma_rcc = RCC_AHBENR_DMA1EN, \ - .dma_irq = DMA1_Channel3_IRQn, \ +#ifndef UART3_CONFIG +#define UART3_CONFIG \ + { \ + .name = "uart3", \ + .Instance = USART3, \ + .irq_type = USART3_IRQn, \ } +#endif /* UART3_CONFIG */ +#endif /* BSP_USING_UART3 */ -#define USART3_RX_DMA_ISR DMA1_Channel3_IRQHandler -#endif +#if defined(BSP_UART3_RX_USING_DMA) +#ifndef UART3_DMA_CONFIG +#define UART3_DMA_CONFIG \ + { \ + .Instance = USART3_RX_DMA_INSTANCE, \ + .dma_rcc = USART3_RX_DMA_RCC, \ + .dma_irq = USART3_RX_DMA_IRQ, \ + } +#endif /* UART3_DMA_CONFIG */ +#endif /* BSP_UART3_RX_USING_DMA */ #if defined(BSP_USING_UART4) - -#define UART4_CONFIG \ - { \ - .name = "uart4", \ - .Instance = UART4, \ - .irq_type = UART4_IRQn, \ - .dma.channel.Instance = DMA2_Channel3, \ - .dma_rcc = RCC_AHBENR_DMA2EN, \ - .dma_irq = DMA2_Channel3_IRQn, \ +#ifndef UART4_CONFIG +#define UART4_CONFIG \ + { \ + .name = "uart4", \ + .Instance = UART4, \ + .irq_type = UART4_IRQn, \ } +#endif /* UART4_CONFIG */ +#endif /* BSP_USING_UART4 */ -#define USART4_RX_DMA_ISR DMA2_Channel3_IRQHandler -#endif +#if defined(BSP_UART4_RX_USING_DMA) +#ifndef UART4_DMA_CONFIG +#define UART4_DMA_CONFIG \ + { \ + .Instance = USART4_RX_DMA_INSTANCE, \ + .dma_rcc = USART4_RX_DMA_RCC, \ + .dma_irq = USART4_RX_DMA_IRQ, \ + } +#endif /* UART4_DMA_CONFIG */ +#endif /* BSP_UART4_RX_USING_DMA */ #if defined(BSP_USING_UART5) - -#define UART5_CONFIG \ - { \ - .name = "uart5", \ - .Instance = UART5, \ - .irq_type = UART5_IRQn, \ - .dma.channel.Instance = DMA_NOT_AVAILABLE, \ +#ifndef UART5_CONFIG +#define UART5_CONFIG \ + { \ + .name = "uart5", \ + .Instance = UART5, \ + .irq_type = UART5_IRQn, \ } -#endif +#endif /* UART5_CONFIG */ +#endif /* BSP_USING_UART5 */ + +#if defined(BSP_UART5_RX_USING_DMA) +#ifndef UART5_DMA_CONFIG +#define UART5_DMA_CONFIG \ + { \ + .Instance = DMA_NOT_AVAILABLE, \ + } +#endif /* UART5_DMA_CONFIG */ +#endif /* BSP_UART5_RX_USING_DMA */ + #endif diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f4/spi_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f4/spi_config.h index abeecd7154..3cd3f69884 100644 --- a/bsp/stm32/libraries/HAL_Drivers/config/f4/spi_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/config/f4/spi_config.h @@ -5,7 +5,8 @@ * * Change Logs: * Date Author Notes - * 2018-11-06 SummerGift change to new framework + * 2018-11-06 SummerGift first version + * 2019-01-03 zylx modify DMA support */ #ifndef __SPI_CONFIG_H__ @@ -14,101 +15,173 @@ #include #ifdef BSP_USING_SPI1 -#define SPI1_BUS_CONFIG \ - { \ - .Instance = SPI1, \ - .bus_name = "spi1", \ - .dma_rx.dma_rcc = RCC_AHB1ENR_DMA2EN, \ - .dma_tx.dma_rcc = RCC_AHB1ENR_DMA2EN, \ - .dma_rx.Instance = DMA2_Stream2, \ - .dma_rx.channel = DMA_CHANNEL_3, \ - .dma_rx.dma_irq = DMA2_Stream2_IRQn, \ - .dma_tx.Instance = DMA2_Stream3, \ - .dma_tx.channel = DMA_CHANNEL_3, \ - .dma_tx.dma_irq = DMA2_Stream3_IRQn, \ +#ifndef SPI1_BUS_CONFIG +#define SPI1_BUS_CONFIG \ + { \ + .Instance = SPI1, \ + .bus_name = "spi1", \ } +#endif /* SPI1_BUS_CONFIG */ +#endif /* BSP_USING_SPI1 */ + +#ifdef BSP_SPI1_TX_USING_DMA +#ifndef SPI1_TX_DMA_CONFIG +#define SPI1_TX_DMA_CONFIG \ + { \ + .dma_rcc = SPI1_TX_DMA_RCC, \ + .Instance = SPI1_TX_DMA_INSTANCE, \ + .channel = SPI1_TX_DMA_CHANNEL, \ + .dma_irq = SPI1_TX_DMA_IRQ, \ + } +#endif /* SPI1_TX_DMA_CONFIG */ +#endif /* BSP_SPI1_TX_USING_DMA */ -#define SPI1_DMA_RX_IRQHandler DMA2_Stream2_IRQHandler -#define SPI1_DMA_TX_IRQHandler DMA2_Stream3_IRQHandler -#endif +#ifdef BSP_SPI1_RX_USING_DMA +#ifndef SPI1_RX_DMA_CONFIG +#define SPI1_RX_DMA_CONFIG \ + { \ + .dma_rcc = SPI1_RX_DMA_RCC, \ + .Instance = SPI1_RX_DMA_INSTANCE, \ + .channel = SPI1_RX_DMA_CHANNEL, \ + .dma_irq = SPI1_RX_DMA_IRQ, \ + } +#endif /* SPI1_RX_DMA_CONFIG */ +#endif /* BSP_SPI1_RX_USING_DMA */ #ifdef BSP_USING_SPI2 -#define SPI2_BUS_CONFIG \ - { \ - .Instance = SPI2, \ - .bus_name = "spi2", \ - .dma_rx.dma_rcc = RCC_AHB1ENR_DMA1EN, \ - .dma_tx.dma_rcc = RCC_AHB1ENR_DMA1EN, \ - .dma_rx.Instance = DMA1_Stream3, \ - .dma_rx.channel = DMA_CHANNEL_0, \ - .dma_rx.dma_irq = DMA1_Stream3_IRQn, \ - .dma_tx.Instance = DMA1_Stream4, \ - .dma_tx.channel = DMA_CHANNEL_0, \ - .dma_tx.dma_irq = DMA1_Stream4_IRQn, \ +#ifndef SPI2_BUS_CONFIG +#define SPI2_BUS_CONFIG \ + { \ + .Instance = SPI2, \ + .bus_name = "spi2", \ } +#endif /* SPI2_BUS_CONFIG */ +#endif /* BSP_USING_SPI2 */ + +#ifdef BSP_SPI2_TX_USING_DMA +#ifndef SPI2_TX_DMA_CONFIG +#define SPI2_TX_DMA_CONFIG \ + { \ + .dma_rcc = SPI2_TX_DMA_RCC, \ + .Instance = SPI2_TX_DMA_INSTANCE, \ + .channel = SPI2_TX_DMA_CHANNEL, \ + .dma_irq = SPI2_TX_DMA_IRQ, \ + } +#endif /* SPI2_TX_DMA_CONFIG */ +#endif /* BSP_SPI2_TX_USING_DMA */ -#define SPI2_DMA_RX_IRQHandler DMA1_Stream3_IRQHandler -#define SPI2_DMA_TX_IRQHandler DMA1_Stream4_IRQHandler -#endif +#ifdef BSP_SPI2_RX_USING_DMA +#ifndef SPI2_RX_DMA_CONFIG +#define SPI2_RX_DMA_CONFIG \ + { \ + .dma_rcc = SPI2_RX_DMA_RCC, \ + .Instance = SPI2_RX_DMA_INSTANCE, \ + .channel = SPI2_RX_DMA_CHANNEL, \ + .dma_irq = SPI2_RX_DMA_IRQ, \ + } +#endif /* SPI2_RX_DMA_CONFIG */ +#endif /* BSP_SPI2_RX_USING_DMA */ #ifdef BSP_USING_SPI3 -#define SPI3_BUS_CONFIG \ - { \ - .Instance = SPI3, \ - .bus_name = "spi3", \ - .dma_rx.dma_rcc = RCC_AHB1ENR_DMA1EN, \ - .dma_tx.dma_rcc = RCC_AHB1ENR_DMA1EN, \ - .dma_rx.Instance = DMA1_Stream0, \ - .dma_rx.channel = DMA_CHANNEL_0, \ - .dma_rx.dma_irq = DMA1_Stream0_IRQn, \ - .dma_tx.Instance = DMA1_Stream5, \ - .dma_tx.channel = DMA_CHANNEL_0, \ - .dma_tx.dma_irq = DMA1_Stream5_IRQn, \ +#ifndef SPI3_BUS_CONFIG +#define SPI3_BUS_CONFIG \ + { \ + .Instance = SPI3, \ + .bus_name = "spi3", \ } +#endif /* SPI3_BUS_CONFIG */ +#endif /* BSP_USING_SPI3 */ + +#ifdef BSP_SPI3_TX_USING_DMA +#ifndef SPI3_TX_DMA_CONFIG +#define SPI3_TX_DMA_CONFIG \ + { \ + .dma_rcc = SPI3_TX_DMA_RCC, \ + .Instance = SPI3_TX_DMA_INSTANCE, \ + .channel = SPI3_TX_DMA_CHANNEL, \ + .dma_irq = SPI3_TX_DMA_IRQ, \ + } +#endif /* SPI3_TX_DMA_CONFIG */ +#endif /* BSP_SPI3_TX_USING_DMA */ -#define SPI3_DMA_RX_IRQHandler DMA1_Stream0_IRQHandler -#define SPI3_DMA_TX_IRQHandler DMA1_Stream5_IRQHandler -#endif +#ifdef BSP_SPI3_RX_USING_DMA +#ifndef SPI3_RX_DMA_CONFIG +#define SPI3_RX_DMA_CONFIG \ + { \ + .dma_rcc = SPI3_RX_DMA_RCC, \ + .Instance = SPI3_RX_DMA_INSTANCE, \ + .channel = SPI3_RX_DMA_CHANNEL, \ + .dma_irq = SPI3_RX_DMA_IRQ, \ + } +#endif /* SPI3_RX_DMA_CONFIG */ +#endif /* BSP_SPI3_RX_USING_DMA */ #ifdef BSP_USING_SPI4 -#define SPI4_BUS_CONFIG \ - { \ - .Instance = SPI4, \ - .bus_name = "spi4", \ - .dma_rx.dma_rcc = RCC_AHB1ENR_DMA2EN, \ - .dma_tx.dma_rcc = RCC_AHB1ENR_DMA2EN, \ - .dma_rx.Instance = DMA2_Stream0, \ - .dma_rx.channel = DMA_CHANNEL_4, \ - .dma_rx.dma_irq = DMA2_Stream0_IRQn, \ - .dma_tx.Instance = DMA2_Stream1, \ - .dma_tx.channel = DMA_CHANNEL_4, \ - .dma_tx.dma_irq = DMA2_Stream1_IRQn, \ +#ifndef SPI4_BUS_CONFIG +#define SPI4_BUS_CONFIG \ + { \ + .Instance = SPI4, \ + .bus_name = "spi4", \ } +#endif /* SPI4_BUS_CONFIG */ +#endif /* BSP_USING_SPI4 */ + +#ifdef BSP_SPI4_TX_USING_DMA +#ifndef SPI4_TX_DMA_CONFIG +#define SPI4_TX_DMA_CONFIG \ + { \ + .dma_rcc = SPI4_TX_DMA_RCC, \ + .Instance = SPI4_TX_DMA_INSTANCE, \ + .channel = SPI4_TX_DMA_CHANNEL, \ + .dma_irq = SPI4_TX_DMA_IRQ, \ + } +#endif /* SPI4_TX_DMA_CONFIG */ +#endif /* BSP_SPI4_TX_USING_DMA */ -#define SPI4_DMA_RX_IRQHandler DMA2_Stream0_IRQHandler -#define SPI4_DMA_TX_IRQHandler DMA2_Stream1_IRQHandler -#endif +#ifdef BSP_SPI4_RX_USING_DMA +#ifndef SPI4_RX_DMA_CONFIG +#define SPI4_RX_DMA_CONFIG \ + { \ + .dma_rcc = SPI4_RX_DMA_RCC, \ + .Instance = SPI4_RX_DMA_INSTANCE, \ + .channel = SPI4_RX_DMA_CHANNEL, \ + .dma_irq = SPI4_RX_DMA_IRQ, \ + } +#endif /* SPI4_RX_DMA_CONFIG */ +#endif /* BSP_SPI4_RX_USING_DMA */ #ifdef BSP_USING_SPI5 -#define SPI5_BUS_CONFIG \ - { \ - .Instance = SPI5, \ - .bus_name = "spi5", \ - .dma_rx.dma_rcc = RCC_AHB1ENR_DMA2EN, \ - .dma_tx.dma_rcc = RCC_AHB1ENR_DMA2EN, \ - .dma_rx.Instance = DMA2_Stream3, \ - .dma_rx.channel = DMA_CHANNEL_2, \ - .dma_rx.dma_irq = DMA2_Stream3_IRQn, \ - .dma_tx.Instance = DMA2_Stream4, \ - .dma_tx.channel = DMA_CHANNEL_2, \ - .dma_tx.dma_irq = DMA2_Stream4_IRQn, \ +#ifndef SPI5_BUS_CONFIG +#define SPI5_BUS_CONFIG \ + { \ + .Instance = SPI5, \ + .bus_name = "spi5", \ } +#endif /* SPI5_BUS_CONFIG */ +#endif /* BSP_USING_SPI5 */ + +#ifdef BSP_SPI5_TX_USING_DMA +#ifndef SPI5_TX_DMA_CONFIG +#define SPI5_TX_DMA_CONFIG \ + { \ + .dma_rcc = SPI5_TX_DMA_RCC, \ + .Instance = SPI5_TX_DMA_INSTANCE, \ + .channel = SPI5_TX_DMA_CHANNEL, \ + .dma_irq = SPI5_TX_DMA_IRQ, \ + } +#endif /* SPI5_TX_DMA_CONFIG */ +#endif /* BSP_SPI5_TX_USING_DMA */ -#define SPI5_DMA_RX_IRQHandler DMA2_Stream3_IRQHandler -#define SPI5_DMA_TX_IRQHandler DMA2_Stream4_IRQHandler -#endif +#ifdef BSP_SPI5_RX_USING_DMA +#ifndef SPI5_RX_DMA_CONFIG +#define SPI5_RX_DMA_CONFIG \ + { \ + .dma_rcc = SPI5_RX_DMA_RCC, \ + .Instance = SPI5_RX_DMA_INSTANCE, \ + .channel = SPI5_RX_DMA_CHANNEL, \ + .dma_irq = SPI5_RX_DMA_IRQ, \ + } +#endif /* SPI5_RX_DMA_CONFIG */ +#endif /* BSP_SPI5_RX_USING_DMA */ #endif /*__SPI_CONFIG_H__ */ - - - diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f4/uart_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f4/uart_config.h index d8fab2c361..20dca9cee2 100644 --- a/bsp/stm32/libraries/HAL_Drivers/config/f4/uart_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/config/f4/uart_config.h @@ -5,7 +5,8 @@ * * Change Logs: * Date Author Notes - * 2018-10-30 SummerGift change to new framework + * 2018-10-30 SummerGift first version + * 2019-01-03 zylx modify dma support */ #ifndef __UART_CONFIG_H__ @@ -14,78 +15,118 @@ #include #if defined(BSP_USING_UART1) -#define UART1_CONFIG \ - { \ - .name = "uart1", \ - .Instance = USART1, \ - .irq_type = USART1_IRQn, \ - .dma.stream_channel.Instance = DMA2_Stream5, \ - .dma.stream_channel.channel = DMA_CHANNEL_4, \ - .dma_rcc = RCC_AHB1ENR_DMA2EN, \ - .dma_irq = DMA2_Stream5_IRQn, \ +#ifndef UART1_CONFIG +#define UART1_CONFIG \ + { \ + .name = "uart1", \ + .Instance = USART1, \ + .irq_type = USART1_IRQn, \ } +#endif /* UART1_CONFIG */ +#endif /* BSP_USING_UART1 */ -#define USART1_RX_DMA_ISR DMA2_Stream5_IRQHandler -#endif +#if defined(BSP_UART1_RX_USING_DMA) +#ifndef UART1_DMA_CONFIG +#define UART1_DMA_CONFIG \ + { \ + .Instance = USART1_RX_DMA_INSTANCE, \ + .channel = USART1_RX_DMA_CHANNEL, \ + .dma_rcc = USART1_RX_DMA_RCC, \ + .dma_irq = USART1_RX_DMA_IRQ, \ + } +#endif /* UART1_DMA_CONFIG */ +#endif /* BSP_UART1_RX_USING_DMA */ #if defined(BSP_USING_UART2) -#define UART2_CONFIG \ - { \ - .name = "uart2", \ - .Instance = USART2, \ - .irq_type = USART2_IRQn, \ - .dma.stream_channel.Instance = DMA1_Stream5, \ - .dma.stream_channel.channel = DMA_CHANNEL_4, \ - .dma_rcc = RCC_AHB1ENR_DMA1EN, \ - .dma_irq = DMA1_Stream5_IRQn, \ +#ifndef UART2_CONFIG +#define UART2_CONFIG \ + { \ + .name = "uart2", \ + .Instance = USART2, \ + .irq_type = USART2_IRQn, \ } +#endif /* UART2_CONFIG */ +#endif /* BSP_USING_UART2 */ -#define USART2_RX_DMA_ISR DMA1_Stream5_IRQHandler -#endif +#if defined(BSP_UART2_RX_USING_DMA) +#ifndef UART2_DMA_CONFIG +#define UART2_DMA_CONFIG \ + { \ + .Instance = USART2_RX_DMA_INSTANCE, \ + .channel = USART2_RX_DMA_CHANNEL, \ + .dma_rcc = USART2_RX_DMA_RCC, \ + .dma_irq = USART2_RX_DMA_IRQ, \ + } +#endif /* UART2_DMA_CONFIG */ +#endif /* BSP_UART2_RX_USING_DMA */ #if defined(BSP_USING_UART3) -#define UART3_CONFIG \ - { \ - .name = "uart3", \ - .Instance = USART3, \ - .irq_type = USART3_IRQn, \ - .dma.stream_channel.Instance = DMA1_Stream1, \ - .dma.stream_channel.channel = DMA_CHANNEL_4, \ - .dma_rcc = RCC_AHB1ENR_DMA1EN, \ - .dma_irq = DMA1_Stream1_IRQn, \ +#ifndef UART3_CONFIG +#define UART3_CONFIG \ + { \ + .name = "uart3", \ + .Instance = USART3, \ + .irq_type = USART3_IRQn, \ } +#endif /* UART3_CONFIG */ +#endif /* BSP_USING_UART3 */ -#define USART3_RX_DMA_ISR DMA1_Stream1_IRQHandler -#endif +#if defined(BSP_UART3_RX_USING_DMA) +#ifndef UART3_DMA_CONFIG +#define UART3_DMA_CONFIG \ + { \ + .Instance = USART3_RX_DMA_INSTANCE, \ + .channel = USART3_RX_DMA_CHANNEL, \ + .dma_rcc = USART3_RX_DMA_RCC, \ + .dma_irq = USART3_RX_DMA_IRQ, \ + } +#endif /* UART3_DMA_CONFIG */ +#endif /* BSP_UART3_RX_USING_DMA */ #if defined(BSP_USING_UART4) -#define UART4_CONFIG \ - { \ - .name = "uart4", \ - .Instance = UART4, \ - .irq_type = UART4_IRQn, \ - .dma.stream_channel.Instance = DMA1_Stream2, \ - .dma.stream_channel.channel = DMA_CHANNEL_4, \ - .dma_rcc = RCC_AHB1ENR_DMA1EN, \ - .dma_irq = DMA1_Stream2_IRQn, \ +#ifndef UART4_CONFIG +#define UART4_CONFIG \ + { \ + .name = "uart4", \ + .Instance = UART4, \ + .irq_type = UART4_IRQn, \ } +#endif /* UART4_CONFIG */ +#endif /* BSP_USING_UART4 */ -#define USART4_RX_DMA_ISR DMA1_Stream2_IRQHandler -#endif +#if defined(BSP_UART4_RX_USING_DMA) +#ifndef UART4_DMA_CONFIG +#define UART4_DMA_CONFIG \ + { \ + .Instance = USART4_RX_DMA_INSTANCE, \ + .channel = USART4_RX_DMA_CHANNEL, \ + .dma_rcc = USART4_RX_DMA_RCC, \ + .dma_irq = USART4_RX_DMA_IRQ, \ + } +#endif /* UART4_DMA_CONFIG */ +#endif /* BSP_UART4_RX_USING_DMA */ #if defined(BSP_USING_UART5) -#define UART5_CONFIG \ - { \ - .name = "uart5", \ - .Instance = UART5, \ - .irq_type = UART5_IRQn, \ - .dma.stream_channel.Instance = DMA1_Stream0, \ - .dma.stream_channel.channel = DMA_CHANNEL_4, \ - .dma_rcc = RCC_AHB1ENR_DMA1EN, \ - .dma_irq = DMA1_Stream0_IRQn, \ +#ifndef UART5_CONFIG +#define UART5_CONFIG \ + { \ + .name = "uart5", \ + .Instance = UART5, \ + .irq_type = UART5_IRQn, \ } +#endif /* UART5_CONFIG */ +#endif /* BSP_USING_UART5 */ -#define USART5_RX_DMA_ISR DMA1_Stream0_IRQHandler -#endif +#if defined(BSP_UART5_RX_USING_DMA) +#ifndef UART5_DMA_CONFIG +#define UART5_DMA_CONFIG \ + { \ + .Instance = USART5_RX_DMA_INSTANCE, \ + .channel = USART5_RX_DMA_CHANNEL, \ + .dma_rcc = USART5_RX_DMA_RCC, \ + .dma_irq = USART5_RX_DMA_IRQ, \ + } +#endif /* UART5_DMA_CONFIG */ +#endif /* BSP_UART5_RX_USING_DMA */ #endif diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f7/qspi_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f7/qspi_config.h index 5e148aa250..d69ab7aff9 100644 --- a/bsp/stm32/libraries/HAL_Drivers/config/f7/qspi_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/config/f7/qspi_config.h @@ -24,13 +24,13 @@ } #endif /* QSPI_BUS_CONFIG */ #endif /* BSP_USING_QSPI */ - + #ifdef BSP_QSPI_USING_DMA #ifndef QSPI_DMA_CONFIG #define QSPI_DMA_CONFIG \ { \ - .Instance = DMA2_Stream7, \ - .Init.Channel = DMA_CHANNEL_3, \ + .Instance = QSPI_DMA_INSTANCE, \ + .Init.Channel = QSPI_DMA_CHANNEL, \ .Init.Direction = DMA_PERIPH_TO_MEMORY, \ .Init.PeriphInc = DMA_PINC_DISABLE, \ .Init.MemInc = DMA_MINC_ENABLE, \ @@ -42,10 +42,7 @@ #endif /* QSPI_DMA_CONFIG */ #endif /* BSP_QSPI_USING_DMA */ -#define QSPI_DMA_CLK_ENABLE __HAL_RCC_DMA2_CLK_ENABLE() #define QSPI_IRQn QUADSPI_IRQn -#define QSPI_DMA_IRQn DMA2_Stream7_IRQn #define QSPI_IRQHandler QUADSPI_IRQHandler -#define QSPI_DMA_IRQHandler DMA2_Stream7_IRQHandler #endif /* __QSPI_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f7/spi_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f7/spi_config.h index 41c10756a0..ac18fcd015 100644 --- a/bsp/stm32/libraries/HAL_Drivers/config/f7/spi_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/config/f7/spi_config.h @@ -14,120 +14,173 @@ #include #ifdef BSP_USING_SPI1 -#define SPI1_BUS_CONFIG \ - { \ - .Instance = SPI1, \ - .bus_name = "spi1", \ - .dma_rx.dma_rcc = RCC_AHB1ENR_DMA2EN, \ - .dma_tx.dma_rcc = RCC_AHB1ENR_DMA2EN, \ - .dma_rx.Instance = DMA2_Stream2, \ - .dma_rx.channel = DMA_CHANNEL_3, \ - .dma_rx.dma_irq = DMA2_Stream2_IRQn, \ - .dma_tx.Instance = DMA2_Stream3, \ - .dma_tx.channel = DMA_CHANNEL_3, \ - .dma_tx.dma_irq = DMA2_Stream3_IRQn, \ +#ifndef SPI1_BUS_CONFIG +#define SPI1_BUS_CONFIG \ + { \ + .Instance = SPI1, \ + .bus_name = "spi1", \ } +#endif /* SPI1_BUS_CONFIG */ +#endif /* BSP_USING_SPI1 */ + +#ifdef BSP_SPI1_TX_USING_DMA +#ifndef SPI1_TX_DMA_CONFIG +#define SPI1_TX_DMA_CONFIG \ + { \ + .dma_rcc = SPI1_TX_DMA_RCC, \ + .Instance = SPI1_TX_DMA_INSTANCE, \ + .channel = SPI1_TX_DMA_CHANNEL, \ + .dma_irq = SPI1_TX_DMA_IRQ, \ + } +#endif /* SPI1_TX_DMA_CONFIG */ +#endif /* BSP_SPI1_TX_USING_DMA */ -#define SPI1_DMA_RX_IRQHandler DMA2_Stream2_IRQHandler -#define SPI1_DMA_TX_IRQHandler DMA2_Stream3_IRQHandler -#endif +#ifdef BSP_SPI1_RX_USING_DMA +#ifndef SPI1_RX_DMA_CONFIG +#define SPI1_RX_DMA_CONFIG \ + { \ + .dma_rcc = SPI1_RX_DMA_RCC, \ + .Instance = SPI1_RX_DMA_INSTANCE, \ + .channel = SPI1_RX_DMA_CHANNEL, \ + .dma_irq = SPI1_RX_DMA_IRQ, \ + } +#endif /* SPI1_RX_DMA_CONFIG */ +#endif /* BSP_SPI1_RX_USING_DMA */ #ifdef BSP_USING_SPI2 -#define SPI2_BUS_CONFIG \ - { \ - .Instance = SPI2, \ - .bus_name = "spi2", \ - .dma_rx.dma_rcc = RCC_AHB1ENR_DMA1EN, \ - .dma_tx.dma_rcc = RCC_AHB1ENR_DMA1EN, \ - .dma_rx.Instance = DMA1_Stream3, \ - .dma_rx.channel = DMA_CHANNEL_0, \ - .dma_rx.dma_irq = DMA1_Stream3_IRQn, \ - .dma_tx.Instance = DMA1_Stream4, \ - .dma_tx.channel = DMA_CHANNEL_0, \ - .dma_tx.dma_irq = DMA1_Stream4_IRQn, \ +#ifndef SPI2_BUS_CONFIG +#define SPI2_BUS_CONFIG \ + { \ + .Instance = SPI2, \ + .bus_name = "spi2", \ } +#endif /* SPI2_BUS_CONFIG */ +#endif /* BSP_USING_SPI2 */ + +#ifdef BSP_SPI2_TX_USING_DMA +#ifndef SPI2_TX_DMA_CONFIG +#define SPI2_TX_DMA_CONFIG \ + { \ + .dma_rcc = SPI2_TX_DMA_RCC, \ + .Instance = SPI2_TX_DMA_INSTANCE, \ + .channel = SPI2_TX_DMA_CHANNEL, \ + .dma_irq = SPI2_TX_DMA_IRQ, \ + } +#endif /* SPI2_TX_DMA_CONFIG */ +#endif /* BSP_SPI2_TX_USING_DMA */ -#define SPI2_DMA_RX_IRQHandler DMA1_Stream3_IRQHandler -#define SPI2_DMA_TX_IRQHandler DMA1_Stream4_IRQHandler -#endif +#ifdef BSP_SPI2_RX_USING_DMA +#ifndef SPI2_RX_DMA_CONFIG +#define SPI2_RX_DMA_CONFIG \ + { \ + .dma_rcc = SPI2_RX_DMA_RCC, \ + .Instance = SPI2_RX_DMA_INSTANCE, \ + .channel = SPI2_RX_DMA_CHANNEL, \ + .dma_irq = SPI2_RX_DMA_IRQ, \ + } +#endif /* SPI2_RX_DMA_CONFIG */ +#endif /* BSP_SPI2_RX_USING_DMA */ #ifdef BSP_USING_SPI3 -#define SPI3_BUS_CONFIG \ - { \ - .Instance = SPI3, \ - .bus_name = "spi3", \ - .dma_rx.dma_rcc = RCC_AHB1ENR_DMA1EN, \ - .dma_tx.dma_rcc = RCC_AHB1ENR_DMA1EN, \ - .dma_rx.Instance = DMA1_Stream0, \ - .dma_rx.channel = DMA_CHANNEL_0, \ - .dma_rx.dma_irq = DMA1_Stream0_IRQn, \ - .dma_tx.Instance = DMA1_Stream7, \ - .dma_tx.channel = DMA_CHANNEL_0, \ - .dma_tx.dma_irq = DMA1_Stream7_IRQn, \ +#ifndef SPI3_BUS_CONFIG +#define SPI3_BUS_CONFIG \ + { \ + .Instance = SPI3, \ + .bus_name = "spi3", \ } +#endif /* SPI3_BUS_CONFIG */ +#endif /* BSP_USING_SPI3 */ + +#ifdef BSP_SPI3_TX_USING_DMA +#ifndef SPI3_TX_DMA_CONFIG +#define SPI3_TX_DMA_CONFIG \ + { \ + .dma_rcc = SPI3_TX_DMA_RCC, \ + .Instance = SPI3_TX_DMA_INSTANCE, \ + .channel = SPI3_TX_DMA_CHANNEL, \ + .dma_irq = SPI3_TX_DMA_IRQ, \ + } +#endif /* SPI3_TX_DMA_CONFIG */ +#endif /* BSP_SPI3_TX_USING_DMA */ -#define SPI3_DMA_RX_IRQHandler DMA1_Stream0_IRQHandler -#define SPI3_DMA_TX_IRQHandler DMA1_Stream7_IRQHandler -#endif +#ifdef BSP_SPI3_RX_USING_DMA +#ifndef SPI3_RX_DMA_CONFIG +#define SPI3_RX_DMA_CONFIG \ + { \ + .dma_rcc = SPI3_RX_DMA_RCC, \ + .Instance = SPI3_RX_DMA_INSTANCE, \ + .channel = SPI3_RX_DMA_CHANNEL, \ + .dma_irq = SPI3_RX_DMA_IRQ, \ + } +#endif /* SPI3_RX_DMA_CONFIG */ +#endif /* BSP_SPI3_RX_USING_DMA */ #ifdef BSP_USING_SPI4 -#define SPI4_BUS_CONFIG \ - { \ - .Instance = SPI4, \ - .bus_name = "spi4", \ - .dma_rx.dma_rcc = RCC_AHB1ENR_DMA2EN, \ - .dma_tx.dma_rcc = RCC_AHB1ENR_DMA2EN, \ - .dma_rx.Instance = DMA2_Stream0, \ - .dma_rx.channel = DMA_CHANNEL_4, \ - .dma_rx.dma_irq = DMA2_Stream0_IRQn, \ - .dma_tx.Instance = DMA2_Stream1, \ - .dma_tx.channel = DMA_CHANNEL_4, \ - .dma_tx.dma_irq = DMA2_Stream1_IRQn, \ +#ifndef SPI4_BUS_CONFIG +#define SPI4_BUS_CONFIG \ + { \ + .Instance = SPI4, \ + .bus_name = "spi4", \ } +#endif /* SPI4_BUS_CONFIG */ +#endif /* BSP_USING_SPI4 */ + +#ifdef BSP_SPI4_TX_USING_DMA +#ifndef SPI4_TX_DMA_CONFIG +#define SPI4_TX_DMA_CONFIG \ + { \ + .dma_rcc = SPI4_TX_DMA_RCC, \ + .Instance = SPI4_TX_DMA_INSTANCE, \ + .channel = SPI4_TX_DMA_CHANNEL, \ + .dma_irq = SPI4_TX_DMA_IRQ, \ + } +#endif /* SPI4_TX_DMA_CONFIG */ +#endif /* BSP_SPI4_TX_USING_DMA */ -#define SPI4_DMA_RX_IRQHandler DMA2_Stream0_IRQHandler -#define SPI4_DMA_TX_IRQHandler DMA2_Stream1_IRQHandler -#endif +#ifdef BSP_SPI4_RX_USING_DMA +#ifndef SPI4_RX_DMA_CONFIG +#define SPI4_RX_DMA_CONFIG \ + { \ + .dma_rcc = SPI4_RX_DMA_RCC, \ + .Instance = SPI4_RX_DMA_INSTANCE, \ + .channel = SPI4_RX_DMA_CHANNEL, \ + .dma_irq = SPI4_RX_DMA_IRQ, \ + } +#endif /* SPI4_RX_DMA_CONFIG */ +#endif /* BSP_SPI4_RX_USING_DMA */ #ifdef BSP_USING_SPI5 -#define SPI5_BUS_CONFIG \ - { \ - .Instance = SPI5, \ - .bus_name = "spi5", \ - .dma_rx.dma_rcc = RCC_AHB1ENR_DMA2EN, \ - .dma_tx.dma_rcc = RCC_AHB1ENR_DMA2EN, \ - .dma_rx.Instance = DMA2_Stream3, \ - .dma_rx.channel = DMA_CHANNEL_2, \ - .dma_rx.dma_irq = DMA2_Stream3_IRQn, \ - .dma_tx.Instance = DMA2_Stream4, \ - .dma_tx.channel = DMA_CHANNEL_2, \ - .dma_tx.dma_irq = DMA2_Stream4_IRQn, \ +#ifndef SPI5_BUS_CONFIG +#define SPI5_BUS_CONFIG \ + { \ + .Instance = SPI5, \ + .bus_name = "spi5", \ } - -#define SPI5_DMA_RX_IRQHandler DMA2_Stream3_IRQHandler -#define SPI5_DMA_TX_IRQHandler DMA2_Stream4_IRQHandler -#endif - -#ifdef BSP_USING_SPI6 -#define SPI5_BUS_CONFIG \ - { \ - .Instance = SPI6, \ - .bus_name = "spi6", \ - .dma_rx.dma_rcc = RCC_AHB1ENR_DMA2EN, \ - .dma_tx.dma_rcc = RCC_AHB1ENR_DMA2EN, \ - .dma_rx.Instance = DMA2_Stream6, \ - .dma_rx.channel = DMA_CHANNEL_1, \ - .dma_rx.dma_irq = DMA2_Stream6_IRQn, \ - .dma_tx.Instance = DMA2_Stream5, \ - .dma_tx.channel = DMA_CHANNEL_1, \ - .dma_tx.dma_irq = DMA2_Stream5_IRQn, \ +#endif /* SPI5_BUS_CONFIG */ +#endif /* BSP_USING_SPI5 */ + +#ifdef BSP_SPI5_TX_USING_DMA +#ifndef SPI5_TX_DMA_CONFIG +#define SPI5_TX_DMA_CONFIG \ + { \ + .dma_rcc = SPI5_TX_DMA_RCC, \ + .Instance = SPI5_TX_DMA_INSTANCE, \ + .channel = SPI5_TX_DMA_CHANNEL, \ + .dma_irq = SPI5_TX_DMA_IRQ, \ } +#endif /* SPI5_TX_DMA_CONFIG */ +#endif /* BSP_SPI5_TX_USING_DMA */ -#define SPI6_DMA_RX_IRQHandler DMA2_Stream6_IRQHandler -#define SPI6_DMA_TX_IRQHandler DMA2_Stream5_IRQHandler -#endif +#ifdef BSP_SPI5_RX_USING_DMA +#ifndef SPI5_RX_DMA_CONFIG +#define SPI5_RX_DMA_CONFIG \ + { \ + .dma_rcc = SPI5_RX_DMA_RCC, \ + .Instance = SPI5_RX_DMA_INSTANCE, \ + .channel = SPI5_RX_DMA_CHANNEL, \ + .dma_irq = SPI5_RX_DMA_IRQ, \ + } +#endif /* SPI5_RX_DMA_CONFIG */ +#endif /* BSP_SPI5_RX_USING_DMA */ #endif /*__SPI_CONFIG_H__ */ - - - diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f7/uart_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f7/uart_config.h index d8fab2c361..ae343a1621 100644 --- a/bsp/stm32/libraries/HAL_Drivers/config/f7/uart_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/config/f7/uart_config.h @@ -5,7 +5,8 @@ * * Change Logs: * Date Author Notes - * 2018-10-30 SummerGift change to new framework + * 2018-10-30 SummerGift first version + * 2019-01-05 zylx modify dma support */ #ifndef __UART_CONFIG_H__ @@ -14,78 +15,118 @@ #include #if defined(BSP_USING_UART1) -#define UART1_CONFIG \ - { \ - .name = "uart1", \ - .Instance = USART1, \ - .irq_type = USART1_IRQn, \ - .dma.stream_channel.Instance = DMA2_Stream5, \ - .dma.stream_channel.channel = DMA_CHANNEL_4, \ - .dma_rcc = RCC_AHB1ENR_DMA2EN, \ - .dma_irq = DMA2_Stream5_IRQn, \ +#ifndef UART1_CONFIG +#define UART1_CONFIG \ + { \ + .name = "uart1", \ + .Instance = USART1, \ + .irq_type = USART1_IRQn, \ } +#endif /* UART1_CONFIG */ +#endif /* BSP_USING_UART1 */ -#define USART1_RX_DMA_ISR DMA2_Stream5_IRQHandler -#endif +#if defined(BSP_UART1_RX_USING_DMA) +#ifndef UART1_DMA_CONFIG +#define UART1_DMA_CONFIG \ + { \ + .Instance = USART1_RX_DMA_INSTANCE, \ + .channel = USART1_RX_DMA_CHANNEL, \ + .dma_rcc = USART1_RX_DMA_RCC, \ + .dma_irq = USART1_RX_DMA_IRQ, \ + } +#endif /* UART1_DMA_CONFIG */ +#endif /* BSP_UART1_RX_USING_DMA */ #if defined(BSP_USING_UART2) -#define UART2_CONFIG \ - { \ - .name = "uart2", \ - .Instance = USART2, \ - .irq_type = USART2_IRQn, \ - .dma.stream_channel.Instance = DMA1_Stream5, \ - .dma.stream_channel.channel = DMA_CHANNEL_4, \ - .dma_rcc = RCC_AHB1ENR_DMA1EN, \ - .dma_irq = DMA1_Stream5_IRQn, \ +#ifndef UART2_CONFIG +#define UART2_CONFIG \ + { \ + .name = "uart2", \ + .Instance = USART2, \ + .irq_type = USART2_IRQn, \ } +#endif /* UART2_CONFIG */ +#endif /* BSP_USING_UART2 */ -#define USART2_RX_DMA_ISR DMA1_Stream5_IRQHandler -#endif +#if defined(BSP_UART2_RX_USING_DMA) +#ifndef UART2_DMA_CONFIG +#define UART2_DMA_CONFIG \ + { \ + .Instance = USART2_RX_DMA_INSTANCE, \ + .channel = USART2_RX_DMA_CHANNEL, \ + .dma_rcc = USART2_RX_DMA_RCC, \ + .dma_irq = USART2_RX_DMA_IRQ, \ + } +#endif /* UART2_DMA_CONFIG */ +#endif /* BSP_UART2_RX_USING_DMA */ #if defined(BSP_USING_UART3) -#define UART3_CONFIG \ - { \ - .name = "uart3", \ - .Instance = USART3, \ - .irq_type = USART3_IRQn, \ - .dma.stream_channel.Instance = DMA1_Stream1, \ - .dma.stream_channel.channel = DMA_CHANNEL_4, \ - .dma_rcc = RCC_AHB1ENR_DMA1EN, \ - .dma_irq = DMA1_Stream1_IRQn, \ +#ifndef UART3_CONFIG +#define UART3_CONFIG \ + { \ + .name = "uart3", \ + .Instance = USART3, \ + .irq_type = USART3_IRQn, \ } +#endif /* UART3_CONFIG */ +#endif /* BSP_USING_UART3 */ -#define USART3_RX_DMA_ISR DMA1_Stream1_IRQHandler -#endif +#if defined(BSP_UART3_RX_USING_DMA) +#ifndef UART3_DMA_CONFIG +#define UART3_DMA_CONFIG \ + { \ + .Instance = USART3_RX_DMA_INSTANCE, \ + .channel = USART3_RX_DMA_CHANNEL, \ + .dma_rcc = USART3_RX_DMA_RCC, \ + .dma_irq = USART3_RX_DMA_IRQ, \ + } +#endif /* UART3_DMA_CONFIG */ +#endif /* BSP_UART3_RX_USING_DMA */ #if defined(BSP_USING_UART4) -#define UART4_CONFIG \ - { \ - .name = "uart4", \ - .Instance = UART4, \ - .irq_type = UART4_IRQn, \ - .dma.stream_channel.Instance = DMA1_Stream2, \ - .dma.stream_channel.channel = DMA_CHANNEL_4, \ - .dma_rcc = RCC_AHB1ENR_DMA1EN, \ - .dma_irq = DMA1_Stream2_IRQn, \ +#ifndef UART4_CONFIG +#define UART4_CONFIG \ + { \ + .name = "uart4", \ + .Instance = UART4, \ + .irq_type = UART4_IRQn, \ } +#endif /* UART4_CONFIG */ +#endif /* BSP_USING_UART4 */ -#define USART4_RX_DMA_ISR DMA1_Stream2_IRQHandler -#endif +#if defined(BSP_UART4_RX_USING_DMA) +#ifndef UART4_DMA_CONFIG +#define UART4_DMA_CONFIG \ + { \ + .Instance = USART4_RX_DMA_INSTANCE, \ + .channel = USART4_RX_DMA_CHANNEL, \ + .dma_rcc = USART4_RX_DMA_RCC, \ + .dma_irq = USART4_RX_DMA_IRQ, \ + } +#endif /* UART4_DMA_CONFIG */ +#endif /* BSP_UART4_RX_USING_DMA */ #if defined(BSP_USING_UART5) -#define UART5_CONFIG \ - { \ - .name = "uart5", \ - .Instance = UART5, \ - .irq_type = UART5_IRQn, \ - .dma.stream_channel.Instance = DMA1_Stream0, \ - .dma.stream_channel.channel = DMA_CHANNEL_4, \ - .dma_rcc = RCC_AHB1ENR_DMA1EN, \ - .dma_irq = DMA1_Stream0_IRQn, \ +#ifndef UART5_CONFIG +#define UART5_CONFIG \ + { \ + .name = "uart5", \ + .Instance = UART5, \ + .irq_type = UART5_IRQn, \ } +#endif /* UART5_CONFIG */ +#endif /* BSP_USING_UART5 */ -#define USART5_RX_DMA_ISR DMA1_Stream0_IRQHandler -#endif +#if defined(BSP_UART5_RX_USING_DMA) +#ifndef UART5_DMA_CONFIG +#define UART5_DMA_CONFIG \ + { \ + .Instance = USART5_RX_DMA_INSTANCE, \ + .channel = USART5_RX_DMA_CHANNEL, \ + .dma_rcc = USART5_RX_DMA_RCC, \ + .dma_irq = USART5_RX_DMA_IRQ, \ + } +#endif /* UART5_DMA_CONFIG */ +#endif /* BSP_UART5_RX_USING_DMA */ #endif diff --git a/bsp/stm32/libraries/HAL_Drivers/config/l4/qspi_config.h b/bsp/stm32/libraries/HAL_Drivers/config/l4/qspi_config.h index 93a018ac85..ae968c0cfc 100644 --- a/bsp/stm32/libraries/HAL_Drivers/config/l4/qspi_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/config/l4/qspi_config.h @@ -29,8 +29,8 @@ #ifndef QSPI_DMA_CONFIG #define QSPI_DMA_CONFIG \ { \ - .Instance = DMA1_Channel5, \ - .Init.Request = DMA_REQUEST_5, \ + .Instance = QSPI_DMA_INSTANCE, \ + .Init.Request = QSPI_DMA_CHANNEL, \ .Init.Direction = DMA_PERIPH_TO_MEMORY, \ .Init.PeriphInc = DMA_PINC_DISABLE, \ .Init.MemInc = DMA_MINC_ENABLE, \ @@ -42,10 +42,7 @@ #endif /* QSPI_DMA_CONFIG */ #endif /* BSP_QSPI_USING_DMA */ -#define QSPI_DMA_CLK_ENABLE __HAL_RCC_DMA1_CLK_ENABLE() #define QSPI_IRQn QUADSPI_IRQn -#define QSPI_DMA_IRQn DMA1_Channel5_IRQn #define QSPI_IRQHandler QUADSPI_IRQHandler -#define QSPI_DMA_IRQHandler DMA1_Channel5_IRQHandler #endif /* __QSPI_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/l4/spi_config.h b/bsp/stm32/libraries/HAL_Drivers/config/l4/spi_config.h index 054f55ff77..4a595cd9ff 100644 --- a/bsp/stm32/libraries/HAL_Drivers/config/l4/spi_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/config/l4/spi_config.h @@ -14,22 +14,38 @@ #include #ifdef BSP_USING_SPI1 -#define SPI1_BUS_CONFIG \ - { \ - .Instance = SPI1, \ - .bus_name = "spi1", \ - .dma_rx.dma_rcc = RCC_AHB1ENR_DMA1EN, \ - .dma_tx.dma_rcc = RCC_AHB1ENR_DMA1EN, \ - .dma_rx.Instance = DMA1_Channel2, \ - .dma_rx.request = DMA_REQUEST_1, \ - .dma_rx.dma_irq = DMA1_Channel2_IRQn, \ - .dma_tx.Instance = DMA1_Channel3, \ - .dma_tx.request = DMA_REQUEST_1, \ - .dma_tx.dma_irq = DMA1_Channel3_IRQn, \ +#ifndef SPI1_BUS_CONFIG +#define SPI1_BUS_CONFIG \ + { \ + .Instance = SPI1, \ + .bus_name = "spi1", \ } -#define SPI1_DMA_RX_IRQHandler DMA1_Channel2_IRQHandler -#define SPI1_DMA_TX_IRQHandler DMA1_Channel3_IRQHandler -#endif +#endif /* SPI1_BUS_CONFIG */ +#endif /* BSP_USING_SPI1 */ + +#ifdef BSP_SPI1_TX_USING_DMA +#ifndef SPI1_TX_DMA_CONFIG +#define SPI1_TX_DMA_CONFIG \ + { \ + .dma_rcc = SPI1_TX_DMA_RCC, \ + .Instance = SPI1_TX_DMA_INSTANCE, \ + .request = SPI1_TX_DMA_REQUEST, \ + .dma_irq = SPI1_TX_DMA_IRQ, \ + } +#endif /* SPI1_TX_DMA_CONFIG */ +#endif /* BSP_SPI1_TX_USING_DMA */ + +#ifdef BSP_SPI1_RX_USING_DMA +#ifndef SPI1_RX_DMA_CONFIG +#define SPI1_RX_DMA_CONFIG \ + { \ + .dma_rcc = SPI1_RX_DMA_RCC, \ + .Instance = SPI1_RX_DMA_INSTANCE, \ + .request = SPI1_RX_DMA_REQUEST, \ + .dma_irq = SPI1_RX_DMA_IRQ, \ + } +#endif /* SPI1_RX_DMA_CONFIG */ +#endif /* BSP_SPI1_RX_USING_DMA */ #ifdef BSP_USING_SPI2 #define SPI2_BUS_CONFIG \ @@ -45,8 +61,7 @@ .dma_tx.request = DMA_REQUEST_1, \ .dma_tx.dma_irq = DMA1_Channel5_IRQn, \ } -#define SPI2_DMA_RX_IRQHandler DMA1_Channel4_IRQHandler -#define SPI2_DMA_TX_IRQHandler DMA1_Channel5_IRQHandler + #endif #ifdef BSP_USING_SPI3 @@ -63,8 +78,7 @@ .dma_tx.request = DMA_REQUEST_3, \ .dma_tx.dma_irq = DMA2_Channel2_IRQn, \ } -#define SPI3_DMA_RX_IRQHandler DMA2_Channel1_IRQHandler -#define SPI3_DMA_TX_IRQHandler DMA2_Channel2_IRQHandler + #endif #endif /*__SPI_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/l4/uart_config.h b/bsp/stm32/libraries/HAL_Drivers/config/l4/uart_config.h index 46d5414f55..0b27ff77c8 100644 --- a/bsp/stm32/libraries/HAL_Drivers/config/l4/uart_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/config/l4/uart_config.h @@ -14,35 +14,49 @@ #include #if defined(BSP_USING_UART1) - -#define UART1_CONFIG \ - { \ - .name = "uart1", \ - .Instance = USART1, \ - .irq_type = USART1_IRQn, \ - .dma.channel_request.Instance = DMA2_Channel7, \ - .dma.channel_request.request = DMA_REQUEST_2, \ - .dma_rcc = RCC_AHB1ENR_DMA2EN, \ - .dma_irq = DMA2_Channel7_IRQn, \ +#ifndef UART1_CONFIG +#define UART1_CONFIG \ + { \ + .name = "uart1", \ + .Instance = USART1, \ + .irq_type = USART1_IRQn, \ } +#endif /* UART1_CONFIG */ +#endif /* BSP_USING_UART1 */ -#define USART1_RX_DMA_ISR DMA2_Channel7_IRQHandler -#endif - +#if defined(BSP_UART1_RX_USING_DMA) +#ifndef UART1_DMA_CONFIG +#define UART1_DMA_CONFIG \ + { \ + .Instance = USART1_RX_DMA_INSTANCE, \ + .request = USART1_RX_DMA_REQUEST, \ + .dma_rcc = USART1_RX_DMA_RCC, \ + .dma_irq = USART1_RX_DMA_IRQ, \ + } +#endif /* UART1_DMA_CONFIG */ +#endif /* BSP_UART1_RX_USING_DMA */ + #if defined(BSP_USING_UART2) - -#define UART2_CONFIG \ - { \ - .name = "uart2", \ - .Instance = USART2, \ - .irq_type = USART2_IRQn, \ - .dma.channel_request.Instance = DMA1_Channel6, \ - .dma.channel_request.request = DMA_REQUEST_2, \ - .dma_rcc = RCC_AHB1SMENR_DMA1SMEN, \ - .dma_irq = DMA1_Channel6_IRQn, \ +#ifndef UART2_CONFIG +#define UART2_CONFIG \ + { \ + .name = "uart2", \ + .Instance = USART2, \ + .irq_type = USART2_IRQn, \ } +#endif /* UART2_CONFIG */ +#endif /* BSP_USING_UART2 */ -#define USART2_RX_DMA_ISR DMA1_Channel6_IRQHandler -#endif +#if defined(BSP_UART2_RX_USING_DMA) +#ifndef UART2_DMA_CONFIG +#define UART2_DMA_CONFIG \ + { \ + .Instance = USART2_RX_DMA_INSTANCE, \ + .request = USART2_RX_DMA_REQUEST, \ + .dma_rcc = USART2_RX_DMA_RCC, \ + .dma_irq = USART2_RX_DMA_IRQ, \ + } +#endif /* UART2_DMA_CONFIG */ +#endif /* BSP_UART2_RX_USING_DMA */ #endif diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_config.h b/bsp/stm32/libraries/HAL_Drivers/drv_config.h index 1046b44c09..214552398e 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/drv_config.h @@ -15,12 +15,14 @@ #include #if defined(SOC_SERIES_STM32F0) +#include "f0/dma_config.h" #include "f0/uart_config.h" #include "f0/spi_config.h" #include "f0/tim_config.h" #include "f0/pwm_config.h" #include "f0/adc_config.h" #elif defined(SOC_SERIES_STM32F1) +#include "f1/dma_config.h" #include "f1/uart_config.h" #include "f1/spi_config.h" #include "f1/adc_config.h" @@ -28,6 +30,7 @@ #include "f1/sdio_config.h" #include "f1/pwm_config.h" #elif defined(SOC_SERIES_STM32F4) +#include "f4/dma_config.h" #include "f4/uart_config.h" #include "f4/spi_config.h" #include "f4/adc_config.h" @@ -35,6 +38,7 @@ #include "f4/sdio_config.h" #include "f4/pwm_config.h" #elif defined(SOC_SERIES_STM32F7) +#include "f7/dma_config.h" #include "f7/uart_config.h" #include "f7/spi_config.h" #include "f7/qspi_config.h" @@ -43,6 +47,7 @@ #include "f7/sdio_config.h" #include "f7/pwm_config.h" #elif defined(SOC_SERIES_STM32L4) +#include "l4/dma_config.h" #include "l4/uart_config.h" #include "l4/spi_config.h" #include "l4/qspi_config.h" diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_dma.h b/bsp/stm32/libraries/HAL_Drivers/drv_dma.h index 4c266eafce..b56cb1e941 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_dma.h +++ b/bsp/stm32/libraries/HAL_Drivers/drv_dma.h @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2018-11-10 SummerGift change to new framework + * 2018-11-10 SummerGift first version */ #ifndef __DRV_DMA_H_ @@ -16,7 +16,7 @@ #include #include -#if defined(SOC_SERIES_STM32F0) || (SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) +#if defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) #define DMA_INSTANCE_TYPE DMA_Channel_TypeDef #elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) #define DMA_INSTANCE_TYPE DMA_Stream_TypeDef @@ -36,5 +36,4 @@ struct dma_config { #endif }; - #endif /*__DRV_DMA_H_ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_qspi.c b/bsp/stm32/libraries/HAL_Drivers/drv_qspi.c index 95b7cf10ad..6b54ad2c7a 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_qspi.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_qspi.c @@ -92,11 +92,19 @@ static int stm32_qspi_init(struct rt_qspi_device *device, struct rt_qspi_configu /* QSPI interrupts must be enabled when using the HAL_QSPI_Receive_DMA */ HAL_NVIC_SetPriority(QSPI_IRQn, 0, 0); HAL_NVIC_EnableIRQ(QSPI_IRQn); - HAL_NVIC_SetPriority(QSPI_DMA_IRQn, 0, 0); - HAL_NVIC_EnableIRQ(QSPI_DMA_IRQn); + HAL_NVIC_SetPriority(QSPI_DMA_IRQ, 0, 0); + HAL_NVIC_EnableIRQ(QSPI_DMA_IRQ); /* init QSPI DMA */ - QSPI_DMA_CLK_ENABLE; + if(QSPI_DMA_RCC == RCC_AHB1ENR_DMA1EN) + { + __HAL_RCC_DMA1_CLK_ENABLE(); + } + else + { + __HAL_RCC_DMA2_CLK_ENABLE(); + } + HAL_DMA_DeInit(qspi_bus->QSPI_Handler.hdma); DMA_HandleTypeDef hdma_quadspi_config = QSPI_DMA_CONFIG; qspi_bus->hdma_quadspi = hdma_quadspi_config; diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_spi.c b/bsp/stm32/libraries/HAL_Drivers/drv_spi.c index fd70be7d2b..033cd2859f 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_spi.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_spi.c @@ -5,15 +5,16 @@ * * Change Logs: * Date Author Notes - * 2018-11-5 SummerGift change to new framework + * 2018-11-5 SummerGift first version * 2018-12-11 greedyhao Porting for stm32f7xx + * 2019-01-03 zylx modify DMA initialization and spixfer function */ #include "board.h" #ifdef RT_USING_SPI -#if defined(BSP_USING_SPI1) || defined(BSP_USING_SPI2) || defined(BSP_USING_SPI3) || defined(BSP_USING_SPI4) || defined(BSP_USING_SPI5) || defined(BSP_USING_SPI6) +#if defined(BSP_USING_SPI1) || defined(BSP_USING_SPI2) || defined(BSP_USING_SPI3) || defined(BSP_USING_SPI4) || defined(BSP_USING_SPI5) || defined(BSP_USING_SPI6) /* this driver can be disabled at menuconfig → RT-Thread Components → Device Drivers */ #include "drv_spi.h" @@ -72,7 +73,7 @@ static struct stm32_spi_config spi_config[] = #endif }; -static struct stm32_spi spi_bus_obj[sizeof(spi_config) / sizeof(spi_config[0])]; +static struct stm32_spi spi_bus_obj[sizeof(spi_config) / sizeof(spi_config[0])] = {0}; static rt_err_t stm32_spi_init(struct stm32_spi *spi_drv, struct rt_spi_configuration *cfg) { @@ -201,6 +202,10 @@ static rt_err_t stm32_spi_init(struct stm32_spi *spi_drv, struct rt_spi_configur spi_handle->Init.TIMode = SPI_TIMODE_DISABLE; spi_handle->Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; spi_handle->State = HAL_SPI_STATE_RESET; +#ifdef SOC_SERIES_STM32L4 + spi_handle->Init.NSSPMode = SPI_NSS_PULSE_DISABLE; +#endif + if (HAL_SPI_Init(spi_handle) != HAL_OK) { return RT_EIO; @@ -210,204 +215,112 @@ static rt_err_t stm32_spi_init(struct stm32_spi *spi_drv, struct rt_spi_configur SET_BIT(spi_handle->Instance->CR2, SPI_RXFIFO_THRESHOLD_HF); #endif + /* DMA configuration */ + if (spi_drv->spi_dma_flag & SPI_USING_RX_DMA_FLAG) + { + HAL_DMA_Init(&spi_drv->dma.handle_rx); + + __HAL_LINKDMA(&spi_drv->handle, hdmarx, spi_drv->dma.handle_rx); + + /* NVIC configuration for DMA transfer complete interrupt */ + HAL_NVIC_SetPriority(spi_drv->config->dma_rx->dma_irq, 0, 0); + HAL_NVIC_EnableIRQ(spi_drv->config->dma_rx->dma_irq); + } + + if (spi_drv->spi_dma_flag & SPI_USING_TX_DMA_FLAG) + { + HAL_DMA_Init(&spi_drv->dma.handle_tx); + + __HAL_LINKDMA(&spi_drv->handle, hdmatx, spi_drv->dma.handle_tx); + + /* NVIC configuration for DMA transfer complete interrupt */ + HAL_NVIC_SetPriority(spi_drv->config->dma_tx->dma_irq, 0, 1); + HAL_NVIC_EnableIRQ(spi_drv->config->dma_tx->dma_irq); + } + __HAL_SPI_ENABLE(spi_handle); LOG_D("%s init done", spi_drv->config->bus_name); return RT_EOK; } -#ifdef BSP_SPI_USING_DMA -static uint8_t dummy = 0xFF; -static void spi_dma_transfer_prepare(struct rt_spi_bus * spi_bus, struct rt_spi_message* message) -{ - struct stm32_spi *spi_drv = rt_container_of(spi_bus, struct stm32_spi, spi_bus); - - DMA_HandleTypeDef * hdma_tx = (DMA_HandleTypeDef *)&spi_drv->dma.handle_tx; - DMA_HandleTypeDef * hdma_rx = (DMA_HandleTypeDef *)&spi_drv->dma.handle_rx; - - HAL_DMA_DeInit(hdma_tx); - HAL_DMA_DeInit(hdma_rx); - - /* - * Check if the DMA Stream is disabled before enabling it. - * Note that this step is useful when the same Stream is used multiple times. - */ -#if defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) - while (hdma_tx->Instance->CR & DMA_SxCR_EN); - while (hdma_rx->Instance->CR & DMA_SxCR_EN); -#endif - - if(message->recv_buf != RT_NULL) - { - hdma_rx->Init.MemInc = DMA_MINC_ENABLE; - } - else - { - message->recv_buf = &dummy; - hdma_rx->Init.MemInc = DMA_MINC_DISABLE; - } - HAL_DMA_Init(hdma_rx); - - __HAL_LINKDMA(&spi_drv->handle, hdmarx, spi_drv->dma.handle_rx); - - if(message->send_buf != RT_NULL) - { - hdma_tx->Init.MemInc = DMA_MINC_ENABLE; - } - else - { - dummy = 0xFF; - message->send_buf = &dummy; - hdma_tx->Init.MemInc = DMA_MINC_DISABLE; - } - HAL_DMA_Init(hdma_tx); - - /* link DMA with SPI */ - __HAL_LINKDMA(&spi_drv->handle, hdmatx, spi_drv->dma.handle_tx); - - LOG_D("%s RX Instance: %x, TX Instance: %x", spi_drv->config->bus_name, hdma_rx->Instance, hdma_tx->Instance); - LOG_D("%s dma config done, TX dma_irq number: %d, RX dma_irq number: %d", - spi_drv->config->bus_name, - spi_drv->config->dma_tx.dma_irq, - spi_drv->config->dma_rx.dma_irq); - - /* NVIC configuration for DMA transfer complete interrupt*/ - HAL_NVIC_SetPriority(spi_drv->config->dma_tx.dma_irq, 0, 1); - HAL_NVIC_EnableIRQ(spi_drv->config->dma_tx.dma_irq); - - /* NVIC configuration for DMA transfer complete interrupt*/ - HAL_NVIC_SetPriority(spi_drv->config->dma_rx.dma_irq, 0, 0); - HAL_NVIC_EnableIRQ(spi_drv->config->dma_rx.dma_irq); -} -#endif - static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message *message) { + HAL_StatusTypeDef state; + RT_ASSERT(device != RT_NULL); RT_ASSERT(device->bus != RT_NULL); RT_ASSERT(device->bus->parent.user_data != RT_NULL); RT_ASSERT(message != RT_NULL); struct stm32_spi *spi_drv = rt_container_of(device->bus, struct stm32_spi, spi_bus); - SPI_HandleTypeDef * spi_handle = &spi_drv->handle; + SPI_HandleTypeDef *spi_handle = &spi_drv->handle; struct stm32_hw_spi_cs *cs = device->parent.user_data; - rt_int32_t length = message->length; - rt_int32_t data_width = spi_drv->cfg->data_width; if (message->cs_take) { HAL_GPIO_WritePin(cs->GPIOx, cs->GPIO_Pin, GPIO_PIN_RESET); } -#ifdef BSP_SPI_USING_DMA - if(message->length > 32) + LOG_D("%s transfer prepare and start", spi_drv->config->bus_name); + LOG_D("%s sendbuf: %X, recvbuf: %X, length: %d", + spi_drv->config->bus_name, + (uint32_t)message->send_buf, + (uint32_t)message->recv_buf, message->length); + + if (message->length) { - if(data_width <= 8) + /* start once data exchange in DMA mode */ + if (message->send_buf && message->recv_buf) { - HAL_StatusTypeDef state; - LOG_D("%s dma transfer prepare and start", spi_drv->config->bus_name); - LOG_D("%s sendbuf: %X, recvbuf: %X, length: %d", - spi_drv->config->bus_name, - (uint32_t)message->send_buf, - (uint32_t)message->recv_buf, message->length); - - spi_dma_transfer_prepare(device->bus, message); - /* start once data exchange in DMA mode */ - state = HAL_SPI_TransmitReceive_DMA(spi_handle, - (uint8_t*)message->send_buf, - (uint8_t*)message->recv_buf, - message->length); - if (state != HAL_OK) + if ((spi_drv->spi_dma_flag & SPI_USING_TX_DMA_FLAG) && (spi_drv->spi_dma_flag & SPI_USING_RX_DMA_FLAG)) + { + state = HAL_SPI_TransmitReceive_DMA(spi_handle, (uint8_t *)message->send_buf, (uint8_t *)message->recv_buf, message->length); + }else + { + state = HAL_SPI_TransmitReceive(spi_handle, (uint8_t *)message->send_buf, (uint8_t *)message->recv_buf, message->length, 1000); + } + } + else if (message->send_buf) + { + if (spi_drv->spi_dma_flag & SPI_USING_TX_DMA_FLAG) { - LOG_D("spi flash configuration error : %d", state); - message->length = 0; - //while(1); + state = HAL_SPI_Transmit_DMA(spi_handle, (uint8_t *)message->send_buf, message->length); } else { - LOG_D("%s dma transfer done", spi_drv->config->bus_name); + state = HAL_SPI_Transmit(spi_handle, (uint8_t *)message->send_buf, message->length, 1000); } - - /* For simplicity reasons, this example is just waiting till the end of the - transfer, but application may perform other tasks while transfer operation - is ongoing. */ - while (HAL_SPI_GetState(spi_handle) != HAL_SPI_STATE_READY); - LOG_D("%s get state done", spi_drv->config->bus_name); } else { - // TODO - } - } else -#endif - { - if (data_width == 8) - { - const rt_uint8_t * send_ptr = message->send_buf; - rt_uint8_t * recv_ptr = message->recv_buf; - - while (length--) + if (spi_drv->spi_dma_flag & SPI_USING_RX_DMA_FLAG) { - rt_uint8_t data = ~0; - - if(send_ptr != RT_NULL) - { - data = *send_ptr++; - } - - /* send data once */ - while (__HAL_SPI_GET_FLAG(spi_handle, SPI_FLAG_TXE) == RESET); - *(volatile rt_uint8_t *)(&spi_handle->Instance->DR) = data; - - /* receive data once */ -#if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32F7) - SET_BIT(spi_handle->Instance->CR2, SPI_RXFIFO_THRESHOLD_HF); -#endif - while (__HAL_SPI_GET_FLAG(spi_handle, SPI_FLAG_RXNE) == RESET); - data = *(volatile rt_uint8_t *)(&spi_handle->Instance->DR); - - if(recv_ptr != RT_NULL) - { - *recv_ptr++ = data; - } + state = HAL_SPI_Receive_DMA(spi_handle, (uint8_t *)message->recv_buf, message->length); } - - } else - { - const rt_uint16_t * send_ptr = message->send_buf; - rt_uint16_t * recv_ptr = message->recv_buf; - - while (length--) + else { - rt_uint16_t data = ~0; - - if(send_ptr != RT_NULL) - { - data = *send_ptr++; - } - - /* send data once */ - while (__HAL_SPI_GET_FLAG(spi_handle, SPI_FLAG_TXE) == RESET); - *(volatile rt_uint16_t *)(&spi_handle->Instance->DR) = data; - - /* receive data once */ -#if defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32F7) - SET_BIT(spi_handle->Instance->CR2, SPI_RXFIFO_THRESHOLD_HF); -#endif - while (__HAL_SPI_GET_FLAG(spi_handle, SPI_FLAG_RXNE) == RESET); - data = *(volatile rt_uint16_t *)(&spi_handle->Instance->DR); - - if(recv_ptr != RT_NULL) - { - *recv_ptr++ = data; - } + state = HAL_SPI_Receive(spi_handle, (uint8_t *)message->recv_buf, message->length, 1000); } } + + if (state != HAL_OK) + { + LOG_I("spi transfer error : %d", state); + message->length = 0; + spi_handle->State = HAL_SPI_STATE_READY; + } + else + { + LOG_D("%s transfer done", spi_drv->config->bus_name); + } + + /* For simplicity reasons, this example is just waiting till the end of the + transfer, but application may perform other tasks while transfer operation + is ongoing. */ + while (HAL_SPI_GetState(spi_handle) != HAL_SPI_STATE_READY); } - - /* Wait until Busy flag is reset before disabling SPI */ - while (__HAL_SPI_GET_FLAG(spi_handle, SPI_FLAG_BSY) == SET); - + if (message->cs_release) { HAL_GPIO_WritePin(cs->GPIOx, cs->GPIO_Pin, GPIO_PIN_SET); @@ -443,61 +356,81 @@ static int rt_hw_spi_bus_init(void) spi_bus_obj[i].spi_bus.parent.user_data = &spi_config[i]; spi_bus_obj[i].handle.Instance = spi_config[i].Instance; -#ifdef BSP_SPI_USING_DMA - /* Configure the DMA handler for Transmission process */ - spi_bus_obj[i].dma.handle_tx.Instance = spi_config[i].dma_tx.Instance; + if (spi_bus_obj[i].spi_dma_flag & SPI_USING_RX_DMA_FLAG) + { + /* Configure the DMA handler for Transmission process */ + spi_bus_obj[i].dma.handle_rx.Instance = spi_config[i].dma_rx->Instance; #if defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) - spi_bus_obj[i].dma.handle_tx.Init.Channel = spi_config[i].dma_tx.channel; + spi_bus_obj[i].dma.handle_rx.Init.Channel = spi_config[i].dma_rx->channel; #elif defined(SOC_SERIES_STM32L4) - spi_bus_obj[i].dma.handle_tx.Init.Request = spi_config[i].dma_tx.request; + spi_bus_obj[i].dma.handle_rx.Init.Request = spi_config[i].dma_rx->request; #endif - spi_bus_obj[i].dma.handle_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; - spi_bus_obj[i].dma.handle_tx.Init.PeriphInc = DMA_PINC_DISABLE; - spi_bus_obj[i].dma.handle_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; - spi_bus_obj[i].dma.handle_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; - spi_bus_obj[i].dma.handle_tx.Init.Mode = DMA_NORMAL; - spi_bus_obj[i].dma.handle_tx.Init.Priority = DMA_PRIORITY_LOW; + spi_bus_obj[i].dma.handle_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; + spi_bus_obj[i].dma.handle_rx.Init.PeriphInc = DMA_PINC_DISABLE; + spi_bus_obj[i].dma.handle_rx.Init.MemInc = DMA_MINC_ENABLE; + spi_bus_obj[i].dma.handle_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + spi_bus_obj[i].dma.handle_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + spi_bus_obj[i].dma.handle_rx.Init.Mode = DMA_NORMAL; + spi_bus_obj[i].dma.handle_rx.Init.Priority = DMA_PRIORITY_HIGH; #if defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) - spi_bus_obj[i].dma.handle_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; - spi_bus_obj[i].dma.handle_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; - spi_bus_obj[i].dma.handle_tx.Init.MemBurst = DMA_MBURST_INC4; - spi_bus_obj[i].dma.handle_tx.Init.PeriphBurst = DMA_PBURST_INC4; + spi_bus_obj[i].dma.handle_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + spi_bus_obj[i].dma.handle_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; + spi_bus_obj[i].dma.handle_rx.Init.MemBurst = DMA_MBURST_INC4; + spi_bus_obj[i].dma.handle_rx.Init.PeriphBurst = DMA_PBURST_INC4; #endif - spi_bus_obj[i].dma.handle_rx.Instance = spi_config[i].dma_rx.Instance; -#if defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) - spi_bus_obj[i].dma.handle_rx.Init.Channel = spi_config[i].dma_rx.channel; -#elif defined(SOC_SERIES_STM32L4) - spi_bus_obj[i].dma.handle_rx.Init.Request = spi_config[i].dma_rx.request; -#endif - spi_bus_obj[i].dma.handle_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; - spi_bus_obj[i].dma.handle_rx.Init.PeriphInc = DMA_PINC_DISABLE; - spi_bus_obj[i].dma.handle_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; - spi_bus_obj[i].dma.handle_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; - spi_bus_obj[i].dma.handle_rx.Init.Mode = DMA_NORMAL; - spi_bus_obj[i].dma.handle_rx.Init.Priority = DMA_PRIORITY_HIGH; -#if defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) - spi_bus_obj[i].dma.handle_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; - spi_bus_obj[i].dma.handle_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; - spi_bus_obj[i].dma.handle_rx.Init.MemBurst = DMA_MBURST_INC4; - spi_bus_obj[i].dma.handle_rx.Init.PeriphBurst = DMA_PBURST_INC4; -#endif { rt_uint32_t tmpreg = 0x00U; #if defined(SOC_SERIES_STM32F1) /* enable DMA clock && Delay after an RCC peripheral clock enabling*/ - SET_BIT(RCC->AHBENR, spi_config[i].dma_rx.dma_rcc); - tmpreg = READ_BIT(RCC->AHBENR, spi_config[i].dma_rx.dma_rcc); + SET_BIT(RCC->AHBENR, spi_config[i].dma_rx->dma_rcc); + tmpreg = READ_BIT(RCC->AHBENR, spi_config[i].dma_rx->dma_rcc); #elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32L4) - SET_BIT(RCC->AHB1ENR, spi_config[i].dma_rx.dma_rcc); - /* Delay after an RCC peripheral clock enabling */ - tmpreg = READ_BIT(RCC->AHB1ENR, spi_config[i].dma_rx.dma_rcc); + SET_BIT(RCC->AHB1ENR, spi_config[i].dma_rx->dma_rcc); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->AHB1ENR, spi_config[i].dma_rx->dma_rcc); #endif UNUSED(tmpreg); /* To avoid compiler warnings */ } + } - LOG_D("%s DMA clock init done", spi_config[i].bus_name); -#endif /* BSP_SPI_USING_DMA */ + if (spi_bus_obj[i].spi_dma_flag & SPI_USING_TX_DMA_FLAG) + { + /* Configure the DMA handler for Transmission process */ + spi_bus_obj[i].dma.handle_tx.Instance = spi_config[i].dma_tx->Instance; +#if defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) + spi_bus_obj[i].dma.handle_tx.Init.Channel = spi_config[i].dma_tx->channel; +#elif defined(SOC_SERIES_STM32L4) + spi_bus_obj[i].dma.handle_tx.Init.Request = spi_config[i].dma_tx->request; +#endif + spi_bus_obj[i].dma.handle_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; + spi_bus_obj[i].dma.handle_tx.Init.PeriphInc = DMA_PINC_DISABLE; + spi_bus_obj[i].dma.handle_tx.Init.MemInc = DMA_MINC_ENABLE; + spi_bus_obj[i].dma.handle_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + spi_bus_obj[i].dma.handle_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + spi_bus_obj[i].dma.handle_tx.Init.Mode = DMA_NORMAL; + spi_bus_obj[i].dma.handle_tx.Init.Priority = DMA_PRIORITY_LOW; +#if defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) + spi_bus_obj[i].dma.handle_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + spi_bus_obj[i].dma.handle_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; + spi_bus_obj[i].dma.handle_tx.Init.MemBurst = DMA_MBURST_INC4; + spi_bus_obj[i].dma.handle_tx.Init.PeriphBurst = DMA_PBURST_INC4; +#endif + + { + rt_uint32_t tmpreg = 0x00U; +#if defined(SOC_SERIES_STM32F1) + /* enable DMA clock && Delay after an RCC peripheral clock enabling*/ + SET_BIT(RCC->AHBENR, spi_config[i].dma_rx->dma_rcc); + tmpreg = READ_BIT(RCC->AHBENR, spi_config[i].dma_rx->dma_rcc); +#elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32L4) + SET_BIT(RCC->AHB1ENR, spi_config[i].dma_tx->dma_rcc); + /* Delay after an RCC peripheral clock enabling */ + tmpreg = READ_BIT(RCC->AHB1ENR, spi_config[i].dma_tx->dma_rcc); +#endif + UNUSED(tmpreg); /* To avoid compiler warnings */ + } + } result = rt_spi_bus_register(&spi_bus_obj[i].spi_bus, spi_config[i].bus_name, &stm_spi_ops); RT_ASSERT(result == RT_EOK); @@ -511,7 +444,7 @@ static int rt_hw_spi_bus_init(void) /** * Attach the spi device to SPI bus, this function must be used after initialization. */ -rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, GPIO_TypeDef* cs_gpiox, uint16_t cs_gpio_pin) +rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, GPIO_TypeDef *cs_gpiox, uint16_t cs_gpio_pin) { RT_ASSERT(bus_name != RT_NULL); RT_ASSERT(device_name != RT_NULL); @@ -550,7 +483,20 @@ rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, return result; } -#if defined(BSP_USING_SPI1) && defined(BSP_SPI_USING_DMA) +#if defined(BSP_SPI1_TX_USING_DMA) || defined(BSP_SPI1_RX_USING_DMA) +void SPI1_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + HAL_SPI_IRQHandler(&spi_bus_obj[SPI1_INDEX].handle); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif + +#if defined(BSP_USING_SPI1) && defined(BSP_SPI1_RX_USING_DMA) /** * @brief This function handles DMA Rx interrupt request. * @param None @@ -566,7 +512,9 @@ void SPI1_DMA_RX_IRQHandler(void) /* leave interrupt */ rt_interrupt_leave(); } +#endif +#if defined(BSP_USING_SPI1) && defined(BSP_SPI1_TX_USING_DMA) /** * @brief This function handles DMA Tx interrupt request. * @param None @@ -584,7 +532,20 @@ void SPI1_DMA_TX_IRQHandler(void) } #endif /* defined(BSP_USING_SPI1) && defined(BSP_SPI_USING_DMA) */ -#if defined(BSP_USING_SPI2) && defined(BSP_SPI_USING_DMA) +#if defined(BSP_SPI2_TX_USING_DMA) || defined(BSP_SPI2_RX_USING_DMA) +void SPI2_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + HAL_SPI_IRQHandler(&spi_bus_obj[SPI2_INDEX].handle); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif + +#if defined(BSP_USING_SPI2) && defined(BSP_SPI2_RX_USING_DMA) /** * @brief This function handles DMA Rx interrupt request. * @param None @@ -600,7 +561,9 @@ void SPI2_DMA_RX_IRQHandler(void) /* leave interrupt */ rt_interrupt_leave(); } +#endif +#if defined(BSP_USING_SPI2) && defined(BSP_SPI2_TX_USING_DMA) /** * @brief This function handles DMA Tx interrupt request. * @param None @@ -618,7 +581,20 @@ void SPI2_DMA_TX_IRQHandler(void) } #endif /* defined(BSP_USING_SPI2) && defined(BSP_SPI_USING_DMA) */ -#if defined(BSP_USING_SPI3) && defined(BSP_SPI_USING_DMA) +#if defined(BSP_SPI3_TX_USING_DMA) || defined(BSP_SPI3_RX_USING_DMA) +void SPI3_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + HAL_SPI_IRQHandler(&spi_bus_obj[SPI3_INDEX].handle); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif + +#if defined(BSP_USING_SPI3) && defined(BSP_SPI3_RX_USING_DMA) /** * @brief This function handles DMA Rx interrupt request. * @param None @@ -634,7 +610,9 @@ void SPI3_DMA_RX_IRQHandler(void) /* leave interrupt */ rt_interrupt_leave(); } +#endif +#if defined(BSP_USING_SPI3) && defined(BSP_SPI3_TX_USING_DMA) /** * @brief This function handles DMA Tx interrupt request. * @param None @@ -652,8 +630,20 @@ void SPI3_DMA_TX_IRQHandler(void) } #endif /* defined(BSP_USING_SPI3) && defined(BSP_SPI_USING_DMA) */ +#if defined(BSP_SPI4_TX_USING_DMA) || defined(BSP_SPI4_RX_USING_DMA) +void SPI4_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); -#if defined(BSP_USING_SPI4) && defined(BSP_SPI_USING_DMA) + HAL_SPI_IRQHandler(&spi_bus_obj[SPI4_INDEX].handle); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif + +#if defined(BSP_USING_SPI4) && defined(BSP_SPI4_RX_USING_DMA) /** * @brief This function handles DMA Rx interrupt request. * @param None @@ -669,7 +659,9 @@ void SPI4_DMA_RX_IRQHandler(void) /* leave interrupt */ rt_interrupt_leave(); } +#endif +#if defined(BSP_USING_SPI4) && defined(BSP_SPI4_TX_USING_DMA) /** * @brief This function handles DMA Tx interrupt request. * @param None @@ -687,7 +679,20 @@ void SPI4_DMA_TX_IRQHandler(void) } #endif /* defined(BSP_USING_SPI4) && defined(BSP_SPI_USING_DMA) */ -#if defined(BSP_USING_SPI5) && defined(BSP_SPI_USING_DMA) +#if defined(BSP_SPI5_TX_USING_DMA) || defined(BSP_SPI5_RX_USING_DMA) +void SPI5_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + HAL_SPI_IRQHandler(&spi_bus_obj[SPI5_INDEX].handle); + + /* leave interrupt */ + rt_interrupt_leave(); +} +#endif + +#if defined(BSP_USING_SPI5) && defined(BSP_SPI5_RX_USING_DMA) /** * @brief This function handles DMA Rx interrupt request. * @param None @@ -703,7 +708,9 @@ void SPI5_DMA_RX_IRQHandler(void) /* leave interrupt */ rt_interrupt_leave(); } +#endif +#if defined(BSP_USING_SPI5) && defined(BSP_SPI5_TX_USING_DMA) /** * @brief This function handles DMA Tx interrupt request. * @param None @@ -721,7 +728,7 @@ void SPI5_DMA_TX_IRQHandler(void) } #endif /* defined(BSP_USING_SPI5) && defined(BSP_SPI_USING_DMA) */ -#if defined(BSP_USING_SPI6) && defined(BSP_SPI_USING_DMA) +#if defined(BSP_USING_SPI6) && defined(BSP_SPI6_RX_USING_DMA) /** * @brief This function handles DMA Rx interrupt request. * @param None @@ -737,7 +744,9 @@ void SPI6_DMA_RX_IRQHandler(void) /* leave interrupt */ rt_interrupt_leave(); } +#endif +#if defined(BSP_USING_SPI6) && defined(BSP_SPI6_TX_USING_DMA) /** * @brief This function handles DMA Tx interrupt request. * @param None @@ -755,8 +764,78 @@ void SPI6_DMA_TX_IRQHandler(void) } #endif /* defined(BSP_USING_SPI6) && defined(BSP_SPI_USING_DMA) */ +static void stm32_get_dma_info(void) +{ +#ifdef BSP_SPI1_RX_USING_DMA + spi_bus_obj[SPI1_INDEX].spi_dma_flag |= SPI_USING_RX_DMA_FLAG; + static struct dma_config spi1_dma_rx = SPI1_RX_DMA_CONFIG; + spi_config[SPI1_INDEX].dma_rx = &spi1_dma_rx; +#endif +#ifdef BSP_SPI1_TX_USING_DMA + spi_bus_obj[SPI1_INDEX].spi_dma_flag |= SPI_USING_TX_DMA_FLAG; + static struct dma_config spi1_dma_tx = SPI1_TX_DMA_CONFIG; + spi_config[SPI1_INDEX].dma_tx = &spi1_dma_tx; +#endif + +#ifdef BSP_SPI2_RX_USING_DMA + spi_bus_obj[SPI2_INDEX].spi_dma_flag |= SPI_USING_RX_DMA_FLAG; + static struct dma_config spi2_dma_rx = SPI2_RX_DMA_CONFIG; + spi_config[SPI2_INDEX].dma_rx = &spi2_dma_rx; +#endif +#ifdef BSP_SPI2_TX_USING_DMA + spi_bus_obj[SPI2_INDEX].spi_dma_flag |= SPI_USING_TX_DMA_FLAG; + static struct dma_config spi2_dma_tx = SPI2_TX_DMA_CONFIG; + spi_config[SPI2_INDEX].dma_tx = &spi2_dma_tx; +#endif + +#ifdef BSP_SPI3_RX_USING_DMA + spi_bus_obj[SPI3_INDEX].spi_dma_flag |= SPI_USING_RX_DMA_FLAG; + static struct dma_config spi3_dma_rx = SPI3_RX_DMA_CONFIG; + spi_config[SPI3_INDEX].dma_rx = &spi3_dma_rx; +#endif +#ifdef BSP_SPI3_TX_USING_DMA + spi_bus_obj[SPI3_INDEX].spi_dma_flag |= SPI_USING_TX_DMA_FLAG; + static struct dma_config spi3_dma_tx = SPI3_TX_DMA_CONFIG; + spi_config[SPI3_INDEX].dma_tx = &spi3_dma_tx; +#endif + +#ifdef BSP_SPI4_RX_USING_DMA + spi_bus_obj[SPI4_INDEX].spi_dma_flag |= SPI_USING_RX_DMA_FLAG; + static struct dma_config spi4_dma_rx = SPI4_RX_DMA_CONFIG; + spi_config[SPI4_INDEX].dma_rx = &spi4_dma_rx; +#endif +#ifdef BSP_SPI4_TX_USING_DMA + spi_bus_obj[SPI4_INDEX].spi_dma_flag |= SPI_USING_TX_DMA_FLAG; + static struct dma_config spi4_dma_tx = SPI4_TX_DMA_CONFIG; + spi_config[SPI4_INDEX].dma_tx = &spi4_dma_tx; +#endif + +#ifdef BSP_SPI5_RX_USING_DMA + spi_bus_obj[SPI5_INDEX].spi_dma_flag |= SPI_USING_RX_DMA_FLAG; + static struct dma_config spi5_dma_rx = SPI5_RX_DMA_CONFIG; + spi_config[SPI5_INDEX].dma_rx = &spi5_dma_rx; +#endif +#ifdef BSP_SPI5_TX_USING_DMA + spi_bus_obj[SPI5_INDEX].spi_dma_flag |= SPI_USING_TX_DMA_FLAG; + static struct dma_config spi5_dma_tx = SPI5_TX_DMA_CONFIG; + spi_config[SPI5_INDEX].dma_tx = &spi5_dma_tx; +#endif + +#ifdef BSP_SPI6_RX_USING_DMA + spi_bus_obj[SPI6_INDEX].spi_dma_flag |= SPI_USING_RX_DMA_FLAG; + static struct dma_config spi6_dma_rx = SPI6_RX_DMA_CONFIG; + spi_config[SPI6_INDEX].dma_rx = &spi6_dma_rx; +#endif +#ifdef BSP_SPI6_TX_USING_DMA + spi_bus_obj[SPI6_INDEX].spi_dma_flag |= SPI_USING_TX_DMA_FLAG; + static struct dma_config spi6_dma_tx = SPI6_TX_DMA_CONFIG; + spi_config[SPI6_INDEX].dma_tx = &spi6_dma_tx; +#endif +} + int rt_hw_spi_init(void) { + stm32_get_dma_info(); return rt_hw_spi_bus_init(); } INIT_BOARD_EXPORT(rt_hw_spi_init); diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_spi.h b/bsp/stm32/libraries/HAL_Drivers/drv_spi.h index 710f3fa59c..763a44dfdf 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_spi.h +++ b/bsp/stm32/libraries/HAL_Drivers/drv_spi.h @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2018-11-5 SummerGift change to new framework + * 2018-11-5 SummerGift first version */ #ifndef __DRV_SPI_H_ @@ -29,7 +29,7 @@ struct stm32_spi_config { SPI_TypeDef *Instance; char *bus_name; - struct dma_config dma_rx, dma_tx; + struct dma_config *dma_rx, *dma_tx; }; struct stm32_spi_device @@ -39,21 +39,23 @@ struct stm32_spi_device char *device_name; }; +#define SPI_USING_RX_DMA_FLAG (1<<0) +#define SPI_USING_TX_DMA_FLAG (1<<1) + /* stm32 spi dirver class */ struct stm32_spi { SPI_HandleTypeDef handle; - const struct stm32_spi_config *config; + struct stm32_spi_config *config; struct rt_spi_configuration *cfg; - -#ifdef BSP_SPI_USING_DMA + struct { DMA_HandleTypeDef handle_rx; DMA_HandleTypeDef handle_tx; } dma; -#endif + rt_uint8_t spi_dma_flag; struct rt_spi_bus spi_bus; }; diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_usart.c b/bsp/stm32/libraries/HAL_Drivers/drv_usart.c index 916d0ed2d2..87543442b6 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_usart.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_usart.c @@ -46,7 +46,7 @@ enum #endif }; -static const struct stm32_uart_config uart_config[] = +static struct stm32_uart_config uart_config[] = { #ifdef BSP_USING_UART1 UART1_CONFIG, @@ -65,7 +65,7 @@ static const struct stm32_uart_config uart_config[] = #endif }; -static struct stm32_uart uart_obj[sizeof(uart_config) / sizeof(uart_config[0])]; +static struct stm32_uart uart_obj[sizeof(uart_config) / sizeof(uart_config[0])] = {0}; static rt_err_t stm32_configure(struct rt_serial_device *serial, struct serial_configure *cfg) { @@ -239,7 +239,7 @@ static void uart_isr(struct rt_serial_device *serial) UART_INSTANCE_CLEAR_FUNCTION(&(uart->handle), UART_FLAG_RXNE); } #ifdef RT_SERIAL_USING_DMA - else if ((__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_IDLE) != RESET) && + else if ((uart->uart_dma_flag) && (__HAL_UART_GET_FLAG(&(uart->handle), UART_FLAG_IDLE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&(uart->handle), UART_IT_IDLE) != RESET)) { level = rt_hw_interrupt_disable(); @@ -309,8 +309,8 @@ void USART1_IRQHandler(void) /* leave interrupt */ rt_interrupt_leave(); } -#if defined(RT_SERIAL_USING_DMA) && defined(USART1_RX_DMA_ISR) -void USART1_RX_DMA_ISR(void) +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_RX_USING_DMA) +void USART1_DMA_RX_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); @@ -320,7 +320,7 @@ void USART1_RX_DMA_ISR(void) /* leave interrupt */ rt_interrupt_leave(); } -#endif /* defined(RT_SERIAL_USING_DMA) && defined(USART1_RX_DMA_ISR) */ +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART1_RX_USING_DMA) */ #endif /* BSP_USING_UART1 */ #if defined(BSP_USING_UART2) @@ -334,8 +334,8 @@ void USART2_IRQHandler(void) /* leave interrupt */ rt_interrupt_leave(); } -#if defined(RT_SERIAL_USING_DMA) && defined(USART2_RX_DMA_ISR) -void USART2_RX_DMA_ISR(void) +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_RX_USING_DMA) +void USART2_DMA_RX_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); @@ -345,7 +345,7 @@ void USART2_RX_DMA_ISR(void) /* leave interrupt */ rt_interrupt_leave(); } -#endif /* defined(RT_SERIAL_USING_DMA) && defined(USART2_RX_DMA_ISR) */ +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART2_RX_USING_DMA) */ #endif /* BSP_USING_UART2 */ #if defined(BSP_USING_UART3) @@ -359,8 +359,8 @@ void USART3_IRQHandler(void) /* leave interrupt */ rt_interrupt_leave(); } -#if defined(RT_SERIAL_USING_DMA) && defined(USART3_RX_DMA_ISR) -void USART3_RX_DMA_ISR(void) +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART3_RX_USING_DMA) +void USART3_DMA_RX_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); @@ -370,7 +370,7 @@ void USART3_RX_DMA_ISR(void) /* leave interrupt */ rt_interrupt_leave(); } -#endif /* defined(BSP_UART_USING_DMA_RX) && defined(USART3_RX_DMA_ISR) */ +#endif /* defined(BSP_UART_USING_DMA_RX) && defined(BSP_UART3_RX_USING_DMA) */ #endif /* BSP_USING_UART3*/ #if defined(BSP_USING_UART4) @@ -384,8 +384,8 @@ void UART4_IRQHandler(void) /* leave interrupt */ rt_interrupt_leave(); } -#if defined(RT_SERIAL_USING_DMA) && defined(USART1_RX_DMA_ISR) -void USART4_RX_DMA_ISR(void) +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART4_RX_USING_DMA) +void USART4_DMA_RX_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); @@ -395,7 +395,7 @@ void USART4_RX_DMA_ISR(void) /* leave interrupt */ rt_interrupt_leave(); } -#endif /* defined(BSP_UART_USING_DMA_RX) && defined(USART4_RX_DMA_ISR) */ +#endif /* defined(BSP_UART_USING_DMA_RX) && defined(BSP_UART4_RX_USING_DMA) */ #endif /* BSP_USING_UART4*/ #if defined(BSP_USING_UART5) @@ -409,8 +409,8 @@ void UART5_IRQHandler(void) /* leave interrupt */ rt_interrupt_leave(); } -#if defined(RT_SERIAL_USING_DMA) && defined(USART5_RX_DMA_ISR) -void USART5_RX_DMA_ISR(void) +#if defined(RT_SERIAL_USING_DMA) && defined(BSP_UART5_RX_USING_DMA) +void USART5_DMA_RX_IRQHandler(void) { /* enter interrupt */ rt_interrupt_enter(); @@ -420,7 +420,7 @@ void USART5_RX_DMA_ISR(void) /* leave interrupt */ rt_interrupt_leave(); } -#endif /* defined(RT_SERIAL_USING_DMA) && defined(USART5_RX_DMA_ISR) */ +#endif /* defined(RT_SERIAL_USING_DMA) && defined(BSP_UART5_RX_USING_DMA) */ #endif /* BSP_USING_UART5*/ #ifdef RT_SERIAL_USING_DMA @@ -437,12 +437,12 @@ static void stm32_dma_config(struct rt_serial_device *serial) rt_uint32_t tmpreg= 0x00U; #if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F0) /* enable DMA clock && Delay after an RCC peripheral clock enabling*/ - SET_BIT(RCC->AHBENR, uart->config->dma_rcc); - tmpreg = READ_BIT(RCC->AHBENR, uart->config->dma_rcc); + SET_BIT(RCC->AHBENR, uart->config->dma_rx->dma_rcc); + tmpreg = READ_BIT(RCC->AHBENR, uart->config->dma_rx->dma_rcc); #elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32L4) /* enable DMA clock && Delay after an RCC peripheral clock enabling*/ - SET_BIT(RCC->AHB1ENR, uart->config->dma_rcc); - tmpreg = READ_BIT(RCC->AHB1ENR, uart->config->dma_rcc); + SET_BIT(RCC->AHB1ENR, uart->config->dma_rx->dma_rcc); + tmpreg = READ_BIT(RCC->AHB1ENR, uart->config->dma_rx->dma_rcc); #endif UNUSED(tmpreg); /* To avoid compiler warnings */ } @@ -450,13 +450,13 @@ static void stm32_dma_config(struct rt_serial_device *serial) __HAL_LINKDMA(&(uart->handle), hdmarx, uart->dma.handle); #if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F0) - uart->dma.handle.Instance = uart->config->dma.Instance; + uart->dma.handle.Instance = uart->config->dma_rx->Instance; #elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) - uart->dma.handle.Instance = uart->config->dma.Instance; - uart->dma.handle.Init.Channel = uart->config->dma.stream_channel.channel; + uart->dma.handle.Instance = uart->config->dma_rx->Instance; + uart->dma.handle.Init.Channel = uart->config->dma_rx->channel; #elif defined(SOC_SERIES_STM32L4) - uart->dma.handle.Instance = uart->config->dma.Instance; - uart->dma.handle.Init.Request = uart->config->dma.channel_request.request; + uart->dma.handle.Instance = uart->config->dma_rx->Instance; + uart->dma.handle.Init.Request = uart->config->dma_rx->request; #endif uart->dma.handle.Init.Direction = DMA_PERIPH_TO_MEMORY; uart->dma.handle.Init.PeriphInc = DMA_PINC_DISABLE; @@ -491,8 +491,8 @@ static void stm32_dma_config(struct rt_serial_device *serial) __HAL_UART_ENABLE_IT(&(uart->handle), UART_IT_IDLE); /* enable rx irq */ - HAL_NVIC_SetPriority(uart->config->dma_irq, 0, 0); - HAL_NVIC_EnableIRQ(uart->config->dma_irq); + HAL_NVIC_SetPriority(uart->config->dma_rx->dma_irq, 0, 0); + HAL_NVIC_EnableIRQ(uart->config->dma_rx->dma_irq); HAL_NVIC_SetPriority(uart->config->irq_type, 1, 0); HAL_NVIC_EnableIRQ(uart->config->irq_type); @@ -547,31 +547,59 @@ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) } #endif /* RT_SERIAL_USING_DMA */ +static void stm32_uart_get_dma_config(void) +{ +#ifdef BSP_UART1_RX_USING_DMA + uart_obj[UART1_INDEX].uart_dma_flag = 1; + static struct dma_config uart1_dma_rx = UART1_DMA_CONFIG; + uart_config[UART1_INDEX].dma_rx = &uart1_dma_rx; +#endif +#ifdef BSP_UART2_RX_USING_DMA + uart_obj[UART2_INDEX].uart_dma_flag = 1; + static struct dma_config uart2_dma_rx = UART2_DMA_CONFIG; + uart_config[UART2_INDEX].dma_rx = &uart2_dma_rx; +#endif +#ifdef BSP_UART3_RX_USING_DMA + uart_obj[UART3_INDEX].uart_dma_flag = 1; + static struct dma_config uart3_dma_rx = UART3_DMA_CONFIG; + uart_config[UART3_INDEX].dma_rx = &uart3_dma_rx; +#endif +#ifdef BSP_UART4_RX_USING_DMA + uart_obj[UART4_INDEX].uart_dma_flag = 1; + static struct dma_config uart4_dma_rx = UART4_DMA_CONFIG; + uart_config[UART4_INDEX].dma_rx = &uart4_dma_rx; +#endif +#ifdef BSP_UART5_RX_USING_DMA + uart_obj[UART5_INDEX].uart_dma_flag = 1; + static struct dma_config uart5_dma_rx = UART5_DMA_CONFIG; + uart_config[UART5_INDEX].dma_rx = &uart5_dma_rx; +#endif +} + int rt_hw_usart_init(void) { rt_size_t obj_num = sizeof(uart_obj) / sizeof(struct stm32_uart); struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; - rt_err_t result = 0; + stm32_uart_get_dma_config(); + for (int i = 0; i < obj_num; i++) { uart_obj[i].config = &uart_config[i]; uart_obj[i].serial.ops = &stm32_uart_ops; uart_obj[i].serial.config = config; - /* Determines whether a serial instance supports DMA */ - if(uart_obj[i].config->dma.Instance != DMA_NOT_AVAILABLE) +#if defined(RT_SERIAL_USING_DMA) + if(uart_obj[i].uart_dma_flag) { /* register UART device */ result = rt_hw_serial_register(&uart_obj[i].serial,uart_obj[i].config->name, - RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX -#if defined(RT_SERIAL_USING_DMA) - | RT_DEVICE_FLAG_DMA_RX -#endif + RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX| RT_DEVICE_FLAG_DMA_RX ,&uart_obj[i]); } else +#endif { /* register UART device */ result = rt_hw_serial_register(&uart_obj[i].serial,uart_obj[i].config->name, diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_usart.h b/bsp/stm32/libraries/HAL_Drivers/drv_usart.h index 7f6a359826..80716933fe 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_usart.h +++ b/bsp/stm32/libraries/HAL_Drivers/drv_usart.h @@ -15,10 +15,10 @@ #include "rtdevice.h" #include #include +#include "drv_dma.h" int rt_hw_usart_init(void); - #if defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32L4) #define DMA_INSTANCE_TYPE DMA_Channel_TypeDef #elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) @@ -37,45 +37,15 @@ struct stm32_uart_config const char *name; USART_TypeDef *Instance; IRQn_Type irq_type; - - union { - DMA_INSTANCE_TYPE *Instance; - -#if defined(SOC_SERIES_STM32F1) - /* the DMA config has channel only, such as on STM32F1xx */ - struct { - DMA_INSTANCE_TYPE *Instance; - } channel; -#endif - -#if defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) - /* the DMA config has stream and channel, such as on STM32F4xx */ - struct { - DMA_INSTANCE_TYPE *Instance; - rt_uint32_t channel; - } stream_channel; -#endif - -#if defined(SOC_SERIES_STM32L4) - /* the DMA config has channel and request, such as on STM32L4xx */ - struct { - DMA_INSTANCE_TYPE *Instance; - rt_uint32_t request; - } channel_request; -#endif - } dma; - - rt_uint32_t dma_rcc; - IRQn_Type dma_irq; + struct dma_config *dma_rx; }; /* stm32 uart dirver class */ struct stm32_uart { UART_HandleTypeDef handle; - const struct stm32_uart_config *config; + struct stm32_uart_config *config; - #ifdef RT_SERIAL_USING_DMA struct { @@ -83,7 +53,7 @@ struct stm32_uart rt_size_t last_index; } dma; #endif - + rt_uint8_t uart_dma_flag; struct rt_serial_device serial; }; From 74395fd11410cb85da8a8fa0a9425976b31ee17a Mon Sep 17 00:00:00 2001 From: SummerGift Date: Tue, 8 Jan 2019 12:04:44 +0800 Subject: [PATCH 03/15] [bsp][stm32] update kconfig --- bsp/stm32/stm32f091-st-nucleo/board/Kconfig | 55 ++++- bsp/stm32/stm32f103-atk-nano/board/Kconfig | 81 ++++++-- bsp/stm32/stm32f103-atk-nano/project.uvprojx | 195 +++++++++++++----- .../stm32f103-fire-arbitrary/board/Kconfig | 106 +++++++--- .../stm32f407-atk-explorer/board/Kconfig | 76 +++++-- .../stm32f407-st-discovery/board/Kconfig | 44 ++-- bsp/stm32/stm32f429-armfly-v6/board/Kconfig | 46 +++-- bsp/stm32/stm32f429-atk-apollo/board/Kconfig | 103 ++++++--- .../stm32f429-fire-challenger/board/Kconfig | 58 ++++-- bsp/stm32/stm32f767-atk-apollo/board/Kconfig | 71 +++++-- .../stm32f767-fire-challenger/board/Kconfig | 102 ++++++--- bsp/stm32/stm32l475-atk-pandora/board/Kconfig | 74 +++++-- 12 files changed, 772 insertions(+), 239 deletions(-) diff --git a/bsp/stm32/stm32f091-st-nucleo/board/Kconfig b/bsp/stm32/stm32f091-st-nucleo/board/Kconfig index 481026ed92..681580fdce 100644 --- a/bsp/stm32/stm32f091-st-nucleo/board/Kconfig +++ b/bsp/stm32/stm32f091-st-nucleo/board/Kconfig @@ -9,6 +9,7 @@ menu "Onboard Peripheral Drivers" config BSP_USING_USB_TO_USART bool "Enable USB TO USART (uart2)" + select BSP_USING_UART select BSP_USING_UART2 default y @@ -21,20 +22,52 @@ menu "On-chip Peripheral Drivers" select RT_USING_PIN default y - config BSP_USING_UART1 - bool "Enable UART1" - select RT_USING_SERIAL - default n - - config BSP_USING_UART2 - bool "Enable UART2" - select RT_USING_SERIAL + menuconfig BSP_USING_UART + bool "Enable UART" default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y - config BSP_USING_SPI1 - bool "Enable SPI1 BUS" - select RT_USING_SPI + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default y + + config BSP_USING_UART2 + bool "Enable UART2" + default n + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n + + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n + endif + menuconfig BSP_USING_I2C1 bool "Enable I2C1 BUS (software simulation)" diff --git a/bsp/stm32/stm32f103-atk-nano/board/Kconfig b/bsp/stm32/stm32f103-atk-nano/board/Kconfig index 1c4ae055bb..84ef7224b6 100644 --- a/bsp/stm32/stm32f103-atk-nano/board/Kconfig +++ b/bsp/stm32/stm32f103-atk-nano/board/Kconfig @@ -9,6 +9,7 @@ menu "Onboard Peripheral Drivers" config BSP_USING_USB_TO_USART bool "Enable USB TO USART (uart1)" + select BSP_USING_UART select BSP_USING_UART1 default y @@ -19,6 +20,7 @@ menu "Onboard Peripheral Drivers" config BSP_USING_SPI_FLASH bool "Enable SPI FLASH (w25q16 spi2)" + select BSP_USING_SPI select BSP_USING_SPI2 select RT_USING_SFUD select RT_SFUD_USING_SFDP @@ -39,6 +41,39 @@ menu "On-chip Peripheral Drivers" select RT_USING_PIN default y + menuconfig BSP_USING_UART + bool "Enable UART" + default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y + + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default n + + config BSP_USING_UART2 + bool "Enable UART2" + default n + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + + config BSP_USING_UART3 + bool "Enable UART3" + default n + + config BSP_UART3_RX_USING_DMA + bool "Enable UART3 RX DMA" + depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA + default n + endif + config BSP_USING_UART1 bool "Enable UART1" select RT_USING_SERIAL @@ -90,20 +125,42 @@ menu "On-chip Peripheral Drivers" default n endif endif + + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n - config BSP_USING_SPI1 - bool "Enable SPI1 BUS" - select RT_USING_SPI - default n + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n - config BSP_USING_SPI2 - bool "Enable SPI2 BUS" - select RT_USING_SPI - default n - - config BSP_SPI_USING_DMA - bool "Enable SPI DMA support" - default n + config BSP_USING_SPI2 + bool "Enable SPI2 BUS" + default n + + config BSP_SPI2_TX_USING_DMA + bool "Enable SPI2 TX DMA" + depends on BSP_USING_SPI2 + default n + + config BSP_SPI2_RX_USING_DMA + bool "Enable SPI2 RX DMA" + depends on BSP_USING_SPI2 + select BSP_SPI2_TX_USING_DMA + default n + endif menuconfig BSP_USING_I2C1 bool "Enable I2C1 BUS (software simulation)" diff --git a/bsp/stm32/stm32f103-atk-nano/project.uvprojx b/bsp/stm32/stm32f103-atk-nano/project.uvprojx index 4d626125a2..af0b59df29 100644 --- a/bsp/stm32/stm32f103-atk-nano/project.uvprojx +++ b/bsp/stm32/stm32f103-atk-nano/project.uvprojx @@ -1,10 +1,7 @@ - 2.1 -
### uVision Project, (C) Keil Software
- rt-thread @@ -19,28 +16,28 @@ Keil.STM32F1xx_DFP.2.2.0 http://www.keil.com/pack/ IRAM(0x20000000,0x5000) IROM(0x08000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103RB$Flash\STM32F10x_128.FLM)) 0 $$Device:STM32F103RB$Device\Include\stm32f10x.h - - - - - - - - - + + + + + + + + + $$Device:STM32F103RB$SVD\STM32F103xx.svd 0 0 - - - - - + + + + + 0 0 @@ -62,8 +59,8 @@ 0 0 - - + + 0 0 0 @@ -72,8 +69,8 @@ 0 0 - - + + 0 0 0 @@ -83,14 +80,14 @@ 1 0 fromelf --bin !L --output rtthread.bin - + 0 0 0 0 0 - + 0 @@ -104,8 +101,8 @@ 0 0 3 - - + + 1 @@ -114,7 +111,7 @@ DCM.DLL -pCM3 SARMCM3.DLL - + TCM.DLL -pCM3 @@ -139,10 +136,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -175,7 +172,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -307,7 +304,7 @@ 0x0 - + 1 @@ -334,9 +331,9 @@ 0 0 - + STM32F103xB, USE_HAL_DRIVER - + applications;.;board;board\CubeMX_Config\Inc;board\ports;..\libraries\HAL_Drivers;..\libraries\HAL_Drivers\config;..\..\..\include;..\..\..\libcpu\arm\cortex-m3;..\..\..\libcpu\arm\common;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\libraries\STM32F1xx_HAL\CMSIS\Device\ST\STM32F1xx\Include;..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Inc;..\libraries\STM32F1xx_HAL\CMSIS\Include @@ -352,10 +349,10 @@ 0 0 - - - - + + + + @@ -367,13 +364,13 @@ 0 0x08000000 0x20000000 - + .\board\linker_scripts\link.sct - - + + --keep *.o(.rti_fn.*) --keep *.o(FSymTab) - - + + @@ -396,26 +393,36 @@ 1 board\board.c + + stm32f1xx_hal_msp.c 1 board\CubeMX_Config\Src\stm32f1xx_hal_msp.c + + startup_stm32f103xb.s 2 ..\libraries\STM32F1xx_HAL\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm\startup_stm32f103xb.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 @@ -431,76 +438,106 @@ 1 ..\..\..\src\clock.c + + components.c 1 ..\..\..\src\components.c + + cpu.c 1 ..\..\..\src\cpu.c + + device.c 1 ..\..\..\src\device.c + + idle.c 1 ..\..\..\src\idle.c + + ipc.c 1 ..\..\..\src\ipc.c + + irq.c 1 ..\..\..\src\irq.c + + kservice.c 1 ..\..\..\src\kservice.c + + mem.c 1 ..\..\..\src\mem.c + + memheap.c 1 ..\..\..\src\memheap.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 @@ -516,21 +553,29 @@ 1 ..\..\..\libcpu\arm\cortex-m3\cpuport.c + + context_rvds.S 2 ..\..\..\libcpu\arm\cortex-m3\context_rvds.S + + backtrace.c 1 ..\..\..\libcpu\arm\common\backtrace.c + + div0.c 1 ..\..\..\libcpu\arm\common\div0.c + + showmem.c 1 @@ -546,41 +591,57 @@ 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 @@ -596,26 +657,36 @@ 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 @@ -631,66 +702,92 @@ 1 ..\libraries\STM32F1xx_HAL\CMSIS\Device\ST\STM32F1xx\Source\Templates\system_stm32f1xx.c + + stm32f1xx_hal_dma.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_dma.c + + stm32f1xx_hal_cortex.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cortex.c + + stm32f1xx_hal_crc.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_crc.c + + stm32f1xx_hal_pwr.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pwr.c + + stm32f1xx_hal_rcc.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc.c + + stm32f1xx_hal_rcc_ex.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc_ex.c + + stm32f1xx_hal.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal.c + + stm32f1xx_hal_cec.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cec.c + + stm32f1xx_hal_sram.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_sram.c + + stm32f1xx_hal_gpio.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio.c + + stm32f1xx_hal_gpio_ex.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio_ex.c + + stm32f1xx_hal_uart.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_uart.c + + stm32f1xx_hal_usart.c 1 @@ -701,11 +798,9 @@ - - - - + + + -
diff --git a/bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig b/bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig index 51ecf43ef3..2795400969 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig +++ b/bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig @@ -9,6 +9,7 @@ menu "Onboard Peripheral Drivers" config BSP_USING_USB_TO_USART bool "Enable USB TO USART (uart1)" + select BSP_USING_UART select BSP_USING_UART1 default y @@ -19,6 +20,7 @@ menu "Onboard Peripheral Drivers" config BSP_USING_SPI_FLASH bool "Enable SPI FLASH (w25q64 spi1)" + select BSP_USING_SPI select BSP_USING_SPI1 select RT_USING_SFUD select RT_SFUD_USING_SFDP @@ -89,43 +91,93 @@ menu "On-chip Peripheral Drivers" select RT_USING_PIN default y - config BSP_USING_UART1 - bool "Enable UART1" - select RT_USING_SERIAL - default y + menuconfig BSP_USING_UART + bool "Enable UART" + default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y - config BSP_USING_UART2 - bool "Enable UART2" - select RT_USING_SERIAL - default n + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default n - config BSP_USING_UART3 - bool "Enable UART3" - select RT_USING_SERIAL - default n - + config BSP_USING_UART2 + bool "Enable UART2" + default n + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + + config BSP_USING_UART3 + bool "Enable UART3" + default n + + config BSP_UART3_RX_USING_DMA + bool "Enable UART3 RX DMA" + depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA + default n + endif + config BSP_USING_ON_CHIP_FLASH bool "Enable on-chip FLASH" default n - config BSP_USING_SPI1 - bool "Enable SPI1 BUS" + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n select RT_USING_SPI - default n + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n - config BSP_USING_SPI2 - bool "Enable SPI2 BUS" - select RT_USING_SPI - default n + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n - config BSP_USING_SPI3 - bool "Enable SPI3 BUS" - select RT_USING_SPI - default n + config BSP_USING_SPI2 + bool "Enable SPI2 BUS" + default n + + config BSP_SPI2_TX_USING_DMA + bool "Enable SPI2 TX DMA" + depends on BSP_USING_SPI2 + default n + + config BSP_SPI2_RX_USING_DMA + bool "Enable SPI2 RX DMA" + depends on BSP_USING_SPI2 + select BSP_SPI2_TX_USING_DMA + default n + + config BSP_USING_SPI3 + bool "Enable SPI3 BUS" + default n - config BSP_SPI_USING_DMA - bool "Enable SPI DMA support" - default n + config BSP_SPI3_TX_USING_DMA + bool "Enable SPI3 TX DMA" + depends on BSP_USING_SPI3 + default n + + config BSP_SPI3_RX_USING_DMA + bool "Enable SPI3 RX DMA" + depends on BSP_USING_SPI3 + select BSP_SPI3_TX_USING_DMA + default n + endif menuconfig BSP_USING_I2C1 bool "Enable I2C1 BUS (software simulation)" diff --git a/bsp/stm32/stm32f407-atk-explorer/board/Kconfig b/bsp/stm32/stm32f407-atk-explorer/board/Kconfig index ab47b88e1c..41ce192f9e 100644 --- a/bsp/stm32/stm32f407-atk-explorer/board/Kconfig +++ b/bsp/stm32/stm32f407-atk-explorer/board/Kconfig @@ -9,21 +9,25 @@ menu "Onboard Peripheral Drivers" config BSP_USING_USB_TO_USART bool "Enable USB TO USART (uart1)" + select BSP_USING_UART select BSP_USING_UART1 default y config BSP_USING_COM2 bool "Enable COM2 (uart2 pin conflict with Ethernet and PWM)" + select BSP_USING_UART select BSP_USING_UART2 default n config BSP_USING_COM3 bool "Enable COM3 (uart3)" + select BSP_USING_UART select BSP_USING_UART3 default n config BSP_USING_SPI_FLASH bool "Enable SPI FLASH (w25q128 spi1)" + select BSP_USING_SPI select BSP_USING_SPI1 select RT_USING_SFUD select RT_SFUD_USING_SFDP @@ -65,15 +69,29 @@ menu "On-chip Peripheral Drivers" select RT_USING_PIN default y - config BSP_USING_UART1 - bool "Enable UART1" - select RT_USING_SERIAL + menuconfig BSP_USING_UART + bool "Enable UART" default y - - config BSP_USING_UART3 - bool "Enable UART3" select RT_USING_SERIAL - default n + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y + + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default y + + config BSP_USING_UART3 + bool "Enable UART3" + default n + + config BSP_UART3_RX_USING_DMA + bool "Enable UART3 RX DMA" + depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA + default n + endif menuconfig BSP_USING_TIM bool "Enable timer" @@ -112,19 +130,41 @@ menu "On-chip Peripheral Drivers" bool "Enable on-chip FLASH" default n - config BSP_USING_SPI1 - bool "Enable SPI1 BUS" - select RT_USING_SPI - default y - - config BSP_USING_SPI2 - bool "Enable SPI2 BUS" - select RT_USING_SPI + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n - config BSP_SPI_USING_DMA - bool "Enable SPI DMA support" - default n + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n + + config BSP_USING_SPI2 + bool "Enable SPI2 BUS" + default n + + config BSP_SPI2_TX_USING_DMA + bool "Enable SPI2 TX DMA" + depends on BSP_USING_SPI2 + default n + + config BSP_SPI2_RX_USING_DMA + bool "Enable SPI2 RX DMA" + depends on BSP_USING_SPI2 + select BSP_SPI2_TX_USING_DMA + default n + endif menuconfig BSP_USING_ADC bool "Enable ADC" diff --git a/bsp/stm32/stm32f407-st-discovery/board/Kconfig b/bsp/stm32/stm32f407-st-discovery/board/Kconfig index 7c0a91960b..1f5bcd321d 100644 --- a/bsp/stm32/stm32f407-st-discovery/board/Kconfig +++ b/bsp/stm32/stm32f407-st-discovery/board/Kconfig @@ -16,23 +16,41 @@ menu "On-chip Peripheral Drivers" select RT_USING_PIN default y - config BSP_USING_UART1 - bool "Enable UART1" - select RT_USING_SERIAL + menuconfig BSP_USING_UART + bool "Enable UART" default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y - config BSP_UART_USING_DMA_RX - bool "Enable UART RX DMA support" + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default y + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" default n - - config BSP_USING_SPI1 - bool "Enable SPI1 BUS" select RT_USING_SPI - default n - - config BSP_SPI_USING_DMA - bool "Enable SPI DMA support" - default n + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n + + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n + endif menuconfig BSP_USING_I2C1 bool "Enable I2C1 BUS (software simulation)" diff --git a/bsp/stm32/stm32f429-armfly-v6/board/Kconfig b/bsp/stm32/stm32f429-armfly-v6/board/Kconfig index 5986331df2..498495e8d9 100644 --- a/bsp/stm32/stm32f429-armfly-v6/board/Kconfig +++ b/bsp/stm32/stm32f429-armfly-v6/board/Kconfig @@ -9,6 +9,7 @@ menu "Onboard Peripheral Drivers" config BSP_USING_RS232_TO_USART bool "Enable RS232 TO USART (uart1)" + select BSP_USING_UART select BSP_USING_UART1 default y @@ -22,6 +23,7 @@ menu "Onboard Peripheral Drivers" config BSP_USING_SPI_FLASH bool "Enable SPI FLASH (w25q64 spi3)" + select BSP_USING_SPI select BSP_USING_SPI3 select RT_USING_SFUD select RT_SFUD_USING_SFDP @@ -60,27 +62,45 @@ menu "On-chip Peripheral Drivers" select RT_USING_PIN default y - config BSP_USING_UART1 - bool "Enable UART1" - select RT_USING_SERIAL + menuconfig BSP_USING_UART + bool "Enable UART" default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y - config BSP_UART_USING_DMA_RX - bool "Enable UART RX DMA support" - default n + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default y + endif config BSP_USING_ON_CHIP_FLASH bool "Enable on-chip FLASH" 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" + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI3 + bool "Enable SPI3 BUS" + default n + + config BSP_SPI3_TX_USING_DMA + bool "Enable SPI3 TX DMA" + depends on BSP_USING_SPI3 + default n + + config BSP_SPI3_RX_USING_DMA + bool "Enable SPI3 RX DMA" + depends on BSP_USING_SPI3 + select BSP_SPI3_TX_USING_DMA + default n + endif menuconfig BSP_USING_I2C1 bool "Enable I2C1 BUS (software simulation)" diff --git a/bsp/stm32/stm32f429-atk-apollo/board/Kconfig b/bsp/stm32/stm32f429-atk-apollo/board/Kconfig index 8355099335..c8529ead4f 100644 --- a/bsp/stm32/stm32f429-atk-apollo/board/Kconfig +++ b/bsp/stm32/stm32f429-atk-apollo/board/Kconfig @@ -9,11 +9,13 @@ menu "Onboard Peripheral Drivers" config BSP_USING_USB_TO_USART bool "Enable USB TO USART (uart1)" + select BSP_USING_UART select BSP_USING_UART1 default y config BSP_USING_COM2 bool "Enable COM2 (uart2 pin conflict with Ethernet and PWM)" + select BSP_USING_UART select BSP_USING_UART2 default n @@ -28,6 +30,7 @@ menu "Onboard Peripheral Drivers" config BSP_USING_SPI_FLASH bool "Enable SPI FLASH (w25q256 spi5)" + select BSP_USING_SPI select BSP_USING_SPI5 select RT_USING_SFUD select RT_SFUD_USING_SFDP @@ -66,43 +69,93 @@ menu "On-chip Peripheral Drivers" select RT_USING_PIN default y - config BSP_USING_UART1 - bool "Enable UART1" - select RT_USING_SERIAL + menuconfig BSP_USING_UART + bool "Enable UART" default y - - config BSP_USING_UART2 - bool "Enable UART2" select RT_USING_SERIAL - default n + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y - config BSP_USING_UART3 - bool "Enable UART3" - select RT_USING_SERIAL - default n + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default y + + config BSP_USING_UART2 + bool "Enable UART2" + default n + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + + config BSP_USING_UART3 + bool "Enable UART3" + default n + + config BSP_UART3_RX_USING_DMA + bool "Enable UART3 RX DMA" + depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA + default n + endif config BSP_USING_ON_CHIP_FLASH bool "Enable on-chip FLASH" default n - config BSP_USING_SPI1 - bool "Enable SPI1 BUS" + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n select RT_USING_SPI - default n + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n - config BSP_USING_SPI2 - bool "Enable SPI2 BUS" - select RT_USING_SPI - default n + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n - config BSP_USING_SPI5 - bool "Enable SPI5 BUS" - select RT_USING_SPI - default n + config BSP_USING_SPI2 + bool "Enable SPI2 BUS" + default n + + config BSP_SPI2_TX_USING_DMA + bool "Enable SPI2 TX DMA" + depends on BSP_USING_SPI2 + default n + + config BSP_SPI2_RX_USING_DMA + bool "Enable SPI2 RX DMA" + depends on BSP_USING_SPI2 + select BSP_SPI2_TX_USING_DMA + default n + + config BSP_USING_SPI5 + bool "Enable SPI5 BUS" + default n - config BSP_SPI_USING_DMA - bool "Enable SPI DMA support" - default n + config BSP_SPI5_TX_USING_DMA + bool "Enable SPI5 TX DMA" + depends on BSP_USING_SPI5 + default n + + config BSP_SPI5_RX_USING_DMA + bool "Enable SPI5 RX DMA" + depends on BSP_USING_SPI5 + select BSP_SPI5_TX_USING_DMA + default n + endif menuconfig BSP_USING_I2C1 bool "Enable I2C1 BUS (software simulation)" diff --git a/bsp/stm32/stm32f429-fire-challenger/board/Kconfig b/bsp/stm32/stm32f429-fire-challenger/board/Kconfig index 10d86df091..2c8d3f10cf 100644 --- a/bsp/stm32/stm32f429-fire-challenger/board/Kconfig +++ b/bsp/stm32/stm32f429-fire-challenger/board/Kconfig @@ -9,11 +9,13 @@ menu "Onboard Peripheral Drivers" config BSP_USING_USB_TO_USART bool "Enable USB TO USART (uart1)" + select BSP_USING_UART select BSP_USING_UART1 default y config BSP_USING_RS232 bool "Enable RS232" + select BSP_USING_UART select BSP_USING_UART2 default n @@ -22,7 +24,8 @@ menu "Onboard Peripheral Drivers" default n config BSP_USING_SPI_FLASH - bool "Enable SPI FLASH (W25Q128 spi5)" + bool "Enable SPI FLASH (w25q256 spi5)" + select BSP_USING_SPI select BSP_USING_SPI5 select RT_USING_SFUD select RT_SFUD_USING_SFDP @@ -76,28 +79,55 @@ menu "On-chip Peripheral Drivers" select RT_USING_PIN default y - config BSP_USING_UART1 - bool "Enable UART1" - select RT_USING_SERIAL + menuconfig BSP_USING_UART + bool "Enable UART" default y - - config BSP_USING_UART2 - bool "Enable UART2" select RT_USING_SERIAL - default n + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y + + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default y + + config BSP_USING_UART2 + bool "Enable UART2" + default n + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + + endif config BSP_USING_ON_CHIP_FLASH bool "Enable on-chip FLASH" default n - config BSP_USING_SPI5 - bool "Enable SPI5 BUS" + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n select RT_USING_SPI - default n + if BSP_USING_SPI + config BSP_USING_SPI5 + bool "Enable SPI5 BUS" + default n - config BSP_SPI_USING_DMA - bool "Enable SPI DMA support" - default n + config BSP_SPI5_TX_USING_DMA + bool "Enable SPI5 TX DMA" + depends on BSP_USING_SPI5 + default n + + config BSP_SPI5_RX_USING_DMA + bool "Enable SPI5 RX DMA" + depends on BSP_USING_SPI5 + select BSP_SPI5_TX_USING_DMA + default n + endif menuconfig BSP_USING_TIM bool "Enable timer" diff --git a/bsp/stm32/stm32f767-atk-apollo/board/Kconfig b/bsp/stm32/stm32f767-atk-apollo/board/Kconfig index d8a1575d27..e87dbd896a 100644 --- a/bsp/stm32/stm32f767-atk-apollo/board/Kconfig +++ b/bsp/stm32/stm32f767-atk-apollo/board/Kconfig @@ -9,11 +9,13 @@ menu "Onboard Peripheral Drivers" config BSP_USING_USB_TO_USART bool "Enable USB TO USART (uart1)" + select BSP_USING_UART select BSP_USING_UART1 default y config BSP_USING_RS232 bool "Enable RS232 (uart2 pin conflict with Ethernet)" + select BSP_USING_UART select BSP_USING_UART2 default n @@ -67,28 +69,71 @@ menu "On-chip Peripheral Drivers" select RT_USING_PIN default y - config BSP_USING_UART1 - bool "Enable UART1" - select RT_USING_SERIAL + menuconfig BSP_USING_UART + bool "Enable UART" default y - - config BSP_USING_UART2 - bool "Enable UART2" select RT_USING_SERIAL - default n + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y + + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default y + + config BSP_USING_UART2 + bool "Enable UART2" + default n + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + + endif config BSP_USING_ON_CHIP_FLASH bool "Enable on-chip FLASH" default n - config BSP_USING_SPI2 - bool "Enable SPI2 BUS" +menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n select RT_USING_SPI - default n + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n + + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n + + config BSP_USING_SPI2 + bool "Enable SPI2 BUS" + default n + + config BSP_SPI2_TX_USING_DMA + bool "Enable SPI2 TX DMA" + depends on BSP_USING_SPI2 + default n + + config BSP_SPI2_RX_USING_DMA + bool "Enable SPI2 RX DMA" + depends on BSP_USING_SPI2 + select BSP_SPI2_TX_USING_DMA + default n + endif - config BSP_SPI_USING_DMA - bool "Enable SPI DMA support" - default n config BSP_USING_QSPI bool "Enable QSPI BUS" diff --git a/bsp/stm32/stm32f767-fire-challenger/board/Kconfig b/bsp/stm32/stm32f767-fire-challenger/board/Kconfig index 8945170ec8..2423430d38 100644 --- a/bsp/stm32/stm32f767-fire-challenger/board/Kconfig +++ b/bsp/stm32/stm32f767-fire-challenger/board/Kconfig @@ -9,11 +9,13 @@ menu "Onboard Peripheral Drivers" config BSP_USING_USB_TO_USART bool "Enable USB TO USART (uart1)" + select BSP_USING_UART select BSP_USING_UART1 default y config BSP_USING_RS232 bool "Enable RS232 (uart2 pin conflict with Ethernet)" + select BSP_USING_UART select BSP_USING_UART2 default n @@ -43,43 +45,93 @@ menu "On-chip Peripheral Drivers" select RT_USING_PIN default y - config BSP_USING_UART1 - bool "Enable UART1" - select RT_USING_SERIAL + menuconfig BSP_USING_UART + bool "Enable UART" default y - - config BSP_USING_UART2 - bool "Enable UART2" select RT_USING_SERIAL - default n + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y - config BSP_USING_UART3 - bool "Enable UART3" - select RT_USING_SERIAL - default n + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default y + + config BSP_USING_UART2 + bool "Enable UART2" + default n + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + + config BSP_USING_UART3 + bool "Enable UART3" + default n + + config BSP_UART3_RX_USING_DMA + bool "Enable UART3 RX DMA" + depends on BSP_USING_UART3 && RT_SERIsAL_USING_DMA + default n + endif config BSP_USING_ON_CHIP_FLASH bool "Enable on-chip FLASH" default n - config BSP_USING_SPI1 - bool "Enable SPI1 BUS" +menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n select RT_USING_SPI - default n + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n - config BSP_USING_SPI2 - bool "Enable SPI2 BUS" - select RT_USING_SPI - default n + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n - config BSP_USING_SPI5 - bool "Enable SPI5 BUS" - select RT_USING_SPI - default n + config BSP_USING_SPI2 + bool "Enable SPI2 BUS" + default n + + config BSP_SPI2_TX_USING_DMA + bool "Enable SPI2 TX DMA" + depends on BSP_USING_SPI2 + default n + + config BSP_SPI2_RX_USING_DMA + bool "Enable SPI2 RX DMA" + depends on BSP_USING_SPI2 + select BSP_SPI2_TX_USING_DMA + default n - config BSP_SPI_USING_DMA - bool "Enable SPI DMA support" - default n + config BSP_USING_SPI5 + bool "Enable SPI5 BUS" + default n + + config BSP_SPI5_TX_USING_DMA + bool "Enable SPI5 TX DMA" + depends on BSP_USING_SPI5 + default n + + config BSP_SPI5_RX_USING_DMA + bool "Enable SPI5 RX DMA" + depends on BSP_USING_SPI5 + select BSP_SPI5_TX_USING_DMA + default n + endif config BSP_USING_QSPI bool "Enable QSPI BUS" diff --git a/bsp/stm32/stm32l475-atk-pandora/board/Kconfig b/bsp/stm32/stm32l475-atk-pandora/board/Kconfig index 2efacdb00e..538cf8d472 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/Kconfig +++ b/bsp/stm32/stm32l475-atk-pandora/board/Kconfig @@ -9,6 +9,7 @@ menu "Onboard Peripheral Drivers" config BSP_USING_STLINK_TO_USART bool "Enable STLINK TO USART (uart1)" + select BSP_USING_UART select BSP_USING_UART1 default y @@ -21,6 +22,7 @@ menu "Onboard Peripheral Drivers" config BSP_USING_SDCARD bool "Enable SDCARD (spi1)" + select BSP_USING_SPI select BSP_USING_SPI1 select BSP_SPI_USING_DMA select RT_USING_SPI_MSD @@ -37,33 +39,69 @@ menu "On-chip Peripheral Drivers" select RT_USING_PIN default y - config BSP_USING_UART1 - bool "Enable UART1" - select RT_USING_SERIAL + menuconfig BSP_USING_UART + bool "Enable UART" default y - - config BSP_USING_UART2 - bool "Enable UART2" select RT_USING_SERIAL - default n - + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y + + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default y + + config BSP_USING_UART2 + bool "Enable UART2" + default n + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + endif + config BSP_USING_ON_CHIP_FLASH bool "Enable on-chip FLASH" default n - config BSP_USING_SPI1 - bool "Enable SPI1 BUS" + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n select RT_USING_SPI - default n + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n - config BSP_USING_SPI2 - bool "Enable SPI2 BUS" - select RT_USING_SPI - default n + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n - config BSP_SPI_USING_DMA - bool "Enable SPI DMA support" - default n + config BSP_USING_SPI2 + bool "Enable SPI2 BUS" + default n + + config BSP_SPI2_TX_USING_DMA + bool "Enable SPI2 TX DMA" + depends on BSP_USING_SPI2 + default n + + config BSP_SPI2_RX_USING_DMA + bool "Enable SPI2 RX DMA" + depends on BSP_USING_SPI2 + select BSP_SPI2_TX_USING_DMA + default n + endif config BSP_USING_QSPI bool "Enable QSPI BUS" From 688d8994d92856126a85f5f9a3e38593fdd514f6 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Tue, 8 Jan 2019 13:59:34 +0800 Subject: [PATCH 04/15] [bsp][stm32] update drv_spi.c --- bsp/stm32/libraries/HAL_Drivers/drv_spi.c | 55 ++++++++++++----------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_spi.c b/bsp/stm32/libraries/HAL_Drivers/drv_spi.c index 033cd2859f..45f425fbe8 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_spi.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_spi.c @@ -19,6 +19,7 @@ #include "drv_spi.h" #include "drv_config.h" +#include //#define DRV_DEBUG #define LOG_TAG "drv.spi" @@ -204,8 +205,8 @@ static rt_err_t stm32_spi_init(struct stm32_spi *spi_drv, struct rt_spi_configur spi_handle->State = HAL_SPI_STATE_RESET; #ifdef SOC_SERIES_STM32L4 spi_handle->Init.NSSPMode = SPI_NSS_PULSE_DISABLE; -#endif - +#endif + if (HAL_SPI_Init(spi_handle) != HAL_OK) { return RT_EIO; @@ -267,19 +268,20 @@ static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message * spi_drv->config->bus_name, (uint32_t)message->send_buf, (uint32_t)message->recv_buf, message->length); - + if (message->length) { /* start once data exchange in DMA mode */ if (message->send_buf && message->recv_buf) { - if ((spi_drv->spi_dma_flag & SPI_USING_TX_DMA_FLAG) && (spi_drv->spi_dma_flag & SPI_USING_RX_DMA_FLAG)) - { + if ((spi_drv->spi_dma_flag & SPI_USING_TX_DMA_FLAG) && (spi_drv->spi_dma_flag & SPI_USING_RX_DMA_FLAG)) + { state = HAL_SPI_TransmitReceive_DMA(spi_handle, (uint8_t *)message->send_buf, (uint8_t *)message->recv_buf, message->length); - }else - { + } + else + { state = HAL_SPI_TransmitReceive(spi_handle, (uint8_t *)message->send_buf, (uint8_t *)message->recv_buf, message->length, 1000); - } + } } else if (message->send_buf) { @@ -294,6 +296,7 @@ static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message * } else { + memset(message->recv_buf, 0xff, message->length); if (spi_drv->spi_dma_flag & SPI_USING_RX_DMA_FLAG) { state = HAL_SPI_Receive_DMA(spi_handle, (uint8_t *)message->recv_buf, message->length); @@ -303,7 +306,7 @@ static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message * state = HAL_SPI_Receive(spi_handle, (uint8_t *)message->recv_buf, message->length, 1000); } } - + if (state != HAL_OK) { LOG_I("spi transfer error : %d", state); @@ -320,7 +323,7 @@ static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message * is ongoing. */ while (HAL_SPI_GetState(spi_handle) != HAL_SPI_STATE_READY); } - + if (message->cs_release) { HAL_GPIO_WritePin(cs->GPIOx, cs->GPIO_Pin, GPIO_PIN_SET); @@ -379,19 +382,19 @@ static int rt_hw_spi_bus_init(void) spi_bus_obj[i].dma.handle_rx.Init.PeriphBurst = DMA_PBURST_INC4; #endif - { - rt_uint32_t tmpreg = 0x00U; + { + rt_uint32_t tmpreg = 0x00U; #if defined(SOC_SERIES_STM32F1) - /* enable DMA clock && Delay after an RCC peripheral clock enabling*/ - SET_BIT(RCC->AHBENR, spi_config[i].dma_rx->dma_rcc); - tmpreg = READ_BIT(RCC->AHBENR, spi_config[i].dma_rx->dma_rcc); -#elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32L4) + /* enable DMA clock && Delay after an RCC peripheral clock enabling*/ + SET_BIT(RCC->AHBENR, spi_config[i].dma_rx->dma_rcc); + tmpreg = READ_BIT(RCC->AHBENR, spi_config[i].dma_rx->dma_rcc); +#elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32L4) SET_BIT(RCC->AHB1ENR, spi_config[i].dma_rx->dma_rcc); /* Delay after an RCC peripheral clock enabling */ tmpreg = READ_BIT(RCC->AHB1ENR, spi_config[i].dma_rx->dma_rcc); #endif - UNUSED(tmpreg); /* To avoid compiler warnings */ - } + UNUSED(tmpreg); /* To avoid compiler warnings */ + } } if (spi_bus_obj[i].spi_dma_flag & SPI_USING_TX_DMA_FLAG) @@ -417,19 +420,19 @@ static int rt_hw_spi_bus_init(void) spi_bus_obj[i].dma.handle_tx.Init.PeriphBurst = DMA_PBURST_INC4; #endif - { - rt_uint32_t tmpreg = 0x00U; + { + rt_uint32_t tmpreg = 0x00U; #if defined(SOC_SERIES_STM32F1) - /* enable DMA clock && Delay after an RCC peripheral clock enabling*/ - SET_BIT(RCC->AHBENR, spi_config[i].dma_rx->dma_rcc); - tmpreg = READ_BIT(RCC->AHBENR, spi_config[i].dma_rx->dma_rcc); -#elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32L4) + /* enable DMA clock && Delay after an RCC peripheral clock enabling*/ + SET_BIT(RCC->AHBENR, spi_config[i].dma_rx->dma_rcc); + tmpreg = READ_BIT(RCC->AHBENR, spi_config[i].dma_rx->dma_rcc); +#elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32L4) SET_BIT(RCC->AHB1ENR, spi_config[i].dma_tx->dma_rcc); /* Delay after an RCC peripheral clock enabling */ tmpreg = READ_BIT(RCC->AHB1ENR, spi_config[i].dma_tx->dma_rcc); #endif - UNUSED(tmpreg); /* To avoid compiler warnings */ - } + UNUSED(tmpreg); /* To avoid compiler warnings */ + } } result = rt_spi_bus_register(&spi_bus_obj[i].spi_bus, spi_config[i].bus_name, &stm_spi_ops); From 40a474fefa27f7bdb56946812b764faa44e25d77 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Tue, 8 Jan 2019 14:01:02 +0800 Subject: [PATCH 05/15] [bsp][stm32] optimize eth driver --- bsp/stm32/libraries/HAL_Drivers/drv_eth.c | 56 +++++++++++++++++++++-- bsp/stm32/libraries/HAL_Drivers/drv_eth.h | 7 +++ 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_eth.c b/bsp/stm32/libraries/HAL_Drivers/drv_eth.c index 21c2e90cf2..315c1b9890 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_eth.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_eth.c @@ -260,6 +260,9 @@ rt_err_t rt_stm32_eth_tx(rt_device_t dev, struct pbuf *p) /* TODO Optimize data send speed*/ LOG_D("transmit frame lenth :%d", framelength); + /* wait for unlocked */ + while (EthHandle.Lock == HAL_LOCKED); + state = HAL_ETH_TransmitFrame(&EthHandle, framelength); if (state != HAL_OK) { @@ -410,6 +413,40 @@ void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *heth) LOG_E("eth err"); } +#ifdef PHY_USING_INTERRUPT_MODE +static void eth_phy_isr(void *args) +{ + rt_uint32_t status = 0; + static rt_uint8_t link_status = 1; + + HAL_ETH_ReadPHYRegister(&EthHandle, PHY_INTERRUPT_FLAG_REG, (uint32_t *)&status); + LOG_D("phy interrupt status reg is 0x%X", status); + HAL_ETH_ReadPHYRegister(&EthHandle, PHY_BASIC_STATUS_REG, (uint32_t *)&status); + LOG_D("phy basic status reg is 0x%X", status); + + if (status & PHY_LINKED_STATUS_MASK) + { + if (link_status == 0) + { + link_status = 1; + LOG_D("link up"); + /* send link up. */ + eth_device_linkchange(&stm32_eth_device.parent, RT_TRUE); + } + } + else + { + if (link_status == 1) + { + link_status = 0; + LOG_I("link down"); + /* send link down. */ + eth_device_linkchange(&stm32_eth_device.parent, RT_FALSE); + } + } +} +#endif /* PHY_USING_INTERRUPT_MODE */ + static uint8_t phy_speed = 0; #define PHY_LINK_MASK (1<<0) static void phy_monitor_thread_entry(void *parameter) @@ -435,12 +472,12 @@ static void phy_monitor_thread_entry(void *parameter) if (phy_addr == 0xFF) { - LOG_E("phy not probe!\r\n"); + LOG_E("phy not probe!"); return; } else { - LOG_D("found a phy, address:0x%02X\r\n", phy_addr); + LOG_D("found a phy, address:0x%02X", phy_addr); } /* RESET PHY */ @@ -452,7 +489,7 @@ static void phy_monitor_thread_entry(void *parameter) while (1) { HAL_ETH_ReadPHYRegister(&EthHandle, PHY_BASIC_STATUS_REG, (uint32_t *)&status); - LOG_D("PHY BASIC STATUS REG:0x%04X\r\n", status); + LOG_D("PHY BASIC STATUS REG:0x%04X", status); phy_speed_new = 0; @@ -512,10 +549,21 @@ static void phy_monitor_thread_entry(void *parameter) /* send link up. */ eth_device_linkchange(&stm32_eth_device.parent, RT_TRUE); +#ifdef PHY_USING_INTERRUPT_MODE + /* configuration intterrupt pin */ + rt_pin_mode(PHY_INT_PIN, PIN_MODE_INPUT_PULLUP); + rt_pin_attach_irq(PHY_INT_PIN, PIN_IRQ_MODE_FALLING, eth_phy_isr, (void *)"callbackargs"); + rt_pin_irq_enable(PHY_INT_PIN, PIN_IRQ_ENABLE); + + /* enable phy interrupt */ + HAL_ETH_WritePHYRegister(&EthHandle, PHY_INTERRUPT_MSAK_REG, PHY_INT_MASK); + + break; +#endif } /* link up. */ else { - LOG_I("link down\r\n"); + LOG_I("link down"); /* send link down. */ eth_device_linkchange(&stm32_eth_device.parent, RT_FALSE); } diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_eth.h b/bsp/stm32/libraries/HAL_Drivers/drv_eth.h index fbfe08d484..378aca5838 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_eth.h +++ b/bsp/stm32/libraries/HAL_Drivers/drv_eth.h @@ -55,6 +55,13 @@ #define PHY_10M_MASK ((1<<12) || (1<<13)) #define PHY_100M_MASK ((1<<14) || (1<<15)) #define PHY_FULL_DUPLEX_MASK ((1<<15) || (1<<13)) +/* The PHY interrupt source flag register. */ +#define PHY_INTERRUPT_FLAG_REG 0x15U +/* The PHY interrupt mask register. */ +#define PHY_INTERRUPT_MSAK_REG 0x15U +#define PHY_LINK_CHANGE_FLAG (1<<2) +#define PHY_LINK_CHANGE_MASK (1<<9) +#define PHY_INT_MASK 0 #endif /* PHY_USING_DM9161CEP */ From 02a1fa307987d3883c9eeaebfd00061b4c2af0e3 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Tue, 8 Jan 2019 14:01:51 +0800 Subject: [PATCH 06/15] [bsp][stm32] add hwtimer driver for f7 series --- bsp/stm32/libraries/HAL_Drivers/drv_hwtimer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_hwtimer.c b/bsp/stm32/libraries/HAL_Drivers/drv_hwtimer.c index 8c3b42606a..57ff812c52 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_hwtimer.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_hwtimer.c @@ -288,13 +288,13 @@ static rt_err_t timer_ctrl(rt_hwtimer_t *timer, rt_uint32_t cmd, void *arg) { #if defined(SOC_SERIES_STM32L4) val = HAL_RCC_GetPCLK2Freq() / freq; -#elif defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F4) +#elif defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) val = HAL_RCC_GetPCLK2Freq() * 2 / freq; #endif } else { -#if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F4) +#if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) val = HAL_RCC_GetPCLK1Freq() * 2 / freq; #elif defined(SOC_SERIES_STM32F0) val = HAL_RCC_GetPCLK1Freq() / freq; From 883a9f1e131c4e38193ff367a7068af8135c10e4 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Tue, 8 Jan 2019 14:07:46 +0800 Subject: [PATCH 07/15] [bsp][stm32] update dma config in Kconfig --- .../libraries/templates/stm32f0xx/.config | 36 ++---- .../templates/stm32f0xx/board/Kconfig | 42 +++++-- .../libraries/templates/stm32f0xx/rtconfig.h | 12 +- .../libraries/templates/stm32f10x/.config | 16 +-- .../templates/stm32f10x/board/Kconfig | 42 +++++-- .../libraries/templates/stm32f10x/rtconfig.h | 6 +- .../libraries/templates/stm32f4xx/.config | 16 +-- .../templates/stm32f4xx/board/Kconfig | 42 +++++-- .../libraries/templates/stm32f4xx/rtconfig.h | 6 +- .../libraries/templates/stm32f7xx/.config | 16 +-- .../templates/stm32f7xx/board/Kconfig | 42 +++++-- .../libraries/templates/stm32f7xx/rtconfig.h | 6 +- .../libraries/templates/stm32l4xx/.config | 16 +-- .../templates/stm32l4xx/board/Kconfig | 40 ++++-- .../libraries/templates/stm32l4xx/rtconfig.h | 6 +- bsp/stm32/stm32f091-st-nucleo/.config | 43 +++---- bsp/stm32/stm32f091-st-nucleo/board/Kconfig | 2 +- bsp/stm32/stm32f091-st-nucleo/rtconfig.h | 14 +-- bsp/stm32/stm32f103-atk-nano/.config | 8 +- bsp/stm32/stm32f103-atk-nano/board/Kconfig | 118 +++++++++--------- bsp/stm32/stm32f103-atk-nano/rtconfig.h | 1 + bsp/stm32/stm32f103-fire-arbitrary/.config | 9 +- .../stm32f103-fire-arbitrary/board/Kconfig | 55 ++++---- bsp/stm32/stm32f103-fire-arbitrary/rtconfig.h | 1 + bsp/stm32/stm32f407-atk-explorer/.config | 13 +- .../stm32f407-atk-explorer/board/Kconfig | 2 +- bsp/stm32/stm32f407-atk-explorer/rtconfig.h | 1 + bsp/stm32/stm32f407-st-discovery/.config | 8 +- .../stm32f407-st-discovery/board/Kconfig | 2 +- bsp/stm32/stm32f407-st-discovery/rtconfig.h | 1 + bsp/stm32/stm32f429-armfly-v6/.config | 37 ++---- bsp/stm32/stm32f429-armfly-v6/board/Kconfig | 18 ++- bsp/stm32/stm32f429-armfly-v6/rtconfig.h | 12 +- bsp/stm32/stm32f429-atk-apollo/.config | 9 +- bsp/stm32/stm32f429-atk-apollo/board/Kconfig | 2 +- bsp/stm32/stm32f429-atk-apollo/rtconfig.h | 1 + bsp/stm32/stm32f429-fire-challenger/.config | 10 +- .../stm32f429-fire-challenger/board/Kconfig | 5 +- .../stm32f429-fire-challenger/rtconfig.h | 1 + bsp/stm32/stm32f767-atk-apollo/.config | 21 ++-- bsp/stm32/stm32f767-atk-apollo/board/Kconfig | 4 +- bsp/stm32/stm32f767-atk-apollo/rtconfig.h | 1 + bsp/stm32/stm32f767-fire-challenger/.config | 13 +- .../stm32f767-fire-challenger/board/Kconfig | 4 +- .../stm32f767-fire-challenger/rtconfig.h | 1 + bsp/stm32/stm32l475-atk-pandora/.config | 8 +- bsp/stm32/stm32l475-atk-pandora/board/Kconfig | 3 +- bsp/stm32/stm32l475-atk-pandora/rtconfig.h | 1 + 48 files changed, 396 insertions(+), 377 deletions(-) diff --git a/bsp/stm32/libraries/templates/stm32f0xx/.config b/bsp/stm32/libraries/templates/stm32f0xx/.config index 28eea196b2..95ba89c2b8 100644 --- a/bsp/stm32/libraries/templates/stm32f0xx/.config +++ b/bsp/stm32/libraries/templates/stm32f0xx/.config @@ -281,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 @@ -295,6 +296,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 @@ -309,10 +311,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_ZLIB is not set # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set - -# -# sample package -# +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set # # samples: kernel and components samples @@ -321,30 +320,8 @@ 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_PKG_USING_VI is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F0=y @@ -361,9 +338,10 @@ CONFIG_SOC_STM32F091RC=y # On-chip Peripheral Drivers # CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y CONFIG_BSP_USING_UART1=y -# CONFIG_BSP_USING_SPI1 is not set -# CONFIG_BSP_SPI_USING_DMA is not set +# CONFIG_BSP_UART1_RX_USING_DMA is not set +# CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_I2C1 is not set # diff --git a/bsp/stm32/libraries/templates/stm32f0xx/board/Kconfig b/bsp/stm32/libraries/templates/stm32f0xx/board/Kconfig index 766529e3a3..2af0bda763 100644 --- a/bsp/stm32/libraries/templates/stm32f0xx/board/Kconfig +++ b/bsp/stm32/libraries/templates/stm32f0xx/board/Kconfig @@ -16,19 +16,41 @@ menu "On-chip Peripheral Drivers" select RT_USING_PIN default y - config BSP_USING_UART1 - bool "Enable UART1" - select RT_USING_SERIAL + menuconfig BSP_USING_UART + bool "Enable UART" default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y - config BSP_USING_SPI1 - bool "Enable SPI1 BUS" + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default n + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n select RT_USING_SPI - default n - - config BSP_SPI_USING_DMA - bool "Enable SPI DMA support" - default n + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n + + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n + endif menuconfig BSP_USING_I2C1 bool "Enable I2C1 BUS (software simulation)" diff --git a/bsp/stm32/libraries/templates/stm32f0xx/rtconfig.h b/bsp/stm32/libraries/templates/stm32f0xx/rtconfig.h index bb37c4d3a2..0026ccb4a8 100644 --- a/bsp/stm32/libraries/templates/stm32f0xx/rtconfig.h +++ b/bsp/stm32/libraries/templates/stm32f0xx/rtconfig.h @@ -149,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_STM32F0 @@ -174,6 +163,7 @@ /* On-chip Peripheral Drivers */ #define BSP_USING_GPIO +#define BSP_USING_UART #define BSP_USING_UART1 /* Board extended module Drivers */ diff --git a/bsp/stm32/libraries/templates/stm32f10x/.config b/bsp/stm32/libraries/templates/stm32f10x/.config index b74dd34859..4d9fc24b34 100644 --- a/bsp/stm32/libraries/templates/stm32f10x/.config +++ b/bsp/stm32/libraries/templates/stm32f10x/.config @@ -296,6 +296,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 @@ -310,10 +311,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_ZLIB is not set # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set - -# -# sample package -# +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set # # samples: kernel and components samples @@ -322,11 +320,8 @@ 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_PKG_USING_VI is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F1=y @@ -343,9 +338,10 @@ CONFIG_SOC_STM32F103RB=y # On-chip Peripheral Drivers # CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y CONFIG_BSP_USING_UART1=y -# CONFIG_BSP_USING_SPI1 is not set -# CONFIG_BSP_SPI_USING_DMA is not set +# CONFIG_BSP_UART1_RX_USING_DMA is not set +# CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_I2C1 is not set # diff --git a/bsp/stm32/libraries/templates/stm32f10x/board/Kconfig b/bsp/stm32/libraries/templates/stm32f10x/board/Kconfig index 39a000d371..a8a2e516f2 100644 --- a/bsp/stm32/libraries/templates/stm32f10x/board/Kconfig +++ b/bsp/stm32/libraries/templates/stm32f10x/board/Kconfig @@ -16,19 +16,41 @@ menu "On-chip Peripheral Drivers" select RT_USING_PIN default y - config BSP_USING_UART1 - bool "Enable UART1" - select RT_USING_SERIAL + menuconfig BSP_USING_UART + bool "Enable UART" default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y - config BSP_USING_SPI1 - bool "Enable SPI1 BUS" + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default n + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n select RT_USING_SPI - default n - - config BSP_SPI_USING_DMA - bool "Enable SPI DMA support" - default n + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n + + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n + endif menuconfig BSP_USING_I2C1 bool "Enable I2C1 BUS (software simulation)" diff --git a/bsp/stm32/libraries/templates/stm32f10x/rtconfig.h b/bsp/stm32/libraries/templates/stm32f10x/rtconfig.h index 908c0d760d..63450a8a21 100644 --- a/bsp/stm32/libraries/templates/stm32f10x/rtconfig.h +++ b/bsp/stm32/libraries/templates/stm32f10x/rtconfig.h @@ -149,13 +149,8 @@ /* miscellaneous packages */ -/* sample package */ - /* samples: kernel and components samples */ - -/* example package: hello */ - #define SOC_FAMILY_STM32 #define SOC_SERIES_STM32F1 @@ -168,6 +163,7 @@ /* On-chip Peripheral Drivers */ #define BSP_USING_GPIO +#define BSP_USING_UART #define BSP_USING_UART1 /* Board extended module Drivers */ diff --git a/bsp/stm32/libraries/templates/stm32f4xx/.config b/bsp/stm32/libraries/templates/stm32f4xx/.config index ed06540dab..973b093b5b 100644 --- a/bsp/stm32/libraries/templates/stm32f4xx/.config +++ b/bsp/stm32/libraries/templates/stm32f4xx/.config @@ -297,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 @@ -311,10 +312,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_ZLIB is not set # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set - -# -# sample package -# +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set # # samples: kernel and components samples @@ -323,11 +321,8 @@ 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_PKG_USING_VI is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F4=y @@ -344,9 +339,10 @@ CONFIG_SOC_STM32F407ZG=y # On-chip Peripheral Drivers # CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y CONFIG_BSP_USING_UART1=y -# CONFIG_BSP_USING_SPI1 is not set -# CONFIG_BSP_SPI_USING_DMA is not set +# CONFIG_BSP_UART1_RX_USING_DMA is not set +# CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_I2C1 is not set # diff --git a/bsp/stm32/libraries/templates/stm32f4xx/board/Kconfig b/bsp/stm32/libraries/templates/stm32f4xx/board/Kconfig index 5ba6059541..a04f418b5b 100644 --- a/bsp/stm32/libraries/templates/stm32f4xx/board/Kconfig +++ b/bsp/stm32/libraries/templates/stm32f4xx/board/Kconfig @@ -16,19 +16,41 @@ menu "On-chip Peripheral Drivers" select RT_USING_PIN default y - config BSP_USING_UART1 - bool "Enable UART1" - select RT_USING_SERIAL + menuconfig BSP_USING_UART + bool "Enable UART" default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y - config BSP_USING_SPI1 - bool "Enable SPI1 BUS" + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default n + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n select RT_USING_SPI - default n - - config BSP_SPI_USING_DMA - bool "Enable SPI DMA support" - default n + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n + + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n + endif menuconfig BSP_USING_I2C1 bool "Enable I2C1 BUS (software simulation)" diff --git a/bsp/stm32/libraries/templates/stm32f4xx/rtconfig.h b/bsp/stm32/libraries/templates/stm32f4xx/rtconfig.h index b8700de08d..8e6b709a8a 100644 --- a/bsp/stm32/libraries/templates/stm32f4xx/rtconfig.h +++ b/bsp/stm32/libraries/templates/stm32f4xx/rtconfig.h @@ -149,13 +149,8 @@ /* miscellaneous packages */ -/* sample package */ - /* samples: kernel and components samples */ - -/* example package: hello */ - #define SOC_FAMILY_STM32 #define SOC_SERIES_STM32F4 @@ -168,6 +163,7 @@ /* On-chip Peripheral Drivers */ #define BSP_USING_GPIO +#define BSP_USING_UART #define BSP_USING_UART1 /* Board extended module Drivers */ diff --git a/bsp/stm32/libraries/templates/stm32f7xx/.config b/bsp/stm32/libraries/templates/stm32f7xx/.config index 5b2fbd74ae..a594f088db 100644 --- a/bsp/stm32/libraries/templates/stm32f7xx/.config +++ b/bsp/stm32/libraries/templates/stm32f7xx/.config @@ -297,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 @@ -311,10 +312,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_ZLIB is not set # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set - -# -# sample package -# +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set # # samples: kernel and components samples @@ -323,11 +321,8 @@ 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_PKG_USING_VI is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F7=y @@ -344,9 +339,10 @@ CONFIG_SOC_STM32F767IG=y # On-chip Peripheral Drivers # CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y CONFIG_BSP_USING_UART1=y -# CONFIG_BSP_USING_SPI1 is not set -# CONFIG_BSP_SPI_USING_DMA is not set +# CONFIG_BSP_UART1_RX_USING_DMA is not set +# CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_I2C1 is not set # diff --git a/bsp/stm32/libraries/templates/stm32f7xx/board/Kconfig b/bsp/stm32/libraries/templates/stm32f7xx/board/Kconfig index 02454235c7..bfd687cbc1 100644 --- a/bsp/stm32/libraries/templates/stm32f7xx/board/Kconfig +++ b/bsp/stm32/libraries/templates/stm32f7xx/board/Kconfig @@ -16,19 +16,41 @@ menu "On-chip Peripheral Drivers" select RT_USING_PIN default y - config BSP_USING_UART1 - bool "Enable UART1" - select RT_USING_SERIAL + menuconfig BSP_USING_UART + bool "Enable UART" default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y - config BSP_USING_SPI1 - bool "Enable SPI1 BUS" + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default n + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n select RT_USING_SPI - default n - - config BSP_SPI_USING_DMA - bool "Enable SPI DMA support" - default n + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n + + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n + endif menuconfig BSP_USING_I2C1 bool "Enable I2C1 BUS (software simulation)" diff --git a/bsp/stm32/libraries/templates/stm32f7xx/rtconfig.h b/bsp/stm32/libraries/templates/stm32f7xx/rtconfig.h index f1dff62d4b..50eb442ed8 100644 --- a/bsp/stm32/libraries/templates/stm32f7xx/rtconfig.h +++ b/bsp/stm32/libraries/templates/stm32f7xx/rtconfig.h @@ -149,13 +149,8 @@ /* miscellaneous packages */ -/* sample package */ - /* samples: kernel and components samples */ - -/* example package: hello */ - #define SOC_FAMILY_STM32 #define SOC_SERIES_STM32F7 @@ -168,6 +163,7 @@ /* On-chip Peripheral Drivers */ #define BSP_USING_GPIO +#define BSP_USING_UART #define BSP_USING_UART1 /* Board extended module Drivers */ diff --git a/bsp/stm32/libraries/templates/stm32l4xx/.config b/bsp/stm32/libraries/templates/stm32l4xx/.config index 2ace5a3beb..e29aecd0c8 100644 --- a/bsp/stm32/libraries/templates/stm32l4xx/.config +++ b/bsp/stm32/libraries/templates/stm32l4xx/.config @@ -297,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 @@ -311,10 +312,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_ZLIB is not set # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set - -# -# sample package -# +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set # # samples: kernel and components samples @@ -323,11 +321,8 @@ 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_PKG_USING_VI is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32L4=y @@ -344,9 +339,10 @@ CONFIG_SOC_STM32L475VE=y # On-chip Peripheral Drivers # CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y CONFIG_BSP_USING_UART1=y -# CONFIG_BSP_USING_SPI1 is not set -# CONFIG_BSP_SPI_USING_DMA is not set +# CONFIG_BSP_UART1_RX_USING_DMA is not set +# CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_I2C1 is not set # diff --git a/bsp/stm32/libraries/templates/stm32l4xx/board/Kconfig b/bsp/stm32/libraries/templates/stm32l4xx/board/Kconfig index 5d0299fe3b..a06a967059 100644 --- a/bsp/stm32/libraries/templates/stm32l4xx/board/Kconfig +++ b/bsp/stm32/libraries/templates/stm32l4xx/board/Kconfig @@ -16,19 +16,41 @@ menu "On-chip Peripheral Drivers" select RT_USING_PIN default y - config BSP_USING_UART1 - bool "Enable UART1" - select RT_USING_SERIAL + menuconfig BSP_USING_UART + bool "Enable UART" default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y - config BSP_USING_SPI1 - bool "Enable SPI1 BUS" + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default n + endif + + menuconfig BSP_USING_SPI + bool "Enable SPI BUS" + default n select RT_USING_SPI - default n + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n - config BSP_SPI_USING_DMA - bool "Enable SPI DMA support" - default n + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n + endif menuconfig BSP_USING_I2C1 bool "Enable I2C1 BUS (software simulation)" diff --git a/bsp/stm32/libraries/templates/stm32l4xx/rtconfig.h b/bsp/stm32/libraries/templates/stm32l4xx/rtconfig.h index 512a1832ce..6ae4a7ba8a 100644 --- a/bsp/stm32/libraries/templates/stm32l4xx/rtconfig.h +++ b/bsp/stm32/libraries/templates/stm32l4xx/rtconfig.h @@ -149,13 +149,8 @@ /* miscellaneous packages */ -/* sample package */ - /* samples: kernel and components samples */ - -/* example package: hello */ - #define SOC_FAMILY_STM32 #define SOC_SERIES_STM32L4 @@ -168,6 +163,7 @@ /* On-chip Peripheral Drivers */ #define BSP_USING_GPIO +#define BSP_USING_UART #define BSP_USING_UART1 /* Board extended module Drivers */ diff --git a/bsp/stm32/stm32f091-st-nucleo/.config b/bsp/stm32/stm32f091-st-nucleo/.config index 3a0dbd8dc3..0fced6c38b 100644 --- a/bsp/stm32/stm32f091-st-nucleo/.config +++ b/bsp/stm32/stm32f091-st-nucleo/.config @@ -281,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 @@ -295,6 +296,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 @@ -309,10 +311,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_ZLIB is not set # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set - -# -# sample package -# +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set # # samples: kernel and components samples @@ -321,30 +320,8 @@ 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_PKG_USING_VI is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F0=y @@ -356,16 +333,24 @@ CONFIG_SOC_STM32F091RC=y # # Onboard Peripheral Drivers # +CONFIG_BSP_USING_USB_TO_USART=y # # On-chip Peripheral Drivers # CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y # CONFIG_BSP_USING_UART1 is not set CONFIG_BSP_USING_UART2=y -# CONFIG_BSP_USING_SPI1 is not set -# CONFIG_BSP_SPI_USING_DMA is not set +# CONFIG_BSP_UART2_RX_USING_DMA is not set +# CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_I2C1 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_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/stm32f091-st-nucleo/board/Kconfig b/bsp/stm32/stm32f091-st-nucleo/board/Kconfig index 681580fdce..745a331f31 100644 --- a/bsp/stm32/stm32f091-st-nucleo/board/Kconfig +++ b/bsp/stm32/stm32f091-st-nucleo/board/Kconfig @@ -34,7 +34,7 @@ menu "On-chip Peripheral Drivers" config BSP_UART1_RX_USING_DMA bool "Enable UART1 RX DMA" depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA - default y + default n config BSP_USING_UART2 bool "Enable UART2" diff --git a/bsp/stm32/stm32f091-st-nucleo/rtconfig.h b/bsp/stm32/stm32f091-st-nucleo/rtconfig.h index 818e2c9cef..dc6298a719 100644 --- a/bsp/stm32/stm32f091-st-nucleo/rtconfig.h +++ b/bsp/stm32/stm32f091-st-nucleo/rtconfig.h @@ -149,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_STM32F0 @@ -171,9 +160,12 @@ /* Onboard Peripheral Drivers */ +#define BSP_USING_USB_TO_USART + /* On-chip Peripheral Drivers */ #define BSP_USING_GPIO +#define BSP_USING_UART #define BSP_USING_UART2 /* Board extended module Drivers */ diff --git a/bsp/stm32/stm32f103-atk-nano/.config b/bsp/stm32/stm32f103-atk-nano/.config index 7a673ceb4d..7a4eec1ff9 100644 --- a/bsp/stm32/stm32f103-atk-nano/.config +++ b/bsp/stm32/stm32f103-atk-nano/.config @@ -312,6 +312,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_ZLIB is not set # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set # # samples: kernel and components samples @@ -321,6 +322,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_NETWORK_SAMPLES is not set # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set # CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F1=y @@ -341,14 +343,14 @@ CONFIG_BSP_USING_USB_TO_USART=y # On-chip Peripheral Drivers # CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y CONFIG_BSP_USING_UART1=y +# CONFIG_BSP_UART1_RX_USING_DMA is not set # CONFIG_BSP_USING_UART2 is not set # CONFIG_BSP_USING_UART3 is not set # CONFIG_BSP_USING_TIM is not set # CONFIG_BSP_USING_PWM 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_SPI is not set # CONFIG_BSP_USING_I2C1 is not set # CONFIG_BSP_USING_ADC is not set # CONFIG_BSP_USING_ON_CHIP_FLASH is not set diff --git a/bsp/stm32/stm32f103-atk-nano/board/Kconfig b/bsp/stm32/stm32f103-atk-nano/board/Kconfig index 84ef7224b6..3c49481a23 100644 --- a/bsp/stm32/stm32f103-atk-nano/board/Kconfig +++ b/bsp/stm32/stm32f103-atk-nano/board/Kconfig @@ -42,37 +42,37 @@ menu "On-chip Peripheral Drivers" default y menuconfig BSP_USING_UART - bool "Enable UART" - default y - select RT_USING_SERIAL - if BSP_USING_UART - config BSP_USING_UART1 - bool "Enable UART1" - default y + bool "Enable UART" + default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y - config BSP_UART1_RX_USING_DMA - bool "Enable UART1 RX DMA" - depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA - default n + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default n - config BSP_USING_UART2 - bool "Enable UART2" - default n + config BSP_USING_UART2 + bool "Enable UART2" + default n - config BSP_UART2_RX_USING_DMA - bool "Enable UART2 RX DMA" - depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA - default n - - config BSP_USING_UART3 - bool "Enable UART3" - default n + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + + config BSP_USING_UART3 + bool "Enable UART3" + default n - config BSP_UART3_RX_USING_DMA - bool "Enable UART3 RX DMA" - depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA - default n - endif + config BSP_UART3_RX_USING_DMA + bool "Enable UART3 RX DMA" + depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA + default n + endif config BSP_USING_UART1 bool "Enable UART1" @@ -127,40 +127,40 @@ menu "On-chip Peripheral Drivers" endif menuconfig BSP_USING_SPI - bool "Enable SPI BUS" - default n - select RT_USING_SPI - if BSP_USING_SPI - config BSP_USING_SPI1 - bool "Enable SPI1 BUS" - default n + bool "Enable SPI BUS" + default n + select RT_USING_SPI + if BSP_USING_SPI + config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n - config BSP_SPI1_TX_USING_DMA - bool "Enable SPI1 TX DMA" - depends on BSP_USING_SPI1 - default n - - config BSP_SPI1_RX_USING_DMA - bool "Enable SPI1 RX DMA" - depends on BSP_USING_SPI1 - select BSP_SPI1_TX_USING_DMA - default n + config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + + config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n - config BSP_USING_SPI2 - bool "Enable SPI2 BUS" - default n - - config BSP_SPI2_TX_USING_DMA - bool "Enable SPI2 TX DMA" - depends on BSP_USING_SPI2 - default n - - config BSP_SPI2_RX_USING_DMA - bool "Enable SPI2 RX DMA" - depends on BSP_USING_SPI2 - select BSP_SPI2_TX_USING_DMA - default n - endif + config BSP_USING_SPI2 + bool "Enable SPI2 BUS" + default n + + config BSP_SPI2_TX_USING_DMA + bool "Enable SPI2 TX DMA" + depends on BSP_USING_SPI2 + default n + + config BSP_SPI2_RX_USING_DMA + bool "Enable SPI2 RX DMA" + depends on BSP_USING_SPI2 + select BSP_SPI2_TX_USING_DMA + default n + endif menuconfig BSP_USING_I2C1 bool "Enable I2C1 BUS (software simulation)" diff --git a/bsp/stm32/stm32f103-atk-nano/rtconfig.h b/bsp/stm32/stm32f103-atk-nano/rtconfig.h index 8bae9ebc30..816034b45d 100644 --- a/bsp/stm32/stm32f103-atk-nano/rtconfig.h +++ b/bsp/stm32/stm32f103-atk-nano/rtconfig.h @@ -166,6 +166,7 @@ /* On-chip Peripheral Drivers */ #define BSP_USING_GPIO +#define BSP_USING_UART #define BSP_USING_UART1 /* Board extended module Drivers */ diff --git a/bsp/stm32/stm32f103-fire-arbitrary/.config b/bsp/stm32/stm32f103-fire-arbitrary/.config index 81ee04aba5..0938feaf7e 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/.config +++ b/bsp/stm32/stm32f103-fire-arbitrary/.config @@ -312,6 +312,7 @@ CONFIG_RT_USING_LIBC=y # CONFIG_PKG_USING_ZLIB is not set # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set # # samples: kernel and components samples @@ -321,6 +322,7 @@ CONFIG_RT_USING_LIBC=y # CONFIG_PKG_USING_NETWORK_SAMPLES is not set # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set # CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F1=y @@ -345,14 +347,13 @@ CONFIG_BSP_USING_USB_TO_USART=y # On-chip Peripheral Drivers # CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y CONFIG_BSP_USING_UART1=y +# CONFIG_BSP_UART1_RX_USING_DMA is not set # CONFIG_BSP_USING_UART2 is not set # CONFIG_BSP_USING_UART3 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_SPI is not set # CONFIG_BSP_USING_I2C1 is not set # CONFIG_BSP_USING_TIM is not set # CONFIG_BSP_USING_PWM is not set diff --git a/bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig b/bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig index 2795400969..983ce4bb86 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig +++ b/bsp/stm32/stm32f103-fire-arbitrary/board/Kconfig @@ -54,7 +54,6 @@ menu "Onboard Peripheral Drivers" select WIZNET_DEVICE_EXTERN_CONFIG select BSP_USING_SPI2 if BSP_USING_ETH - if WIZNET_DEVICE_EXTERN_CONFIG config WIZ_SPI_DEVICE string @@ -92,37 +91,37 @@ menu "On-chip Peripheral Drivers" default y menuconfig BSP_USING_UART - bool "Enable UART" - default y - select RT_USING_SERIAL - if BSP_USING_UART - config BSP_USING_UART1 - bool "Enable UART1" - default y + bool "Enable UART" + default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART1 + bool "Enable UART1" + default y - config BSP_UART1_RX_USING_DMA - bool "Enable UART1 RX DMA" - depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA - default n + config BSP_UART1_RX_USING_DMA + bool "Enable UART1 RX DMA" + depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA + default n - config BSP_USING_UART2 - bool "Enable UART2" - default n + config BSP_USING_UART2 + bool "Enable UART2" + default n - config BSP_UART2_RX_USING_DMA - bool "Enable UART2 RX DMA" - depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA - default n - - config BSP_USING_UART3 - bool "Enable UART3" - default n + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + + config BSP_USING_UART3 + bool "Enable UART3" + default n - config BSP_UART3_RX_USING_DMA - bool "Enable UART3 RX DMA" - depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA - default n - endif + config BSP_UART3_RX_USING_DMA + bool "Enable UART3 RX DMA" + depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA + default n + endif config BSP_USING_ON_CHIP_FLASH bool "Enable on-chip FLASH" diff --git a/bsp/stm32/stm32f103-fire-arbitrary/rtconfig.h b/bsp/stm32/stm32f103-fire-arbitrary/rtconfig.h index b26cc15cae..5a2ac1c53c 100644 --- a/bsp/stm32/stm32f103-fire-arbitrary/rtconfig.h +++ b/bsp/stm32/stm32f103-fire-arbitrary/rtconfig.h @@ -167,6 +167,7 @@ /* On-chip Peripheral Drivers */ #define BSP_USING_GPIO +#define BSP_USING_UART #define BSP_USING_UART1 /* Board extended module Drivers */ diff --git a/bsp/stm32/stm32f407-atk-explorer/.config b/bsp/stm32/stm32f407-atk-explorer/.config index 8bb6510a75..177d468704 100644 --- a/bsp/stm32/stm32f407-atk-explorer/.config +++ b/bsp/stm32/stm32f407-atk-explorer/.config @@ -312,6 +312,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_ZLIB is not set # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set # # samples: kernel and components samples @@ -321,6 +322,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_NETWORK_SAMPLES is not set # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set # CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F4=y @@ -333,8 +335,9 @@ CONFIG_SOC_STM32F407ZG=y # Onboard Peripheral Drivers # CONFIG_BSP_USING_USB_TO_USART=y -# CONFIG_BSP_USING_SPI_FLASH is not set +# CONFIG_BSP_USING_COM2 is not set # CONFIG_BSP_USING_COM3 is not set +# CONFIG_BSP_USING_SPI_FLASH is not set # CONFIG_BSP_USING_EEPROM is not set # CONFIG_BSP_USING_ETH is not set # CONFIG_BSP_USING_MPU6050 is not set @@ -344,16 +347,14 @@ CONFIG_BSP_USING_USB_TO_USART=y # On-chip Peripheral Drivers # CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y CONFIG_BSP_USING_UART1=y -# CONFIG_BSP_USING_UART2 is not set +# CONFIG_BSP_UART1_RX_USING_DMA 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_PWM 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_SPI 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 diff --git a/bsp/stm32/stm32f407-atk-explorer/board/Kconfig b/bsp/stm32/stm32f407-atk-explorer/board/Kconfig index 41ce192f9e..66d7cf8d0f 100644 --- a/bsp/stm32/stm32f407-atk-explorer/board/Kconfig +++ b/bsp/stm32/stm32f407-atk-explorer/board/Kconfig @@ -81,7 +81,7 @@ menu "On-chip Peripheral Drivers" config BSP_UART1_RX_USING_DMA bool "Enable UART1 RX DMA" depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA - default y + default n config BSP_USING_UART3 bool "Enable UART3" diff --git a/bsp/stm32/stm32f407-atk-explorer/rtconfig.h b/bsp/stm32/stm32f407-atk-explorer/rtconfig.h index e628397b54..d35ad8f997 100644 --- a/bsp/stm32/stm32f407-atk-explorer/rtconfig.h +++ b/bsp/stm32/stm32f407-atk-explorer/rtconfig.h @@ -165,6 +165,7 @@ /* On-chip Peripheral Drivers */ #define BSP_USING_GPIO +#define BSP_USING_UART #define BSP_USING_UART1 /* Board extended module Drivers */ diff --git a/bsp/stm32/stm32f407-st-discovery/.config b/bsp/stm32/stm32f407-st-discovery/.config index 0755a2d357..855a959166 100644 --- a/bsp/stm32/stm32f407-st-discovery/.config +++ b/bsp/stm32/stm32f407-st-discovery/.config @@ -312,6 +312,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_ZLIB is not set # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set # # samples: kernel and components samples @@ -321,6 +322,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_NETWORK_SAMPLES is not set # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set # CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F4=y @@ -337,10 +339,10 @@ CONFIG_SOC_STM32F407VG=y # On-chip Peripheral Drivers # CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=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_UART1_RX_USING_DMA is not set +# CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_I2C1 is not set # diff --git a/bsp/stm32/stm32f407-st-discovery/board/Kconfig b/bsp/stm32/stm32f407-st-discovery/board/Kconfig index 1f5bcd321d..cdb1f1ff48 100644 --- a/bsp/stm32/stm32f407-st-discovery/board/Kconfig +++ b/bsp/stm32/stm32f407-st-discovery/board/Kconfig @@ -28,7 +28,7 @@ menu "On-chip Peripheral Drivers" config BSP_UART1_RX_USING_DMA bool "Enable UART1 RX DMA" depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA - default y + default n endif menuconfig BSP_USING_SPI diff --git a/bsp/stm32/stm32f407-st-discovery/rtconfig.h b/bsp/stm32/stm32f407-st-discovery/rtconfig.h index a7d941bd2b..41e6ddedbd 100644 --- a/bsp/stm32/stm32f407-st-discovery/rtconfig.h +++ b/bsp/stm32/stm32f407-st-discovery/rtconfig.h @@ -163,6 +163,7 @@ /* On-chip Peripheral Drivers */ #define BSP_USING_GPIO +#define BSP_USING_UART #define BSP_USING_UART1 /* Board extended module Drivers */ diff --git a/bsp/stm32/stm32f429-armfly-v6/.config b/bsp/stm32/stm32f429-armfly-v6/.config index 8615848ef0..e3045b305e 100644 --- a/bsp/stm32/stm32f429-armfly-v6/.config +++ b/bsp/stm32/stm32f429-armfly-v6/.config @@ -282,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 @@ -296,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 @@ -310,10 +312,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_ZLIB is not set # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set - -# -# sample package -# +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set # # samples: kernel and components samples @@ -322,30 +321,8 @@ 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_PKG_USING_VI is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F4=y @@ -369,11 +346,11 @@ CONFIG_BSP_USING_EXT_FMC_IO=y # On-chip Peripheral Drivers # CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y CONFIG_BSP_USING_UART1=y -# CONFIG_BSP_UART_USING_DMA_RX is not set +# CONFIG_BSP_UART1_RX_USING_DMA is not set # CONFIG_BSP_USING_ON_CHIP_FLASH is not set -# CONFIG_BSP_USING_SPI3 is not set -# CONFIG_BSP_SPI_USING_DMA is not set +# CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_I2C1 is not set # CONFIG_BSP_USING_TIM is not set # CONFIG_BSP_USING_PWM is not set diff --git a/bsp/stm32/stm32f429-armfly-v6/board/Kconfig b/bsp/stm32/stm32f429-armfly-v6/board/Kconfig index 498495e8d9..ae6e2de2fd 100644 --- a/bsp/stm32/stm32f429-armfly-v6/board/Kconfig +++ b/bsp/stm32/stm32f429-armfly-v6/board/Kconfig @@ -39,11 +39,23 @@ menu "Onboard Peripheral Drivers" config PHY_USING_DM9161CEP bool - config BSP_USING_ETH + + + menuconfig BSP_USING_ETH bool "Enable Ethernet" - default n select RT_USING_LWIP select PHY_USING_DM9161CEP + default n + if BSP_USING_ETH + config PHY_USING_INTERRUPT_MODE + bool "enable phy interrupt mode" + select PHY_INT_PIN + default n + + config PHY_INT_PIN + int + default 118 + endif config BSP_USING_MPU6050 bool "Enable MPU6050(i2c1)" @@ -74,7 +86,7 @@ menu "On-chip Peripheral Drivers" config BSP_UART1_RX_USING_DMA bool "Enable UART1 RX DMA" depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA - default y + default n endif config BSP_USING_ON_CHIP_FLASH diff --git a/bsp/stm32/stm32f429-armfly-v6/rtconfig.h b/bsp/stm32/stm32f429-armfly-v6/rtconfig.h index 11ecaf3496..eb2f4e408c 100644 --- a/bsp/stm32/stm32f429-armfly-v6/rtconfig.h +++ b/bsp/stm32/stm32f429-armfly-v6/rtconfig.h @@ -150,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 @@ -178,6 +167,7 @@ /* On-chip Peripheral Drivers */ #define BSP_USING_GPIO +#define BSP_USING_UART #define BSP_USING_UART1 /* Board extended module Drivers */ diff --git a/bsp/stm32/stm32f429-atk-apollo/.config b/bsp/stm32/stm32f429-atk-apollo/.config index e382919ed4..90c7572d90 100644 --- a/bsp/stm32/stm32f429-atk-apollo/.config +++ b/bsp/stm32/stm32f429-atk-apollo/.config @@ -312,6 +312,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_ZLIB is not set # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set # # samples: kernel and components samples @@ -321,6 +322,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_NETWORK_SAMPLES is not set # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set # CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F4=y @@ -345,14 +347,13 @@ CONFIG_BSP_USING_USB_TO_USART=y # On-chip Peripheral Drivers # CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y CONFIG_BSP_USING_UART1=y +# CONFIG_BSP_UART1_RX_USING_DMA is not set # CONFIG_BSP_USING_UART2 is not set # CONFIG_BSP_USING_UART3 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_SPI is not set # CONFIG_BSP_USING_I2C1 is not set # CONFIG_BSP_USING_TIM is not set # CONFIG_BSP_USING_PWM is not set diff --git a/bsp/stm32/stm32f429-atk-apollo/board/Kconfig b/bsp/stm32/stm32f429-atk-apollo/board/Kconfig index c8529ead4f..916e0844a4 100644 --- a/bsp/stm32/stm32f429-atk-apollo/board/Kconfig +++ b/bsp/stm32/stm32f429-atk-apollo/board/Kconfig @@ -81,7 +81,7 @@ menu "On-chip Peripheral Drivers" config BSP_UART1_RX_USING_DMA bool "Enable UART1 RX DMA" depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA - default y + default n config BSP_USING_UART2 bool "Enable UART2" diff --git a/bsp/stm32/stm32f429-atk-apollo/rtconfig.h b/bsp/stm32/stm32f429-atk-apollo/rtconfig.h index f3f451258a..bcf153da33 100644 --- a/bsp/stm32/stm32f429-atk-apollo/rtconfig.h +++ b/bsp/stm32/stm32f429-atk-apollo/rtconfig.h @@ -165,6 +165,7 @@ /* On-chip Peripheral Drivers */ #define BSP_USING_GPIO +#define BSP_USING_UART #define BSP_USING_UART1 /* Board extended module Drivers */ diff --git a/bsp/stm32/stm32f429-fire-challenger/.config b/bsp/stm32/stm32f429-fire-challenger/.config index 81eb948fb4..c12660c8fe 100644 --- a/bsp/stm32/stm32f429-fire-challenger/.config +++ b/bsp/stm32/stm32f429-fire-challenger/.config @@ -312,6 +312,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_ZLIB is not set # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set # # samples: kernel and components samples @@ -321,6 +322,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_NETWORK_SAMPLES is not set # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set # CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F4=y @@ -346,14 +348,12 @@ CONFIG_BSP_USING_USB_TO_USART=y # On-chip Peripheral Drivers # CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y CONFIG_BSP_USING_UART1=y +# CONFIG_BSP_UART1_RX_USING_DMA is not set # CONFIG_BSP_USING_UART2 is not set -# CONFIG_BSP_USING_UART3 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_SPI is not set # CONFIG_BSP_USING_TIM is not set # CONFIG_BSP_USING_PWM is not set # CONFIG_BSP_USING_ADC is not set diff --git a/bsp/stm32/stm32f429-fire-challenger/board/Kconfig b/bsp/stm32/stm32f429-fire-challenger/board/Kconfig index 2c8d3f10cf..252f188c27 100644 --- a/bsp/stm32/stm32f429-fire-challenger/board/Kconfig +++ b/bsp/stm32/stm32f429-fire-challenger/board/Kconfig @@ -15,7 +15,7 @@ menu "Onboard Peripheral Drivers" config BSP_USING_RS232 bool "Enable RS232" - select BSP_USING_UART + select BSP_USING_UART select BSP_USING_UART2 default n @@ -91,7 +91,7 @@ menu "On-chip Peripheral Drivers" config BSP_UART1_RX_USING_DMA bool "Enable UART1 RX DMA" depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA - default y + default n config BSP_USING_UART2 bool "Enable UART2" @@ -101,7 +101,6 @@ menu "On-chip Peripheral Drivers" bool "Enable UART2 RX DMA" depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA default n - endif config BSP_USING_ON_CHIP_FLASH diff --git a/bsp/stm32/stm32f429-fire-challenger/rtconfig.h b/bsp/stm32/stm32f429-fire-challenger/rtconfig.h index 83dbf4c0d3..7e366cf856 100644 --- a/bsp/stm32/stm32f429-fire-challenger/rtconfig.h +++ b/bsp/stm32/stm32f429-fire-challenger/rtconfig.h @@ -166,6 +166,7 @@ /* On-chip Peripheral Drivers */ #define BSP_USING_GPIO +#define BSP_USING_UART #define BSP_USING_UART1 /* Board extended module Drivers */ diff --git a/bsp/stm32/stm32f767-atk-apollo/.config b/bsp/stm32/stm32f767-atk-apollo/.config index 0e7b661c84..46bbff3a82 100644 --- a/bsp/stm32/stm32f767-atk-apollo/.config +++ b/bsp/stm32/stm32f767-atk-apollo/.config @@ -312,6 +312,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_ZLIB is not set # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set # # samples: kernel and components samples @@ -321,6 +322,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_NETWORK_SAMPLES is not set # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set # CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F7=y @@ -336,28 +338,31 @@ CONFIG_BSP_USING_USB_TO_USART=y # CONFIG_BSP_USING_RS232 is not set # CONFIG_BSP_USING_SDRAM is not set # CONFIG_BSP_USING_QSPI_FLASH is not set -# CONFIG_BSP_USING_MPU6050 is not set +# CONFIG_BSP_USING_MPU9250 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 # CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y CONFIG_BSP_USING_UART1=y +# CONFIG_BSP_UART1_RX_USING_DMA is not set # CONFIG_BSP_USING_UART2 is not set -# CONFIG_BSP_USING_UART3 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_SPI is not set # CONFIG_BSP_USING_QSPI is not set +# CONFIG_BSP_QSPI_USING_DMA 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_I2C1 is not set # CONFIG_BSP_USING_I2C2 is not set -# CONFIG_BSP_USING_I2C3 is not set -# CONFIG_BSP_USING_I2C4 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/stm32f767-atk-apollo/board/Kconfig b/bsp/stm32/stm32f767-atk-apollo/board/Kconfig index e87dbd896a..7d1273b33f 100644 --- a/bsp/stm32/stm32f767-atk-apollo/board/Kconfig +++ b/bsp/stm32/stm32f767-atk-apollo/board/Kconfig @@ -81,7 +81,7 @@ menu "On-chip Peripheral Drivers" config BSP_UART1_RX_USING_DMA bool "Enable UART1 RX DMA" depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA - default y + default n config BSP_USING_UART2 bool "Enable UART2" @@ -98,7 +98,7 @@ menu "On-chip Peripheral Drivers" bool "Enable on-chip FLASH" default n -menuconfig BSP_USING_SPI + menuconfig BSP_USING_SPI bool "Enable SPI BUS" default n select RT_USING_SPI diff --git a/bsp/stm32/stm32f767-atk-apollo/rtconfig.h b/bsp/stm32/stm32f767-atk-apollo/rtconfig.h index 7623c3fda4..23599ade59 100644 --- a/bsp/stm32/stm32f767-atk-apollo/rtconfig.h +++ b/bsp/stm32/stm32f767-atk-apollo/rtconfig.h @@ -165,6 +165,7 @@ /* On-chip Peripheral Drivers */ #define BSP_USING_GPIO +#define BSP_USING_UART #define BSP_USING_UART1 /* Board extended module Drivers */ diff --git a/bsp/stm32/stm32f767-fire-challenger/.config b/bsp/stm32/stm32f767-fire-challenger/.config index 90f3a7719a..7d506e7350 100644 --- a/bsp/stm32/stm32f767-fire-challenger/.config +++ b/bsp/stm32/stm32f767-fire-challenger/.config @@ -181,6 +181,7 @@ 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 @@ -311,6 +312,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_ZLIB is not set # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set # # samples: kernel and components samples @@ -320,6 +322,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_NETWORK_SAMPLES is not set # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set # CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32F7=y @@ -341,21 +344,15 @@ CONFIG_BSP_USING_USB_TO_USART=y # On-chip Peripheral Drivers # CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=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_USING_SPI5 is not set -# CONFIG_BSP_SPI_USING_DMA is not set +# CONFIG_BSP_USING_SPI is not set # CONFIG_BSP_USING_QSPI is not set # CONFIG_BSP_USING_ADC 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_I2C4 is not set # CONFIG_BSP_USING_ONCHIP_RTC is not set # CONFIG_BSP_USING_WDT is not set diff --git a/bsp/stm32/stm32f767-fire-challenger/board/Kconfig b/bsp/stm32/stm32f767-fire-challenger/board/Kconfig index 2423430d38..707a0a4746 100644 --- a/bsp/stm32/stm32f767-fire-challenger/board/Kconfig +++ b/bsp/stm32/stm32f767-fire-challenger/board/Kconfig @@ -57,7 +57,7 @@ menu "On-chip Peripheral Drivers" config BSP_UART1_RX_USING_DMA bool "Enable UART1 RX DMA" depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA - default y + default n config BSP_USING_UART2 bool "Enable UART2" @@ -74,7 +74,7 @@ menu "On-chip Peripheral Drivers" config BSP_UART3_RX_USING_DMA bool "Enable UART3 RX DMA" - depends on BSP_USING_UART3 && RT_SERIsAL_USING_DMA + depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA default n endif diff --git a/bsp/stm32/stm32f767-fire-challenger/rtconfig.h b/bsp/stm32/stm32f767-fire-challenger/rtconfig.h index d001b714a7..16f05af945 100644 --- a/bsp/stm32/stm32f767-fire-challenger/rtconfig.h +++ b/bsp/stm32/stm32f767-fire-challenger/rtconfig.h @@ -165,6 +165,7 @@ /* On-chip Peripheral Drivers */ #define BSP_USING_GPIO +#define BSP_USING_UART #define BSP_USING_UART1 /* Board extended module Drivers */ diff --git a/bsp/stm32/stm32l475-atk-pandora/.config b/bsp/stm32/stm32l475-atk-pandora/.config index 5212663f43..630083f09c 100644 --- a/bsp/stm32/stm32l475-atk-pandora/.config +++ b/bsp/stm32/stm32l475-atk-pandora/.config @@ -312,6 +312,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_ZLIB is not set # CONFIG_PKG_USING_DSTR is not set # CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set # # samples: kernel and components samples @@ -321,6 +322,7 @@ CONFIG_RT_USING_PIN=y # CONFIG_PKG_USING_NETWORK_SAMPLES is not set # CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set # CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set CONFIG_SOC_FAMILY_STM32=y CONFIG_SOC_SERIES_STM32L4=y @@ -340,12 +342,12 @@ CONFIG_BSP_USING_STLINK_TO_USART=y # On-chip Peripheral Drivers # CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y CONFIG_BSP_USING_UART1=y +# CONFIG_BSP_UART1_RX_USING_DMA is not set # CONFIG_BSP_USING_UART2 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_SPI 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 diff --git a/bsp/stm32/stm32l475-atk-pandora/board/Kconfig b/bsp/stm32/stm32l475-atk-pandora/board/Kconfig index 538cf8d472..0ec5631f1a 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/Kconfig +++ b/bsp/stm32/stm32l475-atk-pandora/board/Kconfig @@ -24,7 +24,6 @@ menu "Onboard Peripheral Drivers" bool "Enable SDCARD (spi1)" select BSP_USING_SPI select BSP_USING_SPI1 - select BSP_SPI_USING_DMA select RT_USING_SPI_MSD select RT_USING_DFS select RT_USING_DFS_ELMFAT @@ -51,7 +50,7 @@ menu "On-chip Peripheral Drivers" config BSP_UART1_RX_USING_DMA bool "Enable UART1 RX DMA" depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA - default y + default n config BSP_USING_UART2 bool "Enable UART2" diff --git a/bsp/stm32/stm32l475-atk-pandora/rtconfig.h b/bsp/stm32/stm32l475-atk-pandora/rtconfig.h index 82891ef0a0..f138878738 100644 --- a/bsp/stm32/stm32l475-atk-pandora/rtconfig.h +++ b/bsp/stm32/stm32l475-atk-pandora/rtconfig.h @@ -165,6 +165,7 @@ /* On-chip Peripheral Drivers */ #define BSP_USING_GPIO +#define BSP_USING_UART #define BSP_USING_UART1 /* Board extended module Drivers */ From bad889140b9ec4a6bb6a57529a4af7f4d257ea4c Mon Sep 17 00:00:00 2001 From: SummerGift Date: Tue, 8 Jan 2019 14:10:04 +0800 Subject: [PATCH 08/15] [bsp][stm32] fix bug in f7 bsp template --- .../libraries/templates/stm32f7xx/SConstruct | 2 +- .../templates/stm32f7xx/project.uvoptx | 1367 ++++++++++++++++- .../templates/stm32f7xx/project.uvprojx | 342 +---- .../templates/stm32f7xx/template.uvoptx | 10 +- .../templates/stm32f7xx/template.uvprojx | 44 +- 5 files changed, 1462 insertions(+), 303 deletions(-) diff --git a/bsp/stm32/libraries/templates/stm32f7xx/SConstruct b/bsp/stm32/libraries/templates/stm32f7xx/SConstruct index f9b3d33a62..51333e0a9c 100644 --- a/bsp/stm32/libraries/templates/stm32f7xx/SConstruct +++ b/bsp/stm32/libraries/templates/stm32f7xx/SConstruct @@ -38,7 +38,7 @@ objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) SDK_ROOT = os.path.abspath('./') # include drivers -objs.extend(SConscript(os.path.dirname(SDK_ROOT) + '/libraries/STM32F4xx_HAL/SConscript')) +objs.extend(SConscript(os.path.dirname(SDK_ROOT) + '/libraries/STM32F7xx_HAL/SConscript')) # include libraries objs.extend(SConscript(os.path.dirname(SDK_ROOT) + '/libraries/HAL_Drivers/SConscript')) diff --git a/bsp/stm32/libraries/templates/stm32f7xx/project.uvoptx b/bsp/stm32/libraries/templates/stm32f7xx/project.uvoptx index f8c4606a9e..3287c02122 100644 --- a/bsp/stm32/libraries/templates/stm32f7xx/project.uvoptx +++ b/bsp/stm32/libraries/templates/stm32f7xx/project.uvoptx @@ -119,13 +119,13 @@ 0 - JL2CM3 - -U30000299 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM) + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20020000 -FF0STM32F7x_1024 -FL0100000 -FS08000000 -FP0($$Device:STM32F767BGTx$CMSIS\Flash\STM32F7x_1024.FLM) 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) + JL2CM3 + -U30000299 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F7x_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F767BGTx$CMSIS\Flash\STM32F7x_1024.FLM) @@ -173,6 +173,7 @@ 1 + 0 0 2 10000000 @@ -181,11 +182,1367 @@ - Source Group 1 + Applications 0 0 0 0 + + 1 + 1 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + board\CubeMX_Config\Src\stm32f4xx_hal_msp.c + stm32f4xx_hal_msp.c + 0 + 0 + + + 2 + 4 + 2 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm\startup_stm32f407xx.s + startup_stm32f407xx.s + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_common.c + drv_common.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 3 + 8 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 3 + 9 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler.c + scheduler.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\src\signal.c + signal.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + CORTEX-M4 + 0 + 0 + 0 + 0 + + 4 + 22 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + 4 + 23 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + 4 + 24 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\backtrace.c + backtrace.c + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 5 + 27 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 5 + 28 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + 5 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\completion.c + completion.c + 0 + 0 + + + 5 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\dataqueue.c + dataqueue.c + 0 + 0 + + + 5 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\pipe.c + pipe.c + 0 + 0 + + + 5 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 5 + 34 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\waitqueue.c + waitqueue.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\workqueue.c + workqueue.c + 0 + 0 + + + + + finsh + 0 + 0 + 0 + 0 + + 6 + 36 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 37 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\symbol.c + symbol.c + 0 + 0 + + + 6 + 38 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 6 + 39 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 40 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_cmd.c + msh_cmd.c + 0 + 0 + + + 6 + 41 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_file.c + msh_file.c + 0 + 0 + + + + + STM32_HAL + 0 + 0 + 0 + 0 + + 7 + 42 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c + system_stm32f4xx.c + 0 + 0 + + + 7 + 43 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c + stm32f4xx_hal.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc.c + stm32f4xx_hal_adc.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc_ex.c + stm32f4xx_hal_adc_ex.c + 0 + 0 + + + 7 + 46 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_can.c + stm32f4xx_hal_can.c + 0 + 0 + + + 7 + 47 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cec.c + stm32f4xx_hal_cec.c + 0 + 0 + + + 7 + 48 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c + stm32f4xx_hal_cortex.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_crc.c + stm32f4xx_hal_crc.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp.c + stm32f4xx_hal_cryp.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp_ex.c + stm32f4xx_hal_cryp_ex.c + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dac.c + stm32f4xx_hal_dac.c + 0 + 0 + + + 7 + 53 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dac_ex.c + stm32f4xx_hal_dac_ex.c + 0 + 0 + + + 7 + 54 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dcmi.c + stm32f4xx_hal_dcmi.c + 0 + 0 + + + 7 + 55 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dcmi_ex.c + stm32f4xx_hal_dcmi_ex.c + 0 + 0 + + + 7 + 56 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dfsdm.c + stm32f4xx_hal_dfsdm.c + 0 + 0 + + + 7 + 57 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c + stm32f4xx_hal_dma.c + 0 + 0 + + + 7 + 58 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma2d.c + stm32f4xx_hal_dma2d.c + 0 + 0 + + + 7 + 59 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c + stm32f4xx_hal_dma_ex.c + 0 + 0 + + + 7 + 60 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dsi.c + stm32f4xx_hal_dsi.c + 0 + 0 + + + 7 + 61 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_eth.c + stm32f4xx_hal_eth.c + 0 + 0 + + + 7 + 62 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash.c + stm32f4xx_hal_flash.c + 0 + 0 + + + 7 + 63 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ex.c + stm32f4xx_hal_flash_ex.c + 0 + 0 + + + 7 + 64 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ramfunc.c + stm32f4xx_hal_flash_ramfunc.c + 0 + 0 + + + 7 + 65 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_fmpi2c.c + stm32f4xx_hal_fmpi2c.c + 0 + 0 + + + 7 + 66 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_fmpi2c_ex.c + stm32f4xx_hal_fmpi2c_ex.c + 0 + 0 + + + 7 + 67 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c + stm32f4xx_hal_gpio.c + 0 + 0 + + + 7 + 68 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_hash.c + stm32f4xx_hal_hash.c + 0 + 0 + + + 7 + 69 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_hash_ex.c + stm32f4xx_hal_hash_ex.c + 0 + 0 + + + 7 + 70 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_hcd.c + stm32f4xx_hal_hcd.c + 0 + 0 + + + 7 + 71 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c.c + stm32f4xx_hal_i2c.c + 0 + 0 + + + 7 + 72 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c_ex.c + stm32f4xx_hal_i2c_ex.c + 0 + 0 + + + 7 + 73 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2s.c + stm32f4xx_hal_i2s.c + 0 + 0 + + + 7 + 74 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2s_ex.c + stm32f4xx_hal_i2s_ex.c + 0 + 0 + + + 7 + 75 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_irda.c + stm32f4xx_hal_irda.c + 0 + 0 + + + 7 + 76 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_iwdg.c + stm32f4xx_hal_iwdg.c + 0 + 0 + + + 7 + 77 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_lptim.c + stm32f4xx_hal_lptim.c + 0 + 0 + + + 7 + 78 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_ltdc.c + stm32f4xx_hal_ltdc.c + 0 + 0 + + + 7 + 79 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_ltdc_ex.c + stm32f4xx_hal_ltdc_ex.c + 0 + 0 + + + 7 + 80 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_nand.c + stm32f4xx_hal_nand.c + 0 + 0 + + + 7 + 81 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_nor.c + stm32f4xx_hal_nor.c + 0 + 0 + + + 7 + 82 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pccard.c + stm32f4xx_hal_pccard.c + 0 + 0 + + + 7 + 83 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd.c + stm32f4xx_hal_pcd.c + 0 + 0 + + + 7 + 84 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd_ex.c + stm32f4xx_hal_pcd_ex.c + 0 + 0 + + + 7 + 85 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c + stm32f4xx_hal_pwr.c + 0 + 0 + + + 7 + 86 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c + stm32f4xx_hal_pwr_ex.c + 0 + 0 + + + 7 + 87 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_qspi.c + stm32f4xx_hal_qspi.c + 0 + 0 + + + 7 + 88 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c + stm32f4xx_hal_rcc.c + 0 + 0 + + + 7 + 89 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c + stm32f4xx_hal_rcc_ex.c + 0 + 0 + + + 7 + 90 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rng.c + stm32f4xx_hal_rng.c + 0 + 0 + + + 7 + 91 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rtc.c + stm32f4xx_hal_rtc.c + 0 + 0 + + + 7 + 92 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rtc_ex.c + stm32f4xx_hal_rtc_ex.c + 0 + 0 + + + 7 + 93 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sai.c + stm32f4xx_hal_sai.c + 0 + 0 + + + 7 + 94 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sai_ex.c + stm32f4xx_hal_sai_ex.c + 0 + 0 + + + 7 + 95 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sd.c + stm32f4xx_hal_sd.c + 0 + 0 + + + 7 + 96 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sdram.c + stm32f4xx_hal_sdram.c + 0 + 0 + + + 7 + 97 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_smartcard.c + stm32f4xx_hal_smartcard.c + 0 + 0 + + + 7 + 98 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_spdifrx.c + stm32f4xx_hal_spdifrx.c + 0 + 0 + + + 7 + 99 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_spi.c + stm32f4xx_hal_spi.c + 0 + 0 + + + 7 + 100 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sram.c + stm32f4xx_hal_sram.c + 0 + 0 + + + 7 + 101 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim.c + stm32f4xx_hal_tim.c + 0 + 0 + + + 7 + 102 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim_ex.c + stm32f4xx_hal_tim_ex.c + 0 + 0 + + + 7 + 103 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c + stm32f4xx_hal_uart.c + 0 + 0 + + + 7 + 104 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_usart.c + stm32f4xx_hal_usart.c + 0 + 0 + + + 7 + 105 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_wwdg.c + stm32f4xx_hal_wwdg.c + 0 + 0 + + + 7 + 106 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_fmc.c + stm32f4xx_ll_fmc.c + 0 + 0 + + + 7 + 107 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_fsmc.c + stm32f4xx_ll_fsmc.c + 0 + 0 + + + 7 + 108 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_sdmmc.c + stm32f4xx_ll_sdmmc.c + 0 + 0 + + + 7 + 109 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_usb.c + stm32f4xx_ll_usb.c + 0 + 0 + diff --git a/bsp/stm32/libraries/templates/stm32f7xx/project.uvprojx b/bsp/stm32/libraries/templates/stm32f7xx/project.uvprojx index 88c46860e7..ffd8f012ec 100644 --- a/bsp/stm32/libraries/templates/stm32f7xx/project.uvprojx +++ b/bsp/stm32/libraries/templates/stm32f7xx/project.uvprojx @@ -1,7 +1,10 @@ + 2.1 +
### uVision Project, (C) Keil Software
+ rt-thread @@ -11,33 +14,33 @@ 0 - STM32F407ZGTx + STM32F767BGTx STMicroelectronics - Keil.STM32F4xx_DFP.2.11.0 + Keil.STM32F7xx_DFP.2.9.0 http://www.keil.com/pack - IRAM(0x20000000,0x20000) IRAM2(0x10000000,0x10000) IROM(0x08000000,0x100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) + IRAM(0x20020000,0x60000) IRAM2(0x20000000,0x20000) IROM(0x08000000,0x100000) IROM2(0x00200000,0x100000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20020000 -FC1000 -FN1 -FF0STM32F7x_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F767BGTx$CMSIS\Flash\STM32F7x_1024.FLM)) 0 - $$Device:STM32F407ZGTx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h - - - - - - - - - - $$Device:STM32F407ZGTx$CMSIS\SVD\STM32F40x.svd + $$Device:STM32F767BGTx$Drivers\CMSIS\Device\ST\STM32F7xx\Include\stm32f7xx.h + + + + + + + + + + $$Device:STM32F767BGTx$CMSIS\SVD\STM32F7x7_v1r2.svd 0 0 - - - - - + + + + + 0 0 @@ -59,8 +62,8 @@ 0 0 - - + + 0 0 0 @@ -69,8 +72,8 @@ 0 0 - - + + 0 0 0 @@ -80,14 +83,14 @@ 1 0 fromelf --bin !L --output rtthread.bin - + 0 0 0 0 0 - + 0 @@ -101,19 +104,19 @@ 0 0 3 - - + + 1 SARMCM3.DLL -REMAP -MPU DCM.DLL - -pCM4 + -pCM7 SARMCM3.DLL -MPU TCM.DLL - -pCM4 + -pCM7 @@ -135,11 +138,11 @@ 1 BIN\UL2CM3.DLL - "" () - - - - + + + + + 0 @@ -171,8 +174,8 @@ 1 0 0 - "Cortex-M4" - + "Cortex-M7" + 0 0 0 @@ -180,15 +183,16 @@ 1 0 0 - 2 + 3 + 0 1 - 0 + 1 8 0 0 0 0 - 3 + 4 4 0 0 @@ -205,7 +209,7 @@ 0 0 0 - 0 + 1 1 @@ -240,8 +244,8 @@ 0 - 0x20000000 - 0x20000 + 0x20020000 + 0x60000 1 @@ -275,8 +279,8 @@ 1 - 0x0 - 0x0 + 0x200000 + 0x100000 0 @@ -295,16 +299,16 @@ 0 - 0x20000000 - 0x20000 + 0x20020000 + 0x60000 0 - 0x10000000 - 0x10000 + 0x20000000 + 0x20000 - + 1 @@ -331,9 +335,9 @@ 0 0 - + USE_HAL_DRIVER, STM32F407xx - + 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\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Inc;..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Include;..\libraries\STM32F4xx_HAL\CMSIS\Include @@ -349,10 +353,10 @@ 0 0 - - - - + + + + @@ -364,13 +368,13 @@ 0 0x08000000 0x20000000 - + .\board\linker_scripts\link.sct - - + + --keep *.o(.rti_fn.*) --keep *.o(FSymTab) - - + + @@ -393,36 +397,26 @@ 1 board\board.c - - stm32f4xx_hal_msp.c 1 board\CubeMX_Config\Src\stm32f4xx_hal_msp.c - - startup_stm32f407xx.s 2 ..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm\startup_stm32f407xx.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 @@ -438,92 +432,66 @@ 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 @@ -539,29 +507,21 @@ 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 @@ -577,57 +537,41 @@ 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 @@ -643,36 +587,26 @@ 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 @@ -688,470 +622,336 @@ 1 ..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c - - stm32f4xx_hal.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c - - stm32f4xx_hal_adc.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc.c - - stm32f4xx_hal_adc_ex.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_adc_ex.c - - stm32f4xx_hal_can.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_can.c - - stm32f4xx_hal_cec.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cec.c - - stm32f4xx_hal_cortex.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c - - stm32f4xx_hal_crc.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_crc.c - - stm32f4xx_hal_cryp.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp.c - - stm32f4xx_hal_cryp_ex.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp_ex.c - - stm32f4xx_hal_dac.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dac.c - - stm32f4xx_hal_dac_ex.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dac_ex.c - - stm32f4xx_hal_dcmi.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dcmi.c - - stm32f4xx_hal_dcmi_ex.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dcmi_ex.c - - stm32f4xx_hal_dfsdm.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dfsdm.c - - stm32f4xx_hal_dma.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c - - stm32f4xx_hal_dma2d.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma2d.c - - stm32f4xx_hal_dma_ex.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c - - stm32f4xx_hal_dsi.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dsi.c - - stm32f4xx_hal_eth.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_eth.c - - stm32f4xx_hal_flash.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash.c - - stm32f4xx_hal_flash_ex.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ex.c - - stm32f4xx_hal_flash_ramfunc.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_flash_ramfunc.c - - stm32f4xx_hal_fmpi2c.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_fmpi2c.c - - stm32f4xx_hal_fmpi2c_ex.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_fmpi2c_ex.c - - stm32f4xx_hal_gpio.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c - - stm32f4xx_hal_hash.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_hash.c - - stm32f4xx_hal_hash_ex.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_hash_ex.c - - stm32f4xx_hal_hcd.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_hcd.c - - stm32f4xx_hal_i2c.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c.c - - stm32f4xx_hal_i2c_ex.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2c_ex.c - - stm32f4xx_hal_i2s.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2s.c - - stm32f4xx_hal_i2s_ex.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_i2s_ex.c - - stm32f4xx_hal_irda.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_irda.c - - stm32f4xx_hal_iwdg.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_iwdg.c - - stm32f4xx_hal_lptim.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_lptim.c - - stm32f4xx_hal_ltdc.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_ltdc.c - - stm32f4xx_hal_ltdc_ex.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_ltdc_ex.c - - stm32f4xx_hal_nand.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_nand.c - - stm32f4xx_hal_nor.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_nor.c - - stm32f4xx_hal_pccard.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pccard.c - - stm32f4xx_hal_pcd.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd.c - - stm32f4xx_hal_pcd_ex.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pcd_ex.c - - stm32f4xx_hal_pwr.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c - - stm32f4xx_hal_pwr_ex.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c - - stm32f4xx_hal_qspi.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_qspi.c - - stm32f4xx_hal_rcc.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c - - stm32f4xx_hal_rcc_ex.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c - - stm32f4xx_hal_rng.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rng.c - - stm32f4xx_hal_rtc.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rtc.c - - stm32f4xx_hal_rtc_ex.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rtc_ex.c - - stm32f4xx_hal_sai.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sai.c - - stm32f4xx_hal_sai_ex.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sai_ex.c - - stm32f4xx_hal_sd.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sd.c - - stm32f4xx_hal_sdram.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sdram.c - - stm32f4xx_hal_smartcard.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_smartcard.c - - stm32f4xx_hal_spdifrx.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_spdifrx.c - - stm32f4xx_hal_spi.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_spi.c - - stm32f4xx_hal_sram.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_sram.c - - stm32f4xx_hal_tim.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim.c - - stm32f4xx_hal_tim_ex.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_tim_ex.c - - stm32f4xx_hal_uart.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c - - stm32f4xx_hal_usart.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_usart.c - - stm32f4xx_hal_wwdg.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_wwdg.c - - stm32f4xx_ll_fmc.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_fmc.c - - stm32f4xx_ll_fsmc.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_fsmc.c - - stm32f4xx_ll_sdmmc.c 1 ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_ll_sdmmc.c - - stm32f4xx_ll_usb.c 1 @@ -1162,9 +962,11 @@ + - - - + + + +
diff --git a/bsp/stm32/libraries/templates/stm32f7xx/template.uvoptx b/bsp/stm32/libraries/templates/stm32f7xx/template.uvoptx index 84efc74877..79e4edc632 100644 --- a/bsp/stm32/libraries/templates/stm32f7xx/template.uvoptx +++ b/bsp/stm32/libraries/templates/stm32f7xx/template.uvoptx @@ -103,7 +103,7 @@ 1 0 0 - 3 + 4 @@ -119,13 +119,13 @@ 0 - JL2CM3 - -U59400616 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024.FLM -FS08000000 -FL0100000 -FP0($$Device:STM32F407ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM) + UL2CM3 + UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20020000 -FF0STM32F7x_1024 -FL0100000 -FS08000000 -FP0($$Device:STM32F767BGTx$CMSIS\Flash\STM32F7x_1024.FLM) 0 - UL2CM3 - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) + JL2CM3 + -U59400616 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32F7x_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F767BGTx$CMSIS\Flash\STM32F7x_1024.FLM) diff --git a/bsp/stm32/libraries/templates/stm32f7xx/template.uvprojx b/bsp/stm32/libraries/templates/stm32f7xx/template.uvprojx index af223abacc..a196f74381 100644 --- a/bsp/stm32/libraries/templates/stm32f7xx/template.uvprojx +++ b/bsp/stm32/libraries/templates/stm32f7xx/template.uvprojx @@ -14,16 +14,16 @@ 0 - STM32F407ZGTx + STM32F767BGTx STMicroelectronics - Keil.STM32F4xx_DFP.2.13.0 + Keil.STM32F7xx_DFP.2.9.0 http://www.keil.com/pack - IRAM(0x20000000,0x20000) IRAM2(0x10000000,0x10000) IROM(0x08000000,0x100000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + IRAM(0x20020000,0x60000) IRAM2(0x20000000,0x20000) IROM(0x08000000,0x100000) IROM2(0x00200000,0x100000) CPUTYPE("Cortex-M7") FPU3(DFPU) CLOCK(12000000) ELITTLE - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F407ZGTx$CMSIS\Flash\STM32F4xx_1024.FLM)) + UL2CM3(-S0 -C0 -P0 -FD20020000 -FC1000 -FN1 -FF0STM32F7x_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32F767BGTx$CMSIS\Flash\STM32F7x_1024.FLM)) 0 - $$Device:STM32F407ZGTx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h + $$Device:STM32F767BGTx$Drivers\CMSIS\Device\ST\STM32F7xx\Include\stm32f7xx.h @@ -33,7 +33,7 @@ - $$Device:STM32F407ZGTx$CMSIS\SVD\STM32F40x.svd + $$Device:STM32F767BGTx$CMSIS\SVD\STM32F7x7_v1r2.svd 0 0 @@ -112,11 +112,11 @@ SARMCM3.DLL -REMAP -MPU DCM.DLL - -pCM4 + -pCM7 SARMCM3.DLL -MPU TCM.DLL - -pCM4 + -pCM7 @@ -138,7 +138,7 @@ 1 BIN\UL2CM3.DLL - "" () + @@ -174,7 +174,7 @@ 1 0 0 - "Cortex-M4" + "Cortex-M7" 0 0 @@ -183,16 +183,16 @@ 1 0 0 - 2 + 3 0 1 - 0 + 1 8 0 0 0 0 - 3 + 4 4 0 0 @@ -209,7 +209,7 @@ 0 0 0 - 0 + 1 1 @@ -244,8 +244,8 @@ 0 - 0x20000000 - 0x20000 + 0x20020000 + 0x60000 1 @@ -279,8 +279,8 @@ 1 - 0x0 - 0x0 + 0x200000 + 0x100000 0 @@ -299,13 +299,13 @@ 0 - 0x20000000 - 0x20000 + 0x20020000 + 0x60000 0 - 0x10000000 - 0x10000 + 0x20000000 + 0x20000 From f1004b013d3b803d0fc4611cd6484c337f1448e1 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Tue, 8 Jan 2019 14:15:49 +0800 Subject: [PATCH 09/15] [bsp][stm32] update stm32/stm32f103-atk-nano --- bsp/stm32/stm32f103-atk-nano/project.uvoptx | 12 +- bsp/stm32/stm32f103-atk-nano/project.uvprojx | 195 +++++-------------- 2 files changed, 56 insertions(+), 151 deletions(-) diff --git a/bsp/stm32/stm32f103-atk-nano/project.uvoptx b/bsp/stm32/stm32f103-atk-nano/project.uvoptx index cfd9c2865b..eba66b79a0 100644 --- a/bsp/stm32/stm32f103-atk-nano/project.uvoptx +++ b/bsp/stm32/stm32f103-atk-nano/project.uvoptx @@ -187,7 +187,7 @@ Applications - 0 + 1 0 0 0 @@ -207,7 +207,7 @@ Drivers - 0 + 1 0 0 0 @@ -287,7 +287,7 @@ Kernel - 0 + 1 0 0 0 @@ -487,7 +487,7 @@ CORTEX-M3 - 0 + 1 0 0 0 @@ -555,7 +555,7 @@ DeviceDrivers - 0 + 1 0 0 0 @@ -671,7 +671,7 @@ finsh - 0 + 1 0 0 0 diff --git a/bsp/stm32/stm32f103-atk-nano/project.uvprojx b/bsp/stm32/stm32f103-atk-nano/project.uvprojx index af0b59df29..4d626125a2 100644 --- a/bsp/stm32/stm32f103-atk-nano/project.uvprojx +++ b/bsp/stm32/stm32f103-atk-nano/project.uvprojx @@ -1,7 +1,10 @@ + 2.1 +
### uVision Project, (C) Keil Software
+ rt-thread @@ -16,28 +19,28 @@ Keil.STM32F1xx_DFP.2.2.0 http://www.keil.com/pack/ IRAM(0x20000000,0x5000) IROM(0x08000000,0x20000) CPUTYPE("Cortex-M3") CLOCK(12000000) ELITTLE - - + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F10x_128 -FS08000000 -FL020000 -FP0($$Device:STM32F103RB$Flash\STM32F10x_128.FLM)) 0 $$Device:STM32F103RB$Device\Include\stm32f10x.h - - - - - - - - - + + + + + + + + + $$Device:STM32F103RB$SVD\STM32F103xx.svd 0 0 - - - - - + + + + + 0 0 @@ -59,8 +62,8 @@ 0 0 - - + + 0 0 0 @@ -69,8 +72,8 @@ 0 0 - - + + 0 0 0 @@ -80,14 +83,14 @@ 1 0 fromelf --bin !L --output rtthread.bin - + 0 0 0 0 0 - +
0 @@ -101,8 +104,8 @@ 0 0 3 - - + + 1 @@ -111,7 +114,7 @@ DCM.DLL -pCM3 SARMCM3.DLL - + TCM.DLL -pCM3 @@ -136,10 +139,10 @@ 1 BIN\UL2CM3.DLL "" () - - - - + + + + 0 @@ -172,7 +175,7 @@ 0 0 "Cortex-M3" - + 0 0 0 @@ -304,7 +307,7 @@ 0x0 - + 1 @@ -331,9 +334,9 @@ 0 0 - + STM32F103xB, USE_HAL_DRIVER - + applications;.;board;board\CubeMX_Config\Inc;board\ports;..\libraries\HAL_Drivers;..\libraries\HAL_Drivers\config;..\..\..\include;..\..\..\libcpu\arm\cortex-m3;..\..\..\libcpu\arm\common;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\finsh;..\libraries\STM32F1xx_HAL\CMSIS\Device\ST\STM32F1xx\Include;..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Inc;..\libraries\STM32F1xx_HAL\CMSIS\Include @@ -349,10 +352,10 @@ 0 0 - - - - + + + + @@ -364,13 +367,13 @@ 0 0x08000000 0x20000000 - + .\board\linker_scripts\link.sct - - + + --keep *.o(.rti_fn.*) --keep *.o(FSymTab) - - + +
@@ -393,36 +396,26 @@ 1 board\board.c - - stm32f1xx_hal_msp.c 1 board\CubeMX_Config\Src\stm32f1xx_hal_msp.c - - startup_stm32f103xb.s 2 ..\libraries\STM32F1xx_HAL\CMSIS\Device\ST\STM32F1xx\Source\Templates\arm\startup_stm32f103xb.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 @@ -438,106 +431,76 @@ 1 ..\..\..\src\clock.c - - components.c 1 ..\..\..\src\components.c - - cpu.c 1 ..\..\..\src\cpu.c - - device.c 1 ..\..\..\src\device.c - - idle.c 1 ..\..\..\src\idle.c - - ipc.c 1 ..\..\..\src\ipc.c - - irq.c 1 ..\..\..\src\irq.c - - kservice.c 1 ..\..\..\src\kservice.c - - mem.c 1 ..\..\..\src\mem.c - - memheap.c 1 ..\..\..\src\memheap.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 @@ -553,29 +516,21 @@ 1 ..\..\..\libcpu\arm\cortex-m3\cpuport.c - - context_rvds.S 2 ..\..\..\libcpu\arm\cortex-m3\context_rvds.S - - backtrace.c 1 ..\..\..\libcpu\arm\common\backtrace.c - - div0.c 1 ..\..\..\libcpu\arm\common\div0.c - - showmem.c 1 @@ -591,57 +546,41 @@ 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 @@ -657,36 +596,26 @@ 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 @@ -702,92 +631,66 @@ 1 ..\libraries\STM32F1xx_HAL\CMSIS\Device\ST\STM32F1xx\Source\Templates\system_stm32f1xx.c - - stm32f1xx_hal_dma.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_dma.c - - stm32f1xx_hal_cortex.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cortex.c - - stm32f1xx_hal_crc.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_crc.c - - stm32f1xx_hal_pwr.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_pwr.c - - stm32f1xx_hal_rcc.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc.c - - stm32f1xx_hal_rcc_ex.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_rcc_ex.c - - stm32f1xx_hal.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal.c - - stm32f1xx_hal_cec.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_cec.c - - stm32f1xx_hal_sram.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_sram.c - - stm32f1xx_hal_gpio.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio.c - - stm32f1xx_hal_gpio_ex.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_gpio_ex.c - - stm32f1xx_hal_uart.c 1 ..\libraries\STM32F1xx_HAL\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_uart.c - - stm32f1xx_hal_usart.c 1 @@ -798,9 +701,11 @@ + - - - + + + + From fd396975a8f925c292a54801d11287ee0a735a62 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Tue, 8 Jan 2019 14:19:49 +0800 Subject: [PATCH 10/15] [bsp][stm32] add stm32/stm32f411-st-nucleo bsp --- bsp/stm32/stm32f411-st-nucleo/.config | 346 ++ bsp/stm32/stm32f411-st-nucleo/.gitignore | 42 + bsp/stm32/stm32f411-st-nucleo/Kconfig | 21 + bsp/stm32/stm32f411-st-nucleo/README.md | 105 + bsp/stm32/stm32f411-st-nucleo/SConscript | 14 + bsp/stm32/stm32f411-st-nucleo/SConstruct | 58 + .../applications/SConscript | 12 + .../stm32f411-st-nucleo/applications/main.c | 33 + .../board/CubeMX_Config/.mxproject | 17 + .../board/CubeMX_Config/CubeMX_Config.ioc | 155 + .../board/CubeMX_Config/Inc/main.h | 101 + .../CubeMX_Config/Inc/stm32f4xx_hal_conf.h | 451 +++ .../board/CubeMX_Config/Inc/stm32f4xx_it.h | 84 + .../board/CubeMX_Config/Src/main.c | 269 ++ .../CubeMX_Config/Src/stm32f4xx_hal_msp.c | 174 + .../board/CubeMX_Config/Src/stm32f4xx_it.c | 217 ++ .../CubeMX_Config/Src/system_stm32f4xx.c | 761 +++++ bsp/stm32/stm32f411-st-nucleo/board/Kconfig | 44 + .../stm32f411-st-nucleo/board/SConscript | 37 + bsp/stm32/stm32f411-st-nucleo/board/board.c | 50 + bsp/stm32/stm32f411-st-nucleo/board/board.h | 41 + .../board/linker_scripts/link.icf | 28 + .../board/linker_scripts/link.lds | 144 + .../board/linker_scripts/link.sct | 15 + .../stm32f411-st-nucleo/figures/board.png | Bin 0 -> 451390 bytes bsp/stm32/stm32f411-st-nucleo/project.ewd | 2834 +++++++++++++++++ bsp/stm32/stm32f411-st-nucleo/project.ewp | 2261 +++++++++++++ bsp/stm32/stm32f411-st-nucleo/project.eww | 10 + bsp/stm32/stm32f411-st-nucleo/project.uvopt | 162 + bsp/stm32/stm32f411-st-nucleo/project.uvoptx | 947 ++++++ bsp/stm32/stm32f411-st-nucleo/project.uvprojx | 720 +++++ bsp/stm32/stm32f411-st-nucleo/rtconfig.h | 171 + bsp/stm32/stm32f411-st-nucleo/rtconfig.py | 134 + bsp/stm32/stm32f411-st-nucleo/template.ewp | 2032 ++++++++++++ bsp/stm32/stm32f411-st-nucleo/template.eww | 10 + bsp/stm32/stm32f411-st-nucleo/template.uvopt | 162 + bsp/stm32/stm32f411-st-nucleo/template.uvoptx | 191 ++ .../stm32f411-st-nucleo/template.uvprojx | 393 +++ 38 files changed, 13246 insertions(+) create mode 100644 bsp/stm32/stm32f411-st-nucleo/.config create mode 100644 bsp/stm32/stm32f411-st-nucleo/.gitignore create mode 100644 bsp/stm32/stm32f411-st-nucleo/Kconfig create mode 100644 bsp/stm32/stm32f411-st-nucleo/README.md create mode 100644 bsp/stm32/stm32f411-st-nucleo/SConscript create mode 100644 bsp/stm32/stm32f411-st-nucleo/SConstruct create mode 100644 bsp/stm32/stm32f411-st-nucleo/applications/SConscript create mode 100644 bsp/stm32/stm32f411-st-nucleo/applications/main.c create mode 100644 bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/.mxproject create mode 100644 bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc create mode 100644 bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Inc/main.h create mode 100644 bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h create mode 100644 bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_it.h create mode 100644 bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Src/main.c create mode 100644 bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c create mode 100644 bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_it.c create mode 100644 bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Src/system_stm32f4xx.c create mode 100644 bsp/stm32/stm32f411-st-nucleo/board/Kconfig create mode 100644 bsp/stm32/stm32f411-st-nucleo/board/SConscript create mode 100644 bsp/stm32/stm32f411-st-nucleo/board/board.c create mode 100644 bsp/stm32/stm32f411-st-nucleo/board/board.h create mode 100644 bsp/stm32/stm32f411-st-nucleo/board/linker_scripts/link.icf create mode 100644 bsp/stm32/stm32f411-st-nucleo/board/linker_scripts/link.lds create mode 100644 bsp/stm32/stm32f411-st-nucleo/board/linker_scripts/link.sct create mode 100644 bsp/stm32/stm32f411-st-nucleo/figures/board.png create mode 100644 bsp/stm32/stm32f411-st-nucleo/project.ewd create mode 100644 bsp/stm32/stm32f411-st-nucleo/project.ewp create mode 100644 bsp/stm32/stm32f411-st-nucleo/project.eww create mode 100644 bsp/stm32/stm32f411-st-nucleo/project.uvopt create mode 100644 bsp/stm32/stm32f411-st-nucleo/project.uvoptx create mode 100644 bsp/stm32/stm32f411-st-nucleo/project.uvprojx create mode 100644 bsp/stm32/stm32f411-st-nucleo/rtconfig.h create mode 100644 bsp/stm32/stm32f411-st-nucleo/rtconfig.py create mode 100644 bsp/stm32/stm32f411-st-nucleo/template.ewp create mode 100644 bsp/stm32/stm32f411-st-nucleo/template.eww create mode 100644 bsp/stm32/stm32f411-st-nucleo/template.uvopt create mode 100644 bsp/stm32/stm32f411-st-nucleo/template.uvoptx create mode 100644 bsp/stm32/stm32f411-st-nucleo/template.uvprojx diff --git a/bsp/stm32/stm32f411-st-nucleo/.config b/bsp/stm32/stm32f411-st-nucleo/.config new file mode 100644 index 0000000000..ca166c9644 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/.config @@ -0,0 +1,346 @@ +# +# 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=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart2" +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 is not set +# CONFIG_RT_USING_CAN is not set +# CONFIG_RT_USING_HWTIMER is not set +# CONFIG_RT_USING_CPUTIME is not set +# CONFIG_RT_USING_I2C is not set +CONFIG_RT_USING_PIN=y +# CONFIG_RT_USING_ADC is not set +# CONFIG_RT_USING_PWM is not set +# CONFIG_RT_USING_MTD_NOR is not set +# CONFIG_RT_USING_MTD_NAND is not set +# CONFIG_RT_USING_MTD is not set +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_RTC is not set +# CONFIG_RT_USING_SDIO is not set +# CONFIG_RT_USING_SPI is not set +# CONFIG_RT_USING_WDT is not set +# CONFIG_RT_USING_AUDIO is not set + +# +# Using WiFi +# +# CONFIG_RT_USING_WIFI is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# POSIX layer and C standard library +# +# CONFIG_RT_USING_LIBC is not set +# CONFIG_RT_USING_PTHREADS is not set + +# +# Network +# + +# +# Socket abstraction layer +# +# CONFIG_RT_USING_SAL is not set + +# +# light weight TCP/IP stack +# +# CONFIG_RT_USING_LWIP is not set + +# +# Modbus master and slave stack +# +# CONFIG_RT_USING_MODBUS is not set + +# +# AT commands +# +# CONFIG_RT_USING_AT is not set + +# +# VBUS(Virtual Software BUS) +# +# CONFIG_RT_USING_VBUS is not set + +# +# Utilities +# +# CONFIG_RT_USING_LOGTRACE is not set +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set + +# +# ARM CMSIS +# +# CONFIG_RT_USING_CMSIS_OS is not set +# CONFIG_RT_USING_RTT_CMSIS is not set +# CONFIG_RT_USING_LWP is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_EZXML is not set +# CONFIG_PKG_USING_NANOPB is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_WIZNET is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set +# CONFIG_PKG_USING_TENCENT_IOTKIT is not set + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_libsodium is not set +# CONFIG_PKG_USING_TINYCRYPT is not set + +# +# language packages +# +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set + +# +# multimedia packages +# +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set + +# +# system packages +# +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_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_STM32F4=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_STM32F411RE=y + +# +# Onboard Peripheral Drivers +# + +# +# On-chip Peripheral Drivers +# +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART2=y +# CONFIG_BSP_USING_ON_CHIP_FLASH is not set + +# +# Board extended module Drivers +# diff --git a/bsp/stm32/stm32f411-st-nucleo/.gitignore b/bsp/stm32/stm32f411-st-nucleo/.gitignore new file mode 100644 index 0000000000..7221bde019 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/.gitignore @@ -0,0 +1,42 @@ +*.pyc +*.map +*.dblite +*.elf +*.bin +*.hex +*.axf +*.exe +*.pdb +*.idb +*.ilk +*.old +build +Debug +documentation/html +packages/ +*~ +*.o +*.obj +*.out +*.bak +*.dep +*.lib +*.i +*.d +.DS_Stor* +.config 3 +.config 4 +.config 5 +Midea-X1 +*.uimg +GPATH +GRTAGS +GTAGS +.vscode +JLinkLog.txt +JLinkSettings.ini +DebugConfig/ +RTE/ +settings/ +*.uvguix* +cconfig.h diff --git a/bsp/stm32/stm32f411-st-nucleo/Kconfig b/bsp/stm32/stm32f411-st-nucleo/Kconfig new file mode 100644 index 0000000000..d174bcc585 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/Kconfig @@ -0,0 +1,21 @@ +mainmenu "RT-Thread Configuration" + +config $BSP_DIR + string + option env="BSP_ROOT" + default "." + +config $RTT_DIR + string + option env="RTT_ROOT" + default "../../.." + +config $PKGS_DIR + string + option env="PKGS_ROOT" + default "packages" + +source "$RTT_DIR/Kconfig" +source "$PKGS_DIR/Kconfig" +source "../libraries/Kconfig" +source "board/Kconfig" diff --git a/bsp/stm32/stm32f411-st-nucleo/README.md b/bsp/stm32/stm32f411-st-nucleo/README.md new file mode 100644 index 0000000000..ec84e51601 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/README.md @@ -0,0 +1,105 @@ +# STM32F411-Nucleo-64 开发板 BSP 说明 + +## 简介 + +本文档为 RT-Thread 开发团队为 STM32F411-Nucleo-64 开发板提供的 BSP (板级支持包) 说明。 + +主要内容如下: + +- 开发板资源介绍 +- BSP 快速上手 +- 进阶使用方法 + +通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。 + +## 开发板介绍 + +探索者 STM32F411-Nucleo-64 是意法半导体推出的一款基于 ARM Cortex-M4 内核的开发板,最高主频为 100Mhz,该开发板具有丰富的板载资源,可以充分发挥 STM32F411RE 的芯片性能。 + +开发板外观如下图所示: + +![board](figures/board.png) + +该开发板常用 ** 板载资源 ** 如下: + +- MCU:STM32F407ZGT6,主频 100MHz,512KB FLASH ,128KB RAM。 +- 常用外设 + - LED:3 个,USB communication (LD1), user LED (LD2), power LED (LD3) 。 + - 按键,2 个,USER and RESET 。 +- 常用接口:USB 支持 3 种不同接口:虚拟 COM 端口、大容量存储和调试端口。 +- 调试接口,板载 ST-LINK/V2-1 调试器。 + +开发板更多详细信息请参考意法半导体 [STM32F411-Nucleo-64 开发板介绍](https://www.st.com/en/evaluation-tools/nucleo-f411re.html)。 + +## 外设支持 + +本 BSP 目前对外设的支持情况如下: + +| **片上外设** | **支持情况** | **备注** | +| :------------ | :----------: | :-----------------------------------: | +| GPIO | 支持 | PA0, PA1... PH1 ---> PIN: 0, 1...63 | +| UART | 支持 | UART2 | + +## 使用说明 + +使用说明分为如下两个章节: + +- 快速上手 + + 本章节是为刚接触 RT-Thread 的新手准备的使用说明,遵循简单的步骤即可将 RT-Thread 操作系统运行在该开发板上,看到实验效果 。 + +- 进阶使用 + + 本章节是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + + +### 快速上手 + +本 BSP 为开发者提供 MDK5 和 IAR 工程,并且支持 GCC 开发环境。下面以 MDK5 开发环境为例,介绍如何将系统运行起来。 + +#### 硬件连接 + +使用 Type-A to Mini-B 线连接开发板和 PC 供电,红色 LED LD3 (PWR) 和 LD1 (COM) 会点亮。 + +#### 编译下载 + +双击 project.uvprojx 文件,打开 MDK5 工程,编译并下载程序到开发板。 + +> 工程默认配置使用 ST-LINK 下载程序,点击下载按钮即可下载程序到开发板。 + +#### 运行结果 + +下载程序成功之后,系统会自动运行,观察开发板上 LED 的运行效果,红色 LD3 和 LD1 常亮、绿色 LD2 会周期性闪烁。 + +USB 虚拟 COM 端口默认连接串口 2,在终端工具里打开相应的串口(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 和 串口 2 的功能,更多高级功能需要利用 ENV 工具对 BSP 进行配置,步骤如下: + +1. 在 BSP 下打开 env 工具。 + +2. 输入 `menuconfig` 命令配置工程,配置好之后保存退出。 + +3. 输入 `pkgs --update` 命令更新软件包。 + +4. 输入 `scons --target=mdk4/mdk5/iar` 命令重新生成工程。 + +本章节更多详细的介绍请参考 [STM32 系列 BSP 外设驱动使用教程](../docs/STM32 系列 BSP 外设驱动使用教程. md)。 + +## 注意事项 + +暂无 + +## 联系人信息 + +维护人: + +- [misonyo](https://github.com/misonyo) ,邮箱: \ No newline at end of file diff --git a/bsp/stm32/stm32f411-st-nucleo/SConscript b/bsp/stm32/stm32f411-st-nucleo/SConscript new file mode 100644 index 0000000000..fe0ae941ae --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/SConscript @@ -0,0 +1,14 @@ +# for module compiling +import os +Import('RTT_ROOT') + +cwd = str(Dir('#')) +objs = [] +list = os.listdir(cwd) + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +Return('objs') diff --git a/bsp/stm32/stm32f411-st-nucleo/SConstruct b/bsp/stm32/stm32f411-st-nucleo/SConstruct new file mode 100644 index 0000000000..8ecf112e9c --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/SConstruct @@ -0,0 +1,58 @@ +import os +import sys +import rtconfig + +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') +else: + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + +sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] +try: + from building import * +except: + print('Cannot found RT-Thread root directory, please check RTT_ROOT') + print(RTT_ROOT) + exit(-1) + +TARGET = 'rtthread.' + 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 rtthread.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 = 'STM32F4xx_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/stm32f411-st-nucleo/applications/SConscript b/bsp/stm32/stm32f411-st-nucleo/applications/SConscript new file mode 100644 index 0000000000..6f66f7ab73 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/applications/SConscript @@ -0,0 +1,12 @@ +import rtconfig +from building import * + +cwd = GetCurrentDir() +CPPPATH = [cwd, str(Dir('#'))] +src = Split(""" +main.c +""") + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/stm32/stm32f411-st-nucleo/applications/main.c b/bsp/stm32/stm32f411-st-nucleo/applications/main.c new file mode 100644 index 0000000000..5e963c636d --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/applications/main.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift change to new framework + */ + +#include +#include +#include +#include "drv_gpio.h" +/* defined the LED0 pin: PA5 */ +#define LED0_PIN GET_PIN(A, 5) + +int main(void) +{ + int count = 1; + /* set LED0 pin mode to output */ + rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); + + while (count++) + { + rt_pin_write(LED0_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED0_PIN, PIN_LOW); + rt_thread_mdelay(500); + } + + return RT_EOK; +} diff --git a/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/.mxproject b/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/.mxproject new file mode 100644 index 0000000000..8691bed235 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/.mxproject @@ -0,0 +1,17 @@ +[PreviousGenFiles] +HeaderPath=D:/repository/BspFramework/rt-thread/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Inc +HeaderFiles=stm32f4xx_it.h;stm32f4xx_hal_conf.h;main.h; +SourcePath=D:/repository/BspFramework/rt-thread/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Src +SourceFiles=stm32f4xx_it.c;stm32f4xx_hal_msp.c;main.c; + +[PreviousLibFiles] +LibFiles=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_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_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/stm32f411xe.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; + +[PreviousUsedIarFiles] +SourceFiles=..\Src\main.c;..\Src\stm32f4xx_it.c;..\Src\stm32f4xx_hal_msp.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_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; + +[PreviousUsedKeilFiles] +SourceFiles=..\Src\main.c;..\Src\stm32f4xx_it.c;..\Src\stm32f4xx_hal_msp.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_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/stm32f411-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc b/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc new file mode 100644 index 0000000000..0428900030 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/CubeMX_Config.ioc @@ -0,0 +1,155 @@ +#MicroXplorer Configuration settings - do not modify +File.Version=6 +KeepUserPlacement=true +Mcu.Family=STM32F4 +Mcu.IP0=NVIC +Mcu.IP1=RCC +Mcu.IP2=SYS +Mcu.IP3=USART2 +Mcu.IPNb=4 +Mcu.Name=STM32F411R(C-E)Tx +Mcu.Package=LQFP64 +Mcu.Pin0=PC13-ANTI_TAMP +Mcu.Pin1=PC14-OSC32_IN +Mcu.Pin10=PB3 +Mcu.Pin11=VP_SYS_VS_Systick +Mcu.Pin2=PC15-OSC32_OUT +Mcu.Pin3=PH0 - OSC_IN +Mcu.Pin4=PH1 - OSC_OUT +Mcu.Pin5=PA2 +Mcu.Pin6=PA3 +Mcu.Pin7=PA5 +Mcu.Pin8=PA13 +Mcu.Pin9=PA14 +Mcu.PinsNb=12 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32F411RETx +MxCube.Version=5.0.0 +MxDb.Version=DB.5.0.0 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:true +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:true +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:true +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:true +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_0 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false +NVIC.SysTick_IRQn=true\:0\:0\:true\:false\:true\:true +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:true +PA13.GPIOParameters=GPIO_Label +PA13.GPIO_Label=TMS +PA13.Locked=true +PA13.Mode=Serial_Wire +PA13.Signal=SYS_JTMS-SWDIO +PA14.GPIOParameters=GPIO_Label +PA14.GPIO_Label=TCK +PA14.Locked=true +PA14.Mode=Serial_Wire +PA14.Signal=SYS_JTCK-SWCLK +PA2.Mode=Asynchronous +PA2.Signal=USART2_TX +PA3.Mode=Asynchronous +PA3.Signal=USART2_RX +PA5.GPIOParameters=GPIO_Label +PA5.GPIO_Label=LD2 [Green Led] +PA5.Locked=true +PA5.Signal=GPIO_Output +PB3.GPIOParameters=GPIO_Label +PB3.GPIO_Label=SWO +PB3.Locked=true +PB3.Signal=SYS_JTDO-SWO +PC13-ANTI_TAMP.GPIOParameters=GPIO_Label,GPIO_ModeDefaultEXTI +PC13-ANTI_TAMP.GPIO_Label=B1 [Blue PushButton] +PC13-ANTI_TAMP.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_FALLING +PC13-ANTI_TAMP.Locked=true +PC13-ANTI_TAMP.Signal=GPXTI13 +PC14-OSC32_IN.Locked=true +PC14-OSC32_IN.Mode=LSE-External-Oscillator +PC14-OSC32_IN.Signal=RCC_OSC32_IN +PC15-OSC32_OUT.Locked=true +PC15-OSC32_OUT.Mode=LSE-External-Oscillator +PC15-OSC32_OUT.Signal=RCC_OSC32_OUT +PCC.Checker=false +PCC.Line=STM32F411 +PCC.MCU=STM32F411R(C-E)Tx +PCC.PartNumber=STM32F411RETx +PCC.Seq0=0 +PCC.Series=STM32F4 +PCC.Temperature=25 +PCC.Vdd=null +PH0\ -\ OSC_IN.Locked=true +PH0\ -\ OSC_IN.Mode=HSE-External-Clock-Source +PH0\ -\ OSC_IN.Signal=RCC_OSC_IN +PH1\ -\ OSC_OUT.Locked=true +PH1\ -\ OSC_OUT.Mode=HSE-External-Clock-Source +PH1\ -\ OSC_OUT.Signal=RCC_OSC_OUT +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=false +ProjectManager.CustomerFirmwarePackage=..\\..\\..\\..\\..\\..\\..\\..\\board\\stm32cubefx-repo\\STM32Cube_FW_F4_V1.11.0 +ProjectManager.DefaultFWLocation=false +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32F411RETx +ProjectManager.FirmwarePackage=STM32Cube FW_F4 V1.23.0 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=0 +ProjectManager.MainLocation=Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=CubeMX_Config.ioc +ProjectManager.ProjectName=CubeMX_Config +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=MDK-ARM V5 +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART2_UART_Init-USART2-false-HAL-true +RCC.48MHZClocksFreq_Value=42000000 +RCC.AHBFreq_Value=84000000 +RCC.APB1CLKDivider=RCC_HCLK_DIV2 +RCC.APB1Freq_Value=42000000 +RCC.APB1TimFreq_Value=84000000 +RCC.APB2Freq_Value=84000000 +RCC.APB2TimFreq_Value=84000000 +RCC.CortexFreq_Value=84000000 +RCC.EthernetFreq_Value=84000000 +RCC.FCLKCortexFreq_Value=84000000 +RCC.FLatency-AdvancedSettings=FLASH_LATENCY_2 +RCC.FamilyName=M +RCC.HCLKFreq_Value=84000000 +RCC.HSE_VALUE=8000000 +RCC.HSI_VALUE=16000000 +RCC.I2SClocksFreq_Value=48000000 +RCC.IPParameters=48MHZClocksFreq_Value,AHBFreq_Value,APB1CLKDivider,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,EthernetFreq_Value,FCLKCortexFreq_Value,FLatency-AdvancedSettings,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI_VALUE,I2SClocksFreq_Value,LSI_VALUE,MCO2PinFreq_Value,PLLCLKFreq_Value,PLLM,PLLN,PLLQCLKFreq_Value,PLLSourceVirtual,RTCFreq_Value,RTCHSEDivFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,VCOI2SOutputFreq_Value,VCOInputFreq_Value,VCOInputMFreq_Value,VCOOutputFreq_Value,VcooutputI2S +RCC.LSI_VALUE=32000 +RCC.MCO2PinFreq_Value=84000000 +RCC.PLLCLKFreq_Value=84000000 +RCC.PLLM=4 +RCC.PLLN=84 +RCC.PLLQCLKFreq_Value=42000000 +RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE +RCC.RTCFreq_Value=32000 +RCC.RTCHSEDivFreq_Value=4000000 +RCC.SYSCLKFreq_VALUE=84000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.VCOI2SOutputFreq_Value=96000000 +RCC.VCOInputFreq_Value=2000000 +RCC.VCOInputMFreq_Value=500000 +RCC.VCOOutputFreq_Value=168000000 +RCC.VcooutputI2S=48000000 +SH.GPXTI13.0=GPIO_EXTI13 +SH.GPXTI13.ConfNb=1 +USART2.IPParameters=VirtualMode +USART2.VirtualMode=VM_ASYNC +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +board=NUCLEO-F411RE +boardIOC=true diff --git a/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Inc/main.h b/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Inc/main.h new file mode 100644 index 0000000000..47036898b7 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Inc/main.h @@ -0,0 +1,101 @@ +/* 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 "stm32f4xx_hal.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ +#define B1_Pin GPIO_PIN_13 +#define B1_GPIO_Port GPIOC +#define LD2_Pin GPIO_PIN_5 +#define LD2_GPIO_Port GPIOA +#define TMS_Pin GPIO_PIN_13 +#define TMS_GPIO_Port GPIOA +#define TCK_Pin GPIO_PIN_14 +#define TCK_GPIO_Port GPIOA +#define SWO_Pin GPIO_PIN_3 +#define SWO_GPIO_Port GPIOB +/* 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/stm32f411-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h b/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h new file mode 100644 index 0000000000..15f9b6ae02 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h @@ -0,0 +1,451 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf.h + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2019 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CONF_H +#define __STM32F4xx_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_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_ETH_MODULE_ENABLED */ +/* #define HAL_NAND_MODULE_ENABLED */ +/* #define HAL_NOR_MODULE_ENABLED */ +/* #define HAL_PCCARD_MODULE_ENABLED */ +/* #define HAL_SRAM_MODULE_ENABLED */ +/* #define HAL_SDRAM_MODULE_ENABLED */ +/* #define HAL_HASH_MODULE_ENABLED */ +/* #define HAL_I2C_MODULE_ENABLED */ +/* #define HAL_I2S_MODULE_ENABLED */ +/* #define HAL_IWDG_MODULE_ENABLED */ +/* #define HAL_LTDC_MODULE_ENABLED */ +/* #define HAL_RNG_MODULE_ENABLED */ +/* #define HAL_RTC_MODULE_ENABLED */ +/* #define HAL_SAI_MODULE_ENABLED */ +/* #define HAL_SD_MODULE_ENABLED */ +/* #define HAL_MMC_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 */ +/* #define HAL_SMARTCARD_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ +/* #define HAL_PCD_MODULE_ENABLED */ +/* #define HAL_HCD_MODULE_ENABLED */ +/* #define HAL_DSI_MODULE_ENABLED */ +/* #define HAL_QSPI_MODULE_ENABLED */ +/* #define HAL_QSPI_MODULE_ENABLED */ +/* #define HAL_CEC_MODULE_ENABLED */ +/* #define HAL_FMPI2C_MODULE_ENABLED */ +/* #define HAL_SPDIFRX_MODULE_ENABLED */ +/* #define HAL_DFSDM_MODULE_ENABLED */ +/* #define HAL_LPTIM_MODULE_ENABLED */ +/* #define HAL_EXTI_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## HSE/HSI 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 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 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. + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed 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 /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) + #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE ((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 1U +#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 */ + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 2U +#define MAC_ADDR1 0U +#define MAC_ADDR2 0U +#define MAC_ADDR3 0U +#define MAC_ADDR4 0U +#define MAC_ADDR5 0U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848_PHY_ADDRESS Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY ((uint32_t)0x000000FFU) +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU) + +#define PHY_READ_TO ((uint32_t)0x0000FFFFU) +#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU) + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ +#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */ + +#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */ + +/* ################## 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 "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32f4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED + #include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED + #include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32f4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED + #include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED + #include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32f4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_CONF_H */ + + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_it.h b/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_it.h new file mode 100644 index 0000000000..7a788c296b --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Inc/stm32f4xx_it.h @@ -0,0 +1,84 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_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 __STM32F4xx_IT_H +#define __STM32F4xx_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 /* __STM32F4xx_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Src/main.c b/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Src/main.c new file mode 100644 index 0000000000..f934319b9d --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Src/main.c @@ -0,0 +1,269 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +UART_HandleTypeDef huart2; + +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_USART2_UART_Init(void); +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_USART2_UART_Init(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /**Configure the main internal regulator output voltage + */ + __HAL_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_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 4; + RCC_OscInitStruct.PLL.PLLN = 84; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 4; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief 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; + 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_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : B1_Pin */ + GPIO_InitStruct.Pin = B1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : LD2_Pin */ + GPIO_InitStruct.Pin = LD2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); + +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c b/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c new file mode 100644 index 0000000000..a0b3b19ee5 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c @@ -0,0 +1,174 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : stm32f4xx_hal_msp.c + * Description : This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0); + + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/** +* @brief UART MSP Initialization +* This function configures the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspInit(UART_HandleTypeDef* huart) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspInit 0 */ + + /* USER CODE END USART2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART2_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_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==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/stm32f411-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_it.c b/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_it.c new file mode 100644 index 0000000000..5973f7fddb --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Src/stm32f4xx_it.c @@ -0,0 +1,217 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_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 "stm32f4xx_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 Pre-fetch 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 */ +} + +/******************************************************************************/ +/* STM32F4xx 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_stm32f4xx.s). */ +/******************************************************************************/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Src/system_stm32f4xx.c b/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Src/system_stm32f4xx.c new file mode 100644 index 0000000000..14204ed5e7 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/board/CubeMX_Config/Src/system_stm32f4xx.c @@ -0,0 +1,761 @@ +/** + ****************************************************************************** + * @file system_stm32f4xx.c + * @author MCD Application Team + * @version V2.4.3 + * @date 22-January-2016 + * @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_stm32f4xx.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. + * + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2016 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 stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ + + +#include "stm32f4xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ + || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) +/* #define DATA_IN_ExtSRAM */ +#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/* #define DATA_IN_ExtSDRAM */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\ + STM32F479xx */ + +/*!< 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 STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ + /* This 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 = 16000000; +const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + static void SystemInit_ExtMemCtl(void); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the FPU setting, vector table location and External memory + * configuration. + * @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 HSION bit */ + RCC->CR |= (uint32_t)0x00000001; + + /* Reset CFGR register */ + RCC->CFGR = 0x00000000; + + /* Reset HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFFF; + + /* Reset PLLCFGR register */ + RCC->PLLCFGR = 0x24003010; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /* Disable all interrupts */ + RCC->CIR = 0x00000000; + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + SystemInit_ExtMemCtl(); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value + * depends on the application requirements), 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 = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +#if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM) +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) ||\ + defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external memories (SRAM/SDRAM) + * This SRAM/SDRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmp = 0x00; + + register uint32_t tmpreg = 0, timeout = 0xFFFF; + register uint32_t index; + + /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface clock */ + RCC->AHB1ENR |= 0x000001F8; + + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x00CCC0CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A8A; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xFFFF0FCF; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00CC0CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA828A; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xFFFFC3CF; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0xCCCCCCCC; + GPIOF->AFR[1] = 0xCCCCCCCC; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA800AAA; + /* Configure PFx pins speed to 50 MHz */ + GPIOF->OSPEEDR = 0xAA800AAA; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0xCCCCCCCC; + GPIOG->AFR[1] = 0xCCCCCCCC; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0xAAAAAAAA; + /* Configure PGx pins speed to 50 MHz */ + GPIOG->OSPEEDR = 0xAAAAAAAA; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + + /* Connect PHx pins to FMC Alternate function */ + GPIOH->AFR[0] = 0x00C0CC00; + GPIOH->AFR[1] = 0xCCCCCCCC; + /* Configure PHx pins in Alternate function mode */ + GPIOH->MODER = 0xAAAA08A0; + /* Configure PHx pins speed to 50 MHz */ + GPIOH->OSPEEDR = 0xAAAA08A0; + /* Configure PHx pins Output type to push-pull */ + GPIOH->OTYPER = 0x00000000; + /* No pull-up, pull-down for PHx pins */ + GPIOH->PUPDR = 0x00000000; + + /* Connect PIx pins to FMC Alternate function */ + GPIOI->AFR[0] = 0xCCCCCCCC; + GPIOI->AFR[1] = 0x00000CC0; + /* Configure PIx pins in Alternate function mode */ + GPIOI->MODER = 0x0028AAAA; + /* Configure PIx pins speed to 50 MHz */ + GPIOI->OSPEEDR = 0x0028AAAA; + /* Configure PIx pins Output type to push-pull */ + GPIOI->OTYPER = 0x00000000; + /* No pull-up, pull-down for PIx pins */ + GPIOI->PUPDR = 0x00000000; + +/*-- FMC Configuration -------------------------------------------------------*/ + /* Enable the FMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + + FMC_Bank5_6->SDCR[0] = 0x000019E4; + FMC_Bank5_6->SDTR[0] = 0x01115351; + + /* SDRAM initialization sequence */ + /* Clock enable command */ + FMC_Bank5_6->SDCMR = 0x00000011; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Delay */ + for (index = 0; index<1000; index++); + + /* PALL command */ + FMC_Bank5_6->SDCMR = 0x00000012; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ + FMC_Bank5_6->SDCMR = 0x00000073; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ + FMC_Bank5_6->SDCMR = 0x00046014; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Set refresh count */ + tmpreg = FMC_Bank5_6->SDRTR; + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); + + /* Disable write protection */ + tmpreg = FMC_Bank5_6->SDCR[0]; + FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001011; + FMC_Bank1->BTCR[3] = 0x00000201; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001091; + FMC_Bank1->BTCR[3] = 0x00110212; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F469xx || STM32F479xx */ + + (void)(tmp); +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external memories (SRAM/SDRAM) + * This SRAM/SDRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmp = 0x00; +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#if defined (DATA_IN_ExtSDRAM) + register uint32_t tmpreg = 0, timeout = 0xFFFF; + register uint32_t index; + +#if defined(STM32F446xx) + /* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface + clock */ + RCC->AHB1ENR |= 0x0000007D; +#else + /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface + clock */ + RCC->AHB1ENR |= 0x000001F8; +#endif /* STM32F446xx */ + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); + +#if defined(STM32F446xx) + /* Connect PAx pins to FMC Alternate function */ + GPIOA->AFR[0] |= 0xC0000000; + GPIOA->AFR[1] |= 0x00000000; + /* Configure PDx pins in Alternate function mode */ + GPIOA->MODER |= 0x00008000; + /* Configure PDx pins speed to 50 MHz */ + GPIOA->OSPEEDR |= 0x00008000; + /* Configure PDx pins Output type to push-pull */ + GPIOA->OTYPER |= 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOA->PUPDR |= 0x00000000; + + /* Connect PCx pins to FMC Alternate function */ + GPIOC->AFR[0] |= 0x00CC0000; + GPIOC->AFR[1] |= 0x00000000; + /* Configure PDx pins in Alternate function mode */ + GPIOC->MODER |= 0x00000A00; + /* Configure PDx pins speed to 50 MHz */ + GPIOC->OSPEEDR |= 0x00000A00; + /* Configure PDx pins Output type to push-pull */ + GPIOC->OTYPER |= 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOC->PUPDR |= 0x00000000; +#endif /* STM32F446xx */ + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x000000CC; + GPIOD->AFR[1] = 0xCC000CCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xA02A000A; + /* Configure PDx pins speed to 50 MHz */ + GPIOD->OSPEEDR = 0xA02A000A; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00000CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA800A; + /* Configure PEx pins speed to 50 MHz */ + GPIOE->OSPEEDR = 0xAAAA800A; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0xCCCCCCCC; + GPIOF->AFR[1] = 0xCCCCCCCC; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA800AAA; + /* Configure PFx pins speed to 50 MHz */ + GPIOF->OSPEEDR = 0xAA800AAA; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0xCCCCCCCC; + GPIOG->AFR[1] = 0xCCCCCCCC; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0xAAAAAAAA; + /* Configure PGx pins speed to 50 MHz */ + GPIOG->OSPEEDR = 0xAAAAAAAA; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) + /* Connect PHx pins to FMC Alternate function */ + GPIOH->AFR[0] = 0x00C0CC00; + GPIOH->AFR[1] = 0xCCCCCCCC; + /* Configure PHx pins in Alternate function mode */ + GPIOH->MODER = 0xAAAA08A0; + /* Configure PHx pins speed to 50 MHz */ + GPIOH->OSPEEDR = 0xAAAA08A0; + /* Configure PHx pins Output type to push-pull */ + GPIOH->OTYPER = 0x00000000; + /* No pull-up, pull-down for PHx pins */ + GPIOH->PUPDR = 0x00000000; + + /* Connect PIx pins to FMC Alternate function */ + GPIOI->AFR[0] = 0xCCCCCCCC; + GPIOI->AFR[1] = 0x00000CC0; + /* Configure PIx pins in Alternate function mode */ + GPIOI->MODER = 0x0028AAAA; + /* Configure PIx pins speed to 50 MHz */ + GPIOI->OSPEEDR = 0x0028AAAA; + /* Configure PIx pins Output type to push-pull */ + GPIOI->OTYPER = 0x00000000; + /* No pull-up, pull-down for PIx pins */ + GPIOI->PUPDR = 0x00000000; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +/*-- FMC Configuration -------------------------------------------------------*/ + /* Enable the FMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + + /* Configure and enable SDRAM bank1 */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCR[0] = 0x00001954; +#else + FMC_Bank5_6->SDCR[0] = 0x000019E4; +#endif /* STM32F446xx */ + FMC_Bank5_6->SDTR[0] = 0x01115351; + + /* SDRAM initialization sequence */ + /* Clock enable command */ + FMC_Bank5_6->SDCMR = 0x00000011; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Delay */ + for (index = 0; index<1000; index++); + + /* PALL command */ + FMC_Bank5_6->SDCMR = 0x00000012; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCMR = 0x000000F3; +#else + FMC_Bank5_6->SDCMR = 0x00000073; +#endif /* STM32F446xx */ + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCMR = 0x00044014; +#else + FMC_Bank5_6->SDCMR = 0x00046014; +#endif /* STM32F446xx */ + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Set refresh count */ + tmpreg = FMC_Bank5_6->SDRTR; +#if defined(STM32F446xx) + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1)); +#else + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); +#endif /* STM32F446xx */ + + /* Disable write protection */ + tmpreg = FMC_Bank5_6->SDCR[0]; + FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); +#endif /* DATA_IN_ExtSDRAM */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ + || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) + +#if defined(DATA_IN_ExtSRAM) +/*-- GPIOs Configuration -----------------------------------------------------*/ + /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ + RCC->AHB1ENR |= 0x00000078; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN); + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x00CCC0CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A8A; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xFFFF0FCF; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00CC0CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA828A; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xFFFFC3CF; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0x00CCCCCC; + GPIOF->AFR[1] = 0xCCCC0000; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA000AAA; + /* Configure PFx pins speed to 100 MHz */ + GPIOF->OSPEEDR = 0xFF000FFF; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0x00CCCCCC; + GPIOG->AFR[1] = 0x000000C0; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0x00085AAA; + /* Configure PGx pins speed to 100 MHz */ + GPIOG->OSPEEDR = 0x000CAFFF; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +/*-- FMC/FSMC Configuration --------------------------------------------------*/ + /* Enable the FMC/FSMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001011; + FMC_Bank1->BTCR[3] = 0x00000201; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001091; + FMC_Bank1->BTCR[3] = 0x00110212; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F469xx || STM32F479xx */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN); + /* Configure and enable Bank1_SRAM2 */ + FSMC_Bank1->BTCR[2] = 0x00001011; + FSMC_Bank1->BTCR[3] = 0x00000201; + FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF; +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx */ + +#endif /* DATA_IN_ExtSRAM */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\ + STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + (void)(tmp); +} +#endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/bsp/stm32/stm32f411-st-nucleo/board/Kconfig b/bsp/stm32/stm32f411-st-nucleo/board/Kconfig new file mode 100644 index 0000000000..1c6ee6b39b --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/board/Kconfig @@ -0,0 +1,44 @@ +menu "Hardware Drivers Config" + +config SOC_STM32F411RE + bool + select SOC_SERIES_STM32F4 + default y + +menu "Onboard Peripheral Drivers" + +endmenu + +menu "On-chip Peripheral Drivers" + + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default y + + menuconfig BSP_USING_UART + bool "Enable UART" + default y + select RT_USING_SERIAL + if BSP_USING_UART + config BSP_USING_UART2 + bool "Enable UART2" + default y + + config BSP_UART2_RX_USING_DMA + bool "Enable UART2 RX DMA" + depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA + default n + endif + + config BSP_USING_ON_CHIP_FLASH + bool "Enable on-chip FLASH" + default n + +endmenu + +menu "Board extended module Drivers" + +endmenu + +endmenu diff --git a/bsp/stm32/stm32f411-st-nucleo/board/SConscript b/bsp/stm32/stm32f411-st-nucleo/board/SConscript new file mode 100644 index 0000000000..19ed8a3678 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/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/stm32f4xx_hal_msp.c +''') + +path = [cwd] +path += [cwd + '/CubeMX_Config/Inc'] + +startup_path_prefix = SDK_LIB + +if rtconfig.CROSS_TOOL == 'gcc': + src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f411xe.s'] +elif rtconfig.CROSS_TOOL == 'keil': + src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f411xe.s'] +elif rtconfig.CROSS_TOOL == 'iar': + src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f411xe.s'] + +# STM32F405xx) || STM32F415xx) || STM32F407xx) || STM32F417xx) +# STM32F427xx) || STM32F437xx) || STM32F429xx) || STM32F439xx) +# STM32F401xC) || STM32F401xE) || STM32F410Tx) || STM32F410Cx) +# STM32F410Rx) || STM32F411xE) || STM32F446xx) || STM32F469xx) +# STM32F479xx) || STM32F412Cx) || STM32F412Rx) || STM32F412Vx) +# STM32F412Zx) || STM32F413xx) || STM32F423xx) +# You can select chips from the list above +CPPDEFINES = ['STM32F411xE'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') \ No newline at end of file diff --git a/bsp/stm32/stm32f411-st-nucleo/board/board.c b/bsp/stm32/stm32f411-st-nucleo/board/board.c new file mode 100644 index 0000000000..74579865c7 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/board/board.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift change to new framework + */ + +#include "board.h" + +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + + /**Configure the main internal regulator output voltage + */ + __HAL_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_LSI|RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 4; + RCC_OscInitStruct.PLL.PLLN = 84; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 4; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) + { + Error_Handler(); + } +} diff --git a/bsp/stm32/stm32f411-st-nucleo/board/board.h b/bsp/stm32/stm32f411-st-nucleo/board/board.h new file mode 100644 index 0000000000..d3e860a5f5 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/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" + +#define STM32_FLASH_START_ADRESS ((uint32_t)0x08000000) +#define STM32_FLASH_SIZE (512 * 1024) +#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE)) + +#define STM32_SRAM_SIZE 128 +#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024) + +#if defined(__CC_ARM) || defined(__CLANG_ARM) +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN (&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="CSTACK" +#define HEAP_BEGIN (__segment_end("CSTACK")) +#else +extern int __bss_end; +#define HEAP_BEGIN (&__bss_end) +#endif + +#define HEAP_END STM32_SRAM_END + +void SystemClock_Config(void); + +#endif + diff --git a/bsp/stm32/stm32f411-st-nucleo/board/linker_scripts/link.icf b/bsp/stm32/stm32f411-st-nucleo/board/linker_scripts/link.icf new file mode 100644 index 0000000000..f6b6ffd23b --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/board/linker_scripts/link.icf @@ -0,0 +1,28 @@ +/*###ICF### Section handled by ICF editor, don't touch! ****/ +/*-Editor annotation file-*/ +/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */ +/*-Specials-*/ +define symbol __ICFEDIT_intvec_start__ = 0x08000000; +/*-Memory Regions-*/ +define symbol __ICFEDIT_region_ROM_start__ = 0x08000000; +define symbol __ICFEDIT_region_ROM_end__ = 0x0807FFFF; +define symbol __ICFEDIT_region_RAM_start__ = 0x20000000; +define symbol __ICFEDIT_region_RAM_end__ = 0x2001FFFF; +/*-Sizes-*/ +define symbol __ICFEDIT_size_cstack__ = 0x0400; +define symbol __ICFEDIT_size_heap__ = 0x0000; +/**** End of ICF editor section. ###ICF###*/ + +define memory mem with size = 4G; +define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__]; +define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__]; + +define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; + +initialize by copy { readwrite }; +do not initialize { section .noinit }; + +place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; + +place in ROM_region { readonly }; +place in RAM_region { readwrite, last block CSTACK}; \ No newline at end of file diff --git a/bsp/stm32/stm32f411-st-nucleo/board/linker_scripts/link.lds b/bsp/stm32/stm32f411-st-nucleo/board/linker_scripts/link.lds new file mode 100644 index 0000000000..4d08a6d00e --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/board/linker_scripts/link.lds @@ -0,0 +1,144 @@ +/* + * linker script for STM32F4xx with GNU ld + * bernard.xiong 2009-10-14 + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + ROM (rx) : ORIGIN = 0x08000000, LENGTH = 512k /* 512KB flash */ + RAM (rw) : ORIGIN = 0x20000000, LENGTH = 128k /* 128K sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x200; + +SECTIONS +{ + .text : + { + . = ALIGN(4); + _stext = .; + KEEP(*(.isr_vector)) /* Startup code */ + + . = ALIGN(4); + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + + . = ALIGN(4); + _etext = .; + } > ROM = 0 + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > ROM + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >RAM + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } >RAM + + __bss_start = .; + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + + *(.bss.init) + } > RAM + __bss_end = .; + + _end = .; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} diff --git a/bsp/stm32/stm32f411-st-nucleo/board/linker_scripts/link.sct b/bsp/stm32/stm32f411-st-nucleo/board/linker_scripts/link.sct new file mode 100644 index 0000000000..5d1e3e6c00 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/board/linker_scripts/link.sct @@ -0,0 +1,15 @@ +; ************************************************************* +; *** Scatter-Loading Description File generated by uVision *** +; ************************************************************* + +LR_IROM1 0x08000000 0x00080000 { ; load region size_region + ER_IROM1 0x08000000 0x00080000 { ; load address = execution address + *.o (RESET, +First) + *(InRoot$$Sections) + .ANY (+RO) + } + RW_IRAM1 0x20000000 0x00020000 { ; RW data + .ANY (+RW +ZI) + } +} + diff --git a/bsp/stm32/stm32f411-st-nucleo/figures/board.png b/bsp/stm32/stm32f411-st-nucleo/figures/board.png new file mode 100644 index 0000000000000000000000000000000000000000..e2a4e57a7f03caab5b9ddd7b4a3b70275d3db75e GIT binary patch literal 451390 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%0Da?pj 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νYd3Up?%SiEd7LSSV?Xo(geqQ}>*JP`^X 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 literal 0 HcmV?d00001 diff --git a/bsp/stm32/stm32f411-st-nucleo/project.ewd b/bsp/stm32/stm32f411-st-nucleo/project.ewd new file mode 100644 index 0000000000..2841d18c7c --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/project.ewd @@ -0,0 +1,2834 @@ + + + 3 + + rtthread + + ARM + + 1 + + C-SPY + 2 + + 29 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 1 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 1 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 1 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 1 + + + + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 1 + + + + + + + + STLINK_ID + 2 + + 4 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 1 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + + Release + + ARM + + 0 + + C-SPY + 2 + + 29 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ARMSIM_ID + 2 + + 1 + 1 + 0 + + + + + + + + CADI_ID + 2 + + 0 + 1 + 0 + + + + + + + + + CMSISDAP_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + GDBSERVER_ID + 2 + + 0 + 1 + 0 + + + + + + + + + + + IJET_ID + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + JLINK_ID + 2 + + 16 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LMIFTDI_ID + 2 + + 2 + 1 + 0 + + + + + + + + + + PEMICRO_ID + 2 + + 3 + 1 + 0 + + + + + + + + STLINK_ID + 2 + + 4 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + THIRDPARTY_ID + 2 + + 0 + 1 + 0 + + + + + + + + TIFET_ID + 2 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + XDS100_ID + 2 + + 6 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\CMX\CmxTinyArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\embOS\embOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\Mbed\MbedArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\OpenRTOS\OpenRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\SafeRTOS\SafeRTOSPlugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\ThreadX\ThreadXArmPlugin.ENU.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\TI-RTOS\tirtosplugin.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-286-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-II\uCOS-II-KA-CSpy.ewplugin + 0 + + + $TOOLKIT_DIR$\plugins\rtos\uCOS-III\uCOS-III-KA-CSpy.ewplugin + 0 + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\TargetAccessServer\TargetAccessServer.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\uCProbe\uCProbePlugin.ENU.ewplugin + 0 + + + + diff --git a/bsp/stm32/stm32f411-st-nucleo/project.ewp b/bsp/stm32/stm32f411-st-nucleo/project.ewp new file mode 100644 index 0000000000..82d8b50b16 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/project.ewp @@ -0,0 +1,2261 @@ + + 3 + + rtthread + + 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\stm32f4xx_hal_msp.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\iar\startup_stm32f411xe.s + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_gpio.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_usart.c + + + $PROJ_DIR$\..\libraries\HAL_Drivers\drv_common.c + + + + Kernel + + $PROJ_DIR$\..\..\..\src\clock.c + + + $PROJ_DIR$\..\..\..\src\components.c + + + $PROJ_DIR$\..\..\..\src\cpu.c + + + $PROJ_DIR$\..\..\..\src\device.c + + + $PROJ_DIR$\..\..\..\src\idle.c + + + $PROJ_DIR$\..\..\..\src\ipc.c + + + $PROJ_DIR$\..\..\..\src\irq.c + + + $PROJ_DIR$\..\..\..\src\kservice.c + + + $PROJ_DIR$\..\..\..\src\mem.c + + + $PROJ_DIR$\..\..\..\src\mempool.c + + + $PROJ_DIR$\..\..\..\src\object.c + + + $PROJ_DIR$\..\..\..\src\scheduler.c + + + $PROJ_DIR$\..\..\..\src\signal.c + + + $PROJ_DIR$\..\..\..\src\thread.c + + + $PROJ_DIR$\..\..\..\src\timer.c + + + + CORTEX-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\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cec.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_crc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rng.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c + + + $PROJ_DIR$\..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_usart.c + + + diff --git a/bsp/stm32/stm32f411-st-nucleo/project.eww b/bsp/stm32/stm32f411-st-nucleo/project.eww new file mode 100644 index 0000000000..c2cb02eb1e --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/project.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\project.ewp + + + + + diff --git a/bsp/stm32/stm32f411-st-nucleo/project.uvopt b/bsp/stm32/stm32f411-st-nucleo/project.uvopt new file mode 100644 index 0000000000..b53d69d5df --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/project.uvopt @@ -0,0 +1,162 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 255 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 6 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + JL2CM3 + -U30000299 -O207 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 + + + 0 + UL2CM3 + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + +
diff --git a/bsp/stm32/stm32f411-st-nucleo/project.uvoptx b/bsp/stm32/stm32f411-st-nucleo/project.uvoptx new file mode 100644 index 0000000000..33f764fea8 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/project.uvoptx @@ -0,0 +1,947 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rtthread + 0x4 + ARM-ADS + + 12000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + ST-LINKIII-KEIL_SWO + -U066CFF535155878281155143 -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 -FF0STM32F4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F411RETx$CMSIS\Flash\STM32F4xx_512.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32F411RETx$CMSIS\Flash\STM32F4xx_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 + + + + + + Applications + 1 + 0 + 0 + 0 + + 1 + 1 + 1 + 0 + 0 + 0 + applications\main.c + main.c + 0 + 0 + + + + + Drivers + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + board\board.c + board.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + board\CubeMX_Config\Src\stm32f4xx_hal_msp.c + stm32f4xx_hal_msp.c + 0 + 0 + + + 2 + 4 + 2 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm\startup_stm32f411xe.s + startup_stm32f411xe.s + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_gpio.c + drv_gpio.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_usart.c + drv_usart.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\libraries\HAL_Drivers\drv_common.c + drv_common.c + 0 + 0 + + + + + Kernel + 0 + 0 + 0 + 0 + + 3 + 8 + 1 + 0 + 0 + 0 + ..\..\..\src\clock.c + clock.c + 0 + 0 + + + 3 + 9 + 1 + 0 + 0 + 0 + ..\..\..\src\components.c + components.c + 0 + 0 + + + 3 + 10 + 1 + 0 + 0 + 0 + ..\..\..\src\cpu.c + cpu.c + 0 + 0 + + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\src\device.c + device.c + 0 + 0 + + + 3 + 12 + 1 + 0 + 0 + 0 + ..\..\..\src\idle.c + idle.c + 0 + 0 + + + 3 + 13 + 1 + 0 + 0 + 0 + ..\..\..\src\ipc.c + ipc.c + 0 + 0 + + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\src\irq.c + irq.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\src\kservice.c + kservice.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\src\mem.c + mem.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\src\mempool.c + mempool.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\src\object.c + object.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\src\scheduler.c + scheduler.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\src\signal.c + signal.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\src\thread.c + thread.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\..\..\src\timer.c + timer.c + 0 + 0 + + + + + CORTEX-M4 + 0 + 0 + 0 + 0 + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m4\cpuport.c + cpuport.c + 0 + 0 + + + 4 + 24 + 2 + 0 + 0 + 0 + ..\..\..\libcpu\arm\cortex-m4\context_rvds.S + context_rvds.S + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\backtrace.c + backtrace.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\div0.c + div0.c + 0 + 0 + + + 4 + 27 + 1 + 0 + 0 + 0 + ..\..\..\libcpu\arm\common\showmem.c + showmem.c + 0 + 0 + + + + + DeviceDrivers + 0 + 0 + 0 + 0 + + 5 + 28 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\misc\pin.c + pin.c + 0 + 0 + + + 5 + 29 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\serial\serial.c + serial.c + 0 + 0 + + + 5 + 30 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\completion.c + completion.c + 0 + 0 + + + 5 + 31 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\dataqueue.c + dataqueue.c + 0 + 0 + + + 5 + 32 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\pipe.c + pipe.c + 0 + 0 + + + 5 + 33 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringblk_buf.c + ringblk_buf.c + 0 + 0 + + + 5 + 34 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\ringbuffer.c + ringbuffer.c + 0 + 0 + + + 5 + 35 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\waitqueue.c + waitqueue.c + 0 + 0 + + + 5 + 36 + 1 + 0 + 0 + 0 + ..\..\..\components\drivers\src\workqueue.c + workqueue.c + 0 + 0 + + + + + finsh + 0 + 0 + 0 + 0 + + 6 + 37 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\shell.c + shell.c + 0 + 0 + + + 6 + 38 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\symbol.c + symbol.c + 0 + 0 + + + 6 + 39 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\cmd.c + cmd.c + 0 + 0 + + + 6 + 40 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh.c + msh.c + 0 + 0 + + + 6 + 41 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_cmd.c + msh_cmd.c + 0 + 0 + + + 6 + 42 + 1 + 0 + 0 + 0 + ..\..\..\components\finsh\msh_file.c + msh_file.c + 0 + 0 + + + + + STM32_HAL + 0 + 0 + 0 + 0 + + 7 + 43 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c + system_stm32f4xx.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c + stm32f4xx_hal.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cec.c + stm32f4xx_hal_cec.c + 0 + 0 + + + 7 + 46 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c + stm32f4xx_hal_cortex.c + 0 + 0 + + + 7 + 47 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_crc.c + stm32f4xx_hal_crc.c + 0 + 0 + + + 7 + 48 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp.c + stm32f4xx_hal_cryp.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp_ex.c + stm32f4xx_hal_cryp_ex.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c + stm32f4xx_hal_dma.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c + stm32f4xx_hal_dma_ex.c + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c + stm32f4xx_hal_pwr.c + 0 + 0 + + + 7 + 53 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c + stm32f4xx_hal_pwr_ex.c + 0 + 0 + + + 7 + 54 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c + stm32f4xx_hal_rcc.c + 0 + 0 + + + 7 + 55 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c + stm32f4xx_hal_rcc_ex.c + 0 + 0 + + + 7 + 56 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rng.c + stm32f4xx_hal_rng.c + 0 + 0 + + + 7 + 57 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c + stm32f4xx_hal_gpio.c + 0 + 0 + + + 7 + 58 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c + stm32f4xx_hal_uart.c + 0 + 0 + + + 7 + 59 + 1 + 0 + 0 + 0 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_usart.c + stm32f4xx_hal_usart.c + 0 + 0 + + + +
diff --git a/bsp/stm32/stm32f411-st-nucleo/project.uvprojx b/bsp/stm32/stm32f411-st-nucleo/project.uvprojx new file mode 100644 index 0000000000..735e620c46 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/project.uvprojx @@ -0,0 +1,720 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rtthread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32F411RETx + STMicroelectronics + Keil.STM32F4xx_DFP.2.12.0 + http://www.keil.com/pack + IRAM(0x20000000,0x00020000) IROM(0x08000000,0x00080000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32F411RETx$CMSIS\Flash\STM32F4xx_512.FLM)) + 0 + $$Device:STM32F411RETx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h + + + + + + + + + + $$Device:STM32F411RETx$CMSIS\SVD\STM32F411xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rtthread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 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 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + USE_HAL_DRIVER, STM32F411xE + + 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\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Inc;..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Include;..\libraries\STM32F4xx_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 + + + stm32f4xx_hal_msp.c + 1 + board\CubeMX_Config\Src\stm32f4xx_hal_msp.c + + + startup_stm32f411xe.s + 2 + ..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\arm\startup_stm32f411xe.s + + + drv_gpio.c + 1 + ..\libraries\HAL_Drivers\drv_gpio.c + + + drv_usart.c + 1 + ..\libraries\HAL_Drivers\drv_usart.c + + + drv_common.c + 1 + ..\libraries\HAL_Drivers\drv_common.c + + + + + Kernel + + + clock.c + 1 + ..\..\..\src\clock.c + + + components.c + 1 + ..\..\..\src\components.c + + + cpu.c + 1 + ..\..\..\src\cpu.c + + + device.c + 1 + ..\..\..\src\device.c + + + idle.c + 1 + ..\..\..\src\idle.c + + + ipc.c + 1 + ..\..\..\src\ipc.c + + + irq.c + 1 + ..\..\..\src\irq.c + + + kservice.c + 1 + ..\..\..\src\kservice.c + + + mem.c + 1 + ..\..\..\src\mem.c + + + mempool.c + 1 + ..\..\..\src\mempool.c + + + object.c + 1 + ..\..\..\src\object.c + + + scheduler.c + 1 + ..\..\..\src\scheduler.c + + + signal.c + 1 + ..\..\..\src\signal.c + + + thread.c + 1 + ..\..\..\src\thread.c + + + timer.c + 1 + ..\..\..\src\timer.c + + + + + CORTEX-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_stm32f4xx.c + 1 + ..\libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c + + + stm32f4xx_hal.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal.c + + + stm32f4xx_hal_cec.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cec.c + + + stm32f4xx_hal_cortex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cortex.c + + + stm32f4xx_hal_crc.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_crc.c + + + stm32f4xx_hal_cryp.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp.c + + + stm32f4xx_hal_cryp_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_cryp_ex.c + + + stm32f4xx_hal_dma.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma.c + + + stm32f4xx_hal_dma_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_dma_ex.c + + + stm32f4xx_hal_pwr.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr.c + + + stm32f4xx_hal_pwr_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_pwr_ex.c + + + stm32f4xx_hal_rcc.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc.c + + + stm32f4xx_hal_rcc_ex.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rcc_ex.c + + + stm32f4xx_hal_rng.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_rng.c + + + stm32f4xx_hal_gpio.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_gpio.c + + + stm32f4xx_hal_uart.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_uart.c + + + stm32f4xx_hal_usart.c + 1 + ..\libraries\STM32F4xx_HAL\STM32F4xx_HAL_Driver\Src\stm32f4xx_hal_usart.c + + + + + + + + + + + + + +
diff --git a/bsp/stm32/stm32f411-st-nucleo/rtconfig.h b/bsp/stm32/stm32f411-st-nucleo/rtconfig.h new file mode 100644 index 0000000000..94d5708a91 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/rtconfig.h @@ -0,0 +1,171 @@ +#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 128 +#define RT_CONSOLE_DEVICE_NAME "uart2" +#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_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_STM32F4 + +/* Hardware Drivers Config */ + +#define SOC_STM32F411RE + +/* Onboard Peripheral Drivers */ + +/* On-chip Peripheral Drivers */ + +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_UART2 + +/* Board extended module Drivers */ + + +#endif diff --git a/bsp/stm32/stm32f411-st-nucleo/rtconfig.py b/bsp/stm32/stm32f411-st-nucleo/rtconfig.py new file mode 100644 index 0000000000..4d9d4450aa --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/rtconfig.py @@ -0,0 +1,134 @@ +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' + CXX = PREFIX + 'g++' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + + DEVICE = ' -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -std=c99 -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.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 + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rtthread.map --strict' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' + + CFLAGS += ' -D__MICROLIB ' + AFLAGS += ' --pd "__MICROLIB SETA 1" ' + LFLAGS += ' --library_type=microlib ' + EXEC_PATH += '/ARM/ARMCC/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iar': + # toolchains + CC = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-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/stm32f411-st-nucleo/template.ewp b/bsp/stm32/stm32f411-st-nucleo/template.ewp new file mode 100644 index 0000000000..51abb339f9 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/template.ewp @@ -0,0 +1,2032 @@ + + + 3 + + rtthread + + 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/stm32f411-st-nucleo/template.eww b/bsp/stm32/stm32f411-st-nucleo/template.eww new file mode 100644 index 0000000000..bd036bb4c9 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/template.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\template.ewp + + + + + diff --git a/bsp/stm32/stm32f411-st-nucleo/template.uvopt b/bsp/stm32/stm32f411-st-nucleo/template.uvopt new file mode 100644 index 0000000000..b53d69d5df --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/template.uvopt @@ -0,0 +1,162 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + + + + 0 + 0 + + + + rt-thread + 0x4 + ARM-ADS + + 25000000 + + 1 + 1 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\build\keil\List\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 0 + 0 + 1 + + 255 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 6 + + + + + + + + + + + Segger\JL2CM3.dll + + + + 0 + JL2CM3 + -U30000299 -O207 -S0 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8001 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000 + + + 0 + UL2CM3 + UL2CM3(-O207 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0STM32F4xx_1024 -FS08000000 -FL0100000) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + +
diff --git a/bsp/stm32/stm32f411-st-nucleo/template.uvoptx b/bsp/stm32/stm32f411-st-nucleo/template.uvoptx new file mode 100644 index 0000000000..f42ac67b9d --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/template.uvoptx @@ -0,0 +1,191 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + rtthread + 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 + -U066CFF535155878281155143 -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 -FF0STM32F4xx_512.FLM -FS08000000 -FL080000 -FP0($$Device:STM32F411RETx$CMSIS\Flash\STM32F4xx_512.FLM) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32F411RETx$CMSIS\Flash\STM32F4xx_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/stm32f411-st-nucleo/template.uvprojx b/bsp/stm32/stm32f411-st-nucleo/template.uvprojx new file mode 100644 index 0000000000..cda776d330 --- /dev/null +++ b/bsp/stm32/stm32f411-st-nucleo/template.uvprojx @@ -0,0 +1,393 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + rtthread + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32F411RETx + STMicroelectronics + Keil.STM32F4xx_DFP.2.12.0 + http://www.keil.com/pack + IRAM(0x20000000,0x00020000) IROM(0x08000000,0x00080000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE + + + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32F4xx_512 -FS08000000 -FL080000 -FP0($$Device:STM32F411RETx$CMSIS\Flash\STM32F4xx_512.FLM)) + 0 + $$Device:STM32F411RETx$Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h + + + + + + + + + + $$Device:STM32F411RETx$CMSIS\SVD\STM32F411xx.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\build\keil\Obj\ + rtthread + 1 + 0 + 0 + 1 + 0 + .\build\keil\List\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + fromelf --bin !L --output rtthread.bin + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4096 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 8 + 0 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x20000 + + + 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 + 0x20000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 2 + 0 + 0 + 1 + 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 f717dd5f44cbe773efcbddc8adc7ba9a07146087 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Tue, 8 Jan 2019 14:20:23 +0800 Subject: [PATCH 11/15] [bsp][stm32] update README.md --- bsp/stm32/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/bsp/stm32/README.md b/bsp/stm32/README.md index a79e692510..1021fbdf8a 100644 --- a/bsp/stm32/README.md +++ b/bsp/stm32/README.md @@ -11,6 +11,7 @@ STM32 系列 BSP 目前支持情况如下表所示: | [stm32f103-fire-arbitrary](stm32f103-fire-arbitrary/) | 野火 F103 霸道开发板 | | **F4 系列** | | | [stm32f407-st-discovery](stm32f407-st-discovery/) | ST 官方 stm32f407-discovery 开发板 | +| [stm32f411-st-nucleo](stm32f411-st-nucleo/) | ST 官方 STM32F411-Nucleo-64 开发板 | | [stm32f407-atk-explorer](stm32f407-atk-explorer/) | 正点原子 F407 探索者开发板 | | [stm32f429-atk-apollo](stm32f429-atk-apollo/) | 正点原子 F429 阿波罗开发板 | | [stm32f429-fire-challenger](stm32f429-fire-challenger/) | 野火 F429 挑战者开发板 | From f39797090309101ccb5150dcadc95befb0cc2b1e Mon Sep 17 00:00:00 2001 From: SummerGift Date: Tue, 8 Jan 2019 14:53:02 +0800 Subject: [PATCH 12/15] [bsp][stm32] add ci for stm32f411-st-nucleo bsp --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 1c16bf683d..fde8606ac3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -86,6 +86,7 @@ env: - RTT_BSP='stm32/stm32f103-fire-arbitrary' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32f407-atk-explorer' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32f407-st-discovery' RTT_TOOL_CHAIN='sourcery-arm' + - RTT_BSP='stm32/stm32f411-st-nucleo' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32f429-armfly-v6' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32f429-atk-apollo' RTT_TOOL_CHAIN='sourcery-arm' - RTT_BSP='stm32/stm32f429-fire-challenger' RTT_TOOL_CHAIN='sourcery-arm' From c1ce319f930eb04b7461a7c9192dd0adbd232d4e Mon Sep 17 00:00:00 2001 From: SummerGift Date: Tue, 8 Jan 2019 18:15:27 +0800 Subject: [PATCH 13/15] [bsp][stm32] optimize Kconfig file --- bsp/stm32/stm32f091-st-nucleo/board/Kconfig | 2 +- bsp/stm32/stm32l475-atk-pandora/board/Kconfig | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bsp/stm32/stm32f091-st-nucleo/board/Kconfig b/bsp/stm32/stm32f091-st-nucleo/board/Kconfig index 745a331f31..4fe2365ebc 100644 --- a/bsp/stm32/stm32f091-st-nucleo/board/Kconfig +++ b/bsp/stm32/stm32f091-st-nucleo/board/Kconfig @@ -9,7 +9,7 @@ menu "Onboard Peripheral Drivers" config BSP_USING_USB_TO_USART bool "Enable USB TO USART (uart2)" - select BSP_USING_UART + select BSP_USING_UART select BSP_USING_UART2 default y diff --git a/bsp/stm32/stm32l475-atk-pandora/board/Kconfig b/bsp/stm32/stm32l475-atk-pandora/board/Kconfig index 0ec5631f1a..afe8fe2f5e 100644 --- a/bsp/stm32/stm32l475-atk-pandora/board/Kconfig +++ b/bsp/stm32/stm32l475-atk-pandora/board/Kconfig @@ -51,7 +51,7 @@ menu "On-chip Peripheral Drivers" bool "Enable UART1 RX DMA" depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA default n - + config BSP_USING_UART2 bool "Enable UART2" default n From 0032fff1d24aa06063000bdfc2ebecf5a030e0e3 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Tue, 8 Jan 2019 18:15:59 +0800 Subject: [PATCH 14/15] [bsp][stm32] remove useless configuration --- .../libraries/templates/stm32l4xx/board/Kconfig | 2 +- bsp/stm32/stm32f103-atk-nano/board/Kconfig | 15 --------------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/bsp/stm32/libraries/templates/stm32l4xx/board/Kconfig b/bsp/stm32/libraries/templates/stm32l4xx/board/Kconfig index a06a967059..e16439982f 100644 --- a/bsp/stm32/libraries/templates/stm32l4xx/board/Kconfig +++ b/bsp/stm32/libraries/templates/stm32l4xx/board/Kconfig @@ -44,7 +44,7 @@ menu "On-chip Peripheral Drivers" bool "Enable SPI1 TX DMA" depends on BSP_USING_SPI1 default n - + config BSP_SPI1_RX_USING_DMA bool "Enable SPI1 RX DMA" depends on BSP_USING_SPI1 diff --git a/bsp/stm32/stm32f103-atk-nano/board/Kconfig b/bsp/stm32/stm32f103-atk-nano/board/Kconfig index 3c49481a23..e7873048cf 100644 --- a/bsp/stm32/stm32f103-atk-nano/board/Kconfig +++ b/bsp/stm32/stm32f103-atk-nano/board/Kconfig @@ -73,21 +73,6 @@ menu "On-chip Peripheral Drivers" depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA default n endif - - 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 menuconfig BSP_USING_TIM bool "Enable timer" From 0d025a69e62895a720da602ae85397f7e50acb39 Mon Sep 17 00:00:00 2001 From: SummerGift Date: Tue, 8 Jan 2019 18:19:11 +0800 Subject: [PATCH 15/15] [bsp][stm32] fix bug in dma config && clean up the dma config code --- .../HAL_Drivers/config/f0/dma_config.h | 37 +- .../HAL_Drivers/config/f0/uart_config.h | 12 +- .../HAL_Drivers/config/f1/dma_config.h | 46 +- .../HAL_Drivers/config/f1/uart_config.h | 24 +- .../HAL_Drivers/config/f4/dma_config.h | 374 +++++++--------- .../HAL_Drivers/config/f7/dma_config.h | 402 ++++++++---------- .../HAL_Drivers/config/l4/dma_config.h | 146 +++---- .../HAL_Drivers/config/l4/qspi_config.h | 2 +- .../HAL_Drivers/config/l4/uart_config.h | 18 +- 9 files changed, 443 insertions(+), 618 deletions(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f0/dma_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f0/dma_config.h index a883c86fdc..1c44c20531 100644 --- a/bsp/stm32/libraries/HAL_Drivers/config/f0/dma_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/config/f0/dma_config.h @@ -6,6 +6,7 @@ * Change Logs: * Date Author Notes * 2018-01-05 zylx first version + * 2019-01-08 SummerGift clean up the code */ #ifndef __DMA_CONFIG_H__ @@ -13,30 +14,24 @@ #include -/* dma1 channel1 */ - -/* dma1 channel1 */ - -/* dma1 channel2-3 DMA2 channel1-2 */ -#if defined(BSP_UART1_RX_USING_DMA) && !defined(UART1_RX_DMA_CHANNEL) -#define USART1_DMA_RX_IRQHandler DMA1_Ch2_3_DMA2_Ch1_2_IRQHandler -#define USART1_RX_DMA_RCC RCC_AHBENR_DMA1EN -#define USART1_RX_DMA_INSTANCE DMA1_Channel3 -#define USART1_RX_DMA_IRQ DMA1_Ch2_3_DMA2_Ch1_2_IRQn +/* DMA1 channel1 */ +/* DMA1 channel2-3 DMA2 channel1-2 */ +#if defined(BSP_UART1_RX_USING_DMA) && !defined(UART1_RX_DMA_INSTANCE) +#define UART1_DMA_RX_IRQHandler DMA1_Ch2_3_DMA2_Ch1_2_IRQHandler +#define UART1_RX_DMA_RCC RCC_AHBENR_DMA1EN +#define UART1_RX_DMA_INSTANCE DMA1_Channel3 +#define UART1_RX_DMA_IRQ DMA1_Ch2_3_DMA2_Ch1_2_IRQn #endif -/* dma1 channel2-3 DMA2 channel1-2 */ - -/* dma1 channel4-7 DMA2 channel3-5 */ -#if defined(BSP_UART2_RX_USING_DMA) && !defined(UART2_RX_DMA_CHANNEL) -#define USART2_DMA_RX_IRQHandler DMA1_Ch4_7_DMA2_Ch3_5_IRQHandler -#define USART2_RX_DMA_RCC RCC_AHBENR_DMA1EN -#define USART2_RX_DMA_INSTANCE DMA1_Channel5 -#define USART2_RX_DMA_IRQ DMA1_Ch4_7_DMA2_Ch3_5_IRQn +/* DMA1 channel2-3 DMA2 channel1-2 */ +/* DMA1 channel4-7 DMA2 channel3-5 */ +#if defined(BSP_UART2_RX_USING_DMA) && !defined(UART2_RX_DMA_INSTANCE) +#define UART2_DMA_RX_IRQHandler DMA1_Ch4_7_DMA2_Ch3_5_IRQHandler +#define UART2_RX_DMA_RCC RCC_AHBENR_DMA1EN +#define UART2_RX_DMA_INSTANCE DMA1_Channel5 +#define UART2_RX_DMA_IRQ DMA1_Ch4_7_DMA2_Ch3_5_IRQn #endif -/* dma1 channel4-7 DMA2 channel3-5 */ - - +/* DMA1 channel4-7 DMA2 channel3-5 */ #endif /* __DMA_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f0/uart_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f0/uart_config.h index 64ad12adf4..9ef9b2ba67 100644 --- a/bsp/stm32/libraries/HAL_Drivers/config/f0/uart_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/config/f0/uart_config.h @@ -28,9 +28,9 @@ #ifndef UART1_DMA_CONFIG #define UART1_DMA_CONFIG \ { \ - .Instance = USART1_RX_DMA_INSTANCE, \ - .dma_rcc = USART1_RX_DMA_RCC, \ - .dma_irq = USART1_RX_DMA_IRQ, \ + .Instance = UART1_RX_DMA_INSTANCE, \ + .dma_rcc = UART1_RX_DMA_RCC, \ + .dma_irq = UART1_RX_DMA_IRQ, \ } #endif /* UART1_DMA_CONFIG */ #endif /* BSP_UART1_RX_USING_DMA */ @@ -50,9 +50,9 @@ #ifndef UART2_DMA_CONFIG #define UART2_DMA_CONFIG \ { \ - .Instance = USART2_RX_DMA_INSTANCE, \ - .dma_rcc = USART2_RX_DMA_RCC, \ - .dma_irq = USART2_RX_DMA_IRQ, \ + .Instance = UART2_RX_DMA_INSTANCE, \ + .dma_rcc = UART2_RX_DMA_RCC, \ + .dma_irq = UART2_RX_DMA_IRQ, \ } #endif /* UART2_DMA_CONFIG */ #endif /* BSP_UART2_RX_USING_DMA */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f1/dma_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f1/dma_config.h index d073838d44..0b6b0550a4 100644 --- a/bsp/stm32/libraries/HAL_Drivers/config/f1/dma_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/config/f1/dma_config.h @@ -6,6 +6,7 @@ * Change Logs: * Date Author Notes * 2018-01-02 SummerGift first version + * 2019-01-08 SummerGift clean up the code */ #ifndef __DMA_CONFIG_H__ @@ -15,7 +16,7 @@ /* DMA1 channel1 */ /* DMA1 channel2 */ -#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_CHANNEL) +#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_INSTANCE) #define SPI1_DMA_RX_IRQHandler DMA1_Channel2_IRQHandler #define SPI1_RX_DMA_RCC RCC_AHBENR_DMA1EN #define SPI1_RX_DMA_INSTANCE DMA1_Channel2 @@ -23,21 +24,20 @@ #endif /* DMA1 channel3 */ -#if defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_CHANNEL) +#if defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_INSTANCE) #define SPI1_DMA_TX_IRQHandler DMA1_Channel3_IRQHandler #define SPI1_TX_DMA_RCC RCC_AHBENR_DMA1EN #define SPI1_TX_DMA_INSTANCE DMA1_Channel3 #define SPI1_TX_DMA_IRQ DMA1_Channel3_IRQn - -#elif defined(BSP_UART3_RX_USING_DMA) && !defined(UART3_RX_DMA_CHANNEL) -#define USART3_DMA_RX_IRQHandler DMA1_Channel3_IRQHandler -#define USART3_RX_DMA_RCC RCC_AHBENR_DMA1EN -#define USART3_RX_DMA_INSTANCE DMA1_Channel3 -#define USART3_RX_DMA_IRQ DMA1_Channel3_IRQn +#elif defined(BSP_UART3_RX_USING_DMA) && !defined(UART3_RX_DMA_INSTANCE) +#define UART3_DMA_RX_IRQHandler DMA1_Channel3_IRQHandler +#define UART3_RX_DMA_RCC RCC_AHBENR_DMA1EN +#define UART3_RX_DMA_INSTANCE DMA1_Channel3 +#define UART3_RX_DMA_IRQ DMA1_Channel3_IRQn #endif /* DMA1 channel4 */ -#if defined(BSP_SPI2_RX_USING_DMA) && !defined(SPI2_RX_DMA_CHANNEL) +#if defined(BSP_SPI2_RX_USING_DMA) && !defined(SPI2_RX_DMA_INSTANCE) #define SPI2_DMA_RX_IRQHandler DMA1_Channel4_IRQHandler #define SPI2_RX_DMA_RCC RCC_AHBENR_DMA1EN #define SPI2_RX_DMA_INSTANCE DMA1_Channel4 @@ -45,32 +45,31 @@ #endif /* DMA1 channel5 */ -#if defined(BSP_SPI2_TX_USING_DMA) && !defined(SPI2_TX_DMA_CHANNEL) +#if defined(BSP_SPI2_TX_USING_DMA) && !defined(SPI2_TX_DMA_INSTANCE) #define SPI2_DMA_TX_IRQHandler DMA1_Channel5_IRQHandler #define SPI2_TX_DMA_RCC RCC_AHBENR_DMA1EN #define SPI2_TX_DMA_INSTANCE DMA1_Channel5 #define SPI2_TX_DMA_IRQ DMA1_Channel5_IRQn -#elif defined(BSP_UART1_RX_USING_DMA) && !defined(UART1_RX_DMA_CHANNEL) -#define USART1_DMA_RX_IRQHandler DMA1_Channel5_IRQHandler -#define USART1_RX_DMA_RCC RCC_AHBENR_DMA1EN -#define USART1_RX_DMA_INSTANCE DMA1_Channel5 -#define USART1_RX_DMA_IRQ DMA1_Channel5_IRQn +#elif defined(BSP_UART1_RX_USING_DMA) && !defined(UART1_RX_DMA_INSTANCE) +#define UART1_DMA_RX_IRQHandler DMA1_Channel5_IRQHandler +#define UART1_RX_DMA_RCC RCC_AHBENR_DMA1EN +#define UART1_RX_DMA_INSTANCE DMA1_Channel5 +#define UART1_RX_DMA_IRQ DMA1_Channel5_IRQn #endif /* DMA1 channel6 */ -#if defined(BSP_UART2_RX_USING_DMA) && !defined(UART2_RX_DMA_CHANNEL) -#define USART2_DMA_RX_IRQHandler DMA1_Channel6_IRQHandler -#define USART2_RX_DMA_RCC RCC_AHBENR_DMA1EN -#define USART2_RX_DMA_INSTANCE DMA1_Channel6 -#define USART2_RX_DMA_IRQ DMA1_Channel6_IRQn +#if defined(BSP_UART2_RX_USING_DMA) && !defined(UART2_RX_DMA_INSTANCE) +#define UART2_DMA_RX_IRQHandler DMA1_Channel6_IRQHandler +#define UART2_RX_DMA_RCC RCC_AHBENR_DMA1EN +#define UART2_RX_DMA_INSTANCE DMA1_Channel6 +#define UART2_RX_DMA_IRQ DMA1_Channel6_IRQn #endif - /* DMA1 channel7 */ /* DMA2 channel1 */ -#if defined(BSP_SPI3_RX_USING_DMA) && !defined(SPI3_RX_DMA_CHANNEL) +#if defined(BSP_SPI3_RX_USING_DMA) && !defined(SPI3_RX_DMA_INSTANCE) #define SPI3_DMA_RX_IRQHandler DMA2_Channel1_IRQHandler #define SPI3_RX_DMA_RCC RCC_AHBENR_DMA2EN #define SPI3_RX_DMA_INSTANCE DMA2_Channel1 @@ -78,12 +77,11 @@ #endif /* DMA2 channel2 */ -#if defined(BSP_SPI3_TX_USING_DMA) && !defined(SPI3_TX_DMA_CHANNEL) +#if defined(BSP_SPI3_TX_USING_DMA) && !defined(SPI3_TX_DMA_INSTANCE) #define SPI3_DMA_TX_IRQHandler DMA2_Channel2_IRQHandler #define SPI3_TX_DMA_RCC RCC_AHBENR_DMA2EN #define SPI3_TX_DMA_INSTANCE DMA2_Channel2 #define SPI3_TX_DMA_IRQ DMA2_Channel2_IRQn -/* DMA1 channel4 */ #endif /* DMA2 channel3 */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f1/uart_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f1/uart_config.h index f7c5f41f9b..bdfafee744 100644 --- a/bsp/stm32/libraries/HAL_Drivers/config/f1/uart_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/config/f1/uart_config.h @@ -30,9 +30,9 @@ #ifndef UART1_DMA_CONFIG #define UART1_DMA_CONFIG \ { \ - .Instance = USART1_RX_DMA_INSTANCE, \ - .dma_rcc = USART1_RX_DMA_RCC, \ - .dma_irq = USART1_RX_DMA_IRQ, \ + .Instance = UART1_RX_DMA_INSTANCE, \ + .dma_rcc = UART1_RX_DMA_RCC, \ + .dma_irq = UART1_RX_DMA_IRQ, \ } #endif /* UART1_DMA_CONFIG */ #endif /* BSP_UART1_RX_USING_DMA */ @@ -52,9 +52,9 @@ #ifndef UART2_DMA_CONFIG #define UART2_DMA_CONFIG \ { \ - .Instance = USART2_RX_DMA_INSTANCE, \ - .dma_rcc = USART2_RX_DMA_RCC, \ - .dma_irq = USART2_RX_DMA_IRQ, \ + .Instance = UART2_RX_DMA_INSTANCE, \ + .dma_rcc = UART2_RX_DMA_RCC, \ + .dma_irq = UART2_RX_DMA_IRQ, \ } #endif /* UART2_DMA_CONFIG */ #endif /* BSP_UART2_RX_USING_DMA */ @@ -74,9 +74,9 @@ #ifndef UART3_DMA_CONFIG #define UART3_DMA_CONFIG \ { \ - .Instance = USART3_RX_DMA_INSTANCE, \ - .dma_rcc = USART3_RX_DMA_RCC, \ - .dma_irq = USART3_RX_DMA_IRQ, \ + .Instance = UART3_RX_DMA_INSTANCE, \ + .dma_rcc = UART3_RX_DMA_RCC, \ + .dma_irq = UART3_RX_DMA_IRQ, \ } #endif /* UART3_DMA_CONFIG */ #endif /* BSP_UART3_RX_USING_DMA */ @@ -96,9 +96,9 @@ #ifndef UART4_DMA_CONFIG #define UART4_DMA_CONFIG \ { \ - .Instance = USART4_RX_DMA_INSTANCE, \ - .dma_rcc = USART4_RX_DMA_RCC, \ - .dma_irq = USART4_RX_DMA_IRQ, \ + .Instance = UART4_RX_DMA_INSTANCE, \ + .dma_rcc = UART4_RX_DMA_RCC, \ + .dma_irq = UART4_RX_DMA_IRQ, \ } #endif /* UART4_DMA_CONFIG */ #endif /* BSP_UART4_RX_USING_DMA */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f4/dma_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f4/dma_config.h index e8cec06fa7..9eb55f2b9a 100644 --- a/bsp/stm32/libraries/HAL_Drivers/config/f4/dma_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/config/f4/dma_config.h @@ -5,7 +5,8 @@ * * Change Logs: * Date Author Notes - * 2018-01-02 zylx first version + * 2019-01-02 zylx first version + * 2019-01-08 SummerGift clean up the code */ #ifndef __DMA_CONFIG_H__ @@ -13,255 +14,196 @@ #include -/* dma1 stream0 */ -#if defined(BSP_SPI3_RX_USING_DMA) && !defined(SPI3_RX_DMA_CHANNEL) - -#define SPI3_DMA_RX_IRQHandler DMA1_Stream0_IRQHandler -#define SPI3_RX_DMA_RCC RCC_AHB1ENR_DMA1EN -#define SPI3_RX_DMA_INSTANCE DMA1_Stream0 -#define SPI3_RX_DMA_CHANNEL DMA_CHANNEL_0 -#define SPI3_RX_DMA_IRQ DMA1_Stream0_IRQn - -#elif defined(BSP_UART5_RX_USING_DMA) && !defined(UART5_RX_DMA_CHANNEL) +/* DMA1 stream0 */ +#if defined(BSP_SPI3_RX_USING_DMA) && !defined(SPI3_RX_DMA_INSTANCE) +#define SPI3_DMA_RX_IRQHandler DMA1_Stream0_IRQHandler +#define SPI3_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI3_RX_DMA_INSTANCE DMA1_Stream0 +#define SPI3_RX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI3_RX_DMA_IRQ DMA1_Stream0_IRQn +#elif defined(BSP_UART5_RX_USING_DMA) && !defined(UART5_RX_DMA_INSTANCE) #define UART5_DMA_RX_IRQHandler DMA1_Stream0_IRQHandler #define UART5_RX_DMA_RCC RCC_AHB1ENR_DMA1EN #define UART5_RX_DMA_INSTANCE DMA1_Stream0 #define UART5_RX_DMA_CHANNEL DMA_CHANNEL_4 #define UART5_RX_DMA_IRQ DMA1_Stream0_IRQn - #endif -/* dma1 stream0 */ -/* dma1 stream1 */ -#if defined(BSP_UART3_RX_USING_DMA) && !defined(UART3_RX_DMA_CHANNEL) +/* DMA1 stream1 */ +#if defined(BSP_UART3_RX_USING_DMA) && !defined(UART3_RX_DMA_INSTANCE) #define UART3_DMA_RX_IRQHandler DMA1_Stream1_IRQHandler #define UART3_RX_DMA_RCC RCC_AHB1ENR_DMA1EN #define UART3_RX_DMA_INSTANCE DMA1_Stream1 #define UART3_RX_DMA_CHANNEL DMA_CHANNEL_4 #define UART3_RX_DMA_IRQ DMA1_Stream1_IRQn - #endif -/* dma1 stream1 */ -/* dma1 stream2 */ -#if defined(BSP_SPI3_RX_USING_DMA) && !defined(SPI3_RX_DMA_CHANNEL) - -#define SPI3_DMA_RX_IRQHandler DMA1_Stream2_IRQHandler -#define SPI3_RX_DMA_RCC RCC_AHB1ENR_DMA1EN -#define SPI3_RX_DMA_INSTANCE DMA1_Stream2 -#define SPI3_RX_DMA_CHANNEL DMA_CHANNEL_0 -#define SPI3_RX_DMA_IRQ DMA1_Stream2_IRQn - -#elif defined(BSP_UART4_RX_USING_DMA) && !defined(UART4_RX_DMA_CHANNEL) +/* DMA1 stream2 */ +#if defined(BSP_SPI3_RX_USING_DMA) && !defined(SPI3_RX_DMA_INSTANCE) +#define SPI3_DMA_RX_IRQHandler DMA1_Stream2_IRQHandler +#define SPI3_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI3_RX_DMA_INSTANCE DMA1_Stream2 +#define SPI3_RX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI3_RX_DMA_IRQ DMA1_Stream2_IRQn +#elif defined(BSP_UART4_RX_USING_DMA) && !defined(UART4_RX_DMA_INSTANCE) #define UART4_DMA_RX_IRQHandler DMA1_Stream2_IRQHandler #define UART4_RX_DMA_RCC RCC_AHB1ENR_DMA1EN #define UART4_RX_DMA_INSTANCE DMA1_Stream2 #define UART4_RX_DMA_CHANNEL DMA_CHANNEL_4 #define UART4_RX_DMA_IRQ DMA1_Stream2_IRQn - #endif -/* dma1 stream2 */ - -/* dma1 stream3 */ -#if defined(BSP_SPI2_RX_USING_DMA) && !defined(SPI2_RX_DMA_CHANNEL) - -#define SPI2_DMA_RX_IRQHandler DMA1_Stream3_IRQHandler -#define SPI2_RX_DMA_RCC RCC_AHB1ENR_DMA1EN -#define SPI2_RX_DMA_INSTANCE DMA1_Stream3 -#define SPI2_RX_DMA_CHANNEL DMA_CHANNEL_0 -#define SPI2_RX_DMA_IRQ DMA1_Stream3_IRQn +/* DMA1 stream3 */ +#if defined(BSP_SPI2_RX_USING_DMA) && !defined(SPI2_RX_DMA_INSTANCE) +#define SPI2_DMA_RX_IRQHandler DMA1_Stream3_IRQHandler +#define SPI2_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI2_RX_DMA_INSTANCE DMA1_Stream3 +#define SPI2_RX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI2_RX_DMA_IRQ DMA1_Stream3_IRQn #endif -/* dma1 stream3 */ - -/* dma1 stream4 */ -#if defined(BSP_SPI2_TX_USING_DMA) && !defined(SPI2_TX_DMA_CHANNEL) - -#define SPI2_DMA_TX_IRQHandler DMA1_Stream4_IRQHandler -#define SPI2_TX_DMA_RCC RCC_AHB1ENR_DMA1EN -#define SPI2_TX_DMA_INSTANCE DMA1_Stream4 -#define SPI2_TX_DMA_CHANNEL DMA_CHANNEL_0 -#define SPI2_TX_DMA_IRQ DMA1_Stream4_IRQn +/* DMA1 stream4 */ +#if defined(BSP_SPI2_TX_USING_DMA) && !defined(SPI2_TX_DMA_INSTANCE) +#define SPI2_DMA_TX_IRQHandler DMA1_Stream4_IRQHandler +#define SPI2_TX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI2_TX_DMA_INSTANCE DMA1_Stream4 +#define SPI2_TX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI2_TX_DMA_IRQ DMA1_Stream4_IRQn #endif -/* dma1 stream4 */ -/* dma1 stream5 */ -#if defined(BSP_SPI3_TX_USING_DMA) && !defined(SPI3_TX_DMA_CHANNEL) - -#define SPI3_DMA_TX_IRQHandler DMA1_Stream5_IRQHandler -#define SPI3_TX_DMA_RCC RCC_AHB1ENR_DMA1EN -#define SPI3_TX_DMA_INSTANCE DMA1_Stream5 -#define SPI3_TX_DMA_CHANNEL DMA_CHANNEL_0 -#define SPI3_TX_DMA_IRQ DMA1_Stream5_IRQn - -#elif defined(BSP_UART2_RX_USING_DMA) && !defined(UART2_RX_DMA_CHANNEL) +/* DMA1 stream5 */ +#if defined(BSP_SPI3_TX_USING_DMA) && !defined(SPI3_TX_DMA_INSTANCE) +#define SPI3_DMA_TX_IRQHandler DMA1_Stream5_IRQHandler +#define SPI3_TX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI3_TX_DMA_INSTANCE DMA1_Stream5 +#define SPI3_TX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI3_TX_DMA_IRQ DMA1_Stream5_IRQn +#elif defined(BSP_UART2_RX_USING_DMA) && !defined(UART2_RX_DMA_INSTANCE) #define UART2_DMA_RX_IRQHandler DMA1_Stream5_IRQHandler #define UART2_RX_DMA_RCC RCC_AHB1ENR_DMA1EN #define UART2_RX_DMA_INSTANCE DMA1_Stream5 #define UART2_RX_DMA_CHANNEL DMA_CHANNEL_4 #define UART2_RX_DMA_IRQ DMA1_Stream5_IRQn - -#endif -/* dma1 stream5 */ - -/* dma1 stream6 */ -/* dma1 stream6 */ - -/* dma1 stream7 */ -#if defined(BSP_SPI3_TX_USING_DMA) && !defined(SPI3_TX_DMA_CHANNEL) - -#define SPI3_DMA_TX_IRQHandler DMA1_Stream7_IRQHandler -#define SPI3_TX_DMA_RCC RCC_AHB1ENR_DMA1EN -#define SPI3_TX_DMA_INSTANCE DMA1_Stream7 -#define SPI3_TX_DMA_CHANNEL DMA_CHANNEL_0 -#define SPI3_TX_DMA_IRQ DMA1_Stream7_IRQn - -#endif -/* dma1 stream7 */ - -/* dma2 stream0 */ -#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_CHANNEL) - -#define SPI1_DMA_RX_IRQHandler DMA2_Stream0_IRQHandler -#define SPI1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI1_RX_DMA_INSTANCE DMA2_Stream0 -#define SPI1_RX_DMA_CHANNEL DMA_CHANNEL_3 -#define SPI1_RX_DMA_IRQ DMA2_Stream0_IRQn - -#elif defined(BSP_SPI4_TX_USING_DMA) && !defined(SPI4_TX_DMA_CHANNEL) - -#define SPI4_DMA_TX_IRQHandler DMA2_Stream0_IRQHandler -#define SPI4_TX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI4_TX_DMA_INSTANCE DMA2_Stream0 -#define SPI4_TX_DMA_CHANNEL DMA_CHANNEL_4 -#define SPI4_TX_DMA_IRQ DMA2_Stream0_IRQn - -#endif -/* dma2 stream0 */ - -/* dma2 stream1 */ -#if defined(BSP_SPI4_TX_USING_DMA) && !defined(SPI4_TX_DMA_CHANNEL) - -#define SPI4_DMA_TX_IRQHandler DMA2_Stream1_IRQHandler -#define SPI4_TX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI4_TX_DMA_INSTANCE DMA2_Stream1 -#define SPI4_TX_DMA_CHANNEL DMA_CHANNEL_4 -#define SPI4_TX_DMA_IRQ DMA2_Stream1_IRQn - -#endif -/* dma2 stream1 */ - -/* dma2 stream2 */ -#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_CHANNEL) - -#define SPI1_DMA_RX_IRQHandler DMA2_Stream2_IRQHandler -#define SPI1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI1_RX_DMA_INSTANCE DMA2_Stream2 -#define SPI1_RX_DMA_CHANNEL DMA_CHANNEL_3 -#define SPI1_RX_DMA_IRQ DMA2_Stream2_IRQn - -#elif defined(BSP_UART1_RX_USING_DMA) && !defined(USART1_RX_DMA_CHANNEL) - -#define USART1_DMA_RX_IRQHandler DMA2_Stream2_IRQHandler -#define USART1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define USART1_RX_DMA_INSTANCE DMA2_Stream2 -#define USART1_RX_DMA_CHANNEL DMA_CHANNEL_4 -#define USART1_RX_DMA_IRQ DMA2_Stream2_IRQn - -#endif -/* dma2 stream2 */ - -/* dma2 stream3 */ -#if defined(BSP_SPI5_RX_USING_DMA) && !defined(SPI5_RX_DMA_CHANNEL) - -#define SPI5_DMA_RX_IRQHandler DMA2_Stream3_IRQHandler -#define SPI5_RX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI5_RX_DMA_INSTANCE DMA2_Stream3 -#define SPI5_RX_DMA_CHANNEL DMA_CHANNEL_2 -#define SPI5_RX_DMA_IRQ DMA2_Stream3_IRQn - -#elif defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_CHANNEL) - -#define SPI1_DMA_TX_IRQHandler DMA2_Stream3_IRQHandler -#define SPI1_TX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI1_TX_DMA_INSTANCE DMA2_Stream3 -#define SPI1_TX_DMA_CHANNEL DMA_CHANNEL_3 -#define SPI1_TX_DMA_IRQ DMA2_Stream3_IRQn - -#elif defined(BSP_SPI4_TX_USING_DMA) && !defined(SPI4_TX_DMA_CHANNEL) - -#define SPI4_DMA_TX_IRQHandler DMA2_Stream3_IRQHandler -#define SPI4_TX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI4_TX_DMA_INSTANCE DMA2_Stream3 -#define SPI4_TX_DMA_CHANNEL DMA_CHANNEL_5 -#define SPI4_TX_DMA_IRQ DMA2_Stream3_IRQn - -#endif -/* dma2 stream3 */ - -/* dma2 stream4 */ -#if defined(BSP_SPI5_TX_USING_DMA) && !defined(SPI5_TX_DMA_CHANNEL) - -#define SPI5_DMA_TX_IRQHandler DMA2_Stream4_IRQHandler -#define SPI5_TX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI5_TX_DMA_INSTANCE DMA2_Stream4 -#define SPI5_TX_DMA_CHANNEL DMA_CHANNEL_2 -#define SPI5_TX_DMA_IRQ DMA2_Stream4_IRQn - -#elif defined(BSP_SPI4_TX_USING_DMA) && !defined(SPI4_TX_DMA_CHANNEL) - -#define SPI4_DMA_TX_IRQHandler DMA2_Stream4_IRQHandler -#define SPI4_TX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI4_TX_DMA_INSTANCE DMA2_Stream4 -#define SPI4_TX_DMA_CHANNEL DMA_CHANNEL_5 -#define SPI4_TX_DMA_IRQ DMA2_Stream4_IRQn - -#endif -/* dma2 stream4 */ - -/* dma2 stream5 */ -#if defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_CHANNEL) - -#define SPI1_DMA_TX_IRQHandler DMA2_Stream5_IRQHandler -#define SPI1_TX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI1_TX_DMA_INSTANCE DMA2_Stream5 -#define SPI1_TX_DMA_CHANNEL DMA_CHANNEL_3 -#define SPI1_TX_DMA_IRQ DMA2_Stream5_IRQn - -#elif defined(BSP_UART1_RX_USING_DMA) && !defined(USART1_RX_DMA_CHANNEL) - -#define USART1_DMA_RX_IRQHandler DMA2_Stream5_IRQHandler -#define USART1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define USART1_RX_DMA_INSTANCE DMA2_Stream5 -#define USART1_RX_DMA_CHANNEL DMA_CHANNEL_4 -#define USART1_RX_DMA_IRQ DMA2_Stream5_IRQn - -#elif defined(BSP_SPI5_RX_USING_DMA) && !defined(SPI5_RX_DMA_CHANNEL) - -#define SPI5_DMA_RX_IRQHandler DMA2_Stream5_IRQHandler -#define SPI5_RX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI5_RX_DMA_INSTANCE DMA2_Stream5 -#define SPI5_RX_DMA_CHANNEL DMA_CHANNEL_7 -#define SPI5_RX_DMA_IRQ DMA2_Stream5_IRQn - #endif -/* dma2 stream5 */ - -/* dma2 stream6 */ -#if defined(BSP_SPI5_TX_USING_DMA) && !defined(SPI5_TX_DMA_CHANNEL) - -#define SPI5_DMA_TX_IRQHandler DMA2_Stream6_IRQHandler -#define SPI5_TX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI5_TX_DMA_INSTANCE DMA2_Stream6 -#define SPI5_TX_DMA_CHANNEL DMA_CHANNEL_7 -#define SPI5_TX_DMA_IRQ DMA2_Stream6_IRQn +/* DMA1 stream6 */ +/* DMA1 stream7 */ +#if defined(BSP_SPI3_TX_USING_DMA) && !defined(SPI3_TX_DMA_INSTANCE) +#define SPI3_DMA_TX_IRQHandler DMA1_Stream7_IRQHandler +#define SPI3_TX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI3_TX_DMA_INSTANCE DMA1_Stream7 +#define SPI3_TX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI3_TX_DMA_IRQ DMA1_Stream7_IRQn #endif -/* dma2 stream6 */ -/* dma2 stream7 */ -/* dma2 stream7 */ +/* DMA2 stream0 */ +#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_INSTANCE) +#define SPI1_DMA_RX_IRQHandler DMA2_Stream0_IRQHandler +#define SPI1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI1_RX_DMA_INSTANCE DMA2_Stream0 +#define SPI1_RX_DMA_CHANNEL DMA_CHANNEL_3 +#define SPI1_RX_DMA_IRQ DMA2_Stream0_IRQn +#elif defined(BSP_SPI4_TX_USING_DMA) && !defined(SPI4_TX_DMA_INSTANCE) +#define SPI4_DMA_TX_IRQHandler DMA2_Stream0_IRQHandler +#define SPI4_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI4_TX_DMA_INSTANCE DMA2_Stream0 +#define SPI4_TX_DMA_CHANNEL DMA_CHANNEL_4 +#define SPI4_TX_DMA_IRQ DMA2_Stream0_IRQn +#endif + +/* DMA2 stream1 */ +#if defined(BSP_SPI4_TX_USING_DMA) && !defined(SPI4_TX_DMA_INSTANCE) +#define SPI4_DMA_TX_IRQHandler DMA2_Stream1_IRQHandler +#define SPI4_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI4_TX_DMA_INSTANCE DMA2_Stream1 +#define SPI4_TX_DMA_CHANNEL DMA_CHANNEL_4 +#define SPI4_TX_DMA_IRQ DMA2_Stream1_IRQn +#endif + +/* DMA2 stream2 */ +#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_INSTANCE) +#define SPI1_DMA_RX_IRQHandler DMA2_Stream2_IRQHandler +#define SPI1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI1_RX_DMA_INSTANCE DMA2_Stream2 +#define SPI1_RX_DMA_CHANNEL DMA_CHANNEL_3 +#define SPI1_RX_DMA_IRQ DMA2_Stream2_IRQn +#elif defined(BSP_UART1_RX_USING_DMA) && !defined(USART1_RX_DMA_INSTANCE) +#define USART1_DMA_RX_IRQHandler DMA2_Stream2_IRQHandler +#define USART1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define USART1_RX_DMA_INSTANCE DMA2_Stream2 +#define USART1_RX_DMA_CHANNEL DMA_CHANNEL_4 +#define USART1_RX_DMA_IRQ DMA2_Stream2_IRQn +#endif + +/* DMA2 stream3 */ +#if defined(BSP_SPI5_RX_USING_DMA) && !defined(SPI5_RX_DMA_INSTANCE) + +#define SPI5_DMA_RX_IRQHandler DMA2_Stream3_IRQHandler +#define SPI5_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI5_RX_DMA_INSTANCE DMA2_Stream3 +#define SPI5_RX_DMA_CHANNEL DMA_CHANNEL_2 +#define SPI5_RX_DMA_IRQ DMA2_Stream3_IRQn +#elif defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_INSTANCE) +#define SPI1_DMA_TX_IRQHandler DMA2_Stream3_IRQHandler +#define SPI1_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI1_TX_DMA_INSTANCE DMA2_Stream3 +#define SPI1_TX_DMA_CHANNEL DMA_CHANNEL_3 +#define SPI1_TX_DMA_IRQ DMA2_Stream3_IRQn +#elif defined(BSP_SPI4_TX_USING_DMA) && !defined(SPI4_TX_DMA_INSTANCE) +#define SPI4_DMA_TX_IRQHandler DMA2_Stream3_IRQHandler +#define SPI4_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI4_TX_DMA_INSTANCE DMA2_Stream3 +#define SPI4_TX_DMA_CHANNEL DMA_CHANNEL_5 +#define SPI4_TX_DMA_IRQ DMA2_Stream3_IRQn +#endif + +/* DMA2 stream4 */ +#if defined(BSP_SPI5_TX_USING_DMA) && !defined(SPI5_TX_DMA_INSTANCE) +#define SPI5_DMA_TX_IRQHandler DMA2_Stream4_IRQHandler +#define SPI5_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI5_TX_DMA_INSTANCE DMA2_Stream4 +#define SPI5_TX_DMA_CHANNEL DMA_CHANNEL_2 +#define SPI5_TX_DMA_IRQ DMA2_Stream4_IRQn +#elif defined(BSP_SPI4_TX_USING_DMA) && !defined(SPI4_TX_DMA_INSTANCE) +#define SPI4_DMA_TX_IRQHandler DMA2_Stream4_IRQHandler +#define SPI4_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI4_TX_DMA_INSTANCE DMA2_Stream4 +#define SPI4_TX_DMA_CHANNEL DMA_CHANNEL_5 +#define SPI4_TX_DMA_IRQ DMA2_Stream4_IRQn +#endif + +/* DMA2 stream5 */ +#if defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_INSTANCE) +#define SPI1_DMA_TX_IRQHandler DMA2_Stream5_IRQHandler +#define SPI1_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI1_TX_DMA_INSTANCE DMA2_Stream5 +#define SPI1_TX_DMA_CHANNEL DMA_CHANNEL_3 +#define SPI1_TX_DMA_IRQ DMA2_Stream5_IRQn +#elif defined(BSP_UART1_RX_USING_DMA) && !defined(USART1_RX_DMA_INSTANCE) +#define USART1_DMA_RX_IRQHandler DMA2_Stream5_IRQHandler +#define USART1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define USART1_RX_DMA_INSTANCE DMA2_Stream5 +#define USART1_RX_DMA_CHANNEL DMA_CHANNEL_4 +#define USART1_RX_DMA_IRQ DMA2_Stream5_IRQn +#elif defined(BSP_SPI5_RX_USING_DMA) && !defined(SPI5_RX_DMA_INSTANCE) +#define SPI5_DMA_RX_IRQHandler DMA2_Stream5_IRQHandler +#define SPI5_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI5_RX_DMA_INSTANCE DMA2_Stream5 +#define SPI5_RX_DMA_CHANNEL DMA_CHANNEL_7 +#define SPI5_RX_DMA_IRQ DMA2_Stream5_IRQn +#endif + +/* DMA2 stream6 */ +#if defined(BSP_SPI5_TX_USING_DMA) && !defined(SPI5_TX_DMA_INSTANCE) +#define SPI5_DMA_TX_IRQHandler DMA2_Stream6_IRQHandler +#define SPI5_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI5_TX_DMA_INSTANCE DMA2_Stream6 +#define SPI5_TX_DMA_CHANNEL DMA_CHANNEL_7 +#define SPI5_TX_DMA_IRQ DMA2_Stream6_IRQn +#endif + +/* DMA2 stream7 */ + #endif /* __DMA_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/f7/dma_config.h b/bsp/stm32/libraries/HAL_Drivers/config/f7/dma_config.h index 5ff276900b..cf0c416311 100644 --- a/bsp/stm32/libraries/HAL_Drivers/config/f7/dma_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/config/f7/dma_config.h @@ -5,7 +5,8 @@ * * Change Logs: * Date Author Notes - * 2018-01-02 zylx first version + * 2019-01-02 zylx first version + * 2019-01-08 SummerGift clean up the code */ #ifndef __DMA_CONFIG_H__ @@ -13,273 +14,208 @@ #include -/* dma1 stream0 */ -#if defined(BSP_SPI3_RX_USING_DMA) && !defined(SPI3_RX_DMA_CHANNEL) - -#define SPI3_DMA_RX_IRQHandler DMA1_Stream0_IRQHandler -#define SPI3_RX_DMA_RCC RCC_AHB1ENR_DMA1EN -#define SPI3_RX_DMA_INSTANCE DMA1_Stream0 -#define SPI3_RX_DMA_CHANNEL DMA_CHANNEL_0 -#define SPI3_RX_DMA_IRQ DMA1_Stream0_IRQn - -#elif defined(BSP_UART5_RX_USING_DMA) && !defined(UART5_RX_DMA_CHANNEL) +/* DMA1 stream0 */ +#if defined(BSP_SPI3_RX_USING_DMA) && !defined(SPI3_RX_DMA_INSTANCE) +#define SPI3_DMA_RX_IRQHandler DMA1_Stream0_IRQHandler +#define SPI3_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI3_RX_DMA_INSTANCE DMA1_Stream0 +#define SPI3_RX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI3_RX_DMA_IRQ DMA1_Stream0_IRQn +#elif defined(BSP_UART5_RX_USING_DMA) && !defined(UART5_RX_DMA_INSTANCE) #define UART5_DMA_RX_IRQHandler DMA1_Stream0_IRQHandler #define UART5_RX_DMA_RCC RCC_AHB1ENR_DMA1EN #define UART5_RX_DMA_INSTANCE DMA1_Stream0 #define UART5_RX_DMA_CHANNEL DMA_CHANNEL_4 #define UART5_RX_DMA_IRQ DMA1_Stream0_IRQn - #endif -/* dma1 stream0 */ -/* dma1 stream1 */ -#if defined(BSP_UART3_RX_USING_DMA) && !defined(UART3_RX_DMA_CHANNEL) +/* DMA1 stream1 */ +#if defined(BSP_UART3_RX_USING_DMA) && !defined(UART3_RX_DMA_INSTANCE) #define UART3_DMA_RX_IRQHandler DMA1_Stream1_IRQHandler #define UART3_RX_DMA_RCC RCC_AHB1ENR_DMA1EN #define UART3_RX_DMA_INSTANCE DMA1_Stream1 #define UART3_RX_DMA_CHANNEL DMA_CHANNEL_4 #define UART3_RX_DMA_IRQ DMA1_Stream1_IRQn - #endif -/* dma1 stream1 */ -/* dma1 stream2 */ -#if defined(BSP_SPI3_RX_USING_DMA) && !defined(SPI3_RX_DMA_CHANNEL) - -#define SPI3_DMA_RX_IRQHandler DMA1_Stream2_IRQHandler -#define SPI3_RX_DMA_RCC RCC_AHB1ENR_DMA1EN -#define SPI3_RX_DMA_INSTANCE DMA1_Stream2 -#define SPI3_RX_DMA_CHANNEL DMA_CHANNEL_0 -#define SPI3_RX_DMA_IRQ DMA1_Stream2_IRQn - -#elif defined(BSP_UART4_RX_USING_DMA) && !defined(UART4_RX_DMA_CHANNEL) +/* DMA1 stream2 */ +#if defined(BSP_SPI3_RX_USING_DMA) && !defined(SPI3_RX_DMA_INSTANCE) +#define SPI3_DMA_RX_IRQHandler DMA1_Stream2_IRQHandler +#define SPI3_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI3_RX_DMA_INSTANCE DMA1_Stream2 +#define SPI3_RX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI3_RX_DMA_IRQ DMA1_Stream2_IRQn +#elif defined(BSP_UART4_RX_USING_DMA) && !defined(UART4_RX_DMA_INSTANCE) #define UART4_DMA_RX_IRQHandler DMA1_Stream2_IRQHandler #define UART4_RX_DMA_RCC RCC_AHB1ENR_DMA1EN #define UART4_RX_DMA_INSTANCE DMA1_Stream2 #define UART4_RX_DMA_CHANNEL DMA_CHANNEL_4 #define UART4_RX_DMA_IRQ DMA1_Stream2_IRQn - #endif -/* dma1 stream2 */ - -/* dma1 stream3 */ -#if defined(BSP_SPI2_RX_USING_DMA) && !defined(SPI2_RX_DMA_CHANNEL) - -#define SPI2_DMA_RX_IRQHandler DMA1_Stream3_IRQHandler -#define SPI2_RX_DMA_RCC RCC_AHB1ENR_DMA1EN -#define SPI2_RX_DMA_INSTANCE DMA1_Stream3 -#define SPI2_RX_DMA_CHANNEL DMA_CHANNEL_0 -#define SPI2_RX_DMA_IRQ DMA1_Stream3_IRQn +/* DMA1 stream3 */ +#if defined(BSP_SPI2_RX_USING_DMA) && !defined(SPI2_RX_DMA_INSTANCE) +#define SPI2_DMA_RX_IRQHandler DMA1_Stream3_IRQHandler +#define SPI2_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI2_RX_DMA_INSTANCE DMA1_Stream3 +#define SPI2_RX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI2_RX_DMA_IRQ DMA1_Stream3_IRQn #endif -/* dma1 stream3 */ - -/* dma1 stream4 */ -#if defined(BSP_SPI2_TX_USING_DMA) && !defined(SPI2_TX_DMA_CHANNEL) - -#define SPI2_DMA_TX_IRQHandler DMA1_Stream4_IRQHandler -#define SPI2_TX_DMA_RCC RCC_AHB1ENR_DMA1EN -#define SPI2_TX_DMA_INSTANCE DMA1_Stream4 -#define SPI2_TX_DMA_CHANNEL DMA_CHANNEL_0 -#define SPI2_TX_DMA_IRQ DMA1_Stream4_IRQn +/* DMA1 stream4 */ +#if defined(BSP_SPI2_TX_USING_DMA) && !defined(SPI2_TX_DMA_INSTANCE) +#define SPI2_DMA_TX_IRQHandler DMA1_Stream4_IRQHandler +#define SPI2_TX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI2_TX_DMA_INSTANCE DMA1_Stream4 +#define SPI2_TX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI2_TX_DMA_IRQ DMA1_Stream4_IRQn #endif -/* dma1 stream4 */ -/* dma1 stream5 */ -#if defined(BSP_SPI3_TX_USING_DMA) && !defined(SPI3_TX_DMA_CHANNEL) -#define SPI3_DMA_TX_IRQHandler DMA1_Stream5_IRQHandler -#define SPI3_TX_DMA_RCC RCC_AHB1ENR_DMA1EN -#define SPI3_TX_DMA_INSTANCE DMA1_Stream5 -#define SPI3_TX_DMA_CHANNEL DMA_CHANNEL_0 -#define SPI3_TX_DMA_IRQ DMA1_Stream5_IRQn - -#elif defined(BSP_UART2_RX_USING_DMA) && !defined(UART2_RX_DMA_CHANNEL) +/* DMA1 stream5 */ +#if defined(BSP_SPI3_TX_USING_DMA) && !defined(SPI3_TX_DMA_INSTANCE) +#define SPI3_DMA_TX_IRQHandler DMA1_Stream5_IRQHandler +#define SPI3_TX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI3_TX_DMA_INSTANCE DMA1_Stream5 +#define SPI3_TX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI3_TX_DMA_IRQ DMA1_Stream5_IRQn +#elif defined(BSP_UART2_RX_USING_DMA) && !defined(UART2_RX_DMA_INSTANCE) #define UART2_DMA_RX_IRQHandler DMA1_Stream5_IRQHandler #define UART2_RX_DMA_RCC RCC_AHB1ENR_DMA1EN #define UART2_RX_DMA_INSTANCE DMA1_Stream5 #define UART2_RX_DMA_CHANNEL DMA_CHANNEL_4 #define UART2_RX_DMA_IRQ DMA1_Stream5_IRQn - -#endif -/* dma1 stream5 */ - -/* dma1 stream6 */ -/* dma1 stream6 */ - -/* dma1 stream7 */ -#if defined(BSP_SPI3_TX_USING_DMA) && !defined(SPI3_TX_DMA_CHANNEL) - -#define SPI3_DMA_TX_IRQHandler DMA1_Stream7_IRQHandler -#define SPI3_TX_DMA_RCC RCC_AHB1ENR_DMA1EN -#define SPI3_TX_DMA_INSTANCE DMA1_Stream7 -#define SPI3_TX_DMA_CHANNEL DMA_CHANNEL_0 -#define SPI3_TX_DMA_IRQ DMA1_Stream7_IRQn - -#endif -/* dma1 stream7 */ - -/* dma2 stream0 */ -#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_CHANNEL) - -#define SPI1_DMA_RX_IRQHandler DMA2_Stream0_IRQHandler -#define SPI1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI1_RX_DMA_INSTANCE DMA2_Stream0 -#define SPI1_RX_DMA_CHANNEL DMA_CHANNEL_3 -#define SPI1_RX_DMA_IRQ DMA2_Stream0_IRQn - -#elif defined(BSP_SPI4_RX_USING_DMA) && !defined(SPI4_RX_DMA_CHANNEL) - -#define SPI4_DMA_RX_IRQHandler DMA2_Stream0_IRQHandler -#define SPI4_RX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI4_RX_DMA_INSTANCE DMA2_Stream0 -#define SPI4_RX_DMA_CHANNEL DMA_CHANNEL_4 -#define SPI4_RX_DMA_IRQ DMA2_Stream0_IRQn - -#endif -/* dma2 stream0 */ - -/* dma2 stream1 */ -#if defined(BSP_SPI4_TX_USING_DMA) && !defined(SPI4_TX_DMA_CHANNEL) - -#define SPI4_DMA_TX_IRQHandler DMA2_Stream1_IRQHandler -#define SPI4_TX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI4_TX_DMA_INSTANCE DMA2_Stream1 -#define SPI4_TX_DMA_CHANNEL DMA_CHANNEL_4 -#define SPI4_TX_DMA_IRQ DMA2_Stream1_IRQn - -#endif -/* dma2 stream1 */ - -/* dma2 stream2 */ -#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_CHANNEL) - -#define SPI1_DMA_RX_IRQHandler DMA2_Stream2_IRQHandler -#define SPI1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI1_RX_DMA_INSTANCE DMA2_Stream2 -#define SPI1_RX_DMA_CHANNEL DMA_CHANNEL_3 -#define SPI1_RX_DMA_IRQ DMA2_Stream2_IRQn - -#elif defined(BSP_UART1_RX_USING_DMA) && !defined(USART1_RX_DMA_CHANNEL) - -#define USART1_DMA_RX_IRQHandler DMA2_Stream2_IRQHandler -#define USART1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define USART1_RX_DMA_INSTANCE DMA2_Stream2 -#define USART1_RX_DMA_CHANNEL DMA_CHANNEL_4 -#define USART1_RX_DMA_IRQ DMA2_Stream2_IRQn - -#elif defined(BSP_QSPI_USING_DMA) && !defined(QSPI_DMA_CHANNEL) - -#define QSPI_DMA_IRQHandler DMA2_Stream2_IRQHandler -#define QSPI_DMA_RCC RCC_AHB1ENR_DMA2EN -#define QSPI_DMA_INSTANCE DMA2_Stream2 -#define QSPI_DMA_CHANNEL DMA_CHANNEL_11 -#define QSPI_DMA_IRQ DMA2_Stream2_IRQn - -#endif -/* dma2 stream2 */ - -/* dma2 stream3 */ -#if defined(BSP_SPI5_RX_USING_DMA) && !defined(SPI5_RX_DMA_CHANNEL) - -#define SPI5_DMA_RX_IRQHandler DMA2_Stream3_IRQHandler -#define SPI5_RX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI5_RX_DMA_INSTANCE DMA2_Stream3 -#define SPI5_RX_DMA_CHANNEL DMA_CHANNEL_2 -#define SPI5_RX_DMA_IRQ DMA2_Stream3_IRQn - -#elif defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_CHANNEL) - -#define SPI1_DMA_TX_IRQHandler DMA2_Stream3_IRQHandler -#define SPI1_TX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI1_TX_DMA_INSTANCE DMA2_Stream3 -#define SPI1_TX_DMA_CHANNEL DMA_CHANNEL_3 -#define SPI1_TX_DMA_IRQ DMA2_Stream3_IRQn - -#elif defined(BSP_SPI4_RX_USING_DMA) && !defined(SPI4_RX_DMA_CHANNEL) - -#define SPI4_DMA_RX_IRQHandler DMA2_Stream3_IRQHandler -#define SPI4_RX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI4_RX_DMA_INSTANCE DMA2_Stream3 -#define SPI4_RX_DMA_CHANNEL DMA_CHANNEL_5 -#define SPI4_RX_DMA_IRQ DMA2_Stream3_IRQn - -#endif -/* dma2 stream3 */ - -/* dma2 stream4 */ -#if defined(BSP_SPI5_TX_USING_DMA) && !defined(SPI5_TX_DMA_CHANNEL) - -#define SPI5_DMA_TX_IRQHandler DMA2_Stream4_IRQHandler -#define SPI5_TX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI5_TX_DMA_INSTANCE DMA2_Stream4 -#define SPI5_TX_DMA_CHANNEL DMA_CHANNEL_2 -#define SPI5_TX_DMA_IRQ DMA2_Stream4_IRQn - -#elif defined(BSP_SPI4_TX_USING_DMA) && !defined(SPI4_TX_DMA_CHANNEL) - -#define SPI4_DMA_TX_IRQHandler DMA2_Stream4_IRQHandler -#define SPI4_TX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI4_TX_DMA_INSTANCE DMA2_Stream4 -#define SPI4_TX_DMA_CHANNEL DMA_CHANNEL_5 -#define SPI4_TX_DMA_IRQ DMA2_Stream4_IRQn - -#endif -/* dma2 stream4 */ - -/* dma2 stream5 */ -#if defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_CHANNEL) - -#define SPI1_DMA_TX_IRQHandler DMA2_Stream5_IRQHandler -#define SPI1_TX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI1_TX_DMA_INSTANCE DMA2_Stream5 -#define SPI1_TX_DMA_CHANNEL DMA_CHANNEL_3 -#define SPI1_TX_DMA_IRQ DMA2_Stream5_IRQn - -#elif defined(BSP_UART1_RX_USING_DMA) && !defined(USART1_RX_DMA_CHANNEL) - -#define USART1_DMA_RX_IRQHandler DMA2_Stream5_IRQHandler -#define USART1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define USART1_RX_DMA_INSTANCE DMA2_Stream5 -#define USART1_RX_DMA_CHANNEL DMA_CHANNEL_4 -#define USART1_RX_DMA_IRQ DMA2_Stream5_IRQn - -#elif defined(BSP_SPI5_RX_USING_DMA) && !defined(SPI5_RX_DMA_CHANNEL) - -#define SPI5_DMA_RX_IRQHandler DMA2_Stream5_IRQHandler -#define SPI5_RX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI5_RX_DMA_INSTANCE DMA2_Stream5 -#define SPI5_RX_DMA_CHANNEL DMA_CHANNEL_7 -#define SPI5_RX_DMA_IRQ DMA2_Stream5_IRQn - #endif -/* dma2 stream5 */ - -/* dma2 stream6 */ -#if defined(BSP_SPI5_TX_USING_DMA) && !defined(SPI5_TX_DMA_CHANNEL) - -#define SPI5_DMA_TX_IRQHandler DMA2_Stream6_IRQHandler -#define SPI5_TX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define SPI5_TX_DMA_INSTANCE DMA2_Stream6 -#define SPI5_TX_DMA_CHANNEL DMA_CHANNEL_7 -#define SPI5_TX_DMA_IRQ DMA2_Stream6_IRQn - -#endif -/* dma2 stream6 */ - -/* dma2 stream7 */ -#if defined(BSP_QSPI_USING_DMA) && !defined(QSPI_DMA_CHANNEL) - -#define QSPI_DMA_IRQHandler DMA2_Stream7_IRQHandler -#define QSPI_DMA_RCC RCC_AHB1ENR_DMA2EN -#define QSPI_DMA_INSTANCE DMA2_Stream7 -#define QSPI_DMA_CHANNEL DMA_CHANNEL_3 -#define QSPI_DMA_IRQ DMA2_Stream7_IRQn +/* DMA1 stream6 */ +/* DMA1 stream7 */ +#if defined(BSP_SPI3_TX_USING_DMA) && !defined(SPI3_TX_DMA_INSTANCE) +#define SPI3_DMA_TX_IRQHandler DMA1_Stream7_IRQHandler +#define SPI3_TX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define SPI3_TX_DMA_INSTANCE DMA1_Stream7 +#define SPI3_TX_DMA_CHANNEL DMA_CHANNEL_0 +#define SPI3_TX_DMA_IRQ DMA1_Stream7_IRQn #endif -/* dma2 stream7 */ +/* DMA2 stream0 */ +#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_INSTANCE) +#define SPI1_DMA_RX_IRQHandler DMA2_Stream0_IRQHandler +#define SPI1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI1_RX_DMA_INSTANCE DMA2_Stream0 +#define SPI1_RX_DMA_CHANNEL DMA_CHANNEL_3 +#define SPI1_RX_DMA_IRQ DMA2_Stream0_IRQn +#elif defined(BSP_SPI4_RX_USING_DMA) && !defined(SPI4_RX_DMA_INSTANCE) +#define SPI4_DMA_RX_IRQHandler DMA2_Stream0_IRQHandler +#define SPI4_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI4_RX_DMA_INSTANCE DMA2_Stream0 +#define SPI4_RX_DMA_CHANNEL DMA_CHANNEL_4 +#define SPI4_RX_DMA_IRQ DMA2_Stream0_IRQn +#endif + +/* DMA2 stream1 */ +#if defined(BSP_SPI4_TX_USING_DMA) && !defined(SPI4_TX_DMA_INSTANCE) +#define SPI4_DMA_TX_IRQHandler DMA2_Stream1_IRQHandler +#define SPI4_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI4_TX_DMA_INSTANCE DMA2_Stream1 +#define SPI4_TX_DMA_CHANNEL DMA_CHANNEL_4 +#define SPI4_TX_DMA_IRQ DMA2_Stream1_IRQn +#endif + +/* DMA2 stream2 */ +#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_INSTANCE) +#define SPI1_DMA_RX_IRQHandler DMA2_Stream2_IRQHandler +#define SPI1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI1_RX_DMA_INSTANCE DMA2_Stream2 +#define SPI1_RX_DMA_CHANNEL DMA_CHANNEL_3 +#define SPI1_RX_DMA_IRQ DMA2_Stream2_IRQn +#elif defined(BSP_UART1_RX_USING_DMA) && !defined(USART1_RX_DMA_INSTANCE) +#define USART1_DMA_RX_IRQHandler DMA2_Stream2_IRQHandler +#define USART1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define USART1_RX_DMA_INSTANCE DMA2_Stream2 +#define USART1_RX_DMA_CHANNEL DMA_CHANNEL_4 +#define USART1_RX_DMA_IRQ DMA2_Stream2_IRQn +#elif defined(BSP_QSPI_USING_DMA) && !defined(QSPI_DMA_INSTANCE) +#define QSPI_DMA_IRQHandler DMA2_Stream2_IRQHandler +#define QSPI_DMA_RCC RCC_AHB1ENR_DMA2EN +#define QSPI_DMA_INSTANCE DMA2_Stream2 +#define QSPI_DMA_CHANNEL DMA_CHANNEL_11 +#define QSPI_DMA_IRQ DMA2_Stream2_IRQn +#endif + +/* DMA2 stream3 */ +#if defined(BSP_SPI5_RX_USING_DMA) && !defined(SPI5_RX_DMA_INSTANCE) +#define SPI5_DMA_RX_IRQHandler DMA2_Stream3_IRQHandler +#define SPI5_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI5_RX_DMA_INSTANCE DMA2_Stream3 +#define SPI5_RX_DMA_CHANNEL DMA_CHANNEL_2 +#define SPI5_RX_DMA_IRQ DMA2_Stream3_IRQn +#elif defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_INSTANCE) +#define SPI1_DMA_TX_IRQHandler DMA2_Stream3_IRQHandler +#define SPI1_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI1_TX_DMA_INSTANCE DMA2_Stream3 +#define SPI1_TX_DMA_CHANNEL DMA_CHANNEL_3 +#define SPI1_TX_DMA_IRQ DMA2_Stream3_IRQn +#elif defined(BSP_SPI4_RX_USING_DMA) && !defined(SPI4_RX_DMA_INSTANCE) +#define SPI4_DMA_RX_IRQHandler DMA2_Stream3_IRQHandler +#define SPI4_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI4_RX_DMA_INSTANCE DMA2_Stream3 +#define SPI4_RX_DMA_CHANNEL DMA_CHANNEL_5 +#define SPI4_RX_DMA_IRQ DMA2_Stream3_IRQn +#endif + +/* DMA2 stream4 */ +#if defined(BSP_SPI5_TX_USING_DMA) && !defined(SPI5_TX_DMA_INSTANCE) +#define SPI5_DMA_TX_IRQHandler DMA2_Stream4_IRQHandler +#define SPI5_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI5_TX_DMA_INSTANCE DMA2_Stream4 +#define SPI5_TX_DMA_CHANNEL DMA_CHANNEL_2 +#define SPI5_TX_DMA_IRQ DMA2_Stream4_IRQn +#elif defined(BSP_SPI4_TX_USING_DMA) && !defined(SPI4_TX_DMA_INSTANCE) +#define SPI4_DMA_TX_IRQHandler DMA2_Stream4_IRQHandler +#define SPI4_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI4_TX_DMA_INSTANCE DMA2_Stream4 +#define SPI4_TX_DMA_CHANNEL DMA_CHANNEL_5 +#define SPI4_TX_DMA_IRQ DMA2_Stream4_IRQn +#endif + +/* DMA2 stream5 */ +#if defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_INSTANCE) +#define SPI1_DMA_TX_IRQHandler DMA2_Stream5_IRQHandler +#define SPI1_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI1_TX_DMA_INSTANCE DMA2_Stream5 +#define SPI1_TX_DMA_CHANNEL DMA_CHANNEL_3 +#define SPI1_TX_DMA_IRQ DMA2_Stream5_IRQn +#elif defined(BSP_UART1_RX_USING_DMA) && !defined(USART1_RX_DMA_INSTANCE) +#define USART1_DMA_RX_IRQHandler DMA2_Stream5_IRQHandler +#define USART1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define USART1_RX_DMA_INSTANCE DMA2_Stream5 +#define USART1_RX_DMA_CHANNEL DMA_CHANNEL_4 +#define USART1_RX_DMA_IRQ DMA2_Stream5_IRQn +#elif defined(BSP_SPI5_RX_USING_DMA) && !defined(SPI5_RX_DMA_INSTANCE) +#define SPI5_DMA_RX_IRQHandler DMA2_Stream5_IRQHandler +#define SPI5_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI5_RX_DMA_INSTANCE DMA2_Stream5 +#define SPI5_RX_DMA_CHANNEL DMA_CHANNEL_7 +#define SPI5_RX_DMA_IRQ DMA2_Stream5_IRQn +#endif + +/* DMA2 stream6 */ +#if defined(BSP_SPI5_TX_USING_DMA) && !defined(SPI5_TX_DMA_INSTANCE) +#define SPI5_DMA_TX_IRQHandler DMA2_Stream6_IRQHandler +#define SPI5_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define SPI5_TX_DMA_INSTANCE DMA2_Stream6 +#define SPI5_TX_DMA_CHANNEL DMA_CHANNEL_7 +#define SPI5_TX_DMA_IRQ DMA2_Stream6_IRQn +#endif + +/* DMA2 stream7 */ +#if defined(BSP_QSPI_USING_DMA) && !defined(QSPI_DMA_INSTANCE) +#define QSPI_DMA_IRQHandler DMA2_Stream7_IRQHandler +#define QSPI_DMA_RCC RCC_AHB1ENR_DMA2EN +#define QSPI_DMA_INSTANCE DMA2_Stream7 +#define QSPI_DMA_CHANNEL DMA_CHANNEL_3 +#define QSPI_DMA_IRQ DMA2_Stream7_IRQn +#endif #endif /* __DMA_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/l4/dma_config.h b/bsp/stm32/libraries/HAL_Drivers/config/l4/dma_config.h index 84495c2c5a..14b0246ca8 100644 --- a/bsp/stm32/libraries/HAL_Drivers/config/l4/dma_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/config/l4/dma_config.h @@ -5,7 +5,8 @@ * * Change Logs: * Date Author Notes - * 2018-01-05 zylx first version + * 2019-01-05 zylx first version + * 2019-01-08 SummerGift clean up the code */ #ifndef __DMA_CONFIG_H__ @@ -13,161 +14,114 @@ #include -/* dma1 channel1 */ - - - -/* dma1 channel1 */ - -/* dma1 channel2 */ -#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_REQUEST) +/* DMA1 channel1 */ +/* DMA1 channel2 */ +#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_INSTANCE) #define SPI1_DMA_RX_IRQHandler DMA1_Channel2_IRQHandler #define SPI1_RX_DMA_RCC RCC_AHB1ENR_DMA1EN #define SPI1_RX_DMA_INSTANCE DMA1_Channel2 #define SPI1_RX_DMA_REQUEST DMA_REQUEST_1 #define SPI1_RX_DMA_IRQ DMA1_Channel2_IRQn - #endif -/* dma1 channel2 */ - -/* dma1 channel3 */ -#if defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_REQUEST) +/* DMA1 channel3 */ +#if defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_INSTANCE) #define SPI1_DMA_TX_IRQHandler DMA1_Channel3_IRQHandler #define SPI1_TX_DMA_RCC RCC_AHB1ENR_DMA1EN #define SPI1_TX_DMA_INSTANCE DMA1_Channel3 #define SPI1_TX_DMA_REQUEST DMA_REQUEST_1 #define SPI1_TX_DMA_IRQ DMA1_Channel3_IRQn - #endif -/* dma1 channel3 */ - -/* dma1 channel4 */ -#if defined(BSP_UART1_TX_USING_DMA) && !defined(USART1_TX_DMA_REQUEST) - -#define USART1_DMA_TX_IRQHandler DMA1_Channel4_IRQHandler -#define USART1_TX_DMA_RCC RCC_AHB1ENR_DMA1EN -#define USART1_TX_DMA_INSTANCE DMA1_Channel4 -#define USART1_TX_DMA_REQUEST DMA_REQUEST_2 -#define USART1_TX_DMA_IRQ DMA1_Channel4_IRQn +/* DMA1 channel4 */ +#if defined(BSP_UART1_TX_USING_DMA) && !defined(UART1_TX_DMA_INSTANCE) +#define UART1_DMA_TX_IRQHandler DMA1_Channel4_IRQHandler +#define UART1_TX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define UART1_TX_DMA_INSTANCE DMA1_Channel4 +#define UART1_TX_DMA_REQUEST DMA_REQUEST_2 +#define UART1_TX_DMA_IRQ DMA1_Channel4_IRQn #endif -/* dma1 channel4 */ - -/* dma1 channel5 */ -#if defined(BSP_UART1_RX_USING_DMA) && !defined(USART1_RX_DMA_REQUEST) - -#define USART1_DMA_RX_IRQHandler DMA1_Channel5_IRQHandler -#define USART1_RX_DMA_RCC RCC_AHB1ENR_DMA1EN -#define USART1_RX_DMA_INSTANCE DMA1_Channel5 -#define USART1_RX_DMA_REQUEST DMA_REQUEST_2 -#define USART1_RX_DMA_IRQ DMA1_Channel5_IRQn - -#elif defined(BSP_QSPI_USING_DMA) && !defined(QSPI_DMA_CHANNEL) +/* DMA1 channel5 */ +#if defined(BSP_UART1_RX_USING_DMA) && !defined(UART1_RX_DMA_INSTANCE) +#define UART1_DMA_RX_IRQHandler DMA1_Channel5_IRQHandler +#define UART1_RX_DMA_RCC RCC_AHB1ENR_DMA1EN +#define UART1_RX_DMA_INSTANCE DMA1_Channel5 +#define UART1_RX_DMA_REQUEST DMA_REQUEST_2 +#define UART1_RX_DMA_IRQ DMA1_Channel5_IRQn +#elif defined(BSP_QSPI_USING_DMA) && !defined(QSPI_DMA_INSTANCE) #define QSPI_DMA_IRQHandler DMA1_Channel5_IRQHandler #define QSPI_DMA_RCC RCC_AHB1ENR_DMA1EN #define QSPI_DMA_INSTANCE DMA1_Channel5 -#define QSPI_DMA_CHANNEL DMA_REQUEST_5 +#define QSPI_DMA_REQUEST DMA_REQUEST_5 #define QSPI_DMA_IRQ DMA1_Channel5_IRQn - #endif -/* dma1 channel5 */ -/* dma1 channel6 */ -/* dma1 channel6 */ +/* DMA1 channel6 */ -/* dma1 channel7 */ - - - -/* dma1 channel7 */ - -/* dma2 channel1 */ -#if defined(BSP_UART5_TX_USING_DMA) && !defined(UART5_TX_DMA_REQUEST) +/* DMA1 channel7 */ +/* DMA2 channel1 */ +#if defined(BSP_UART5_TX_USING_DMA) && !defined(UART5_TX_DMA_INSTANCE) #define UART5_DMA_TX_IRQHandler DMA2_Channel1_IRQHandler #define UART5_TX_DMA_RCC RCC_AHB1ENR_DMA2EN #define UART5_TX_DMA_INSTANCE DMA2_Channel1 #define UART5_TX_DMA_REQUEST DMA_REQUEST_2 #define UART5_TX_DMA_IRQ DMA2_Channel1_IRQn - #endif -/* dma2 channel1 */ - -/* dma2 channel2 */ -#if defined(BSP_UART5_RX_USING_DMA) && !defined(UART5_RX_DMA_REQUEST) +/* DMA2 channel2 */ +#if defined(BSP_UART5_RX_USING_DMA) && !defined(UART5_RX_DMA_INSTANCE) #define UART5_DMA_RX_IRQHandler DMA2_Channel2_IRQHandler #define UART5_RX_DMA_RCC RCC_AHB1ENR_DMA2EN #define UART5_RX_DMA_INSTANCE DMA2_Channel2 #define UART5_RX_DMA_REQUEST DMA_REQUEST_2 #define UART5_RX_DMA_IRQ DMA2_Channel2_IRQn - #endif -/* dma2 channel2 */ - -/* dma2 channel3 */ -#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_REQUEST) +/* DMA2 channel3 */ +#if defined(BSP_SPI1_RX_USING_DMA) && !defined(SPI1_RX_DMA_INSTANCE) #define SPI1_DMA_RX_IRQHandler DMA2_Channel3_IRQHandler #define SPI1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN #define SPI1_RX_DMA_INSTANCE DMA2_Channel3 #define SPI1_RX_DMA_REQUEST DMA_REQUEST_4 #define SPI1_RX_DMA_IRQ DMA2_Channel3_IRQn - #endif -/* dma2 channel3 */ - -/* dma2 channel4 */ -#if defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_REQUEST) +/* DMA2 channel4 */ +#if defined(BSP_SPI1_TX_USING_DMA) && !defined(SPI1_TX_DMA_INSTANCE) #define SPI1_DMA_TX_IRQHandler DMA2_Channel4_IRQHandler #define SPI1_TX_DMA_RCC RCC_AHB1ENR_DMA2EN #define SPI1_TX_DMA_INSTANCE DMA2_Channel4 #define SPI1_TX_DMA_REQUEST DMA_REQUEST_4 #define SPI1_TX_DMA_IRQ DMA2_Channel4_IRQn - #endif -/* dma2 channel4 */ -/* dma2 channel5 */ - - - -/* dma2 channel5 */ - -/* dma2 channel6 */ -#if defined(BSP_UART1_TX_USING_DMA) && !defined(USART1_TX_DMA_REQUEST) - -#define USART1_DMA_TX_IRQHandler DMA2_Channel6_IRQHandler -#define USART1_TX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define USART1_TX_DMA_INSTANCE DMA2_Channel6 -#define USART1_TX_DMA_REQUEST DMA_REQUEST_2 -#define USART1_TX_DMA_IRQ DMA2_Channel6_IRQn +/* DMA2 channel5 */ +/* DMA2 channel6 */ +#if defined(BSP_UART1_TX_USING_DMA) && !defined(UART1_TX_DMA_INSTANCE) +#define UART1_DMA_TX_IRQHandler DMA2_Channel6_IRQHandler +#define UART1_TX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define UART1_TX_DMA_INSTANCE DMA2_Channel6 +#define UART1_TX_DMA_REQUEST DMA_REQUEST_2 +#define UART1_TX_DMA_IRQ DMA2_Channel6_IRQn #endif -/* dma2 channel6 */ - -/* dma2 channel7 */ -#if defined(BSP_UART1_RX_USING_DMA) && !defined(USART1_RX_DMA_REQUEST) - -#define USART1_DMA_RX_IRQHandler DMA2_Channel7_IRQHandler -#define USART1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN -#define USART1_RX_DMA_INSTANCE DMA2_Channel7 -#define USART1_RX_DMA_REQUEST DMA_REQUEST_2 -#define USART1_RX_DMA_IRQ DMA2_Channel7_IRQn - -#elif defined(BSP_QSPI_USING_DMA) && !defined(QSPI_DMA_CHANNEL) +/* DMA2 channel7 */ +#if defined(BSP_UART1_RX_USING_DMA) && !defined(UART1_RX_DMA_INSTANCE) +#define UART1_DMA_RX_IRQHandler DMA2_Channel7_IRQHandler +#define UART1_RX_DMA_RCC RCC_AHB1ENR_DMA2EN +#define UART1_RX_DMA_INSTANCE DMA2_Channel7 +#define UART1_RX_DMA_REQUEST DMA_REQUEST_2 +#define UART1_RX_DMA_IRQ DMA2_Channel7_IRQn +#elif defined(BSP_QSPI_USING_DMA) && !defined(QSPI_DMA_INSTANCE) #define QSPI_DMA_IRQHandler DMA2_Channel7_IRQHandler #define QSPI_DMA_RCC RCC_AHB1ENR_DMA2EN #define QSPI_DMA_INSTANCE DMA2_Channel7 -#define QSPI_DMA_CHANNEL DMA_REQUEST_3 +#define QSPI_DMA_REQUEST DMA_REQUEST_3 #define QSPI_DMA_IRQ DMA2_Channel7_IRQn - #endif -/* dma2 channel7 */ #endif /* __DMA_CONFIG_H__ */ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/l4/qspi_config.h b/bsp/stm32/libraries/HAL_Drivers/config/l4/qspi_config.h index ae968c0cfc..d76ef6dd1d 100644 --- a/bsp/stm32/libraries/HAL_Drivers/config/l4/qspi_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/config/l4/qspi_config.h @@ -30,7 +30,7 @@ #define QSPI_DMA_CONFIG \ { \ .Instance = QSPI_DMA_INSTANCE, \ - .Init.Request = QSPI_DMA_CHANNEL, \ + .Init.Request = QSPI_DMA_REQUEST, \ .Init.Direction = DMA_PERIPH_TO_MEMORY, \ .Init.PeriphInc = DMA_PINC_DISABLE, \ .Init.MemInc = DMA_MINC_ENABLE, \ diff --git a/bsp/stm32/libraries/HAL_Drivers/config/l4/uart_config.h b/bsp/stm32/libraries/HAL_Drivers/config/l4/uart_config.h index 0b27ff77c8..58644894b8 100644 --- a/bsp/stm32/libraries/HAL_Drivers/config/l4/uart_config.h +++ b/bsp/stm32/libraries/HAL_Drivers/config/l4/uart_config.h @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2018-11-06 SummerGift change to new framework + * 2018-11-06 SummerGift first version */ #ifndef __UART_CONFIG_H__ @@ -28,10 +28,10 @@ #ifndef UART1_DMA_CONFIG #define UART1_DMA_CONFIG \ { \ - .Instance = USART1_RX_DMA_INSTANCE, \ - .request = USART1_RX_DMA_REQUEST, \ - .dma_rcc = USART1_RX_DMA_RCC, \ - .dma_irq = USART1_RX_DMA_IRQ, \ + .Instance = UART1_RX_DMA_INSTANCE, \ + .request = UART1_RX_DMA_REQUEST, \ + .dma_rcc = UART1_RX_DMA_RCC, \ + .dma_irq = UART1_RX_DMA_IRQ, \ } #endif /* UART1_DMA_CONFIG */ #endif /* BSP_UART1_RX_USING_DMA */ @@ -51,10 +51,10 @@ #ifndef UART2_DMA_CONFIG #define UART2_DMA_CONFIG \ { \ - .Instance = USART2_RX_DMA_INSTANCE, \ - .request = USART2_RX_DMA_REQUEST, \ - .dma_rcc = USART2_RX_DMA_RCC, \ - .dma_irq = USART2_RX_DMA_IRQ, \ + .Instance = UART2_RX_DMA_INSTANCE, \ + .request = UART2_RX_DMA_REQUEST, \ + .dma_rcc = UART2_RX_DMA_RCC, \ + .dma_irq = UART2_RX_DMA_IRQ, \ } #endif /* UART2_DMA_CONFIG */ #endif /* BSP_UART2_RX_USING_DMA */