到存储器中的循环DMA周期在STM32传输结束时将如何表现?

问题描述 投票:0回答:1

我想问,在以下情况下,STM32中的DMA SPI rx将如何运行。我有一个称为A的指定(例如)96字节数组,该数组用于存储从SPI接收的数据。我打开在每个字节上运行的循环SPI DMA,将其配置为96字节。是否有可能,当DMA填充我的96字节数组时,传输完成中断将消失,以快速将96字节数组复制到另一个-B,然后循环DMA将开始写入A(并销毁保存在B中的数据) ?我想(每次从B中的A获取新数据时)通过USB将数据从B迅速传输到PC。

[我只是在考虑如何通过USB将STM32的连续数据流SPI从USB传输到PC,因为每隔一定时间一次USB传输96字节数据的块比通过STM32将实时SPI数据流传输到USB容易得多?我什至不知道]

c stm32 radio spi dma
1个回答
1
投票

为此,您必须保证在接收下一个SPI字节并将其传输到缓冲区的开始之前,您可以复制所有数据。是否可能,将取决于处理器的时钟速度和SPI的速度,并能够保证不会发生可能会延迟传输的更高优先级的中断。为了安全起见,它需要极慢的SPI速度,在这种情况下,可能根本不需要使用DMA。

总而言之,这是一个坏主意,完全没有必要。正是出于这个目的,DMA控制器具有“半传输”中断。传输前48个字节时,您将获得HT中断,并且在复制lower half缓冲区时,DMA将继续传输其余48个字节。转移完成后,即可转移上半部分。这将您将数据传输的时间从单个字节的接收时间延长到48字节的接收时间。

如果每次传输实际上需要96字节,则只需使缓冲区长192字节(2 x 96)。

使用伪代码:

#define BUFFER_LENGTH 96
char DMA_Buffer[2][BUFFER_LENGTH] ;

void DMA_IRQHandler()
{
    if( DMA_IT_Flag(DMA_HT) == SET )
    {
        memcpy( B, DMA_Buffer[0], BUFFER_LENGTH ) ;
        Clear_IT_Flag(DMA_HT) ;
    }
    else if( DMA_IT_Flag(DMA_TC) == SET )
    {
        memcpy( B, DMA_Buffer[1], BUFFER_LENGTH ) ;
        Clear_IT_Flag(DMA_TC) ;
    }
}

关于通过USB将数据传输到PC,首先需要确保USB传输速率至少与SPI传输速率相同或更快。 USB传输的确定性可能较低(因为它是由PC主机控制的-也就是说,当主机明确要求USB传输时,您只能在USB上输出数据),即使average传输如果速率足够高,则可能存在需要进一步缓冲的等待时间,因此,与其简单地从DMA缓冲区A复制到USB缓冲区B,您可能需要循环缓冲区或FIFO队列来馈送USB。另一方面,如果您已经具有缓冲区DMA_Buffer[0]DMA_Buffer[1]B,则实际上已经具有三个96字节的块的FIFO,这可能就足够了

© www.soinside.com 2019 - 2024. All rights reserved.