STM32 HAL HAL_UART_DMAStop遇到的坑

在使用串口DMA进行发送和接收时,遇到在中断中停止DMA后收发功能均停止的问题。为确保仅停止接收而不影响发送,文章提出在中断服务函数内检测到串口空闲标志后,单独调用接收DMA的停止函数,并禁用IDLE中断。这样可以保持发送功能的正常运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在写串口DMA空闲中断接收的时候,发现一个问题。因为我使用了串口DMA发送和接收功能,发现在中断里将DMA停止以后,收发功能都会停止,为了解决停止收功能,不影响发送部分,解决办法如下:

首先我是需要在接收中断内关闭DMA,如下所示:

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */

  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
		if(RESET != __HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE))//Check whether the specified UART flag is set or not.
	{
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);//Clear the UART IDLE pending flag.(Otherwise it will continue to interrupt)
		HAL_UART_DMAStop(&huart1); //此函数带来的影响
		/*******************/
		Uart_recv_len = RECV_BUFFER_SIZE - (__HAL_DMA_GET_COUNTER(&hdma_usart1_rx));
		Uart_recv_flag = 1;
		__HAL_UART_DISABLE_IT(&huart1, UART_IT_IDLE);
	}

之后跳转HAL_UART_DMAStop()函数,发现函数内部主要由两部分组成: 停止发送DMA + 停止接收DMA;因此想要不互相影响,只需要把此函数停止接收DMA部分复制出来即可;

HAL库还是特别方便的;

STM32 HAL(Hardware Abstraction Layer)是一个用于简化STM32微控制器硬件操作的软件抽象层,它提供了一系列函数,方便开发者处理各种功能,如UART通信。`HAL_UART_Receive`函数主要用于从指定的串行口中接收数据。 使用`HAL_UART_Receive`的具体步骤如下: 1. **初始化**: 首先,你需要初始化 UART 设备。这包括配置波特率、数据位数、停止位、校验模式等。调用`HAL_UART_Init`函数并传入对应的设备句柄。 ```c HAL_StatusTypeDef status; UART_HandleTypeDef huart; status = HAL_UART_Init(&huart); if (HAL_OK != status) { // 初始化失败,处理错误 } ``` 2. **开启接收**: 打开中断以监听接收到的数据,可以使用`HAL_UART_ITConfig`设置接收中断。 ```c HAL_UART_ITConfig(&huart, UART_IT_RXNE, ENABLE); // RXNE表示接收完成中断 ``` 3. **接收数据**: 调用`HAL_UART_Receive`函数开始接收数据,该函数会在接收到指定数量的字节或者接收到中断标志触发时返回。 ```c uint8_t buffer[256]; size_t data_length = sizeof(buffer); status = HAL_UART_Receive(&huart, buffer, data_length, timeout); // timeout是你希望等待的时间(可选) if (status == HAL_OK) { // 数据已成功接收,处理缓冲区内容 } else if (status == HAL_TIMEOUT) { // 接收超时 } else { // 其他错误处理 } ``` 4. **关闭接收**: 在不再需要接收数据时,记得关闭中断并关闭 UART。 ```c HAL_UART_ITConfig(&huart, UART_IT_RXNE, DISABLE); HAL_UART_DeInit(&huart); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值