STM32H743HAL库 串口DMA
时间: 2024-12-29 12:13:17 浏览: 7
### STM32H743 HAL库串口DMA传输
对于STM32H743系列微控制器,在使用HAL库实现串口通信时,可以利用DMA来优化数据传输效率。通过配置DMA用于发送和接收操作,能够显著减少CPU占用率并提高系统的实时性能。
#### 配置环境准备
为了使能DMA功能,需先初始化相应的硬件资源,包括但不限于GPIO、USART以及DMA本身。这些设置通常可以在`stm32h7xx_hal_msp.c`文件中的回调函数里完成:
```c
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USARTx_TX, RX GPIO pin configuration */
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF8_USART1; // Adjust according to your actual connection.
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* Enable clocks and configure DMA channels */
__HAL_RCC_DMA1_CLK_ENABLE();
hdma_usart1_tx.Instance = DMA1_Stream5;
hdma_usart1_tx.Init.Channel = DMA_CHANNEL_4;
hdma_usart1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_usart1_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart1_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart1_tx.Init.Mode = DMA_NORMAL;
hdma_usart1_tx.Init.Priority = DMA_PRIORITY_LOW;
hal_dma_init(&hdma_usart1_tx);
}
```
上述代码片段展示了如何启用USART1的TX线路上的DMA流,并对其进行必要的参数设定[^1]。
#### 实现串口DMA发送与接收
接下来定义两个重要的处理程序——一个是负责启动DMA传输过程;另一个则是用来响应DMA传输完成后触发的中断事件。下面给出了一段简化版的例子说明怎样发起一次完整的DMA发送动作:
```c
UART_HandleTypeDef UartHandle;
// 初始化UartHandle结构体成员变量...
UartHandle.Instance = USART1;
UartHandle.Init.BaudRate = 115200;
UartHandle.Init.WordLength = UART_WORDLENGTH_8B;
UartHandle.Init.StopBits = UART_STOPBITS_1;
UartHandle.Init.Parity = UART_PARITY_NONE;
UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
UartHandle.Init.Mode = UART_MODE_TX_RX;
UartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&UartHandle) != HAL_OK){
Error_Handler();
}
char *pDataToSend = "Hello World!";
uint16_t sizeOfData = strlen(pDataToSend)+1;
/* Start transmission with DMA */
if(HAL_UART_Transmit_DMA(&UartHandle,(uint8_t*) pDataToSend,sizeOfData)!= HAL_OK){
Error_Handler();
}
// 定义DMA传输结束后的回调函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1){
printf("Transmit Complete\n");
}
}
```
这段代码实现了通过DMA方式发送字符串给指定的目标设备的功能。当DMA传输结束后会调用预设好的回调函数通知应用程序层已经完成了此次写入操作。
同样地,也可以采用类似的机制来进行基于DMA的数据读取工作。只需调整为接收模式下的相应API即可。
阅读全文