STM32F407的DMA一个单向数据流流可以同时为两个外设打开么

君,已阅读到文档的结尾了呢~~
广告剩余8秒
文档加载中
实验平台:正点原子探索者STM32F407开发板手册名称:STM32F4开发指南
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
第二十八章 DMA实验-STM32F4开发指南-正点原子探索者STM32开发板
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口【STM32回顾】-- STM32F207的DMA控制器【先看图再结合图看内容】-电子产品世界论坛
【STM32回顾】-- STM32F207的DMA控制器【先看图再结合图看内容】
【英语能力有限,难免有误,敬请纠错】&&&&&&&&
&&&&&&& DMA控制器(Direct Memory Access)是STM32中一个独立于Cortex-M3内核的模块。主要功能是在不占用CPU资源的情况下完成数据在外设到存储空间,存储空间到外设或存储空间到存储空间的数据传输,即帮助应用在不受CPU支配的情况下高速地访问数据。其传输方向可以是单向的或双向的,通过程序来配置。
&&&&&&& STM32F207的DMA基于一个灵活的总线矩阵,利用强大的双AHB主总线架构(翻译可能不专业哈)与独立的FIFO来优化系统带宽。两个DMA控制器共有16个数据流(stream),其中每个控制器有8个数据流(stream),每一个都独立地管理来自一个或多个外设的数据访问请求,每个数据流(stream)都有8个通道,而且每个都具有独立的仲裁机构来处理DMA请求之间的优先级。
STM32F207的DMA的主要功能:
&&&&&&&&&& (1) 双AHB总线架构,一条专门用于访问存储空间,另一条专门访问外设。
&&&&&&&&&& (2) AHB从编程接口只支持32位数据的访问。
&&&&&&&&&& (3) 每个控制器拥有8个数据流(stream),每个数据流又有8个通道(channel)。
&&&&&&&&&& (4) 每个数据流(stream)具有4个分开的32位FIFO缓冲器,使数据流可以工作在FIFO模式或直接模式。
&&&&&&&&&&&&&&&&&&&&&& a. 先进选出模式:软件可选择FIFO阀值大小为FIFO大小的1/4或1/2或3/4。
&&&&&&&&&&&&&&&&&&&&&& b. 直接模式:每个DMA请求都会立即启动源与目的地址的数据传输。
&&&&&&&&&& (5) 每个数据流(stream)都可以被配置成:
&&&&&&&&&&&&&&&&&&&&&&&a. 一个常规的通道,支持外设到存储器、存储器到外设、存储器到存储器的数据传输。
&&&&&&&&&&&&&&&&&&&&&& b. 一个双缓冲通道,这种情况下在存储器端可支持双缓冲。
&&&&&&&&&&& (6) 8个数据流的每一个都与专用的硬件DMA通道相连用于处理数据请求。
&&&&&&&&&&& (7) 可编程配置不同DMA请求的优先级(共4个优先级:非常高(very high)、高(high)、中等(medium)、低(low)),或者根据硬件的配置确定优先级(如从硬件上来说,DMA请求0比DMA请求1的优先级高)。
&&&&&&&&&&&& (8) 每个数据流都同时支持由软件触发的从存储空间到存储空间的数据传输(此功能仅对DMA有效)。
&&&&&&&&&&&& (9) 每个数据流请求可以从多达8个可能的通道请求中选择,这种选择机制可以通过软件进行配置,允许多个外设对DMA请求进行初始化。
&&&&&&&&&&&& (10) 可以由DMA控制器或者外设来管理被传输数据条目的数量:
&&&&&&&&&&&&&&&&&&&&&&&a. DMA数据流控制器:被传输数据条目的数量由软件配置(1-65535)。
&&&&&&&&&&&&&&&&&&&&&& b. 外设数据流控制器:被传输的数据条目的数量是未知的,数据传输会在外设硬件发送传输终止信号后停止。&
&&&&&&&&&&&&& (11) 独立的源和目的的传输器宽度(Byte、Half-Word、Word),当源和目的的数据宽度不相等时,DMA会自动的添加或减缩传输器以优化带宽,不过该功能仅在FIFO模式下有效。
&&&&&&&&&&&&&&(12) 可以将源及目的地址配置为递增或非递增地址中的任一一种。
&&&&&&&&&&&&& (13) 支持4,8,16节拍的增量突发传输(地址递增),突发的长度可以由软件配置。通常是外设FIFO宽度的一半。
&&&&&&&&&&&&& (14) 每个数据流都支持循环缓冲区管理。
&&&&&&&&&&&&& (15) 每个数据流(stream)都有5个事件标志(DMA Half Transfer,DMA Transfer Complete,DMA Transfer Error,DMA FIFO Error,Direct Mode Error),它们进行逻辑'或'操作后合成一个中断请求。
单个DMA模块框图:
&&&&&&&& STM32F207的DMA控制器完成直接存储访问传输:作为一个AHB主设备,它能够控制AHB总线矩阵去完成传输功能的初始化。DMA模块可以执行以下几种传输模式:
&&&&&&& a. 外设到内存的传输
&&&&&&& b. 内存到外设的传输
&&&&&&& c. 内存到内存的传输(注意:如上图所示,DMA1的外设端口并没有与总线矩阵相边,因些不支持此模式的传输功能)
&&&&&&& DMA控制器提供两个AHB主端口:AHB内存端口(用于连接内存和AHB外设端口)、AHB外设端口(用于连接外设)。但是如果要允许内存到内存的传输,AHB外设端口也必须要对内存进行访问。
&&&&&& AHB从接口用于对DMA控制器进行编程(只支持32位字宽的访问)。
&&&&&& 同上面注意事项一样,DMA1控制器AHB外设端口并未与总线矩阵相连,只有DMA2控制器的AHB外设端口及AHB内存端口都与总线矩阵相连,因此只有DMA2的数据流(stream)支持内存到内存的传输。
我表示,STM32官方的固件库很强大,以上内容如果没有错误的话,相信再结合固件库中关于DMA的例程来看,当然你直接看一个ADC的例程,好像也用到了DMA功能,这样相信你就会很快掌握STM32的DMA的用法了(当然用到非例程相关的资源时要多看PDF查阅相关参数),说多了无益,我准备把时间用在其他模块的研究中去了&&请发现问题的大侠一定要指出来哦,我将&感激涕淋&
例程更新了,地址如下,说明:第一个例程是内存与内存之间进行DMA传输,带有详细的中文说明,后面的一个例程是讲解如何使用外设结合DMA来编写应用程序,就没有带太多中文说明了,希望会有点帮助:
——回复可见内容——
嘿嘿,又是DMA。 我从知道有DMA这个东西后,我就深深地喜欢上了它。
而且207的通道好多啊
这一点上,TI就差了一些。 性能差不多的档次,st公司的就提供了,但是TI就没有提供。
例如LM3S8962
版主,没点表示?
什么提示?
大家都不回复,我来回复一个,自已能做到的事情,争取自已多做些
我在提示本版的版主啊
先加上精华,然后再等楼主的实例代码奉上&&
好吧,那看来我还得加代码上去了,我本想让大家自已看代码例程的,因为固件库里面有,比如ADC的例子就用到了DMA功能,不过还是写个中文版带详细说明的吧那&&
匿名不能发帖!请先 [
Copyright (C) 《电子产品世界》杂志社 版权所有stm32f407之DAC(操作寄存器)
我的图书馆
stm32f407之DAC(操作寄存器)
&&&&&& Stm32f4内嵌的DAC是12位数字输入,电压输出的数模转换器。DAC可以配置为8位或12位模式,也可以与DMA控制器配合使用。DAC工作在12位模式时,数据可以设置成左对齐或右对齐。DAC模块有2个输出通道,每个通道都有单独的转换器。在双DAC模式下,2个通道可以独立地进行转换,也可以同时进行转换并同步地更新2个通道的输出。DAC可以通过引脚输入参考电压VREF+以获得更精确的转换结果。
主要特点:
2个DAC转换器:每个转换器对应1个输出通道
8位或者12位单调输出
12位模式下数据左对齐或者右对齐
同步更新功能
噪声波形生成
三角波形生成
双DAC通道同时或者分别转换
每个通道都有DMA功能
外部触发转换
输入参考电压VREF+
设置步骤:
1.&&&&&设置相关GPIO(PA4、5)。
2.&&&&&若时钟源为TIMx更新事件,则设置TIMx。
3.&&&&&使能DAC时钟
4.&&&&&设置触发源,开启相关触发通道,如果用DMA,是否允许数据错误中断。
5.&&&&&如果用DMA。配置相关DMA数据流。
[plain] /************************************&&&&&&标题:DAC&&&&&&软件平台:IAR&for&ARM6.21&&&&&&硬件平台:stm32f4-discovery&&&&&&主频:168M&&&&&&&&&&&&author:小船&&&&&&data:&&*************************************/&&&&#include&&stm32f4xx.h&&&&#include&"MyDebugger.h"&&#include&"sintable.h"&&&&&&&void&main&()&&{&&&&&&&&&SCB-&AIRCR&=&0x05FA0000&|&0x400;&&//中断优先级分组&抢占:响应=3:1&&&&&&&/***GPIO设置***/&&&&RCC-&AHB1ENR&|=&(1&&0);&//打开GPIOA时钟&&&&GPIOA-&MODER&|=&0x00000F00;//PA4、5模拟模式&&&&GPIOA-&PUPDR&&=&0xfffff0//无上拉无下拉&&&&&&&&&&&/***定时器设置***/&&&&RCC-&APB1ENR&|=&(1&&4);//打开TIM6时钟&&&&TIM6-&PSC&=&0;&&&&&TIM6-&ARR&=&83;&&//使得更新事件频率为1m&&&&TIM6-&CR2&|=&&0x;//更新事件输出&&&&TIM6-&CR1&|=&1;&//开始计时&&&&&&&&/***DAC设置***/&&&&RCC-&APB1ENR&|=&(1&&29);&//使能DAC时钟&&&&DAC-&CR&&=&0xffff0000;&&&&/*&&&&使能DMA堵塞中断&&&&使能通道1触发&&&&*/&&&&DAC-&CR&|=&(&(1&&13)&|&(1&&2)&);&&&&&&NVIC-&IP[54]&=&0xA0;&&&&NVIC-&ISER[1]&|=&(1&&(54-32));&&&&&&&/***DMA设置***/&&&&RCC-&AHB1ENR&|=&(1&&21);&//使能DMA1时钟&&&&DAC-&CR&&=&~(1&&12);//DAC&dma发送模式除能&&&&DMA1_Stream5-&CR&&=&0xFFFFFFFE;&//除能DMA1_Stream5&&&&while(DMA1_Stream5-&CR&&&0x);//确保DMA可以被设置&&&&&DMA1-&HIFCR&|=&0x;//传送前清空DMA1_Stream5所有中断标志&&&&&DMA1_Stream5-&PAR&=&(uint32_t)&DAC-&DHR12R1;//设置外设地址&&&&DMA1_Stream5-&M0AR&=&(uint32_t)SinT&//设置内存地址&&&&DMA1_Stream5-&CR&|=&0x0002800;//16位数据&&&&DMA1_Stream5-&NDTR&=&1024;&//设置dma传输数据的数量&&&&/*&&&&&&设置dma通道7,即DAC1&&&&&&优先级Medium&&&&&&传输方向内存到外设&&&&&&内存递增模式&&&&&&循环模式&&&&*/&&&&DMA1_Stream5-&CR&|=&(&0x0e000000&|&0x&|&(1&&6)&&&&&&&&&&&&&&&&&&&&&&&&&&|&(1&&10)&|&(1&&8)&);&&&&&&&&&DMA1_Stream5-&CR&|=&1;&//DMA数据流5使能&&&&&&&&DAC-&CR&|=&(1&&0);&&&//DAC通道1使能&&&&&&DAC-&CR&|=&(1&&12);//DAC&dma发送模式使能&&&&&&&&&&&&MyDebugger_Init();&&&&&&while(1)&&&&{&&&&};&&}&&&&void&TIM6_DAC_IRQHandler(void)&&{&&&&if(&DAC-&SR&&&(1&&13)&)&&&&{&&&&&&MyDebugger_LEDs(red,&on);&&&&&&DAC-&SR&&=&~(1&&13);&&&&&}&&}&&
TA的最新馆藏
喜欢该文的人也喜欢查看: 3337|回复: 7
请问STM32F407的DMA一个数据流可以同时为两个外设打开么
主题帖子精华
中级会员, 积分 221, 距离下一级还需 279 积分
在线时间17 小时
比如我要用到DMA1的数据流3中的SPI2 RX又要用到UART3_TX,我可以初始化的时候把这两个都设置到数据流三的通道0和通道4吗
1、先看下DMA的物理结构,
8个channel共用一个stream,或者说每个stream包含8个channel。
2、同时开启多个stream是可行的,我成功实践过,看结构也可行。(内部自会协调工作)
& & 但,针对一个stream应当不能同时开启多个channel,因为这里有8选一开关。
& &从配置寄存器也可以看出这一点。
& 所以,可能要等前面的channel完成后,再重新配置,选择其他channel。
3、如果是我,就想 ...
无个性,不签名
主题帖子精华
在线时间838 小时
1、先看下DMA的物理结构,
8个channel共用一个stream,或者说每个stream包含8个channel。
5a97ecba4fa6_129.png (0 Bytes, 下载次数: 0)
22:54 上传
2、同时开启多个stream是可行的,我成功实践过,看结构也可行。(内部自会协调工作)
& & 但,针对一个stream应当不能同时开启多个channel,因为这里有8选一开关。
& &从配置寄存器也可以看出这一点。
& 所以,可能要等前面的channel完成后,再重新配置,选择其他channel。
325874cdea84a3c95f480_677.png (0 Bytes, 下载次数: 0)
22:54 上传
3、如果是我,就想办法把它们错开到不同的stream。
bc3a14f6ce8_402.png (0 Bytes, 下载次数: 0)
22:54 上传
4、如果遇到不能错开的情况,就考虑其他可能性。比如放弃USART3、改用其他串口,放弃SPI2、改用其他SPI。硬件也要相应改动。
主题帖子精华
中级会员, 积分 221, 距离下一级还需 279 积分
在线时间17 小时
回复【2楼】xuande:
---------------------------------
谢谢!您的回答解开了我的疑问,再讨论一个问题,串口接收GPS信号(1秒一次,一次四五百个字节)使用空闲中断+DMA方式,我是在中断的过程中把数据post给UCOS的任务好还是定义一个变量,使用DMA的双缓冲乒乓在UCOS的任务中把串口的缓冲数据读出来post给解析任务好呢?
数据量比较大UART和SPI都比较大
无个性,不签名
主题帖子精华
在线时间838 小时
回复【3楼】suebillt:
---------------------------------
两种方法都是常用的。
关键看时序,每个事件消耗的时间。
主题帖子精华
中级会员, 积分 221, 距离下一级还需 279 积分
在线时间17 小时
回复【4楼】xuande:
---------------------------------
好的,谢谢,为啥说阿莫是烂货?
无个性,不签名
主题帖子精华
中级会员, 积分 221, 距离下一级还需 279 积分
在线时间17 小时
回复【4楼】xuande:
---------------------------------
你好,我在用串口空闲中断配合DMA双缓冲的时候出现了问题,
直接用串口空闲中断接收GPS消息是正常的一秒一次,但是加上双缓冲之后
void&USART2_IRQHandler(void)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
{&&&&&
uint32_t&Length&=&0;
// u16&i;
if(USART_GetITStatus(USART2,&USART_IT_IDLE)&!=&RESET)&&
&&//DMA_Cmd(DMA1_Stream5,DISABLE);&
&&Length&=&USART2-&SR;&&
&
&&Length&=&USART2-&DR;&//清除标志位&
&
Length&=&Uart2_GPS1_LEN&-&DMA_GetCurrDataCounter(DMA1_Stream5);
&&&&&&DMA_ClearITPendingBit(DMA1_Stream5,DMA_IT_TCIF5);
OSFlagPost(GPS_FLAG,0x01,OS_FLAG_SET,&err);
printf(&\r\n%d\r\n&,Length);
&&//DMA_Cmd(DMA1_Stream5,&ENABLE);//处理完,重开DMA&&&
__nop();&&&
}
GPS消息被拆成一段一段的不好直接处理了,如果进中断禁止DMA&的话就不能正常工作,是不是双缓冲不太适合这样用?
无个性,不签名
主题帖子精华
中级会员, 积分 324, 距离下一级还需 176 积分
在线时间37 小时
回复【4楼】xuande:
---------------------------------
你好,我在用串口空闲中断配合DMA双缓冲的时候出现 ...
我觉着即使消息被分割了亦可以组成一起的;而且在数据量大的时候,双缓冲还算是个不错的方法。
任何一件事情,只要心甘情愿,总是能够变得简单。
主题帖子精华
金牌会员, 积分 1610, 距离下一级还需 1390 积分
在线时间279 小时
1、先看下DMA的物理结构,
8个channel共用一个stream,或者说每个stream包含8个channel。
解释的非常详细。
Powered by}

我要回帖

更多关于 单向数据流 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信