历史上的今天
返回首页

历史上的今天

今天是:2025年03月12日(星期三)

正在发生

2019年03月12日 | STM32F429HAL库ADCDMA学习笔记

2019-03-12 来源:eefocus

做了一个ADC的程序一直想学习一下DMA的配置,我一直也是不懂DMA到底有什么用处,还是感觉很鸡肋。稍微配置了一下,我是这样理解DMA的。在配置了dma之后我们adc的数据不会再由cpu搬运,我们直接读取我们DMA数据是节省adc时间。直接看配置


void MY_ADC_Init(void)


ADC_ChannelConfTypeDef ADC1_ChanConf;


ADC1_Handler.Instance=ADC1;

 ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;   //4分频,ADCCLK=PCLK2/4=90/4=22.5MHZ

    ADC1_Handler.Init.Resolution=ADC_RESOLUTION_12B;             //12位模式

    ADC1_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT;             //右对齐

    ADC1_Handler.Init.ScanConvMode=ENABLE;                      //非扫描模式

    ADC1_Handler.Init.EOCSelection=DISABLE;                      //关闭EOC中断

    ADC1_Handler.Init.ContinuousConvMode=ENABLE;                //开启连续转换

    ADC1_Handler.Init.NbrOfConversion=2;                         //2个转换在规则序列中 也就是只转换规则序列2 

    ADC1_Handler.Init.DiscontinuousConvMode=DISABLE;       //禁止不连续采样模式

    ADC1_Handler.Init.NbrOfDiscConversion=0;                     //不连续采样通道数为0

    ADC1_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START;       //软件触发

    ADC1_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;//使用软件触发

    ADC1_Handler.Init.DMAContinuousRequests=ENABLE;             //关闭DMA请求

    HAL_ADC_Init(&ADC1_Handler);                                 //初始化 

   ADC1_ChanConf.Channel= ADC_CHANNEL_5;                                   //通道

    ADC1_ChanConf.Rank=1;                                       //第1个序列,序列1

    ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;        //采样时间

    ADC1_ChanConf.Offset=0;     /好像没用              

    HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);        //通道配置

 

ADC1_ChanConf.Channel= ADC_CHANNEL_4;                                   //通道

    ADC1_ChanConf.Rank=2;                                       //第1个序列,序列1

    ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;        //采样时间

    ADC1_ChanConf.Offset=0;    

    HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf); 


 MY_ADC_DMA_Init(); 

}


__HAL_RCC_DMA2_CLK_ENABLE();


 DMA2_Handler.Instance      =DMA2_Stream0;   //数据流0                

    DMA2_Handler.Init.Channel  =DMA_CHANNEL_0;  //通道0                 

    DMA2_Handler.Init.Direction=DMA_PERIPH_TO_MEMORY; //数据传输方向:外设->内存 

    DMA2_Handler.Init.PeriphInc=DMA_PINC_DISABLE;    //外设地址不变           

    DMA2_Handler.Init.MemInc=DMA_MINC_ENABLE;       //内存地址递增              

    DMA2_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD;//数据半字16位    

    DMA2_Handler.Init.MemDataAlignment=DMA_PDATAALIGN_HALFWORD;  //数据半字16位    

    DMA2_Handler.Init.Mode=DMA_CIRCULAR;  //循环模式                                                                            

    DMA2_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;//DMA传输方式有关数据格式几次传输               

    DMA2_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              

    DMA2_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL;     

    DMA2_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                

    DMA2_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;            

    __HAL_LINKDMA(&ADC1_Handler,DMA_Handle,DMA2_Handler);     

    /* Configure DMA Stream source address */

    DMA2_Handler.Instance->PAR  = (u32)&ADC1->DR; //外设地址

    DMA2_Handler.Instance->M0AR = (vu32)ADC_DMA_ConvertedValue;//内存缓冲地址

    DMA2_Handler.Instance->NDTR =2;//数据长度

    HAL_DMA_Init(&DMA2_Handler);

HAL_DMA_Start (&DMA2_Handler,(u32)&ADC1->DR,(unsigned int)&ADC_DMA_ConvertedValue,2);//开启DMA 


}


基本配置就是这样我们在




void Get_Adc_Average(u16 *temp,u8 times)

{

u32 temp_val[2]={0};

u8 t;

for(t=0;t

{

HAL_ADC_Start_DMA(&ADC1_Handler,(uint32_t*)&ADC_DMA_ConvertedValue,2);

temp_val[0]+=ADC_DMA_ConvertedValue[0];

temp_val[1]+=ADC_DMA_ConvertedValue[1];

delay_ms(5);

}

temp[0]=temp_val[0]/times;

temp[1]=temp_val[1]/times;



void ADC_DMA_Open(void)

{

         //DMA config    

          HAL_ADC_Start(&ADC1_Handler);                               //开启ADC 

          MY_ADC_DMA_Init();              

         //ADC

          HAL_ADC_Start_DMA(&ADC1_Handler,(uint32_t*)&ADC_DMA_ConvertedValue,2);        

}


我在采样时取了十次求均值滤波值处理一下好像每次采样都要


HAL_ADC_Start_DMA(&ADC1_Handler,(uint32_t*)&ADC_DMA_ConvertedValue,2);这和先开启否则不会传入DMA有兴趣可以深入理解一下这个函数的用处。我也是简单学习一下就不在深究。到这配置就结束了


推荐阅读

史海拾趣

Electronic-Bauteile Goerlitz GmbH公司的发展小趣事

在技术创新的基础上,Electronic-Bauteile Goerlitz GmbH公司积极拓展市场。公司通过分析市场需求,调整产品策略,不断推出符合市场需求的新产品。同时,公司加强了品牌建设,通过参加国际展会、举办技术研讨会等活动,提高了品牌知名度和影响力。这些努力使得公司的产品在国内外市场上都取得了良好的销售业绩。

EPCOS (TDK)公司的发展小趣事

EPCOS的前身是西门子松下有限公司(Siemens Matsushita Components),于1989年在德国慕尼黑成立。这家合资公司的诞生标志着西门子和松下两大电子巨头在电子元器件领域的强强联合。通过整合双方的技术和市场优势,EPCOS迅速崛起为全球电子元器件市场的重要参与者。

Gore公司的发展小趣事
在隔离型中压大容量直流变换器中,可能存在直流偏磁问题,导致变压器磁路饱和、励磁电流增加、局部过热和噪声增大等问题。
Cavium Networks公司的发展小趣事

随着通信网络的不断升级和转型,Cavium Networks 看到了市场的巨大潜力。在2008年,尽管全球经济风暴肆虐,但 Cavium Networks 依然保持着强劲的增长势头。同年11月,公司宣布收购 W&W Communications 公司,这一举措进一步拓展了 Cavium Networks 的业务范围,增强了其在网络通信领域的竞争力。通过收购,Cavium Networks 获得了更多的技术资源和市场份额,为其后续的发展提供了有力的支持。

Curtis Industries公司的发展小趣事

Curtis Industries公司在发展的同时,也积极承担社会责任。公司关注环保问题,采用环保材料和节能技术生产产品,减少对环境的影响。此外,公司还积极参与公益活动,支持教育事业和社会福利事业的发展。这些举措不仅提升了公司的社会形象,也为公司的可持续发展注入了新的动力。

Frequency Management International公司的发展小趣事

FMI深知技术创新是企业发展的核心动力。因此,公司一直致力于在石英晶体和晶体振荡器领域进行技术研发和创新。通过不断的技术积累和优化,FMI成功开发出了一系列高性能、高稳定性的产品,如压控温度补偿晶体振荡器(VCTCXO)、压控晶体振荡器(VCXO)、温度补偿晶体振荡器(TCXO)等。这些产品的推出不仅丰富了FMI的产品线,还进一步提升了公司在行业内的竞争力。

问答坊 | AI 解惑

蓄电池过放电

请教各位大虾,有没有保护蓄电池过放电的方案或者产品?…

查看全部问答>

印制板设计规范

印制板设计规范…

查看全部问答>

不用变压器降压 这样可以吗

问题见题目 我的台灯坏了  主控全部掉进了水里 不好修  就干脆自己做一个感应台灯 但是能力上有差距 目前大二 学测控的 麻烦看看这俩个地方  谢谢 …

查看全部问答>

28c64与28c64b有什么区别呢?

我在一个项目设计中用到E2PROM存储,用的是atmel的28c64系列,同样的电路,用28C64可以保存下来上次断电前的输入内容,但是用到26C64B就无法保存,有谁能告诉我这是什么原因不?…

查看全部问答>

flash文件系统

想开发flash的文件系统,迫切需要一切资料和参考源代码,FAT32的,请大家给提供点,谢谢…

查看全部问答>

液晶模块求救

各位前辈,我是一个大四的学生,毕业设计内容要求用到液晶显示。购买了一块北京青云的LCM12864B(控制器KS0107),自己焊接上了排针,上电后毫无反应,开、关模块没有问题。但送出数据后不显示,后来想送数后再读进来,发现不对。请问是不是模块坏 ...…

查看全部问答>

谁从TI的网店那里订购的EXP430-G2收到了吗?

收到的朋友,感觉这个系列的片子怎么样啊?…

查看全部问答>

自己设计的移动电源

换手机了,这个电池不经用啊,于是想做个移动电源出来。 现在手机充电几乎都可以用USB口充电,于是就设计成USB口形式,电池选用三洋的2600毫安锂电池(笔记本电芯就这电池,超强,网上几十块钱吧),3.7V的电压,充电电压为4.2V。 首先是DCDC放电 ...…

查看全部问答>

上班空闲时,你都在干什么?

快过年了,有些人也走了,公司显得有点冷清。 仔细看过去,研发人员还是一直的忙碌,生产维护的也在埋头苦干,那么那些、财务、行政等后勤人员,都在干什么呢?按理说年底,他们的事情很少,那他们来上班,都在干什么事情?若没事情,还不如让他 ...…

查看全部问答>

Quartus II 9.0中用模块化进行设计,使用ROM做存储器,为什么编译老是在ROM这块出错?

Quartus II 9.0中用模块化进行设计,使用ROM做存储器,为什么编译老是在ROM这块出错。我设置的ROM是6位地址输入,24位数据输出,同时还指定好了MIF文件,但是连接好原理图后,编译老是提示与ROM输出的线出错,即Error: Port \"G2AN\" of type 74138 ...…

查看全部问答>