



免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
转载自405087695最终编辑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-DR 的 数据写到内存之中 比如某个数组之中 u8 USART1_DMA_Buf1512; 写满512个字节之后将进入DMA中断(通道5)在这里修改DMA 的内存写入入口u8 USART1_DMA_Buf2512; ,同时标记 下次的入口Free_Buf_No=BUF_NO1; 与 Buf_Ok=TRUE; 证明已有数据准备完成。这时CUP将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的增大,并不能够很大程度的提升速度极限.假设 USART 与 FLASH 的 底层驱动已经写好了。 点击查看。/*DMA方式传输*/#defineSRC_USART1_DR (&(USART1-DR) /串口接收寄存器作为源头/DMA目标缓冲,这里使用双缓冲u8USART1_DMA_Buf1512;u8USART1_DMA_Buf2512;boolBuf_Ok;/BUF是否已经可用BUF_NOFree_Buf_No; /空闲的BUF号typedefenumBUF_NO1=0,BUF_NO2=1BUF_NO;DMA_InitTypeDefDMA_InitStructure;voidUSART_DMAToBuf1(void) RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);/开DMA时钟 DMA_DeInit(DMA1_Channel5);/将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_PeripheralSRC; /外设作源头/外设是作为数据传输的目的地还是来源 DMA_InitStructure.DMA_BufferSize = 512; /DMA缓存的大小 单位在下边设定 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /外设地址寄存器不递增 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /内存地址递增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; /外设字节为单位 DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_Byte; /内存字节为单位 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; /工作在循环缓存模式 DMA_InitStructure.DMA_Priority = DMA_Priority_High; /4优先级之一的(高优先)VeryHigh/High/Medium/Low DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; /非内存到内存 DMA_Init(DMA1_Channel5, &DMA_InitStructure);/根据DMA_InitStruct中指定的参数初始化DMA的通道1寄存器 DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE); /DMA5传输完成中断 USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE); /使能USART1的接收DMA请求/*/初始化BUF标志 Free_Buf_No=BUF_NO2;/因为 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USART1_DMA_Buf1; Buf_Ok=FALSE;/此时没有数据准备完成 当然FALSE DMA_Cmd(DMA1_Channel5, ENABLE); /正式允许DMA再来看看DMA中断:/u16DataCounter;externDMA_InitTypeDefDMA_InitStructure;voidDMA1_Channel5_IRQHandler(void) if(DMA_GetITStatus(DMA1_IT_TC5)/通道5传输完成中断TC还有传输 过半中断HT 错误中断TE 全局中断GL /DataCounter = DMA_GetCurrDataCounter(DMA1_Channel5);/获取剩余长度,一般都为0,调试用 DMA_ClearITPendingBit(DMA1_IT_GL5);/清除全部中断标志 /转换可操作BUF if(Free_Buf_No=BUF_NO1) DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USART1_DMA_Buf1; DMA_Init(DMA1_Channel5, &DMA_InitStructure); Free_Buf_No=BUF_NO2; else DMA_InitStructure.DMA_MemoryBaseAddr = (u32)USART1_DMA_Buf2; DMA_Init(DMA1_Channel5, &DMA_InitStructure); Free_Buf_No=BUF_NO1; Buf_Ok=TRUE;/有准备好的数据了 写FLASH的操作while(1) if(Buf_Ok=TRUE) LED1_ON;/一个标记 Buf_Ok=FALSE;/操作了准备好的数据 if(addr%4096)=0) /跨越一个扇区,则需要先刷除 SST25SectorErase(addr); sector_count+; if(Free_Buf_No=BUF_NO1) SST25Write(addr,USART1_DMA_Buf1,512); else SST25Write(addr,USART1_DMA_Buf2,512); addr+=512; Timer1=5000;/时间重置 LED1_OFF; /检测超时开了 定时器 if(Timer1=0)/五秒内没准备好的数据 /获取长度 len=512-DMA_GetCurrDataCounter(DMA1_Channel5); /写入最后数据 if(Free_Buf_No=BUF_NO1) SST25Write(addr,USART1_DMA_Buf2,len); else SST25Write(addr,USART1_DMA_Buf1,len); addr+=len; break; 还是很简单的。有一点比较困扰 就是 Fl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年药品检验技术专项考核试题
- 3.12 大一统王朝的巩固 说课稿 2024-2025学年统编版七年级历史上册
- 2025年全国燃气管网工安全生产理论考试题库(含答案)
- 销售考试题目及答案
- 操作作业人员考试题库及答案
- 2025年高考化学试题分类汇编:实验探究综合题(含解析)
- 2025合同条款调整事项
- 2025官方版房屋租赁长期居住合同范本
- 2025年国家叉车证理论考试题库(含答案)
- 2025年新型皮革加脂剂项目合作计划书
- 2025至2030中国5G毫米波设备行业项目调研及市场前景预测评估报告
- 现代教育技术说课
- 部编版五年级上册语文单元教学计划
- 产品经理绩效管理制度
- 2025年烟台市中考历史试卷真题(含答案)
- 2025四川产业振兴基金投资集团有限公司招聘12人笔试参考题库附带答案详解析集合
- 风湿免疫病患者结核病诊治及预防实践指南(2025版)解读课件
- 膜结构车棚安装合同协议
- 山东省2016年安装定额解释
- 2025-2030中国相变热界面材料行业市场现状供需分析及投资评估规划分析研究报告
- 《中华人民共和国公务员法概述》课件
评论
0/150
提交评论