历史上的今天
返回首页

历史上的今天

今天是:2024年10月09日(星期三)

正在发生

2019年10月09日 | STM32的AD用DMA方式时的请注意初始化顺序

2019-10-09 来源:eefocus

我突然意识到我的数据好像一直没有错位,看到这个我又试验了一下,发现把DMA_Cmd(DMA1_Channel1, ENABLE);放置到哪儿都是一样的啊~~~
这个是原帖部分:


STM32的AD用DMA方式时的请注意初始化顺序
  
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_Result;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStructure.DMA_BufferSize = 6;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  
  
  //DMA_Cmd(DMA1_Channel1, ENABLE);//以前在这里启用DMA,出现通道错乱
     
  
  ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfChannel = 6;
  ADC_Init(ADC1, &ADC_InitStructure);

  
  ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_55Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_55Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 4, ADC_SampleTime_55Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_14, 6, ADC_SampleTime_55Cycles5);
  ADC_RegularChannelConfig(ADC1, ADC_Channel_15, 5, ADC_SampleTime_55Cycles5);
  
  ADC_DMACmd(ADC1, ENABLE);
  
  
  ADC_Cmd(ADC1, ENABLE);

     
  ADC_ResetCalibration(ADC1);
  
  while(ADC_GetResetCalibrationStatus(ADC1));

  
  ADC_StartCalibration(ADC1);
  
  while(ADC_GetCalibrationStatus(ADC1));
     
  
  
  DMA_Cmd(DMA1_Channel1, ENABLE);
  
  ADC_SoftwareStartConvCmd(ADC1, ENABLE);

以上代码转自STM32交流群的“情岁月”(84848098) 17:27:48的发言,在此对他表示感谢。

下面的经验也是“珍情岁月”提供:

用DMA连续采样多路,自动触发,如果在初始化AD前使能了DMA就会出现数据错位现象。
要注意在初始化时将DMA_Cmd(DMA1_Channel1, ENABLE);放置到ADC_SoftwareStartConvCmd(ADC1, ENABLE);前面。

原因是:如果在初始化AD的时候DMA被触发了一次,但是此时并没有采样,但是DMA目的地址已经发生了自加,
当你采样第一路的时候,数据却填充到了第二路。

校准AD的时候会触发DMA导致通道错位,因此校准AD基准前不要启用DMA。

推荐阅读

史海拾趣

Ericsson公司的发展小趣事

在19世纪70年代,Ericsson公司主要以修理电报机和其他电器仪表为主要业务。然而,随着电话技术的引入和普及,Ericsson敏锐地捕捉到了这一新技术带来的商机。公司创始人Lars Magnus Ericsson通过购买、拆解和维修电话机,迅速掌握了电话机制造技术。1878年,Ericsson公司成功推出了自己的电话机,并凭借其经济耐用的特点迅速赢得了市场认可,为公司的发展奠定了坚实的基础。

Dawn Electronics Inc公司的发展小趣事

在技术创新的基础上,Dawn Electronics Inc公司开始积极拓展市场。公司加强了与国内外客户的合作,通过提供优质的产品和服务,赢得了客户的信任和支持。同时,公司还注重品牌建设,积极参与行业展会和交流活动,提高了品牌知名度和影响力。这些努力为公司赢得了更多的市场份额和合作机会。

优先(苏州)半导体公司的发展小趣事

宝士曼第三代半导体研发生产项目位于苏州东山大道旁,占地50亩,计划建设生产、研发、办公等楼宇。项目整体将分二期建成,总建筑面积约70000平方米。已经封顶的4号楼建筑面积超11600平方米,主要用于第三代半导体器件专用封装设备的研发生产。在施工过程中,宝士曼对环保和施工细节提出了更高的要求,要求地面每5平方米的高度误差要小于3毫米,并在施工中做到“工完场清”,最大程度减少对今后生产的影响。这种对细节的严格要求体现了宝士曼对产品质量和环保责任的重视。

FutureWafer公司的发展小趣事

1994年,三星电子(苏州)半导体有限公司在苏州工业园区成立,成为园区首批入驻的外资企业之一。公司初期主要生产配套、低附加值产品,但随着市场的变化和竞争的加剧,公司开始寻求转型。2003年,苏州工厂开始转型生产核心产品,标志着公司从低端生产向高端制造的转变。此后,公司不断加大在智能制造方面的投入,采用先进的半导体自动化生产管理系统和ERP管理系统,实现了“无人化”自动化生产,生产自动化率可达90%以上。同时,公司始终坚持“绿色经营”的可持续发展理念,致力于保护及改善周边环境,履行企业的环保社会责任。

Ferraz Shawmut(Mersen)公司的发展小趣事

2007年,Ferraz Shawmut收购了美国的General Electric公司的功率熔断器部门。这一收购不仅增强了公司在功率熔断器领域的实力,也进一步巩固了其在电气保护领域的领先地位。通过整合双方的技术和资源,Ferraz Shawmut推出了更多高性能、高品质的电气保护产品。

HellermannTyton公司的发展小趣事

Heimann Optoelectronics Gmbh深知人才是企业发展的核心动力。公司建立了完善的人才培养体系,通过内部培训、外部交流等多种方式提升员工的专业技能和综合素质。同时,公司还注重营造开放、包容的企业文化,鼓励员工创新思维和团队合作。这种良好的企业文化氛围吸引了大量优秀人才加入公司,为公司的持续发展提供了有力的人才保障。

以上五个故事虽然基于虚构的“Heimann Optoelectronics Gmbh”公司构建,但反映了电子行业中企业发展的一般规律和趋势。

问答坊 | AI 解惑

keil下ARM的调试程序

uc/os的成功例程,也是从网上下的分享哈…

查看全部问答>

菜鸟参加电子设计大赛感悟!

本帖最后由 paulhyde 于 2014-9-15 08:54 编辑 今年暑假,我有幸参加了全国大学生电子设计大赛的培训.在学校提供的实验室里,我度过了紧张而又刺激的两个月时间.在有限的时间里,我学到了无穷的知识, 仿佛胜过两年的大学学业.在实验室,我感受到了前所 ...…

查看全部问答>

关于嵌入式

各位好! 我呢,以后想学嵌入式,但是对于嵌入式的学习路线还不是很明白。比如说哪些课程特别重要,主要学习什么语言还有就是中国高校目前对于该门课程制定的学习路线是什么,请各位参照自己的情况,给我指点迷津,谢谢!…

查看全部问答>

怎样利用数据分级来提高存储的准确率?

一、利用离线存储来提高设备的使用寿命。    存储在磁带设备上的数据一般可能很少用到。如企业需要对数据库等应用软件的数据进行备份。此时可以将数据备份到磁带设备上。根据惯例,一般一天24个小时这个磁带设备可能就只需要半个小时。 ...…

查看全部问答>

JTAG调试后怎么自动复位MCU

我在MDK下用Ulink2调试STM32,调试一次退出后,再进入调试模式就提示有问题,必须复位MCU才行。 烧写也是,烧写后必须复位MCU才能进入调试或者再烧写。 复位电路是参照的万利的板子,不知道要设置哪里。 谢谢了。…

查看全部问答>

求助M3程序下载问题

M3没法下载程序了  显示 Could not initialize target device!Please power cycle the board and try again!  哪位朋友知道为什么啊?非常感谢…

查看全部问答>

提示:你有新短消息,可又进不去,怎回事?

提示:你有新短消息,可又进不去,怎回事? 点击“您有新消息”,要求登录,因为已经登录,再登录不成,所以进不去。…

查看全部问答>

Sitara AM335x通用EVM硬件用户指南 CN_PDF

介绍 本文档介绍了AM335x评估模块(EVM)(TMDXEVM3358)这是基于德州仪器AM335x处理器的硬件体系结构。该EVM通常也被称为AM335x通用(GP)EVM。描述 AM335x通用EVM是一个独立的测试,开发和评估模块系统,它使开发人员能够编写周围的AM335x处理 ...…

查看全部问答>

nios2运行效率问题

搭建的CPU使用的时钟为100MHz,软件中连续使用IO_WR()直接对IO操作(赋值1和0)发现运行的时间不是10ns,而是1us左右,程序放在DDR中跑得,效率怎么会这么低,将程序放在片内跑,同样的程序,跑出来也不是10ns,而是接近200ns,相当于5M时钟在运行 ...…

查看全部问答>