宜都网站设计,哪个公司做网站好,建怎样的网站挣钱快,透明水印logo在线制作最近一段时间做了一个mems的项目#xff0c;项目的方案是stm32g071做主控#xff0c;读写3颗asm330l的硬件形态。最初是想放置4颗imu芯片#xff0c;因为pcb空间布局的问题#xff0c;改放了3颗。但对于软件方案来说无所谓#xff0c;关键是如何优化spi的传输速率#xf… 最近一段时间做了一个mems的项目项目的方案是stm32g071做主控读写3颗asm330l的硬件形态。最初是想放置4颗imu芯片因为pcb空间布局的问题改放了3颗。但对于软件方案来说无所谓关键是如何优化spi的传输速率满足系统采样率1.667khz的帧率要求。因为如此高的采样率意味着大量的数据传输处理那么传输速率也需要很快才行。 一、SPI的三种读写模式 stm32提供了3种hal层读写接口形式。 xxx_IT和xxx_DMA是带有指定中断回调函数的接口其中xxx_DMA不言而喻采用了dma资源。
每种接口在对应的场景下才能发挥作用并非一味地说dma就一定比cpu快根据开发过程我们一点点来梳理总结。 二、CPU读写模式 cpu读写模式我指的是用cpu来搬移数据从spi接口的数据寄存器获取数据或者赋值给spi接口的数据寄存器接口是上图的第一和第二种。贴个波形来窥探这种方式的特点。 下面绿色的波形是时钟可以看到1个写时钟14个连续读时钟上面黄色的是mosi指令。
乍看上去是不是有点奇怪为什么每8bit的sck会有几个us的间隙是什么地方的耗时呢直接上代码。如下图原来mcu的DR数据寄存器在取值和赋值的过程中会一边判定一边移位直到处理完当前的8bit数据。那这里已经到了硬件映射层没有办法再优化了。cpu做搬移数据的极限也就这个耗时附近了。可以裁剪些hal库的冗余代码但影响都不大可做可不做。 可以看到读取14Bspi时序的耗时约60us左右注意这里指的是spi时序。 三、DMA读写模式 dma读写模式指的是用dma通道做数据搬移同样贴个图形来看下。 这个图像有特点。相比cpu做搬移有2个大的不同。第一写时钟后的时间明显加长了第二连续读取的时钟间隙消失了为什么都是有逻辑的。 首先来讲为什么写时钟后间隙为什么明显变长了同样直接上代码。因为系统触发dma写完成后会切入中断系统进入tx通道完毕中断再退出。整个进出中断中断内处理都增加了明显的耗时。设想一下如果拿中断来每次传输1B耗时会减少吗答案是明显的。 然后来讲下为什么读时钟没有8bit的间隙呢同样直接上代码。 dma传输配置完成后不管你是多少长度只要不超过缓冲区默认一般是4096字节源地址、目地址一次性梭哈。但是重点这里只是开启并不等于执行完这段代码dma就真正执行搬移完数据怎么才知道执行完呢spi接口的state状态必须重新变成ready值。 什么意思呢dma真正意义的传输完成是dma重新进入可ready状态它会主动抛中断告诉系统与上面的写完成是一样的机制。 所以写到这里dma真的能节省耗时吗答案是要做在特定场景下比如连续传输超多数据的前提下。别老提dma多牛逼是吧不会用等于反作用。 四、CPU和DMA混合模式 既然dma写时钟耗时非常大那能不能用cpu来做命令写入dma做数据读出呢可以。直接贴时序。 写入指令的时钟后间隙是不是直接短了一截最后采用了这种方式最终耗时60us优化到45usdma在数据量小当前是14B的前提下整体优化性能也提升不明显。 下一篇讲讲怎么使用stm32的dma初始化编程。