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

4 篇文章 0 订阅
3 篇文章 0 订阅

如果条件允许的话,请不要用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工程师,今晚我要扣你巨蛙

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Introduction:GD32F10x标准固件库。适用于GD32F10x系列MCU,与Cortex-M微控制器软件接口标准(CMSIS)兼容。固件库包括程序、数据结构和宏定义,覆盖所有集成外设的特征,并包括了全部相关驱动和示例程序。 Introduction:GD32F1x0标准固件库。适用于GD32F1x0(130/150/170/190)系列MCU,与Cortex-M微控制器软件接口标准(CMSIS)兼容。固件库包括程序、数据结构和宏定义,覆盖所有集成外设的特征,并包括了全部相关驱动和示例程序 Introduction:GD32F10x系列IAR7.4、Keil MDK 4.74、Keil MDK 5.15 及更高版本支持安装文件。 Introduction:GD32F1x0 外设驱动库和通用例程 ,支持 GD32F130 / GD32F150 / GD32F170 / GD32F190 包含USB Device驱动库和例程 ,仅支持 GD32F150 提供 Keil 和 IAR 两种工程 ,分别在 Keil v4.7x/v5.18a , IAR v7.4 验证通过 Introduction:GD32F1x0 分散加载例程 ,支持 GD32F130 / GD32F150 / GD32F170 / GD32F190 例程演示了如何将代码分配到Flash指定区域,参考这个例程,客户可将非关键代码分配到Flash高地址空间。 Introduction:包含三个文件,具体说明如下: 1. GigaDevice.GD32F1x0_Addon.3.1.0.exe Keil4 环境补丁,支持 Keil v4.7x , 2. GigaDevice.GD32F1x0_DFP.3.1.0.pack Keil5 在线支持包, 支持 Keil v5.15 及以上版本; 3. IAR_GD32F1x0_ADDON.1.0.2.exe IAR 环境补丁,支持 IAR v7.4 以上版本. Introduction:Pdsc Installation of support files for Keil MDK 5.13 or later version
gd32f3adc多通道采样的实现方法如下: 首先,需要在ADC初始化函数中配置多通道扫描模式。可以通过设置ADC_CTL1寄存器的SCAN位来启用多通道扫描模式。同时,还需要配置ADC_CTL1寄存器的SCHx位来选择需要采样的通道。每个SCHx位对应一个通道,可以根据需要设置多个SCHx位来选择多个通道。 其次,需要配置ADC转换序列。可以通过设置ADC_CTL1寄存器的ADC_SAMCTL位来选择转换序列的长度。例如,设置ADC_SAMCTL为ADC_SAMCTL_SAMx_1表示转换序列长度为1,即只采样一个通道;设置为ADC_SAMCTL_SAMx_2表示转换序列长度为2,即采样两个通道。 然后,在采样过程中,可以使用DMA自动将采样数据读取到指定的数组中。可以配置DMA的通道和传输方向,将ADC数据传输到指定的数组中。 最后,在读取采样数据时,需要根据转换序列的长度来确定读取的数据个数。例如,如果转换序列长度为2,则可以通过读取两个数据来获取两个通道的采样值。 综上所述,通过配置ADC多通道扫描模式和转换序列,并使用DMA进行数据传输,可以实现gd32f3adc多通道采样。在读取数据时,需要根据转换序列的长度来确定读取的数据个数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [GD32F190 ADC多通道DMA自动接收指南](https://blog.csdn.net/shizhibuyi1234/article/details/120511411)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [【GD32F310开发板试用】ADC 规则组连续采样](https://blog.csdn.net/weixin_47569031/article/details/124177006)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值