GD32F190 ADC多通道DMA自动接收踩坑指南

2023-11-04

如果条件允许的话,请不要用GD32F1x0系列。。。。

-----题记

这个系列的芯片官方连个库函数指南都没有你敢信?我都不要求中文版的了,起码英文版的得有吧??

以往stm32的ADC工作模式,一般都是配置成多个通道自动连续切换,然后通过DMA把数据读走,这次用上GD32F190Tx芯片后,怀着国产之光的心态认认真真的写代码,看库函数,结果真就是踩坑了。

我们习惯stm32的配置方式,都是给一个结构体成员赋值,然后调用xxx_init()函数,把结构体作为参数传入函数。例如,这是stm32的配置程序:

/* ADC1 configuration ------------------------------------------------------*/
    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 = ADC_CH_NUM;        //顺序进行规则转换的ADC通道的数目
    ADC_Init(ADC1, &ADC_InitStructure);

    /*
    ADCFinalValue[0 ]    PA0  channel0  接收CH2 AGC
    ADCFinalValue[1 ]    PA1  channel1  接收CH1 AGC

    */
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0,  1,  ADC_SampleTime_71Cycles5);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1,  2,  ADC_SampleTime_71Cycles5);


    /* Enable ADC1 DMA */
    ADC_DMACmd(ADC1, ENABLE);

    /* Enable ADC1 */
    ADC_Cmd(ADC1, ENABLE);

    /* Enable ADC1 reset calibaration register */   
    ADC_ResetCalibration(ADC1);
    /* Check the end of ADC1 reset calibration register */
    while(ADC_GetResetCalibrationStatus(ADC1));

    /* Start ADC1 calibaration */
    ADC_StartCalibration(ADC1);
    /* Check the end of ADC1 calibration */
    while(ADC_GetCalibrationStatus(ADC1));

    /* Start ADC1 Software Conversion */ 
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    //ADC end

但是,gd32的库函数都是封装成立一个个函数,初始化一个变量需要调用一次函数,但是也没有具体的步骤告诉你需要调用哪些函数,是不是很恶心?

一开始这样写:

    adc_deinit();
    /* ADC channel length config */
    adc_channel_length_config(ADC_REGULAR_CHANNEL,ADC_CH_NUM);
    /* ADC data alignment config */
    adc_data_alignment_config(ADC_DATAALIGN_RIGHT);  
    /* ADC SCAN function enable */
    adc_special_function_config(ADC_SCAN_MODE,ENABLE);
    /* ADC regular channel config */
    adc_regular_channel_config(0, ADC_CHANNEL_1, ADC_SAMPLETIME_55POINT5);
    adc_regular_channel_config(1, ADC_CHANNEL_9, ADC_SAMPLETIME_55POINT5);
    
    /* ADC external trigger source config */
    adc_external_trigger_source_config(ADC_REGULAR_CHANNEL,ADC_EXTTRIG_REGULAR_NONE);
    adc_external_trigger_config(ADC_REGULAR_CHANNEL,ENABLE);
    
    /* enable ADC interface */
    adc_enable();
    /* ADC calibration and reset calibration */
    adc_calibration_enable();
    /* ADC DMA enable */
    adc_dma_mode_enable();
    adc_software_trigger_enable(ADC_REGULAR_CHANNEL);

后来发现采集到的两个通道数据不动,似乎只有上电采集了一次就没有然后了。

这其中这个adc_external_tigger把我搞得一愣一愣的,你说我寻思dma是内部触发啊,我为什么还有配置外部触发源使能呢?我配置成none,然后再使能?我先自宫了,然后告诉我练功和自宫虽然没关系,但你就得自宫?

给gd软件工程师的脑回路跪了,但是不写这条指令又没有办法工作,采集到的数据都是0。

然后我就把adc的工作模式换咯,换成ADC_CONTINUOUS_MODE,这问题又来了,采集到的数据,数组里两个值都是第一个通道的数据,好烦有么有?

最后你猜我怎么解决的?

    adc_deinit();
    /* ADC channel length config */
    adc_channel_length_config(ADC_REGULAR_CHANNEL,ADC_CH_NUM);
    /* ADC data alignment config */
    adc_data_alignment_config(ADC_DATAALIGN_RIGHT);  
    /* ADC SCAN function enable */
    adc_special_function_config(ADC_CONTINUOUS_MODE,ENABLE);
    adc_special_function_config(ADC_SCAN_MODE,ENABLE);
    /* ADC regular channel config */
    adc_regular_channel_config(0, ADC_CHANNEL_1, ADC_SAMPLETIME_55POINT5);
    adc_regular_channel_config(1, ADC_CHANNEL_9, ADC_SAMPLETIME_55POINT5);
    
    /* ADC external trigger source config */
    adc_external_trigger_source_config(ADC_REGULAR_CHANNEL,ADC_EXTTRIG_REGULAR_NONE);
    adc_external_trigger_config(ADC_REGULAR_CHANNEL,ENABLE);
    
    /* enable ADC interface */
    adc_enable();
    /* ADC calibration and reset calibration */
    adc_calibration_enable();
    /* ADC DMA enable */
    adc_dma_mode_enable();
    adc_software_trigger_enable(ADC_REGULAR_CHANNEL);

ADC的工作模式要配置成两种!!!!!!!!!!

既要配置成scan模式,让他能够各个通道扫描,又要配置成condition模式,让他连续触发!!!

马上联系GD工程师,今晚我要扣你巨蛙

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GD32F190 ADC多通道DMA自动接收踩坑指南 的相关文章

  • flowable流程实例笔记(1)

    RuntimeService 运行服务类 支持启动的方式 流程定义 从这里获取资源文件 执行实例 流程实例中执行的每个环节 流程实例 一个流程实例包括所有运行的节点 一个流程中流程实例只有一个 启动一个实例 public void star
  • 关于性能测试,测试人员必须要知道的

    随着各企业的业务发展 用户量以及数据量的不断增加 系统承载的压力也会随之增加 服务系统的性能好坏又严重影响企业的利益 因此 性能测试重要性与需求越来越强烈 常见的性能测试目的 性能测试是确定系统在特定工作负载下的稳定性和响应能力 在进行性能
  • RTSP和RTP、RTCP协议介绍

    一 RTSP 1 简介 RTSP Real Time Stream Protocol 协议是一个基于文本的多媒体播放控制协议 属于应用层 RTSP以客户端方式工作 对流媒体提供播放 暂停 后退 前进等操作 它主要用来控制具有实时特性的数据的

随机推荐

  • linux:nginx报错,提示host not found in upstream

    原因参考 解决 nginx 启动错误 nginx emerg host not found in upstream emerg host not found in upstream loaclhost
  • 代码随想录算法训练营第一天

    数组理论基础 文章链接 代码随想录 记忆 数组是存放在连续内存空间上的相同类型数据的集合 数组下标都是从0开始的 数组内存空间的地址是连续的 数组的元素是不能删的 只能覆盖 在C 中二维数组是连续分布的 像Java是没有指针的 同时也不对程
  • flutter打包的app有多大_前端大势所趋---Flutter 这篇文章会让你行动起来

    Flutter和原生APP的性能对比 前言 自从今年google IO大会推出flutter跨平台开发框架以来 flutter在各个技术论坛里被吵得如日中天 flutter团队直言flutter可以帮助开发者轻松实现恒定60fps的性能体验
  • Unity3d连接SQLServer数据库

    在编写代码之前需要 1 引入程序集System Data dll 位置在C Program Files Unity Editor Data Mono lib mono unity 我unity默认装在C盘 2 把System Data dl
  • 两个app应用之间的跳转

    一 应用跳转的原理 从一个应用跳转到另一个应用 作为APP开发者 最熟悉的莫过于第三方登录 支付宝 微信支付时 那时候我们可能仅仅按照集成文档一步一步操作 在文档中配置很多类似URL Schemes 如下图 一般的配置 下面我们进入正题的为
  • LCM接口汇总

    LCM接口汇总 如下均是网上找的资料 1 RGB TTL RGB电平信号 TTL接口 数据传输速率不高 传输距离较短 且抗电磁干扰 EMI 能力也比较差 会对RGB数据造成一定的影响 另外 TTL多路数据信号采用排线的方式来传送 整个排线数
  • Hook (钩子) 线程学习总结

    当 JVM 进程退出的时候 或者受到了系统的中断信号 hook线程就会自动执行 通过 Runtime 可以为 JVM 注入多个 Hook 线程 然后看个简单的例子 import java util concurrent TimeUnit a
  • SQL语句查询1:如何从查询结果json格式数据中提取某个字段的值

    很多情况下 数据库表字段内容会以json格式来存数据 如下图 那么在我们需要查询上图中的content字段里面的某个字段的值时 需要怎么处理呢 方法一 字符串截取的方式 利用SQL中的SUBSTR 字段名 m n 函数来进行截取 selec
  • vue项目使用高德地图

    vue项目使用高德地图 部分功能介绍 在此做个笔记 引入方式使用了高德2 0 loadsh的加载方式 1 引入高德地图方式 NPM npm i amap amap jsapi loader save 在页面引入 import AMapLoa
  • java循环操作分页查询

    public void pageQuery List
  • tomcat服务器输入localhost可以访问,ip无法访问解决办法

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 最近在开发项目中 遇到的一个问题是 在 tomcat中发布一个web项目 但是发布成功后 只能用http localhost 8080 fm访问项目 不能用 http 12
  • 【模电】0008 有源滤波器3(二阶有源高通、带通、带阻滤波器)

    上一节我们分析了二阶有源低通滤波器 这一节我们来继续 分析其他种类的二阶滤波器 包括高通 带通 带阻滤波器 由于分析过程是类似的 都是以节点列方程 化简后得到传递函数 本篇就不具体写计算过程了 直接给出仿真图和传递函数的结果 1 二阶有源高
  • 怎么把竖线去掉_怎么去掉word竖线

    一 word中文字左边出现竖线 不可以删除怎么解决 1 本次演示操作的Office办公软件为Excel 2013版本 2 首先新建一个Word文档 输入用于演示的文本数据 在以下的文本中我们可以看到文字左边有竖线 下面我们来操作删除这条竖线
  • 【Java、Redis】通过中心经纬度与半径获取范围内的结果集(类似附近的人)

    文章目录 需求 解决方案 什么是Redis GeoHash 1 Java Redis实现 引用的pom依赖 InitEquLongLatTask java Controller Service dao xml sql语句 2 Java 数据
  • 推特公司员工大规模辞职,挺有勇气的

    近日 一则推特公司员工大规模辞职登上热搜 推特CEO马斯克 此前说目前推特正在为赢得激烈竞争而砥砺前行 所以需要所有员工接受 高强度 长时间 努力工作 邮件里附了一个同意选项框 可以选 是 或 否 选择了 是 的员工 可以留下 选了 否 的
  • 分支结构 --> if else分支结构

    if else分支结构 if 条件表达式 语句块1 else 语句块2 判断条件表达式是否成立 gt 若成立 则执行语句块1 gt 若不成立 则执行语句块2 package demo 编程使用if else分支结构来模拟考试成绩查询的过程
  • 关于DOTS的个人总结

    网上已经有比较多的DOTS的资料了 这里就简单介绍一下 DOTS Data Oriented Technology Stack 数据导向型技术栈 的缩写 是Unity退出的面向多线程编程的解决方案 其包含了 C Job System Ent
  • 如何根据芯片手册时序图编写驱动程序

    如何根据芯片手册时序图编写驱动程序 对于电子开发者来说 刚刚拿到一个芯片 常用的芯片可以参考网上的例程来做深入了解 对于一个不常用的芯片来说 Datasheet几乎是使用芯片的唯一的资料 所以根据Datasheet时序图写出对应的驱动程序就
  • vue样式穿透(::v-deep,/deep/的使用)

    在 vue 项目的开发过程 使用了vant ElementUI antdui等组件且样式 style 使用了 scoped 属性 当想要修改组件样式 发现直接修改不了 需去掉 scoped 属性或者使用深度选择器才能修改成功 去掉scope
  • GD32F190 ADC多通道DMA自动接收踩坑指南

    如果条件允许的话 请不要用GD32F1x0系列 题记 这个系列的芯片官方连个库函数指南都没有你敢信 我都不要求中文版的了 起码英文版的得有吧 以往stm32的ADC工作模式 一般都是配置成多个通道自动连续切换 然后通过DMA把数据读走 这次