STM32串口发送DMA中断中重新开启DMA
时间: 2023-08-05 16:08:57 浏览: 253
STM32F031+串口中断+DMA发送
在 STM32 串口发送 DMA 中断中重新开启 DMA 的方法如下:
1. 定义 DMA 发送缓存数组和 DMA 外设地址。
```c
uint8_t buffer[10] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a};
uint32_t uart_tx_addr = (uint32_t)&(USARTx->DR);
```
2. 配置 DMA 发送通道。
```c
hdma_usart_tx.Instance = USARTx_TX_DMA_STREAM;
hdma_usart_tx.Init.Channel = USARTx_TX_DMA_CHANNEL;
hdma_usart_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_usart_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart_tx.Init.Mode = DMA_NORMAL;
hdma_usart_tx.Init.Priority = DMA_PRIORITY_LOW;
hdma_usart_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
hdma_usart_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
hdma_usart_tx.Init.MemBurst = DMA_MBURST_SINGLE;
hdma_usart_tx.Init.PeriphBurst = DMA_PBURST_SINGLE;
HAL_DMA_Init(&hdma_usart_tx);
__HAL_LINKDMA(&huart, hdmatx, hdma_usart_tx);
```
3. 开始 DMA 传输。
```c
HAL_DMA_Start_IT(&hdma_usart_tx, (uint32_t)buffer, uart_tx_addr, sizeof(buffer));
```
4. 在 DMA 发送完成中断回调函数中重新开启 DMA 传输。
```c
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_DMA_Start_IT(&hdma_usart_tx, (uint32_t)buffer, uart_tx_addr, sizeof(buffer));
}
```
在 DMA 传输过程中,如果需要修改缓存数组中的数据,可以在 DMA 发送完成中断回调函数中修改,然后重新开启 DMA 传输即可。需要注意的是,在修改缓存数组时要保证数据的一致性,避免数据错乱等问题。
阅读全文