STM32的dma能不能实现传输中,字节之间有间隔?

2019-12-20 21:30发布

本帖最后由 zxq6 于 2018-4-13 19:41 编辑

如题,谢谢!
因为外设要求,传输的时候,每2个字节之间,需要一定的时间间隔。
请问下,DMA能不能实现这个需求?
如果不能的话,有没有简单的办法,能够实现类似的,cpu占用率低的大量数据传输?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
zxq6
1楼-- · 2019-12-21 15:09
wshtyr 发表于 2018-4-13 21:41
具体是什么外设?
按LZ的要求可以用一个定时器,比如TIM1,使能2路比较输出通道的DMA,计数周期为要求的 ...

外设是spi1,能不能指教一下具体如何使用呢?
polarbear
2楼-- · 2019-12-21 15:30
 精彩回答 2  元偷偷看……
ZXF_CUG
3楼-- · 2019-12-21 17:46
目标地址定义成4字节的,源地址2字节,这样就会有2字节的间隔
wshtyr
4楼-- · 2019-12-21 22:21
本帖最后由 wshtyr 于 2018-4-14 10:20 编辑
zxq6 发表于 2018-4-13 22:29
外设是spi1,能不能指教一下具体如何使用呢?


假设LZ的MCU就是STM32F2或F4,那么可以使用TIM1或TIM8的DMA。
若要求SPI1每隔N个计数周期发送两次数据,每次数据的发送间隔为T,则按以下步骤配置:

1. SPI1
按原来的参数初始化SPI1。
2. TIM1
TIM1周期设为N,配置比较通道1和2为PWM1或PWM2模式(但不使能任何输出),并使能这两个通道的DMA;
比较通道1和2的比较值分别设为1和T+1;
设置TIM1计数器的初始值为0.
3. DMA2
初始化DMA2的Stream6,通道为Channel 0,内存地址设为需要发送的数组的首地址,外设地址设为SPI1->DR的地址,其余参数沿用原SPI DMA的参数。

开始传输:
复位TIM1计数器;
使能DMA2 Stream6;
使能TIM1计数。

停止传输:
关闭DMA2 Stream6(非循环模式下亦可自行终止);
关闭TIM1

注意:
1. T的取值应保证T个计数周期内SPI能发送完一帧,并留有余地
2. DMA2 Stream6在非循环模式下,停止数据传输时要考虑的数据的完整性


编辑原因:去除“使能SPI1 TX DMA”的描述,因不需要使能SPI的DMA
wshtyr
5楼-- · 2019-12-22 03:16
LZ最好把所用的STM32的型号也说一下。。不同型号的细节可能不一样
zxq6
6楼-- · 2019-12-22 08:37
wshtyr 发表于 2018-4-14 10:23
LZ最好把所用的STM32的型号也说一下。。不同型号的细节可能不一样

哦,不好意思,我用的是stm32f103,要是用的4系列就好了,cpu比较快,这个问题就不是很明显。

一周热门 更多>