HAL库学习之ADC单通道查询,中断读取,DMA转运

目录

一、ADC的三种工作方式及优缺点

二、ADC的转换

三 、单通道阻塞模式

CubeMX配置:

四、单通道中断模式

五、多通道DAM转运​​​​​​​


一、ADC的三种工作方式及优缺点

        1.查询模式:查询模式下,占用CUP时间较多,cup效率较低。

        2.中断模式:相比查询模式大大释放了cup,提高了cup的利用率。

        3.DMA模式:该模式下基本不占用cup,能直接将ADC采集的数据存储到存储器。 

二、ADC的转换

        转换方式需要根据情况搭配使用,分为扫描模式(Scan Conversion mode)、连续转换模式(Continuous Conversion Mode)和间断模式(Discontinuous Conversion Mode)。

ADC单通道转换:

        “单次转换,连续扫描模式关闭”:ADC使能一次,只能进一次转换;若要持续转换需要每转换一次重新使能一次ADC。

        “连续转换,连续扫描模式将关闭”:使能一次ADC可以一直转换,不需要重新使能ADC。

ADC多通道:

        “单次转换,连续扫描模式开启”:每个通道转换结束后停止,可以通过不断使能ADC持续对多ADC多通道的转换。

        “连续转换,扫描模式开始”:可以一直进行多通道采集,不需要重新使能ADC。

三 、单通道阻塞模式

    CubeMX配置:

         我使用的是stm32f103c8t6最小系统板与面包板进行外接10K的可变电阻进行         ADC采集。

 

Data Alignment : 可选左对齐或右对齐。

Conversion Mode:由于只使用了一个通道,关闭就行。

Continuous Conversion Mode:这里关闭,我们使用软件开启ADC。

Discontinuous Conversion Mode:单通道模式间断模式自动关闭,不可选。

Enable Regular Conversions:是否使能转换,开启规则转换。

Number Of Conversion:转换的通道数,单通道当然只能是1。

External Trigger Conversion Source:选择由软件触发采集。

Rank :每个通道的编号,

      每个Rank有如下参数配置:

      Channel:所选择的通道

      Sampling Time:每次采集ADC所需要的时间(采样周期),T = 采样周期 + 12.5个周期,(其中1周期为1/ADCCLK,设置的ADC时钟频率为12M),这里我设置的ADC的采样周期 为1.5Cycles,所以转化一次总的时间T=(1.5+12.5)/12=1.167us。

在main.c文件中添加函数:

 创建接收变量

调用  HAL_ADCEx_Calibration_Start(&hadc1); ADC校验函数

调用 HAL_ADC_Start();函数

 

接收ADC读取数据,通过串口接收显示数据

延迟时间,防止一直转换程序卡死。

 

四、单通道中断模式

这里勾选开启中断,其他不变

 代码编写:

使能ADC函数HAL_ADC_Star(&hadc1); 改为 HAL_ADC_Start_IT(&hadc1);

调用ADC中断回调函数添加:

五、多通道DAM转运

我这里选择两个通道

 程序代码编写:

 

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,关于HAL库中的ADC单通道采集DMA,以下是步骤: 1. 配置ADC外设 首先,需要配置ADC外设。这包括设置ADC时钟,分辨率,采样时间等。可以使用HAL库提供的函数进行配置,例如: ```c hadc.Instance = ADCx; hadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; hadc.Init.Resolution = ADC_RESOLUTION_12B; hadc.Init.ScanConvMode = DISABLE; hadc.Init.ContinuousConvMode = ENABLE; hadc.Init.DiscontinuousConvMode = DISABLE; hadc.Init.NbrOfDiscConversion = 0; hadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hadc.Init.NbrOfConversion = 1; hadc.Init.DMAContinuousRequests = ENABLE; hadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV; if (HAL_ADC_Init(&hadc) != HAL_OK) { /* Initialization Error */ Error_Handler(); } ``` 2. 配置DMA通道 接下来,需要配置DMA通道。在这个例子中,我们使用DMA通道1和ADC的数据寄存器绑定。可以使用HAL库提供的函数进行配置,例如: ```c hdma_adc.Instance = DMAx_Channely; hdma_adc.Init.Direction = DMA_PERIPH_TO_MEMORY; hdma_adc.Init.PeriphInc = DMA_PINC_DISABLE; hdma_adc.Init.MemInc = DMA_MINC_ENABLE; hdma_adc.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; hdma_adc.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; hdma_adc.Init.Mode = DMA_CIRCULAR; hdma_adc.Init.Priority = DMA_PRIORITY_HIGH; if (HAL_DMA_Init(&hdma_adc) != HAL_OK) { /* Initialization Error */ Error_Handler(); } __HAL_LINKDMA(&hadc, DMA_Handle, hdma_adc); ``` 3. 配置ADC转换触发源 然后,需要配置ADC的转换触发源。在这个例子中,我们使用软件触发转换。可以使用HAL库提供的函数进行配置,例如: ```c ADC_ChannelConfTypeDef sConfig; sConfig.Channel = ADC_CHANNEL_x; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_xCYCLES; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK) { /* Channel Configuration Error */ Error_Handler(); } HAL_ADC_Start_DMA(&hadc, (uint32_t*)&ADC_value, 1); ``` 4. 启动DMA传输 最后,需要启动DMA传输。可以使用HAL库提供的函数进行启动,例如: ```c HAL_DMA_Start_IT(&hdma_adc, (uint32_t)&ADCx->DR, (uint32_t)&ADC_value, 1); ``` 以上就是使用HAL库进行ADC单通道采集DMA的步骤。需要注意的是,以上代码仅供参考,具体的实现可能因为硬件配置和需求不同而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值