#include "bsp_usart.h" #include "main.h" extern UART_HandleTypeDef huart1; extern DMA_HandleTypeDef hdma_usart1_tx; extern DMA_HandleTypeDef hdma_usart1_rx; extern UART_HandleTypeDef huart6; extern DMA_HandleTypeDef hdma_usart6_rx; extern DMA_HandleTypeDef hdma_usart6_tx; void usart1_init(uint8_t *rx1_buf, uint8_t *rx2_buf, uint16_t dma_buf_num) { //enable the DMA transfer for the receiver and tramsmit request //使能DMA串口接收和发送 SET_BIT(huart1.Instance->CR3, USART_CR3_DMAR); SET_BIT(huart1.Instance->CR3, USART_CR3_DMAT); //enalbe idle interrupt //使能空闲中断 __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); //disable DMA //失效DMA __HAL_DMA_DISABLE(&hdma_usart1_rx); while(hdma_usart1_rx.Instance->CR & DMA_SxCR_EN) { __HAL_DMA_DISABLE(&hdma_usart1_rx); } __HAL_DMA_CLEAR_FLAG(&hdma_usart1_rx, DMA_LISR_TCIF1); hdma_usart1_rx.Instance->PAR = (uint32_t) & (USART1->DR); //memory buffer 1 //内存缓冲区1 hdma_usart1_rx.Instance->M0AR = (uint32_t)(rx1_buf); //memory buffer 2 //内存缓冲区2 hdma_usart1_rx.Instance->M1AR = (uint32_t)(rx2_buf); //data length //数据长度 __HAL_DMA_SET_COUNTER(&hdma_usart1_rx, dma_buf_num); //enable double memory buffer //使能双缓冲区 SET_BIT(hdma_usart1_rx.Instance->CR, DMA_SxCR_DBM); //enable DMA //使能DMA __HAL_DMA_ENABLE(&hdma_usart1_rx); //disable DMA //失效DMA __HAL_DMA_DISABLE(&hdma_usart1_tx); while(hdma_usart1_tx.Instance->CR & DMA_SxCR_EN) { __HAL_DMA_DISABLE(&hdma_usart1_tx); } hdma_usart1_tx.Instance->PAR = (uint32_t) & (USART1->DR); usart1_tx_dma_init(); } void usart1_tx_dma_init(void) { //enable the DMA transfer for the receiver and tramsmit request //使能DMA串口接收和发送 SET_BIT(huart1.Instance->CR3, USART_CR3_DMAR); SET_BIT(huart1.Instance->CR3, USART_CR3_DMAT); //disable DMA //失效DMA __HAL_DMA_DISABLE(&hdma_usart1_tx); while(hdma_usart1_tx.Instance->CR & DMA_SxCR_EN) { __HAL_DMA_DISABLE(&hdma_usart1_tx); } hdma_usart1_tx.Instance->PAR = (uint32_t) & (USART1->DR); hdma_usart1_tx.Instance->M0AR = (uint32_t)(NULL); hdma_usart1_tx.Instance->NDTR = 0; } void usart1_tx_dma_enable(uint8_t *data, uint16_t len) { //disable DMA //失效DMA __HAL_DMA_DISABLE(&hdma_usart1_tx); while(hdma_usart1_tx.Instance->CR & DMA_SxCR_EN) { __HAL_DMA_DISABLE(&hdma_usart1_tx); } __HAL_DMA_CLEAR_FLAG(&hdma_usart1_tx, DMA_HISR_TCIF7); hdma_usart1_tx.Instance->M0AR = (uint32_t)(data); __HAL_DMA_SET_COUNTER(&hdma_usart1_tx, len); __HAL_DMA_ENABLE(&hdma_usart1_tx); } void usart6_init(uint8_t *rx1_buf, uint8_t *rx2_buf, uint16_t dma_buf_num) { //enable the DMA transfer for the receiver and tramsmit request //使能DMA串口接收和发送 SET_BIT(huart6.Instance->CR3, USART_CR3_DMAR); SET_BIT(huart6.Instance->CR3, USART_CR3_DMAT); //enalbe idle interrupt //使能空闲中断 __HAL_UART_ENABLE_IT(&huart6, UART_IT_IDLE); //disable DMA //失效DMA __HAL_DMA_DISABLE(&hdma_usart6_rx); while(hdma_usart6_rx.Instance->CR & DMA_SxCR_EN) { __HAL_DMA_DISABLE(&hdma_usart6_rx); } __HAL_DMA_CLEAR_FLAG(&hdma_usart6_rx, DMA_LISR_TCIF1); hdma_usart6_rx.Instance->PAR = (uint32_t) & (USART6->DR); //memory buffer 1 //内存缓冲区1 hdma_usart6_rx.Instance->M0AR = (uint32_t)(rx1_buf); //memory buffer 2 //内存缓冲区2 hdma_usart6_rx.Instance->M1AR = (uint32_t)(rx2_buf); //data length //数据长度 __HAL_DMA_SET_COUNTER(&hdma_usart6_rx, dma_buf_num); //enable double memory buffer //使能双缓冲区 SET_BIT(hdma_usart6_rx.Instance->CR, DMA_SxCR_DBM); //enable DMA //使能DMA __HAL_DMA_ENABLE(&hdma_usart6_rx); //disable DMA //失效DMA __HAL_DMA_DISABLE(&hdma_usart6_tx); while(hdma_usart6_tx.Instance->CR & DMA_SxCR_EN) { __HAL_DMA_DISABLE(&hdma_usart6_tx); } hdma_usart6_tx.Instance->PAR = (uint32_t) & (USART6->DR); } void usart6_tx_dma_enable(uint8_t *data, uint16_t len) { //disable DMA //失效DMA __HAL_DMA_DISABLE(&hdma_usart6_tx); while(hdma_usart6_tx.Instance->CR & DMA_SxCR_EN) { __HAL_DMA_DISABLE(&hdma_usart6_tx); } __HAL_DMA_CLEAR_FLAG(&hdma_usart6_tx, DMA_HISR_TCIF6); hdma_usart6_tx.Instance->M0AR = (uint32_t)(data); __HAL_DMA_SET_COUNTER(&hdma_usart6_tx, len); __HAL_DMA_ENABLE(&hdma_usart6_tx); }