dma接收双缓存 stm32_基于stm32的双缓冲的实现

本文介绍了基于STM32的DMA双缓冲串口接收技术,通过DMA从USART接收数据并写入Flash,实现连续且高效的数据存储。在接收过程中,当一个缓冲区满时,会触发中断切换到另一个缓冲区,避免了数据丢失,形成乒乓缓冲效果。关键在于确保DMA中断切换和Flash写入的及时性。
摘要由CSDN通过智能技术生成

最终编辑

405087695

终于开荤了

~~~

DMA

先抄一小段

DMA

的说明。

对于没玩过

DMA

的朋友

,

这里简单说一下

DMA,

用自己的语言说吧

,

那就是

,

从某个位置

传输数据到某个位置

,

如果不用

DMA,

那要

CPU

参与操作

,

一个字节一个字节地搬

,

效率高

点的

,

就一个字一个字地搬

.

但当你用了

DMA

,

那就是只需要设置

:A.

从哪里开始搬

; B,

搬到哪里去

;C

以字节方式搬还是半字还是字

;D:

一共搬多少个

.

之后

,

启动

DMA.CPU

内部

就会开始搬数据了

,

整个搬数据的过程都不需要指令的参与

,

唯一要做的

,

就是检测什么时

候搬完

.

你可以扫描寄存器

,

也可以用中断

.

这里

,

我使用了中断

.

具体设置功能看注释就可以明白了

.

注意一点就是

,

有一个设置

:

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

这个是外设的地址不递增

.

也就是说

,

每次搬动

,

都是从源头

,

也就是

USART1

DR

寄存器

,

但内存地址却是递增的

:

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

这个历程实现了

接受

串口的数据

写到

FLASH

之中工作,而

DMA

的作用在于将

串口收寄存器

USART1->D

u8 USART1_DMA_Buf1[512];

写满

512

个字节之后将进入

DMA

中断(通道

5

)在这里修改

DMA

的内存写入

u8 USART1_DMA_Buf2[512];

,同时标记

下次的入口

Free_Buf_No=BUF_NO1;

Buf_Ok=TRUE;

证明已

USART1_DMA_Buf1

中的数据写入

FLASH .

又抄了一点

这次使用的是双缓冲

,

也有人

叫乒乓缓冲

.

因为一般情况下

,

串口的数据

DMA

传输进

BUF1

的过程中

,

是不建议对

BUF1

进行操作的

.

但由于串口数据是不会等待的直传

,

所以你总不能等

BUF1

满了

,

才往

FLASH

上写

,

因为这时候串口数据依旧是源源不断

.

于是

,

使用双缓冲就变的理

所当然了

.

BUF1

满了的时候

,

就马上设置

DMA

的目标为

BUF2,

并且

BUF1

的数据

25F080

上灌

.

当串口

DMA

写满了

BUF2

的时候

,

再设置

DMA

的目标为

BUF1,

此时

再操作

BUF2

写进

25F080.

如此一直循环

,

就好像打乒乓球那样吧

,

所以就叫乒乓缓冲

.

用这个方法的速度极限就是

,

你必须确保两点

a.DMA

灌满了

BUF1

的时候

,

会发生中

,

此时切换

DMA

的目标缓冲为

BUF2,

而且切换的过程必须在新的串口数据溢出之

前完成

.b.

DMA

BUF1

满之前

,

另外一个有数据的

BUF2

必须能全部写进

25F080,

其中包括了遇到新的扇区边界而要刷除扇区的操作时间

!!

可以看出

,BUF

的增大

,

并不能够很大程度的提升速度极限

.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值