#include <string.h>
#include "stm32f7_uart_dma.h"
#include "../MyModules/RingQueue.h"
#include "../MyModules/Protocol.h"
/** @addtogroup STM32F7xx_LL_Examples
* @{
*/
/** @addtogroup USART_Communication_TxRx_DMA
* @{
*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define DMA_RECEPT_DATA_SIZE 1 //73×Ö½Ú´¥·¢DMAÖжÏ
#define DMA_DATA_BUF_SIZE 128 //DMA·¢ËÍ»º´æ´óС
/* Private macro -------------------------------------------------------------*/
#define USE_USART2//USE_USART3//USE_USART2
#ifdef USE_USART3
#define UART_GPIOx GPIOD
#define UART_TX_PIN LL_GPIO_PIN_8
#define UART_RX_PIN LL_GPIO_PIN_9
#define UART_NUM USART3
#define LL_APB1_GRP1_PERIPH_USARTx LL_APB1_GRP1_PERIPH_USART3
#define LL_RCC_USARTx_CLKSOURCE_PCLK1 LL_RCC_USART3_CLKSOURCE_PCLK1
#define UART_SEND_STREAM LL_DMA_STREAM_3
#define UART_RECV_STREAM LL_DMA_STREAM_1
#define UART_DMA_CHANNEL LL_DMA_CHANNEL_4
#define UART_DMA_NUM DMA1
#else
#define UART_GPIOx GPIOD
#define UART_TX_PIN LL_GPIO_PIN_5
#define UART_RX_PIN LL_GPIO_PIN_6
#define UART_NUM USART2
#define LL_APB1_GRP1_PERIPH_USARTx LL_APB1_GRP1_PERIPH_USART2
#define LL_RCC_USARTx_CLKSOURCE_PCLK1 LL_RCC_USART2_CLKSOURCE_PCLK1
#define UART_SEND_STREAM LL_DMA_STREAM_6
#define UART_RECV_STREAM LL_DMA_STREAM_5
#define UART_DMA_CHANNEL LL_DMA_CHANNEL_4
#define UART_DMA_NUM DMA1
#endif
/* Private variables ---------------------------------------------------------*/
/* Buffer used for transmission */
uint8_t cTxDMABuffer[DMA_DATA_BUF_SIZE];
/* Buffer used for reception */
uint8_t cRxDMABuffer[DMA_DATA_BUF_SIZE];
#define RX_BUF_MAX_SIZE (MAX_CMD_SIZE*10)
static unsigned char RingBuffer[RX_BUF_MAX_SIZE];
static RING_QUEUE RingQueue;
/* Private functions ---------------------------------------------------------*/
/**
* @brief This function configures the DMA Channels for TX and RX transfers
* @note This function is used to :
* -1- Enable DMA1 clock
* -2- Configure NVIC for DMA transfer complete/error interrupts
* -3- Configure DMA TX channel functional parameters
* -4- Configure DMA RX channel functional parameters
* -5- Enable transfer complete/error interrupts
* @param None
* @retval None
*/
void Configure_USART2_DMA(void)
{
/* DMA1 used for USART3 Transmission and Reception
*/
/* (1) Enable the clock of DMA1 */
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1);
/* (2) Configure NVIC for DMA transfer complete/error interrupts */
#ifdef USE_USART3
NVIC_SetPriority(DMA1_Stream3_IRQn, 0);
NVIC_EnableIRQ(DMA1_Stream3_IRQn);
NVIC_SetPriority(DMA1_Stream1_IRQn, 0);
NVIC_EnableIRQ(DMA1_Stream1_IRQn);
#else
NVIC_SetPriority(DMA1_Stream5_IRQn, 0);
NVIC_EnableIRQ(DMA1_Stream5_IRQn);
NVIC_SetPriority(DMA1_Stream6_IRQn, 0);
NVIC_EnableIRQ(DMA1_Stream6_IRQn);
#endif
/* (3) Configure the DMA functional parameters for transmission */
LL_DMA_SetChannelSelection(UART_DMA_NUM, UART_SEND_STREAM, UART_DMA_CHANNEL);
LL_DMA_ConfigTransfer(UART_DMA_NUM, UART_SEND_STREAM,
LL_DMA_DIRECTION_MEMORY_TO_PERIPH |
LL_DMA_PRIORITY_HIGH |
LL_DMA_MODE_NORMAL |
#include "stm32f7_uart_dma.h"
#include "../MyModules/RingQueue.h"
#include "../MyModules/Protocol.h"
/** @addtogroup STM32F7xx_LL_Examples
* @{
*/
/** @addtogroup USART_Communication_TxRx_DMA
* @{
*/
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define DMA_RECEPT_DATA_SIZE 1 //73×Ö½Ú´¥·¢DMAÖжÏ
#define DMA_DATA_BUF_SIZE 128 //DMA·¢ËÍ»º´æ´óС
/* Private macro -------------------------------------------------------------*/
#define USE_USART2//USE_USART3//USE_USART2
#ifdef USE_USART3
#define UART_GPIOx GPIOD
#define UART_TX_PIN LL_GPIO_PIN_8
#define UART_RX_PIN LL_GPIO_PIN_9
#define UART_NUM USART3
#define LL_APB1_GRP1_PERIPH_USARTx LL_APB1_GRP1_PERIPH_USART3
#define LL_RCC_USARTx_CLKSOURCE_PCLK1 LL_RCC_USART3_CLKSOURCE_PCLK1
#define UART_SEND_STREAM LL_DMA_STREAM_3
#define UART_RECV_STREAM LL_DMA_STREAM_1
#define UART_DMA_CHANNEL LL_DMA_CHANNEL_4
#define UART_DMA_NUM DMA1
#else
#define UART_GPIOx GPIOD
#define UART_TX_PIN LL_GPIO_PIN_5
#define UART_RX_PIN LL_GPIO_PIN_6
#define UART_NUM USART2
#define LL_APB1_GRP1_PERIPH_USARTx LL_APB1_GRP1_PERIPH_USART2
#define LL_RCC_USARTx_CLKSOURCE_PCLK1 LL_RCC_USART2_CLKSOURCE_PCLK1
#define UART_SEND_STREAM LL_DMA_STREAM_6
#define UART_RECV_STREAM LL_DMA_STREAM_5
#define UART_DMA_CHANNEL LL_DMA_CHANNEL_4
#define UART_DMA_NUM DMA1
#endif
/* Private variables ---------------------------------------------------------*/
/* Buffer used for transmission */
uint8_t cTxDMABuffer[DMA_DATA_BUF_SIZE];
/* Buffer used for reception */
uint8_t cRxDMABuffer[DMA_DATA_BUF_SIZE];
#define RX_BUF_MAX_SIZE (MAX_CMD_SIZE*10)
static unsigned char RingBuffer[RX_BUF_MAX_SIZE];
static RING_QUEUE RingQueue;
/* Private functions ---------------------------------------------------------*/
/**
* @brief This function configures the DMA Channels for TX and RX transfers
* @note This function is used to :
* -1- Enable DMA1 clock
* -2- Configure NVIC for DMA transfer complete/error interrupts
* -3- Configure DMA TX channel functional parameters
* -4- Configure DMA RX channel functional parameters
* -5- Enable transfer complete/error interrupts
* @param None
* @retval None
*/
void Configure_USART2_DMA(void)
{
/* DMA1 used for USART3 Transmission and Reception
*/
/* (1) Enable the clock of DMA1 */
LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1);
/* (2) Configure NVIC for DMA transfer complete/error interrupts */
#ifdef USE_USART3
NVIC_SetPriority(DMA1_Stream3_IRQn, 0);
NVIC_EnableIRQ(DMA1_Stream3_IRQn);
NVIC_SetPriority(DMA1_Stream1_IRQn, 0);
NVIC_EnableIRQ(DMA1_Stream1_IRQn);
#else
NVIC_SetPriority(DMA1_Stream5_IRQn, 0);
NVIC_EnableIRQ(DMA1_Stream5_IRQn);
NVIC_SetPriority(DMA1_Stream6_IRQn, 0);
NVIC_EnableIRQ(DMA1_Stream6_IRQn);
#endif
/* (3) Configure the DMA functional parameters for transmission */
LL_DMA_SetChannelSelection(UART_DMA_NUM, UART_SEND_STREAM, UART_DMA_CHANNEL);
LL_DMA_ConfigTransfer(UART_DMA_NUM, UART_SEND_STREAM,
LL_DMA_DIRECTION_MEMORY_TO_PERIPH |
LL_DMA_PRIORITY_HIGH |
LL_DMA_MODE_NORMAL |