stm32f405 串口1 DMA收发 源代码
时间: 2024-09-29 17:13:17 浏览: 76
STM32F405系列微控制器的串口1(USART1)利用DMA(Direct Memory Access)可以提高数据传输的效率,特别是当需要处理大量数据时,它能减少CPU的负载。以下是一个简化的源代码片段,展示了如何配置USART1的DMA接收和发送功能:
```c
#include "stm32f4xx_hal.h"
// 初始化USART1和DMA
void init_USART_DMA(USART_HandleTypeDef *husart)
{
// 初始化USART
husart->Instance = USART1;
HAL_UART_Init(husart);
// 配置USART的DMA接收
USART_DMAModeConfig(husart, USART_DMATx | USART_DMARx);
HAL_UARTEx_EnableITDMA(husart, USART_IT_RXNE); // 启用接收完成中断
// 配置DMA接收通道
DMA_HandleTypeDef hdma_usart1_rx;
hdma_usart1_rx.Init.Channel = DMA_CHANNEL_4; // 设定DMA通道
hdma_usart1_rx.Init.Direction = DMA_DIR_PERIPH_TO_MEMORY; // 数据从外设到内存
hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE; // 不增加外设地址
hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE; // 增加内存地址
hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; // 字节对齐
hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; // 字节对齐
hdma_usart1_rx.Init.Mode = DMA_NORMAL; // 正常模式
hdma_usart1_rx.Init.Priority = DMA_PRIORITY_HIGHEST; // 最高优先级
hdma_usart1_rx.Init.FIFOMode = DMA_FIFOMODE_ENABLE; // 开启DMA FIFO
hdma_usart1_rx.Init.Request = DMA_REQUEST_USART1; // 请求来自于USART1 RXNE
HAL_DMA_Init(&hdma_usart1_rx);
__HAL_LINKDMA(husart,.hdmarx, hdma_usart1_rx);
// 配置DMA发送
// 类似于接收部分,只是方向相反,设置相应的中断和配置
// 开始DMA传输
HAL_UART_DMAStop(husart);
HAL_DMA_Start_IT(&hdma_usart1_rx, (uint32_t)&husart->DR, (uint32_t)USART1_RX_BUF, (uint32_t)husart->RxCount);
HAL_UARTDMARequest(husart, DMAReq, ENABLE); // 允许特定请求
}
// 当接收到数据时,此函数会被调用
void HAL_UART_RxCpltCallback(USART_HandleTypeDef *husart)
{
if (husart->ErrorCode == HAL_UART_ERROR_NONE)
// 处理接收到的数据...
}
// 相应的中断服务程序,检查接收完成标志并更新接收计数
void HAL_UART_RxHalfCpltCallback(USART_HandleTypeDef *husart)
{
// 更新接收计数
}
阅读全文