GD32F303固件库开发(11)----ADC在DMA模式下扫描多个通道

发布者:RainbowGarden最新更新时间:2024-11-18 来源: elecfans关键字:GD32F303  固件库开发  ADC  DMA模式 手机看文章 扫描二维码
随时随地手机看文章

概述

本章主要配置,ADC在DMA模式下扫描多个通道,通过串口进行打印。 查阅手册可以得知,PA9、PA10为串口0的输出和输入口。 需要GD样片的可以加群申请:615061293 。

在这里插入图片描述

ADC通道配置

在这里插入图片描述

硬件准备

这里准备了1块开发板进行验证,分别是GD32303C_START开发板。

在这里插入图片描述

keil配置

microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。

在这里插入图片描述

使能串口

/* 使能GPI0A,用PA9、PA10为串口 */

    rcu_periph_clock_enable(RCU_GPIOA);


    /*使能串口0的时钟 */

    rcu_periph_clock_enable(RCU_USART0);


    /*配置USARTx_Tx(PA9)为复用推挽输出*/

    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);


    /*配置USARTx_RxPA9)为浮空输入 */

    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);


    /* USART 配置 */

    usart_deinit(USART0);//重置串口0

    usart_baudrate_set(USART0, 115200U);//设置串口0的波特率为115200

    usart_word_length_set(USART0, USART_WL_8BIT);          // 帧数据字长

        usart_stop_bit_set(USART0, USART_STB_1BIT);               // 停止位1位

    usart_parity_config(USART0, USART_PM_NONE);           // 无奇偶校验位

    usart_receive_config(USART0, USART_RECEIVE_ENABLE);//使能接收器

    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);//使能发送器

    usart_enable(USART0);//使能USART

串口重定向

复制

/* retarget the C library printf function to the USART */

int fputc(int ch, FILE *f)

{

    usart_data_transmit(USART0, (uint8_t)ch);

    while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));

    return ch;

}


串口重定向后就可以使用printf进行打印。

ADC通道设置

在这里插入图片描述

DMA设置

在这里插入图片描述


ADC0初始化

void rcu_config(void)

{

    /*使能GPIOA时钟 */

    rcu_periph_clock_enable(RCU_GPIOA);

    /* 使能ADC时钟 */

    rcu_periph_clock_enable(RCU_ADC0);

    /* 使能DMA0时钟 */

    rcu_periph_clock_enable(RCU_DMA0);

    /* 配置ADC速率 */

    rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV6);

}

GPIO初始化

void gpio_config(void)

{

    /* config the GPIO as analog mode */

    gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_0);

    gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_1);

    gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_2);

    gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_10MHZ, GPIO_PIN_3);

}

ADC0配置

void adc_config(void)

{


        adc_deinit(ADC0);

    /* ADC mode config */

    adc_mode_config(ADC_MODE_FREE); 

    /* 开启连续转换 */

    adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);

    /* 开启扫描模式 */

    adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);

    /*数据右对齐 */

    adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);


    /* ADC channel length config */

    adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 4);


    /* ADC regular channel config */ 

    adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_55POINT5);

    adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_1, ADC_SAMPLETIME_55POINT5);

    adc_regular_channel_config(ADC0, 2, ADC_CHANNEL_2, ADC_SAMPLETIME_55POINT5);

    adc_regular_channel_config(ADC0, 3, ADC_CHANNEL_3, ADC_SAMPLETIME_55POINT5);


    /* ADC 软件触发(规则组) */

    adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);

    adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);


    /* ADC DMA function enable */

    adc_dma_mode_enable(ADC0);

    /* enable ADC interface */

    adc_enable(ADC0);



    /* ADC校准和复位校准 */

    adc_calibration_enable(ADC0);

}

DMA0初始化

void dma_config(void)

{

    /* ADC_DMA_channel configuration */

    dma_parameter_struct dma_data_parameter;


    /*  ADC DMA0_0初始化 */

    dma_deinit(DMA0, DMA_CH0);


    /* initialize DMA single data mode */

    dma_data_parameter.periph_addr  = (uint32_t)(&ADC_RDATA(ADC0));//外设基地址

    dma_data_parameter.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;//内存地址增量模式

    dma_data_parameter.memory_addr  = (uint32_t)(&ADC0_Value);//数据存放地址

    dma_data_parameter.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;//内存地址增量模式

    dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;//dma外设宽度16位,半字

    dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT;  

    dma_data_parameter.direction    = DMA_PERIPHERAL_TO_MEMORY;//传输模式,外设到存储(接收)

    dma_data_parameter.number       = 40;//长度

    dma_data_parameter.priority     = DMA_PRIORITY_HIGH;//优先级高

    dma_init(DMA0, DMA_CH0, &dma_data_parameter);


    dma_circulation_disable(DMA0, DMA_CH0);//循环模式开启dma_circulation_enable(DMA0, DMA_CH0)//dma_circulation_disable


        /* enable DMA transfer complete interrupt */

    dma_interrupt_enable(DMA0, DMA_CH0, DMA_INT_FTF);    //打开全部完成中断

    /* enable DMA channel */

    dma_channel_enable(DMA0, DMA_CH0);    /* DMA内存到内存模式不开启 */

}

DMA0_Channel0_IRQHandler()

void DMA0_Channel0_IRQHandler(void)

{

  if(dma_interrupt_flag_get(DMA0, DMA_CH0, DMA_INT_FLAG_FTF)==SET)

  {     

        dma_interrupt_flag_clear(DMA0, DMA_CH0, DMA_FLAG_FTF);//清除DMA通道传输完成标志

        dma_channel_disable(DMA0, DMA_CH0);


        ADC0_Flag=1;

  }

}

初始化定义

/* system clocks configuration */

    rcu_config();

    nvic_irq_enable(DMA0_Channel0_IRQn, 0, 0);

    /* GPIO configuration */

    gpio_config();

    /* DMA configuration */

    dma_config();

    /* ADC configuration */

    adc_config();

        /* ADC software trigger enable */

    adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);

数据采集

while (1)

        {

            if(ADC0_Flag==1)

            {

                ADC0_0=0;

                ADC0_1=0;

                ADC0_2=0;

                ADC0_3=0;

                for(i=0;i<40;)

                {

                    ADC0_0+=ADC0_Value[i++];

                    ADC0_1+=ADC0_Value[i++];

                    ADC0_2+=ADC0_Value[i++];

                    ADC0_3+=ADC0_Value[i++];

                }        

          printf('\n');

          printf('adc1_IN0(PA0)=%4.0d,ADC_IN0=%1.4f\r\n',ADC0_0/10,ADC0_0/10*3.3f/4096);

          printf('adc1_IN1(PA1)=%4.0d,ADC_IN1=%1.4f\r\n',ADC0_1/10,ADC0_1/10*3.3f/4096);

          printf('adc1_IN2(PA2)=%4.0d,ADC_IN2=%1.4f\r\n',ADC0_2/10,ADC0_2/10*3.3f/4096);

          printf('adc1_IN3(PA3)=%4.0d,ADC_IN3=%1.4f\r\n',ADC0_3/10,ADC0_3/10*3.3f/4096);

            ADC0_Flag=0;

        adc_config();    

        dma_memory_address_config(DMA0, DMA_CH0, (uint32_t)(&ADC0_Value));

        dma_transfer_number_config(DMA0, DMA_CH0, 40);        

        dma_channel_enable(DMA0, DMA_CH0);

        adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);            


            }

      delay_1ms(1000);

    }


测试结果

输入固定电压进行测试。

在这里插入图片描述

测试结果如下。

在这里插入图片描述


关键字:GD32F303  固件库开发  ADC  DMA模式 引用地址:GD32F303固件库开发(11)----ADC在DMA模式下扫描多个通道

上一篇:基于GD32L233的物联网水表解决方案
下一篇:如何利用GD32F310读取HDC1080环境温湿度

推荐阅读最新更新时间:2026-03-25 03:29

STM32CUBEMX开发GD32F303(11)----ADCDMA模式下扫描多个通道
概述 本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过GD32303C_START开发板内进行验证。 需要GD样片的可以加Q_QUN申请:6_15061293。 本章主要配置,双ADC轮询模式扫描多个通道,通过串口进行打印。 查阅手册可以得知,PA9、PA10为串口0的输出和输入口。 ADC通道配置 生成例程 这里准备了GD32303C_START开发板进行验证。 视频教学 https://www.bilibili.com/video/BV1hG41187Ah/ STM32CUBEMX配置 勾选中断。 ADC1配置。 ADCs_Common_Setti
[单片机]
STM32CUBEMX<font color='red'>开发</font><font color='red'>GD32F303</font>(11)----<font color='red'>ADC</font>在<font color='red'>DMA</font><font color='red'>模式</font>下扫描多个通道
GD32F303固件库开发(2)----读保护与写保护
概述 芯片读保护以后,flash将不可以从外部读取,这样可以防止别人读取或者盗取芯片代码,如果想再次烧录代码,需要解除保护,有时候在代码调试的过程中,也有可能会触发读保护,解除读保护也可以使用代码,也可以使用软件进行读保护解锁。 在我们的KEIL烧写和编译过程中,有可能会触发读保护,导致程序无法下载进入到芯片内部,故需要进行解锁操作。 芯片申请 芯片和开发板都可免费申请,暂时只能以公司名义免费申请,填下下面表格即可。 软件进入读保护 打开GD-Link Programmer,点击Target- Security可以进入读保护模式。 这时候会提示是否进入读保护。 进入读保护模式后,点击Target- Program进行
[单片机]
<font color='red'>GD32F303</font><font color='red'>固件库</font><font color='red'>开发</font>(2)----读保护与写保护
GD32F303固件库开发(13)----定时器TIM捕获PWM测量频率与占空比
概述 本章配置GD32F303输出PWM,同时使用TIM测量PWM频率和正占空比。 查阅手册可以得知,PB11为定时器1的通道3,让其输出PWM,PA6为定时器2的通道0,让作为TIM定时器输入。 需要GD样片的可以加群申请:615061293 。 生成例程 这里准备了自己绘制的开发板进行验证。 管脚图如下所示。 keil配置 microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。 使能串口 /* 使能GPI0A,用PA9、PA10为串口 */ rcu_periph_clock
[单片机]
<font color='red'>GD32F303</font><font color='red'>固件库</font><font color='red'>开发</font>(13)----定时器TIM捕获PWM测量频率与占空比
GD32F303固件库开发(17)----内部Flash读写
概述 本例程主要讲解如何对芯片自带Flash进行读写,用芯片内部Flash可以对一些需要断电保存的数据进行保存,无需加外部得存储芯片,本例程采用的是GD32F303ZET6主控,512K大小的Flash。 最近在弄ST和GD的课程,需要GD样片的可以加群申请:615061293 。 csdn课程 课程更加详细。 https://download.csdn.net/course/detail/37144 样品申请 https://www.wjx.top/vm/wFGhGPF.aspx# 生成例程 这里准备了自己绘制的开发板进行验证。 系统架构示意图 Flash的操作可以通过FMC控制器进行操作。 FLASH分配 要注意的
[单片机]
<font color='red'>GD32F303</font><font color='red'>固件库</font><font color='red'>开发</font>(17)----内部Flash读写
GD32F303固件库开发(1)----前期准备与烧录
概述 在这使用STM32CUBEMX进行配置STM32F103,移植到兆易创新GD32F303,然后进行测试。需要样片的可以加Qun申请:615061293。 芯片申请 芯片和开发板都可免费申请,暂时只能以公司名义免费申请,填下下面表格即可。 pack包 GD32f303的pack包下载链接如下: https://www.keil.com/dd2/pack/#/eula-container 调试软件 J-Link下载,选择自己适合的版本进行下载。 https://www.segger.com/downloads/jlink/ 开发板资料下载 开发板资料可以上兆易创新进行下载。 http://www.gd32mcu.com/c
[单片机]
<font color='red'>GD32F303</font><font color='red'>固件库</font><font color='red'>开发</font>(1)----前期准备与烧录
STM32CUBEMX开发GD32F303(10)----双ADC轮询模式扫描多个通道
概述 本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过GD32303C_START开发板内进行验证。需要GD样片的可以加Q_QUN申请:615061293。 本章主要配置,双ADC轮询模式扫描多个通道,通过串口进行打印。 查阅手册可以得知,PA9、PA10为串口0的输出和输入口。 ADC通道配置 ADC1 IN0(PA0) IN3(PA3) IN4(PA4) ADC2 IN7(PA7) IN8(PB0) IN9(PB1) 生成例程 这里准备了GD32303C_START开发板进行验证。 STM32CUBEMX配置 勾选中断。 ADC1配置。 ADCs_Co
[单片机]
STM32CUBEMX<font color='red'>开发</font><font color='red'>GD32F303</font>(10)----双<font color='red'>ADC</font>轮询<font color='red'>模式</font>扫描多个通道
硬盘DMA模式被改为PIO的解决方法
大家都知道,硬盘必须打开DMA模式才会跑得快。而开启各种硬件设备的DMA模式的条件,除主板BIOS必须打开DMA支持选项外,Windows操作系统内的IDE设备也要设成正确的DMA模式才行。 不过,据说Windows XP若发生多次存取错误(如死机后不正常关机),就会自动把硬盘降为较低速的DMA模式或更慢的PIO模式。这个问题应该如何发现并解决呢? 近几年来生产的硬盘,大致采用Ultra DMA 33/66/100/133等几种传输模式(目前市场上所能买到的都是DMA100以上的硬盘),数字越大代表数据传输速度越快。一般情况下,Windows XP会根据硬盘本身的技术规格,自动把它设为正确的DMA模式。 不过根据微软公司公布的
[嵌入式]
基于STM32介绍DMA的双缓冲模式
目前STM32家族中有些系列支持DMA的双缓冲模式,比如STM32F2/STM32F4/STM32F7等系列。尤其随着人们对STM32F4/F7系列应用不断拓宽和加深,在设计中运用到DMA双缓冲的场合也越来越多。STM32芯片中的DMA又可分为两大类,一类是通用DMA,一类是专用DMA,比如用于USB,TFT LCD,ETHERNET等外设应用上的DMA。这里要谈的是基于通用DMA的话题,不妨以STM32F4系列芯片为例。 关于STM32F4的DMA双缓冲传输在STM32F4系列的参考手册里做了简单描述。因为它是基于介绍了单缓冲模式的DMA介绍之后接着介绍的,稍显言简意赅。 相比单缓冲的数据流,双缓冲多了一个DMA存储区和
[单片机]
基于STM32介绍<font color='red'>DMA</font>的双缓冲<font color='red'>模式</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved