STM32使用串口DMA发送+空闲中断

/*
使用串口DMA发送+空闲中断
注意使能串口中断和DMA中断
考虑发送超时处理机制。
*/

void init_Myuart(void){
  HAL_UARTEx_ReceiveToIdle_DMA(&huart1,rx_buf, sizeof(rx_buf));
}

void myuart_send(uint8_t * send_data,uint16_t lenght)
{
  HAL_UART_Transmit_DMA(&huart1,(uint8_t *)&send_data,lenght));  
}

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1) {
      ;
    }    
    if(huart->Instance == USART2) {  
     ;
    }
}

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
  if (huart->Instance == USART1)  {
    ;
  }
  
  if(huart->Instance == USART2) {
    ;
  }
}

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 */
  HAL_UARTEx_ReceiveToIdle_DMA(&huart1,rx_buf, sizeof(rx_buf)-1);//回调完后需要再次启用
  /* USER CODE END USART1_IRQn 1 */
}

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
stm32f103的串口DMA空闲中断接收功能是指通过DMA通道来实现串口接收,并通过空闲中断来触发数据接收完成的事件。下面是修复版的实现过程: 首先,要确保串口DMA的时钟已经使能,并按照正确的引脚配置工作模式。然后,需要配置串口接收的参数,比如波特率、数据位、停止位、奇偶校验等。在这之前,还需要先初始化DMA的通道,并设置合适的传输方向和数据缓冲区。 接下来,在主函数中进行初始化操作。首先,要对串口进行初始化配置,调用相关库函数进行参数设置。然后,设置DMA的传输方向为从外设到存储器,并设置数据长度和数据缓冲区地址。 然后,要编写串口空闲中断的处理函数。当DMA传输完成时,触发空闲中断。在空闲中断处理函数中,需要判断是哪个串口触发的空闲中断。通过判断状态寄存器位来判断当前串口是否接收到了数据,并读取接收缓冲区的数据。在接收完数据后,通过设置DMA的数据长度和数据缓冲区地址来启动下一次接收。 最后,在主函数中,使能串口空闲中断,并启动DMA传输。等待空闲中断触发后,会自动执行空闲中断的处理函数。在空闲中断处理函数中,处理完数据后,再次启动DMA传输,实现连续的接收功能。 以上是stm32f103串口DMA空闲中断接收的修复版实现过程。通过合理的初始化配置和中断处理,可以保证串口接收的稳定性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值