LL库串口+DMA

       由于工作中测试发现串口传输数据延时有点大,传输35个字节,115200,理论值应该在3ms左右,然而实际测试却有40ms,所以首先想到会不会是hal库执行效率低得原因,所以采用LL库,但是LL库的资料少之又少啊!自己做个记录。

      使用cubemx可以直接生产LL库的代码(我的工程里是hal库和LL库混用的),LL库串口硬件初始化部分会自动生成,但是传输地址及DMA传输长度并没有设置,需要手动设置。设置步骤可参考标准库设置

       初始化代码使用DMA+IDLE接收数据,

void bsp_usart_init()
{

   
    LL_DMA_SetMemoryAddress(DMA1, LL_DMA_STREAM_5, (uint32_t)bsp_usart.aRxBuffer);
    LL_DMA_SetPeriphAddress(DMA1, LL_DMA_STREAM_5, (uint32_t)(&USART2->DR));
    LL_DMA_SetDataLength(DMA1, LL_DMA_STREAM_5, bsp_usart.buf_len);
    LL_DMA_EnableStream(DMA1, LL_DMA_STREAM_5);

    LL_DMA_SetMemoryAddress(DMA1, LL_DMA_STREAM_6, (uint32_t)bsp_usart.aTxBuffer);
    LL_DMA_SetPeriphAddress(DMA1, LL_DMA_STREAM_6, (uint32_t)(&USART2->DR));
    LL_DMA_SetDataLength(DMA1, LL_DMA_STREAM_6, 0);

    //LL_USART_EnableIT_TC(USART2);
    //LL_DMA_EnableStream(DMA1, LL_DMA_STREAM_6);

    LL_USART_EnableIT_IDLE(USART2);
    LL_USART_EnableDMAReq_RX(USART2);
    LL_USART_EnableDMAReq_TX(USART2);
}

中断接收函数

void bsp_usart_IRQ()
{

    if (LL_USART_IsActiveFlag_IDLE(USART2))
    {
        LL_DMA_DisableStream(DMA1, LL_DMA_STREAM_5); //¹Ø±ÕDMA

        int cnt = LL_DMA_GetDataLength(DMA1, LL_DMA_STREAM_5);
        bsp_usart.rx_len = bsp_usart.buf_len - cnt; //总计数减去未传输的数据个数,得到已经接收的数据个数
        bsp_usart.recv_end_flag = 1;                // 接受完成标志位置1

        LL_DMA_SetDataLength(DMA1, LL_DMA_STREAM_5, USART_BUF_MAX_LEN);
        LL_DMA_EnableStream(DMA1, LL_DMA_STREAM_5);
        LL_USART_ClearFlag_IDLE(USART2);
    }
    else if (LL_USART_IsActiveFlag_TC(USART2))
    {
        LL_USART_DisableIT_TC(USART2);
        LL_DMA_DisableStream(DMA1, LL_DMA_STREAM_6);
    }
}

DMA发送函数

uint8_t bsp_usart_send(uint8_t *data, uint32_t len)
{

    while (LL_USART_IsActiveFlag_TC(USART2) == 0)
    {
		
    }
    LL_DMA_ClearFlag_TC6(DMA1);

    memcpy(bsp_usart.aTxBuffer, data, len);

    LL_DMA_DisableStream(DMA1, LL_DMA_STREAM_6);
    LL_DMA_SetDataLength(DMA1, LL_DMA_STREAM_6, len);
    LL_DMA_EnableStream(DMA1, LL_DMA_STREAM_6);

    return 0;

}

在使用LL库时,串口接收还比较容易实现,和hal库除了初始化设置DMA地址外,其他大同小异。但是DMA发送却没有那么顺利,第一次调用发送函数时,是可以正常接收到的,但是后面就没有了。最后发现是没有清除DMA发送完成中断,使用LL库特别要注意中断及标志位的清除

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: STM32H750是意法半导体推出的一款32位微控制器,具有高性能和低功耗的特点。LL是低级别外设驱动,能够提供丰富的外设驱动功能,并且具有较高的灵活性和可定制性。 串口DMA是指使用DMA(直接存储器访问)来实现串口通信。在STM32H750中,LL提供了丰富的外设驱动函数,包括串口(USART)的DMA功能。 使用STM32H750的LL实现串口DMA通信,首先需要初始化串口DMA的外设。然后,通过配置DMA通道,将串口的发送和接收功能与DMA相关联。 在发送数据时,可以通过LL的函数配置DMA通道为发送模式,并设置传输大小和目标地址。然后,将要发送的数据存储到指定的内存地址中,并启动DMA传输。DMA将自动读取内存中的数据,并传输到串口发送寄存器中,完成数据的发送过程。 在接收数据时,可以通过LL的函数配置DMA通道为接收模式,并设置传输大小和目标地址。当串口接收到数据时,DMA将自动将数据从串口接收寄存器传输到指定的内存地址中,完成数据的接收过程。 串口DMA通信的优点是可以减轻CPU的负担,提高通信效率。由于使用了DMA,数据的传输不需要通过CPU的介入,可以实现高速的数据传输。同时,通过LL的函数和配置,可以灵活地控制传输的参数和方式,满足不同的应用需求。 总之,STM32H750的LL提供了丰富的功能,包括串口DMA功能。通过配置和使用LL的函数,可以方便地实现串口通信,并提高通信效率。 ### 回答2: STM32H750是STMicroelectronics推出的一款高性能32位微控制器系列,其具有强大的计算和通信能力。串口(USART)是一种常用的通信接口,而DMA(Direct Memory Access)是一种用于高效数据传输的技术。 在STM32H750中,使用LL(Low-Layer library)来操作串口DMA非常方便。首先,我们需要在代码中引入对LL的头文件,然后对串口DMA进行配置和初始化。 在串口配置方面,我们可以使用LL_USART_Init()函数来设置串口的波特率、数据位数、停止位数和奇偶校验位等参数。接下来,在DMA配置方面,我们可以使用LL_DMA_Init()函数来设置DMA的通道、传输方向、数据长度和传输模式等参数。然后,通过LL_DMA_ConfigAddresses()函数来设置源数据和目标数据的起始地址。 一旦我们完成了串口DMA的配置和初始化,就可以启动数据的传输了。通过LL_USART_Enable()函数来使能串口,并通过LL_DMA_EnableStream()函数来使能DMA通道。然后,我们可以使用LL_USART_TransmitDataDMA()函数或LL_USART_ReceiveDataDMA()函数来启动数据的发送或接收。 在数据传输过程中,DMA会自动通过总线传输数据,而不需要CPU的干预,从而提高了数据传输的效率。当数据传输完成后,DMA会通过中断或回调函数来通知我们,并可以进行相应的处理。 总结起来,使用STM32H750的LL来操作串口DMA非常简单。通过合理的配置和初始化,我们可以实现高效的数据传输,从而满足各种应用的需求。 ### 回答3: STM32H750是意法半导体(STMicroelectronics)推出的一款高性能32位微控制器系列产品。该系列产品搭载了Cortex-M7内核,具备较强的计算和处理能力,并且集成了多种外设,例如USART串口控制器和DMA控制器,为实现高效的数据传输提供了便利。 在STM32H750中,有多种方法可以实现串口通信,其中使用DMA(Direct Memory Access)是一种较为常见的方式。串口DMA的实现可以通过STM32H750的LL(Low Layer Library)来完成。 首先,需要初始化USART和DMA的相关寄存器,并配置串口DMA的参数,例如波特率、数据位、校验位等。然后,使能DMA通道和USART的DMA传输功能。 在数据传输过程中,可以使用DMA的循环模式,使得DMA在接收或发送完指定数量的字节后自动重新开始传输,实现连续的数据传输。当有数据需要发送时,可以通过内存填充缓冲区,然后启动DMA传输。当传输完成时,可以通过DMA传输完成中断来进行接收处理,并获取接收到的数据。 使用串口DMA的优点是可以实现较高的数据传输速率,减轻了CPU的负担。同时,DMA传输是通过直接读写内存的方式,避免了CPU的干预,提高了系统的响应速度。 综上所述,通过STM32H750的LL串口DMA功能,我们可以实现高效、稳定的串口通信,提升系统的性能和响应能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值