基于stm32的双缓冲的实现

基于stm32的双缓冲的实现

ID:13358252

大小:229.59 KB

页数:5页

时间:2018-07-22

基于stm32的双缓冲的实现_第1页
基于stm32的双缓冲的实现_第2页
基于stm32的双缓冲的实现_第3页
基于stm32的双缓冲的实现_第4页
基于stm32的双缓冲的实现_第5页
资源描述:

《基于stm32的双缓冲的实现》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、转载自 405087695最终编辑 405087695终于开荤了~~~DMA 先抄一小段DMA的说明。对于没玩过DMA的朋友,这里简单说一下DMA,用自己的语言说吧,那就是,从某个位置传输数据到某个位置,如果不用DMA,那要CPU参与操作,一个字节一个字节地搬,效率高点的,就一个字一个字地搬.但当你用了DMA后,那就是只需要设置:A.从哪里开始搬;B,搬到哪里去;C以字节方式搬还是半字还是字;D:一共搬多少个.之后,启动DMA.CPU内部就会开始搬数据了,整个搬数据的过程都不需要指令的参与,唯一要做的,就是检测什么时候搬完.你可以扫描寄存器,也可以用中断.这里,我使

2、用了中断.具体设置功能看注释就可以明白了.注意一点就是,有一个设置:DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;这个是外设的地址不递增.也就是说,每次搬动,都是从源头,也就是USART1的DR寄存器搬,但内存地址却是递增的:DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;这个历程实现了接受串口的数据写到FLASH之中工作,而DMA的作用在于将串口收寄存器USART1->DR的数据写到内存之中比如某个数组之中u8USART1_DMA

3、_Buf1[512];写满512个字节之后将进入DMA中断(通道5)在这里修改DMA的内存写入入口u8USART1_DMA_Buf2[512];,同时标记下次的入口Free_Buf_No=BUF_NO1;与Buf_Ok=TRUE;证明已有数据准备完成。这时CUP将USART1_DMA_Buf1中的数据写入FLASH.又抄了一点这次使用的是双缓冲,也有人叫乒乓缓冲.因为一般情况下,串口的数据DMA传输进BUF1的过程中,是不建议对BUF1进行操作的.但由于串口数据是不会等待的直传,所以你总不能等BUF1满了,才往FLASH上写,因为这时候串口数据依旧是源源不断.于是,

4、使用双缓冲就变的理所当然了.当BUF1满了的时候,就马上设置DMA的目标为BUF2,并且BUF1的数据往25F080上灌.当串口DMA写满了BUF2的时候,再设置DMA的目标为BUF1,此时再操作BUF2写进25F080.如此一直循环,就好像打乒乓球那样吧,所以就叫乒乓缓冲.用这个方法的速度极限就是,你必须确保两点a.DMA灌满了BUF1的时候,会发生中断,此时切换DMA的目标缓冲为BUF2,而且切换的过程必须在新的串口数据溢出之前完成.b.在DMA的BUF1满之前,另外一个有数据的BUF2必须能全部写进25F080,其中包括了遇到新的扇区边界而要刷除扇区的操作时间

5、!!可以看出,BUF的增大,并不能够很大程度的提升速度极限.假设USART与FLASH的底层驱动已经写好了。  点击查看。/************DMA方式传输***************************/#define SRC_USART1_DR   (&(USART1->DR))       //串口接收寄存器作为源头//DMA目标缓冲,这里使用双缓冲u8 USART1_DMA_Buf1[512];u8 USART1_DMA_Buf2[512];bool Buf_Ok;    //BUF是否已经可用BUF_NO Free_Buf_No;       

6、//空闲的BUF号 typedef enum {BUF_NO1=0,BUF_NO2=1}BUF_NO;DMA_InitTypeDef DMA_InitStructure;void USART_DMAToBuf1(void){   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);                             //开DMA时钟   DMA_DeInit(DMA1_Channel5);                                                        

7、                       //将DMA的通道1寄存器重设为缺省值   DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)SRC_USART1_DR;             //源头BUF 既是(&(USART1->DR))    DMA_InitStructure.DMA_MemoryBaseAddr=(u32)USART1_DMA_Buf1;             //目标BUF既是要写在哪个个数组之中   DMA_InitStructure.DMA_DIR=DMA_DIR_Peripheral

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。