STM32F429HAL库ADCDMA学习笔记

 昨天做了一个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<times;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有兴趣可以深入理解一下这个函数的用处。我也是简单学习一下就不在深究。到这配置就结束了

ADC/DMA配置:stm32f429xx_hal_adc.h

完整资料我上传到我的资源里欢迎参考修改

 点击打开链接



  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
STM32F429 HAL ADC DMA是指在STM32F429系列微控制器上使用HAL库进行ADC数据采集,并使用DMA传输数据的功能。 STM32F429微控制器是STMicroelectronics公司推出的一款高性能ARM Cortex-M4内核的单片机。HAL库是STMicroelectronics公司提供的用于快速开发STM32微控制器的硬件抽象层。ADC(Analog to Digital Converter)是模数转换器,用于将模拟信号转换为数字信号。DMA(Direct Memory Access)是直接内存访问技术,能够在微控制器和外设之间高速传输数据。 使用STM32F429 HAL ADC DMA功能,首先需要初始化ADCDMA相关的寄存器和参数。然后,配置ADC通道、采样时间和转换模式等。可以使用HAL库提供的函数来完成这些配置。接下来,需要配置DMA传输通道,并设置传输方向和传输缓冲区的地址等参数。然后,使能ADCDMA,并启动转换过程。转换完成后,会自动触发DMA传输,并将采样到的数据存储到指定的内存地址中。 通过使用STM32F429 HAL ADC DMA功能,可以实现高效的ADC数据采集。由于使用了DMA技术,数据的传输速度比较快,可以更加灵活地处理和存储采集到的数据。同时,HAL库提供了丰富的函数和接口,方便开发者进行配置和操作。使用这些功能,可以简化开发流程,提高开发效率。 总之,STM32F429 HAL ADC DMA功能是一种在STM32F429微控制器上进行ADC数据采集和DMA数据传输的功能,它结合了硬件抽象层库和直接内存访问技术,可以方便地实现高效的数据采集和传输。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值