最终编辑
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
的增大
,
并不能够很大程度的提升速度极限
.