stm32 uart dma 中断
时间: 2025-02-28 08:49:32 浏览: 44
### STM32 UART DMA 中断 使用方法 教程 示例代码
#### 配置USART与DMA硬件资源
为了实现高效的UART通信,STM32利用了DMA控制器来处理数据传输。通过配置USART外设以及相应的DMA通道,可以在不占用CPU的情况下完成大量数据的收发操作。
```c
// 初始化USART并开启DMA模式
static void MX_USART1_UART_Init(void)
{
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
}
```
#### 创建接收缓冲区及初始化DMA
定义全局变量作为DMA传输的数据容器,并设置初始状态以便后续判断DMA工作情况。
```c
#define MAX_BUF 1024 // 定义最大缓存大小
uint8_t u1_rec_buf[MAX_BUF]; /* 接收缓冲 */
volatile uint8_t receive_num = 0; /* 已接收到字节数目 */
/* 发送部分 */
uint8_t sendbuf[8000] = {0}; /* 发送缓冲 */
volatile uint8_t Tx_busy = 0; /* 等待标志位, 0为空闲可发送, 1为正在发送需等待 */
```
#### 启用IDLE线检测中断服务函数
当串口处于空闲状态时触发此事件,意味着上一次完整的消息已经结束,此时可以通过读取DMA寄存器得知实际接收到多少有效字符数。
```c
void USART1_IRQHandler(void)
{
HAL_UART_IRQHandler(&huart1);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1){
__HAL_DMA_DISABLE_IT(huart->hdmarx, DMA_IT_TC); // 关闭DMA传输完成中断
// 处理接收到的数据...
// 准备下一轮接收
HAL_UART_Receive_DMA(&huart1, (uint8_t *)u1_rec_buf, sizeof(u1_rec_buf));
}
}
```
#### 实现发送功能
在准备就绪的状态下调用`HAL_UART_Transmit_DMA()`启动异步发送过程;同时更新Tx_busy标记防止重复调用造成冲突。
```c
void SendData(const char* data, size_t length)
{
while(Tx_busy){} /* 如果忙则循环等待 */
memcpy(sendbuf, data, length); /* 将要发送的内容复制到sendbuf中 */
Tx_busy = 1; /* 设置忙碌标志 */
HAL_UART_Transmit_DMA(&huart1, sendbuf, length);
// 当DMA传输完成后会自动清除busy flag,在回调里做相应处理
}
```
阅读全文
相关推荐

















