串口DMA

串口DMA接收只需要将平时使用的HALUARTReceive_IT(&huart1,&data,1);

更改为HALUARTReceive_DMA(&huart1,&data,1);即可

此时的接收中断是DMA接收完成时产生的中断

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance==USART1)
    {
        HAL_UART_Receive_DMA(&huart1,datas,3);
        if(datas[1]=='f')
        {
            HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
        }
        point=0;
        memset(datas,0,sizeof(datas));
    }
}//效果与HAL_UART_Receive_IT一样

收发不定长数据:

使用的是串口空闲中断,即在一定的时间RX未收到数据时判断为一帧数据接收完成,但是有一个问题就是在接收规定size的一半数据时也会触发中断,一种办法是将size增大,使接收无法达到size的一半;另一种则为关闭DMA传输过半中断:

将接收函数改为:HALUARTExReceiveToIdle_DMA(&huart1,datas,15); ,扩展空闲中断

中断回调函数为:void HALUARTExRxEventCallback(UARTHandleTypeDef *huart, uint16t Size)

void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
    if(huart->Instance==USART1)
    {
        HAL_UART_Transmit_DMA(&huart1,datas,Size);
        HAL_UARTEx_ReceiveToIdle_DMA(&huart1,datas,15);//接收需要写在开始
        if(datas[1]=='f')
        {
            HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
        }
        __HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT); //关闭DMA传输过半中断
    }
}

注意:

在关闭DMA传输过半中断时需要将usart.c中的DMAHandleTypeDef hdmausart1_rx extern出来

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Raspberry Pi是一款非常流行的单板计算机,拥有丰富的外设接口,并且可以运行各种操作系统和编程语言。其中,串口是一种常见的外设接口,可以通过它与其他设备进行通信。 DMA(Direct Memory Access)是一种用于数据传输的技术,可以直接从内存中读取或写入数据,而无需经过CPU的干预。在Raspberry Pi中,可以通过配置和使用串口DMA实现高效的数据传输。 使用Raspberry Pi的串口DMA可以提高数据传输的效率。传统的串口通信需要CPU参与数据传输的过程,而串口DMA的方式可以将数据传输的任务交给DMA控制器,CPU只需配置相关寄存器即可。这样可以节省CPU的开销,提高系统的运行效率。 要使用Raspberry Pi的串口DMA,首先需要在系统中启用DMA模块,并配置相关参数,比如数据传输的方向、传输字节数、传输触发方式等。然后,通过编程的方式,将需要传输的数据存放在内存中的特定位置,并设置DMA传输寄存器的相关参数,启动数据传输过程。 需要注意的是,使用串口DMA需要对DMA控制寄存器进行正确的配置,以避免数据传输的错误或意外中断。此外,由于DMA直接访问内存的特点,需要确保数据的完整性和安全性,避免数据被意外修改或访问。 总而言之,Raspberry Pi的串口DMA可以提高数据传输的效率和系统的运行性能。通过合理配置和使用DMA,可以使串口通信更加高效和可靠。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值