uart接受串口数据(DMA+IT方式,基于HAL库)

1.通过stm32cubeMx使能usart1并使能usart1中断,开启usart1的接受DMA

2.在void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)函数的最后添加

//使能空闲中断
__HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE)。

huart1为usart1句柄。

UART_IT_IDLE为串口空闲的一个宏

3.在main函数紧挨着while(1)且在while(1)前面的地方加入

//开启DMA搬运
HAL_UART_Receive_DMA(&huart1, DMA_Usart1_RxBuffer, RXLENGHT)。

huart1为串口的句柄,DMA_Usart1_RxBuffer为DMA搬运到的目的地(一个数组)。

RXLENGHT为需要搬运的大小

4.在stm32f4xx_it.c文件中的USART1_IRQHandler函数修改为:

void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
    uint16_t uart1_rece_len = 0;
    //判断是否产生空闲中断
    if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) == SET){
        __HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除中断标志
//        huart1.Instance->SR;
//        huart1.Instance->DR;
        //停止DMA
        HAL_UART_DMAStop(&huart1);
        //将接受长度求出
        uart1_rece_len = RXLENGHT - hdma_usart1_rx.Instance->NDTR;//试试这里能不能通过strlen求出长度
        
        //将接受的数据添加到uart1_msg_S中,每次对USArt1进行读取后都需要清空缓冲区
        uart1_msg_S.len = strlen((char*)uart1_msg_S.data);
        
        memcpy((void*)(&uart1_msg_S.data[uart1_msg_S.len]), (void*)DMA_Usart1_RxBuffer, uart1_rece_len);
        
        //将DMA_Usart1_RxBuffer清空
        memset((void*)DMA_Usart1_RxBuffer, 0, RXLENGHT);
        
        //再次开启DMA
        HAL_UART_Receive_DMA(&huart1, DMA_Usart1_RxBuffer, RXLENGHT);
    }
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */

  /* USER CODE END USART1_IRQn 1 */
}

这个代码我还没有来得及试,试了之后再修改

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值