×

STM3 DMA相关概念及原理介绍资料下载

消耗积分:2 | 格式:pdf | 大小:1.4MB | 2021-04-27

tr12345

分享资料个

第一次接触DMA是在学校学习ARM9裸板程序的时候,想起来都时隔快2年了。现在来看看STM32平台的DMA,一样,在标准外设库的支持下,STM32的DMA编程十分简单,但是既是学习,那还是花点时间看看DMA的相关概念及原理的了解下。 1. DMA简介 DMA是Direct Memory Access的简称,是直接存储器访问的意思。DMA是STM32单片机的外设之一,主要功能是用来搬移数据的。通过DMA搬移数据不需要CPU直接参与控制,也不需要中断处理方式那样保留现场和恢复现场。在传输数据的时候,CPU可以干其他事情。 无使用DMA的数据传输: 使用DMA后的数据传输: DMA数据传输支持从外设到存储器、存储器到外设、存储器到存储器(这里所讲的存储器可以是SRAM,也可以是FLASH)。DMA控制器包含了DMA1控制器和DMA2控制器,分别由7和5个通道作为数据传输。每个通道专门用来管理来自一个或者多个外设对存储器访问的请求,还有一个仲裁器用于协调各个外设对DMA传输请求的优先权。注意,DMA2只存在于大容量或互联型的STM32单片机中。 2. DMA功能框图 2.1 STM32外设对DMA的请求及通道 请求及通道对应图中的标号1和标号2:STM32外设想要通过DMA来传输数据,需先给DMA控制器发送DMA请求,控制器在收到外设的DMA请求之后会给外设一个应答信号,外设应答且DMA控制器收到外设的应答后,DMA启动传输,直至传输完毕。 为什么需要发出请求,应答和接收应答这几个繁琐的步骤?由图中蓝色框框可以看出,DMA传输和CPU是共用系统总线的,要启动DMA传输的前提是系统总线是空闲的,换句话说是CPU没有占用系统总线,所以启动DMA传输前需要以上几个应答机制,其最底层是DMA控制器和CPU正为系统总线作出协调。DMA1有7个通道,DMA2有5个通道,不同的外设请求要通过对应的DMA通道发给DMA控制器。将不同的外设请求传输至对应的通道,这个是我们在软件编程上设置的。 DMA1开放的通道及对应请求: DMA2开放的通道及对应请求: 虽然每个通道可以接收多个外设的请求,但是同一时间内只能接收一个。 2.2 仲裁器 仲裁器对应图中的标号3:当DMA控制器的多个通道发生DMA请求时,就需要仲裁器管理响应处理的顺序。仲裁器通过软件和硬件来管理DMA请求:软件指的是我们写的代码,在DMA_CCRx(x指通道号)寄存器中设置,有4个等级,非常高(DMA_Priority_VeryHigh)、高(DMA_Priority_High)、中(DMA_Priority_Medium)和低(DMA_Priority_Low)。硬件则是指若有两个或以上的DMA通道请求设置的优先级一样,则它们的响应顺序取决于通道编号,编号低者优先级高,在有DMA2的STM32中,DMA1控制器拥的响应优先级高于DMA2。 2.3 配置DMA控制器 配置DMA控制器,无非就是下图这几个寄存器: 前面说到,DMA数据传输机制并不需要CPU的参与,但是DMA控制器要正常工作,数据要正确传输,需有三个必要条件:源地址、目的地址和数据大小,对于数据分批传输的情况,数据大小这个条件还包含每次传输的大小及单位。 (1)源地址和目的地址 DMA的传输数据的方向有三个:从外设到存储器、从存储器到外设、从存储器到存储器。DMA_CCR的BIT[4]DIR就是用于配置数据传输方向的: 取值为0表从外设到存储器,取值为1表从存储器到外设。外设地址在DMA_CPAR寄存器配置,存储器地址在DMA_CMAR寄存器配置。 (2)传输数据的大小及单位 以串口向电脑发送数据为例(存储器->外设方向),开发板软件可以一次性给电脑发送大量数据,具体多少在DMA_CNDTR配置: DMA_CNDTR低16位有效,一次最多只能传输65535个数据。 数据要正确传输,源、目标存储的数据宽度必须一致。串口数据寄存器是8位的,也就是外设数据宽度设置寄存器DMA_CCRx的BIT[9:8]PSIZE取值为0: 存储器的数据宽度设置寄存器DMA_CCRx的BIT[11:10]MSIZE取值也为0: DMA传输数据,还需要设置源地址上的数据发送指针和目的地址数据存放指针的增量模式。开发板串口向电脑发送数据,假设要发送的数据很多,那么存储器(源地址)上数据发送指针每次发送完毕需要加1,而串口数据寄存器则不需要,因为该寄存器只有一个,数据寄存器上的数据传送到电脑后被清空了(就算不清空,数据直接覆盖也没关系)。外设的地址指针增量模式由DMA_CCRx的PINC配置,存储器的地址指针则由MINC配置。 (3)传输结束 DMA中断状态寄存器DMA_ISR可以设置每个DMA通道传输过半、传输完成和传输错误示产生对应标志, 在DMA_CCRx位1、2、3可以设置发生传输过半、传输完成和传输错误时产生中断: 另外补充一点,位0用于使能DMA传输 传输完成分两种模式:一次传输和循环传输,一次传输指传输一次后就停止,要再传输需要关闭DMA使能后重新配置后才能继续传输。循环传输则是一次传输完成后又恢复第一次传输时的配置循环传输,如此循环。设置位在DMA_CCRx寄存器的CIRC。 3. DMA功能模块描述结构体 标准库的一贯风格,在stm32f10x_dma.h文件中定于可DMA_InitTypeDef初始化结构体,DMA_Init()函数定义在stm32f10x_dma.c中。 (1)DMA_PeripheralBaseAddr:外设地址,若是存储器到存储器模式,此成员设置为其中一个存储器的地址,否则设置为外设的地址。 (2)DMA_MemoryBaseAddr:存储器地址,一般设置为程序中存放数据的容器(数组)的首地址。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'STM3 DMA相关概念及原理介绍资料下载',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);