#include "Hal_Dma_Usart/hal_usart_dma.h"
#include "liiot_net_device.h"
#include "sys_timer.h"
#include <string.h>
static uint32_t (*hal_usart_dma_get_sys_tick)(void);
typedef struct
{
USART_TypeDef *usart_port;
DMA_Channel_TypeDef *usart_send_dma_chnl;
DMA_Channel_TypeDef *usart_recv_dma_chnl;
}_usart_dma_chnl;
static _usart_dma_chnl usart_dma_chnl[UART_PORT_INDEX] = {
USART1, DMA1_Channel4, DMA1_Channel5,
USART2, DMA1_Channel7, DMA1_Channel6,
USART3, DMA1_Channel2, DMA1_Channel2,
};
/* UART 数据结构 */
typedef struct
{
#if LIIOT_CONV_HOST_MAX
liiot_convergence_host_t usart_host_net;
#endif
_usart_dma_chnl *usart_chnl;
bool usart_tx_flg;
bool usart_rx_flg;
uint8_t usart_tx[USART_DMA_BUF_SIZE];
uint16_t usart_tx_len;
uint8_t usart_rx[USART_DMA_BUF_SIZE];
uint16_t usart_rx_len;
}_usart_para;
static _usart_para usart_para[UART_PORT_INDEX];
#if defined (Open_UART1_DMA)
/***************************************************************
* UART1_TX PA9
* UART1_RX PA10
****************************************************************/
#define USART1_GPIO_PORT GPIOA
#define USART1_RxPin GPIO_Pin_10
#define USART1_TxPin GPIO_Pin_9
#endif
#if defined (Open_UART2_DMA)
/***************************************************************
* UART2_TX PA2
* UART2_RX PA3
****************************************************************/
#define USART2_GPIO_PORT GPIOA
#define USART2_RxPin GPIO_Pin_3
#define USART2_TxPin GPIO_Pin_2
#endif
#if defined (Open_UART3_DMA)
/***************************************************************
* UART3_TX PB10
* UART3_RX PB11
****************************************************************/
#define USART3_GPIO_PORT GPIOB
#define USART3_RxPin GPIO_Pin_11
#define USART3_TxPin GPIO_Pin_10
#endif
/*********************************************************************
* @brief UART GPIO configuration
* @param None
* @retval None
* @date 20141205
***********************************************************************/
static void hal_usart_dma_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
#if defined (Open_UART1_DMA)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = USART1_TxPin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(USART1_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = USART1_RxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(USART1_GPIO_PORT, &GPIO_InitStructure);
#endif
#if defined (Open_UART2_DMA)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = USART2_TxPin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(USART2_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = USART2_RxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(USART2_GPIO_PORT, &GPIO_InitStructure);
#endif
#if defined (Open_UART3_DMA)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitStructure.GPIO_Pin = USART3_TxPin;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(USART3_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = USART3_RxPin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(USART3_GPIO_PORT, &GPIO_InitStructure);
#endif
}
/*********************************************************************
* @brief UART configuration
* @param None
* @retval None
* @date 20141205
***********************************************************************/
static void hal_usart_dma_usart_Config(void)
{
USART_InitTypeDef USART_InitStructure;
#if defined (Open_UART1_DMA)
/* UART1 connect to HC-02 */
/* HC-02: baud rate is 57600, 8-N-1 */
USART_InitStructure.USART_BaudRate = 57600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowControl =
USART_HardwareFlowControl_None;
USART_Init(USART1, &USART_InitStructure);
/* 采用空闲中断 */
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
/* 使能串口发送完成中断 */
USART_ITConfig(USART1, USART_IT_TC, ENABLE);
USART_DMACmd(USART1, USART_DMAReq_Rx | USART_DMAReq_Tx, ENABLE);
/* enable USART1 */
USART_Cmd(USART1, ENABLE);
/* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去
如下语句解决第1个字节无法正确发送出去的问题 */
USART_ClearFlag(USART1, USART_FLAG_TC); /* 清发送完成标志,Transmission Complete flag */
#endif
#if defined (Open_UART2_DMA)
/* UART2 connect to CP2102 */
/* CP2102: baud rate is 57600, 8-N-1 */
USART_InitStructure.USART_BaudRate = 57600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowControl =
USART_HardwareFlowControl_None;
USART_Init(USART2, &USART_InitStructure);
/* 采用空闲中断 */
USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);
/* 使能串口发送完成中断 */
USART_ITConfig(USART2, USART_IT_TC, ENABLE);
USART_DMACmd(USART2, USART_DMAReq_Rx | USART_DMAReq_Tx, ENABLE);
/* enable USART2 */
USART_Cmd(USART2, ENABLE);
/* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去
如下语句解决第1个字节无法正确发送出去的问题 */
USART_ClearFlag(USART2, USART_FLAG_TC); /* 清发送完成标志,Transmission Complete flag */
#endif
#if defined (Open_UART3_DMA)
USART_InitStructure.USART_BaudRate = 57600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_HardwareFlowControl =
USART_HardwareFlowControl_None;
USART_Init(USART3, &USART_InitStructure);
/* 采用空闲中断 */
USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);
/* 使能串口发送完成中断 */
USART_ITConfig(USART3, USART_IT_TC, ENABLE);
USART_DMACmd(USART3, USART_DMAReq_Rx | USART_DMAReq_Tx, ENABLE);
/* enable USART3 */
USART_Cmd(USART3, ENABLE);
/* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去
如下语句解决第1个字节无法正确发送出去的问题 */
USART_ClearFlag(USART3, USART_FLAG_TC); /* 清发送完成标志,Transmission Complete flag */
#endif
}
/*********************************************************************
* @brief Initialize the NCIC
* @param None
* @retval None
* @date 20141205
***********************************************************************/
static void hal_usart_dma_NVIC_Config(void)
STM32 UART DMA 收发数据
需积分: 49 166 浏览量
2019-04-22
10:20:32
上传
评论 5
收藏 4KB ZIP 举报
WildMonkey
- 粉丝: 3
- 资源: 9