如何快速读取SPI非LL
因为24位ADC每次转换都需要一个触发脉冲,因此无法用DMA模式,所以读取spi成为瓶颈,现在用HAL读取SPI约2us,除了LL还能更快吗?LL搞不定。谢谢!
你也可以尝试用OpenOCD代替CubeIDE自带的GDBServer,有时对断点处理会更稳定。 HAL SPI 的确开销比较大,每次函数调用都有不少额外逻辑。 虽然 DMA 不行,但可以用中断方式配合硬件触发,减少 CPU 空转等待。 如果数据量不大,可以考虑一次触发读三字节,把 SPI 配成 24bit frame,效率会好一些。 还有办法是用 SPI 的 FIFO 特性,把时钟拉到极限,CPU 只是收最后的数据。 有些 ADC 支持 daisy-chain 模式,你看能不能合并触发,减少访问次数。 其实 HAL 里的 SPI 函数你可以改造一下,把状态检查和等待循环简化掉。 H5 的主频很高,可以先算下理论 SPI 时钟和传输周期,看看瓶颈是不是在代码层面。 如果只是单通道采样,考虑用定时器触发 GPIO,然后在中断里立刻收 SPI。 最终如果对时序要求极高,裸寄存器写 SPI 才是最快的,HAL/LL 都比不过手写寄存器操作。 你可以考虑直接操作寄存器,不用 LL 库,写几个专用的 inline 函数,会比 HAL 快很多。
页:
[1]