stm32cubemx使用之dma方式使用adcadc使用遇到的问题(代码片段)

何事误红尘 何事误红尘     2022-12-15     419

关键词:

目录

一、概述

本文记录下ADC的使用过程,主要是后续使用,能有个参考。同样,以后遇到的ADC问题,也都收录在本文后面。
芯片: STM32G0B1RCT6

二、Pinout&Configuration

2.1 选择端口



2.2 开启DMA中断

三、测试ADC

测试代码可参考demo工程,同样是DMA方式:

主要步骤为:

  1. 定义采集值缓存
  2. 开启ADC校准
  3. 开启DMA功能*。
  4. 主循环内重复开启ADC转换并打印采集结果:
  5. 发现打印结果如下,每次只转换了一个通道:

    开启ADC后1S还不够采集完成吗?
  6. 回到demo中查看,是在回调函数中设置标志,然后在主循环中判断标志才进行打印。

    修改后果然正常了:

    这样看来每次开启ADC,只转换了一个通道。CubeMX设置有些问题。使能了scan扫描模式,应该会转换完所有通道吧?回头再看下。

注意:HAL_ADC_Start_DMA后,不要使用立即调用HAL_ADC_Start。

2021-12-9补充:

  1. 前面混合使用了HAL_ADC_Start_DMA和HAL_ADC_Start,是有些问题的。可以只使用HAL_ADC_Start_DMA,但要注意,不能重复调用,每次转换完要先使用HAL_ADC_Stop_DMA关闭。

  2. 修改cube设置

    转换完所有通道后关闭ADC。

四、遇到的问题

4.1 采集到其他通道的值

使用N32G031C8开发板,采集channel1和channel8两路ADC。发现只给channel1输入2V电压,channel8采集值也随之改变。两次采集之间也增加了500ms延时,是什么原因呢?
暂时没有细究。开发板只是把IO直接引出来方便测试,并没有包含外围分压电路。在channel8也输入一路电压,可以看到channel1和channel8都能够正常采集了。

继续4.1的问题

硬件做好后测试,采集channel1、channel8、channel7三路电压,发现仍然存在问题:

正常情况下,只有ADU路是有电压的,但有时ADU会采集到0,或者HW_VER路采集到ADU的电压值。测试了多通道采集和连续转换,发现都不是问题的原因。开发板例程的ADC采集了浪路,参考设置是一样的,仍然有问题。最终发现,增加一个ADC_GetData函数,就可以了。

static uint16_t ADC_GetData(uint8_t ADC_Channel)

    uint16_t dat;
    
    ADC_ConfigRegularChannel(ADC1, ADC_Channel, 1, ADC_SAMP_TIME_56CYCLES5);
    /* Start ADC Software Conversion */
    ADC_EnableSoftwareStartConv(ADC1, ENABLE);
    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ENDC)==0)
    
    ADC_ClearFlag(ADC1, ADC_FLAG_ENDC);
    ADC_ClearFlag(ADC1, ADC_FLAG_STR);
    dat = ADC_GetDat(ADC1);
    
    return dat;



#if USE_ADC1
static int32_t n32_adc1_read(uint8_t channel)

    int32_t read_value = 0;
    uint16_t dat;
    
//    ADC_ConfigRegularChannel(ADC1, channel, 1, ADC_SAMP_TIME_56CYCLES5);
//    /* Start ADC Software Conversion */
//    ADC_EnableSoftwareStartConv(ADC1, ENABLE);
//    while(ADC_GetFlagStatus(ADC1, ADC_FLAG_ENDC)==0)
//    
//    ADC_ClearFlag(ADC1, ADC_FLAG_ENDC);
//    ADC_ClearFlag(ADC1, ADC_FLAG_STR);
//    
    read_value = ADC_GetDat(ADC1);
//    dat = ADC_GetDat(ADC1);
//    read_value = dat;
    
    read_value = ADC_GetData(channel);

    return read_value;

#endif

为什么单独封装一个函数,效果就不一样了呢?暂时没搞明白

4.2 STM32 ADC没有输入电压时,采集结果不为0

单独写为一篇:添加链接描述

stm32之cubemx

目录1.HAL常见函数介绍2.使用3.配置SystemCore-----配置系统核心DMA----直接存储器访问GPIO-----[GPIO使用详细解释](https://www.cnblogs.com/schips/p/12424933.html)IWGD---独立看门狗NVIC----中断优先级RCC-----配置外部时钟源BYPASSClockSource:旁路时钟源Crysta... 查看详情

STM32 cubeMX:使用中断触发SPI DMA中断

】STM32cubeMX:使用中断触发SPIDMA中断【英文标题】:STM32cubeMX:triggeringSPIDMAinterruptusinginterrupt【发布时间】:2019-05-2816:52:33【问题描述】:我目前正在练习使用SPI+DMA将数据发送到SPI显示器。显示的数据顺序如下:[pullCSlow]->[pullD/C... 查看详情

stm32cubemx使用之dma使用spi

目录一、概述二、Pinout&Configuration2.1选择端口2.2开启DMA中断三、测试SPI一、概述这篇文章简单记录下SPI的使用。二、Pinout&Configuration2.1选择端口选择要使用的SPI,对应的PIN脚会自动初始化为SPI模式:查看原理图,... 查看详情

利用stm32cubemx之spi

现在我们继续使用STM32CubeMX来生成SPI工程。我们的硬件平台还是我们熟悉的STM32F103C8开发板。设置时钟树中的配置 现在打开SPI的设置如果想修改管脚的名字可以红色框中进行修改,修改后在生成代码将其来宏定义 现在来... 查看详情

stm32cubemx之串口配置

STM32CubeMX之串口配置  串口通信是一种设备间非常常用的​​串行通信​​方式,以比特位的形式发送或接收数据,电子工程师经常使用这种方式来调试数据。本章节我们将学习串口发送和接收数据。STM32F103C8开发板通过串口... 查看详情

stm32f103vet6基于stm32cubemx配置非dma方式获取内部温度(代码片段)

STM32F103VET6基于STM32CubeMX配置非DMA方式获取内部温度📌相关篇《STM32F103VET6基于STM32CubeMX配置DMA方式获取内部温度》🛠STM32CubeMX配置🌿勾选温度传感器通道。🌿参数配置选项参考上图。🌿配置串口1作为温度信息... 查看详情

stm32f103vet6基于stm32cubemx创建串口中断+dma不定长数据接收(代码片段)

STM32F103VET6基于STM32CubeMX创建串口中断+DMA不定长数据接收✨STM32CubeMX工程配置过程演示:📍此工程参考《STM32CubeMX|STM32使用HAL库DMA+空闲中断实现串口不定长数据接收》📓DMA参数介绍🎉DMA传输方式🌿传输... 查看详情

stm32cubemx(07)定时器+dac+dma输出阶梯波实验。(代码片段)

...前言一、DMA是什么?1.1DMA传输的要素和特点二、STM32CubeMX配置2.1DAC配置2.2定时器配置2.3DMA配置三、软件部分四、测试结果总结前言由定时器6溢出信号作为触发信号,控制DAC1(PA4)循环输出阶梯波形信号,DAC1需要的数据... 查看详情

stm32f103vet6基于stm32cubemx配置dma方式获取内部温度(代码片段)

STM32F103VET6基于STM32CubeMX配置DMA方式获取内部温度🎬STM32CubeMX参数配置演示(没有包含串口1的配置内容)🚩请注意:以演示中没有展现串口1的开启演示过程,需要自己勾选USART1STM32CubeMX配置解析内部温度和参考电压都属于... 查看详情

stm32cubemx第八篇之dma(代码片段)

...的HAL库的版本为:STM32Cube_FW_F4_V1.25.0本实验使用的STM32CubeMX版本为:6.1.1该 查看详情

stm32cubemx|42-使用dma2d加速显存数据传输(代码片段)

...在上一篇文章中讲述了如何配置LTDC驱动RGB屏幕:STM32CubeMX|41-使用LTDC驱动TFT-LCD屏幕(RGB屏)。本节中我们接着上一节的实验,讲述如何使用DMA2D实现打点、画线、填充等函数,只需要单层全屏即可,修改LTDC... 查看详情

stm32cubemx(08)定时器+dac+dma输出正弦波实验。(代码片段)

...、测试结果总结前言我们前面讲了输出了阶梯波实验STM32CubeMX(07)定时器+DAC+DMA输出阶梯波实验。今天我们来输出正弦波,其实我们很容易发现其中的规律,就是输出相应的AD值就可以了。一、练习【功能】定时... 查看详情

stm32cubemx生成fatfs基于sd

...32f407vet步骤一:选择调试接口步骤二:配置SDIO(由于stm32cubemx的fatfs_sd的模板是基于DMA,所以此处使用DMA模式)SDIO中开启对传入传出分别打开DMA打开SDIO的全局中断此处仅测试基于SD的fatfs,所以未对中断优先级进行调整步骤三:... 查看详情

stm32之cubemx

目录1.HAL常见函数介绍2.使用3.配置SystemCore-----配置系统核心DMA----直接存储器访问GPIO-----[GPIO使用详细解释](https://www.cnblogs.com/schips/p/12424933.html)IWGD---独立看门狗NVIC----中断优先级RCC-----配置外部时钟源BYPASSClockSource:旁路时钟源Crysta... 查看详情

stm32h7教程第46章stm32h7的adc应用之dma方式多通道采样(代码片段)

...讲解ADC+DMA方式的多通道数据采集,实际项目中有一定的使用价值,使用一路ADC就可以采集多个通道的数据。46.1初学者 查看详情

stm32cubemx使用之实现点灯大业(代码片段)

...工程一、概述本文主要是通过实现闪灯,记录下STM32CubeMX的基本使用方法。File–新建工程–选择芯片,之后是这个样子:下面 查看详情

stm32cubemx学习:06-配置dma(代码片段)

...e:mcu-stm32-cube-06-配置DMAdate:2020-05-3116:39:05categories:tags:-stm32-cubeMx-dma-serial---知识DMA(DirectMemoryAccess,直接存储器访问)用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何CPU操作的情况下通过DMA快速... 查看详情

笔记之stm32f0芯片spi_dma的使用(hal库)(代码片段)

...BT6(48M)RF芯片:SX1280(通过SPI通讯)环境:cubemx生成+MDKV5关于SPI的通常的应用很简单,特别是通过cubemx自动生成的代码,这里就不过多介绍,可自行百度搜索关于SPI的教程及相关资料这张图片是通过cu... 查看详情