搜索 adc
用STM32F4的DMA实现高速、实时的同步并行通信——以读取高速ADC为例[原创www.cnblogs.com/helesheng]

用STM32F4的DMA实现高速、实时的同步并行通信——以读取高速ADC为例[原创www.cnblogs.com/helesheng]

大概6-7年前,在网上看到过一篇用STM32F1的DMA控制GPIO输出高速数字波形的帖子。觉得很有意思,就自己试了试:控制GPIO输出波形翻转的速度最高只能达到3-4MHz,且容易受到STM32F1的APB2总线其他设备读写的影响,输出的方波不稳定。由于问题较多,对高速实时性提升不大,感觉基本不实用,就没有再进一步研究。 前几天在研究STM32F4和STM32F1的区别时,发现STM32F4进行了两项升级:1、把GPIO连接从APB2总线改到AHB总线上,极大的改善了GPIO输入、输出的实时性和时序控制能力。2、增加DMA stream的概念(参见拙作 https://www.cnblogs.com/helesheng/p/18167026 ),使得DMA传输请求的来源更明确。 DMA控制器的上述升级,使得STM32F1上比较“鸡肋”的DMA高速并行同步传输能力得到了较大提升 ,具备了一定的实用性。我尝试用STM32F407VE的DMA2在TIM1的触发配合下,实现了对并行接口的流水线型ADC的控制和读取。理论读取速度可达40MSPS以上,实测读取速度可超过AD9200E的理论上限——20MSPS。设计思路、程序和电路如下,供大家参考和指正。 以下原创内容欢迎网友转载,但请注明出处: https://www.cnblogs.com/helesheng 一、DMA控制高速同步并行数据传输的原理分析 本文基于DMA的GPIO高速并行读写程序,主要利用了STM32F4系列DMA的以下关键特性: 1)STM32的DMA传输可分为外设和内存之间,以及内存之间两种传输模式。这两种模式的最重要区别是: 外设和内存之前的DMA传输必须由其他外部 请求 信号触发;而内存和内存之间的DMA传输则不会等待其他触发,它会在上一次传输进行完之后自动进行下一次传输 。 在STM32的嵌入式系统中,除去少数只追求传输带宽的纯数据传输任务以外,大部分与硬件相关的DMA传输,还要要求在恰当的时刻完成传输。以本文要完成的高速A/D数据读取为例,读写数据的时刻必须收到采样间隔的严格控制。也就要求由定时器TIM来实现采样间隔的定时,即 由TIM产生DMA传输的请求信号,而数据则通过DMA在GPIO 数据寄存器 和内存之间进行传输 。 2)外设和内存之间的DMA传输的请求信号,可以是本次DMA传输的源或目的的外设,也可以是其他外设。 STM32F4的DMA传输请求信号由DMA的流(stream)和请求信号(或称通道channel)共同决定;但传输源和目的外设种类却由源和目的地址决定 。 二者不能混为一谈。 3)STM32F4的 两个DMA控制器的两个端口被指定为特定的数据源 。具体连接关系如下图所示。以GPIO为例,STM32F4把它连接到AHB1总线上,由下图可知连接到AHB1外设的只有蓝色和黑色两种颜色的线,也就意味着,左侧的两个DMA控制器中只有连接了蓝色和黑色的 DMA2 可以实现与GPIO之间的DMA传输。 图1 STM32F4系列两个DMA控制器端口(源和目标)连接的外设/存储器种类 通过查询STM32F4的数据手册中的DMA请求信号表可知,可用于请求DMA2的定时器只有TIM1和TIM8两个高级定时器。我选择了TIM1的更新事件TIM1_UP来请求DMA传输。 图2 STMF4系列DMA2控制器的外设传输请求表 另外,控制高速ADC还要求单次DMA传输耗时要小于采样间隔,而 STM32F4把GPIO连接到AHB1总线的意义也就在于此——相比之前将GPIO连接到APB2总线的STM32F1系列,STM32F4将能够更快速的对GPIO进行读写 ,从而提高与所控制ADC的数据读取速率。 最后,流水线型ADC还需要一个采样同步时钟;由于数据读取也是在该时钟的同步下进行,自然只能由TIM1时基部分同时产生该时钟。一种合理的解决办法是用TIM1的输出比较(OC)功能电路来产生。这也意味着该时钟只能由TIM1的某个通道(CHx)产生,从而只能在某些管脚上输出,这一点必须在硬件设计时加以注意。 二、高速并行接口ADC读取的程序和电路设计 1、硬件设计 下图是我采用的ADI公司的标称转换速率为20MSPS的流水线型A/D转换器——AD9200E(10bits分辨率)的工作时序图。 图3 AD9200的读取时序 可以发现,数据的更新发生在 上升沿 后25ns左右。 如果输出比较OC电路采用时基计数的前段输出高电平,比较翻转的后输出低电平的模式,就会使得输出PWM信号的上升沿发生在TIM1更新时。而如前所述STM32F4的DMA2数据传输则发生在TIM1更新事件后,这就有由于高速数字电路的竞争与冒险造成读取时序不收敛。 我曾在某论坛看到过有人对AD9226做类似尝试,仅在16MSPS以上时就出现采样点读取错误的问题(https://blog.csdn.net/cusichidouren/article/details/126002742),我猜测就是由于这个原因。 合理的解决方案其实也不复杂:对OC电路输出的PWM信号反相,使其在下降沿时触发DMA2传输请求。幸运的是STM32的OC输出支持负逻辑的PWM输出,不需要附加进一步的门电路。具体配置代码请参见软件设计部分。 具体GPIO选择方面,我用了PE0~16号端口来实现对AD9200的控制和读取。其中,PE口中PE11管脚可以配置为TIM1的通道2(CH2),可以作为AD9200的转换时钟(INPUT CLOCK)。而AD9200的10根数据线则用PE0~9负责读取,低位对齐的做法也有利于后续的数据读取和整理。AD9200的钳位控制(CLAMP)、溢出指示(OTR)、低功耗待机(STBY)等管脚则连接到PE口的其他管脚。原理图太简单,这里就不贴出来了,放一张实物图。 注意:AD9200的模拟驱动应使用一个高压摆率的宽带运放,我使用了低成本的AD8052。 图4 实验系统实物图 2、软件设计 正如本文前面“原理分析”介绍的,DMA传输的通道、流、数据源/目标、传输请求信号如下图所示。 图5 DMA工作原理示意图 3、遇到的几个“坑” 尽管STM32F4是非常成熟的MCU产品线,但本文所述的“基于DMA的高速并行GPIO读写”并不是常见的功能,因此在调试过程中我还是遇到并克服了一些问题。个人觉得是芯片本身以及标准外设库的一些小问题造成的,但也可能是由于我才疏学浅、考虑不周的原因。罗列与此,供大家参考和指正。 1)官方提供的标准外设库高速外部晶振频率不匹配问题 我使用了ST官方提供的标准外设库作为开发平台,其中配置的高速外部晶振HSE的频率(HSE_VALUE)为25MHz。而我实际使用的晶振为8MHz,这除了导致UART通信的波特率不准之外,更重要的是还会导致TIM1输出比较OC电路输出的时钟频率不对。在固件库stm32f4xx.h中搜索宏“HSE_VALUE”,将其改为8000000即可解决问题。 2)PA8管脚复用为TIM1_CH1输出比较功能时无输出的问题 我最初进行硬件设计时,曾想用管脚PA8复用的TIM1_CH1功能输出AD9200所需的转换时钟。但折腾了很长时间都无法让PA8管脚输出所需时钟(PWM)信号,在网上搜索后发现问题是STM32芯片的一个“顽疾”( www.openedv.com/posts/list/49738.htm )——只要使能复用在PA8、PA8、PA10等管脚上的USART1功能,就会导致PA8上的TIM1_CH1无法输出PWM信号。修补这个BUG也不困难:我改成使用TIM1_CH2(在PE11管脚上)输出PWM波,就很好的解决了这个问题。 三、测试结果 下图所示的是VOFA+软件显示的采集信号 图6 AD9200采集的信号波形(采样率为21MS,输入正弦信号为1MHz,采样长度为512点) 相关问题分析如下: 四、DMA控制高速并行ADC/DAC的弊端和问题 1、采样触发信号问题 及其解决办法 1) 用STM32这样的MCU代替FPGA来控制高速ADC,最大的问题在于MCU软件的实时性远远赶不上硬件控制的FPGA。例如,前面提供的主程序代码中,用检测按键的方式触发DMA实现采样。显然无论是检测按键的程序的时间精度还是程序调用外设库启动DMA传输的时间精度都远远低于ADC采样的100ns数量级的时间精度。致使采样触发信号的实时性只能满足对“时间平稳信号”分析的需要,无法达到对非平稳信号进行时域分析的需求。 2)另外,从图6中可以发现信号刚开始的一段信号是混乱的,造成混乱的原因有二: 其一:在高速传输条件下, 在传输刚开始的一段时间 S TM32的DMA控制器无法及时的响应传输请求 ,从而造成DMA只能在TIM1的采样请求已经发出一段时间后才读取ADC的输出数据,结果自然不正确。 其二:流水线型ADC的数据传输和采样值之间存在延迟。从图3给出的时序图也可以发现,当前读取的数据是四个时钟之前“潜伏”在ADC的流水线中的,从而造成了缓冲区中开始一段的信号错误。 以上两个原因,都可以通过丢掉缓冲器中开始的一段数据的方法掩盖,但这无疑也是对采样触发信号的实时性的进一步降低。 2、TIM1输出采样时钟抖动问题及其解决办法 下图是用20G采样率的示波器DSOX6004A采集到的TIM1_CH2(PE11)输出的采样时钟信号。 图7 TIM1的PWM功能产生的采样时钟的孔径抖动(触发后100us处) 为了测试采样时钟信号的孔径抖动情况,我将观察窗对准采样触发后100us的地方(触发-采样延迟如图中红色圈内数据所示),可以发现该处时钟上升沿的抖动达到了5ns左右(图中示波器横轴每个为5ns,如图中黄色圈所示)。这表明TIM1的OC模块产生的采样时钟孔径抖动品质较差,大大降低了采样信号的信噪比。 为解决这个问题,可以使用片外模拟锁相环PLL输出的时钟信号作为ADC的采样时钟。至于STM32F407的TIM1_CH2则由输出比较模式(OC)变为输入捕获模式(IC),由外部锁相环产生的时钟信号作为TIM1_CH2的捕获(IC)对象。 下图是我使用单独的模拟锁相环PLL芯片Si5351产生相同的21MHz信号,同样在采样触发后100us的地方观察时钟抖动情况。可以明显的看到锁相环芯片产生的时钟的孔径抖动性能明显由于定时器输出比较模式输出的时钟。 图8 模拟锁相环芯片Si5351产生的采样时钟的孔径抖动(触发后100us处) 3、同步传输速率被限制在10MSPS左右 从本质上讲,DMA是与CPU内核共享片上的总线资源的,当使用DMA高速传输并行数据时必然挤占CPU读取指令和数据的总线时间。如果DMA传输的是SRAM中的数据,某一笔传输由于总线被占用而延期并不会影响传输整体的正确性。但对于ADC和DAC这样的高速数据传输,某一笔数据的延迟就有可能造成采样的错误。 经过测试,我整体的感觉是: 即使把DMA传输数据的优先级设为非常高(DMA_Priority_VeryHigh),且在采集期间不执行中断服务(ISR)等可能打断DMA的程序,当把DMA同步传输速率提升到10MSPS以上就很难保证每一笔传输的可靠实时性了 。当然在极限情况下,同步传输速率是可以达到40MSPS的,但不建议大家在产品中使用。 4、 单端数字信号,抗干扰能力弱于差分数据线 当数字信号在PCB上传输的速率达到10MSPS以上时,STM32中使用的单端3.3V CMOS在很多情况下就有可能出现传输错误,一般的解决方案是使用LVDS等差分传输标准。但STM32F4系列中没有类似硬件配置,导致同步传输速率达到10MSPS以上时系统的抗干扰能力和传输正确率都会有所下降。

网游攻略 2024-05-22
小炮符文,哪个adc能打过神装德莱文?

小炮符文,哪个adc能打过神装德莱文?

遇到神装德莱文小炮符文,如果大家都是全输出的情况下能和德莱文对抗的adc英雄其实并不多。 1.老鼠,老鼠利用隐身拉开距离大招 偷袭,可以卡一下德莱文的射程,德莱文很容易出现没近身就被打死的情况。 2.大嘴,神装大嘴后期是出了名的强,对付德莱文就看能不能呗德莱文近身了,如果有视野的情况下德莱文正面冲800多码的射程真的让德莱文没办法都出斧子。 3.薇恩,神装vn打人尤其是打脆皮也不过就三下的事情,利用隐身的优势打德莱文还是比较容易的,因为可以先手,像这种情况基本谁先手谁赢了。 不知道大家觉得还有哪些adc神装后打的过德莱文的?

资讯百科 2022-02-21
王者荣耀adc,王者荣耀的c位是什么意思?

王者荣耀adc,王者荣耀的c位是什么意思?

《王者荣耀》是由腾讯游戏开发并运行的一款运营在Android王者荣耀adc、IOS平台上的MOBA类手机游戏,于2015年11月26日在Android、IOS平台上正式公测,游戏前期使用名称有《英雄战迹》、《王者联盟》。 《Arena Of Valor》《王者荣耀》的欧美版本将于2018年在任天堂Switch平台发售。 游戏是类dota手游,游戏中的玩法以竞技对战为主,玩家之间进行1V1、3V3、5V5等多种方式的PVP对战,还可以参加游戏的冒险模式,进行PVE的闯关模式,在满足条件后可以参加游戏排位赛等。游戏正式服已经出了几十位英雄,定期也会推出新的英雄,英雄定位可分为法师、战士、坦克、刺客、射手、辅助,不同的英雄拥有不同的属性和技能。每个英雄都有多个主动攻击技能和1个被动技能,在匹配模式下,玩家可以使用周免英雄、体验卡英雄和已经购买的英雄参加战斗。 讲王者荣耀C位这个问题之前呢,相信大家对于明星之间C位也并不陌生吧,这个C位就是center意思就是中心,也就是说最重要的位置。而王者荣耀这个C位也可以说是center又或者说是carry,总之这些都是一个意思,重点都没有偏离,能carry全场的英雄。每个战队都有一个C位的存在,它是能够带动全场节奏,属于主力输出的地位,也就是指ADC射手和APC法师。 ADC这类英雄伤害一般都比较高,前期一定要发育好后期能够带团队取得胜利,是最容易mvp的位置之一。APC法师后期输出主要就是靠他和下路射手,英雄结算中也可以明显看得出来输出占比。不过中单也算容易被针对的一个位置,对面打野的容易来gank,队友也容易来吃兵线抢钱,不过中路线短钱多优势还是比较大的。 王者荣耀adc是什么意思? 知道哪些是射手英雄: ADC是一个缩写,指代物理英雄,也就是射手,对应的还有APC,也就是法师,C是Carry的缩写,代表核心,大家都知道,战士大部分也是物理的,但是射手比战士伤害要高,所以是物理的C。 射手英雄的攻击值普遍比较高: 射手的定位,主要就是攻击(物理输出)大家可以在英雄资料里看到,这些英雄,普遍攻击会比较高,属性栏当中。如果是法师的话,那么就是技能比较高了。 适合出物理装备: ADC也就是物理英雄,出的装备基本上都是在商店的攻击当中,攻击的都是物理类型的装备,法术的都是适合法师的魔法装备,这个是有区分的要注意。 需要堆积攻击力: 一般ADC,需要出的装备,可以是攻击力的,攻击吸血的,包括攻速的,暴击类型的装备,可以再出1-2件防御类型的装备。 红BUFF可以让射手更猛: 因为射手一般是靠攻击,普通攻击吃饭的,所以红BUFF(每一次普通攻击造成额外的伤害和减速)非常适合射手,大家可以积极的拿一下。 一般走在下路: 在分路当中,ADC一般会走在下路,默认的分路基本上是这样安排的,战士、坦克会在上路,中路是属于法师的,下路是辅助和ADC哦。 团战要怎么打: 那么ADC在团战当中的 定位,就是输出,达不到敌人的后排,那么就打前排,站在我们的前排后面,跟在辅助身边,确保自己的安全。

资讯百科 2022-01-25
< 1 >