GD32F303固件库开发(10)----双ADC轮询模式扫描多个通道

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

概述

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

在这里插入图片描述


样品申请

https://www.wjx.top/vm/wFGhGPF.aspx#


硬件准备

这里准备了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通道设置

在这里插入图片描述

在这里插入图片描述


ADC0初始化

///*************时钟配置******************/


    /*使能GPIOA时钟 */

    rcu_periph_clock_enable(RCU_GPIOA);

    /*使能ADC时钟 */

    rcu_periph_clock_enable(RCU_ADC0);

    /* 配置ADC速率 */

    rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8);

ADC0配置

/*------------------ADC GPIO配置------------------*/

// 必须为模拟输入

    gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_MAX, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2);


/*------------------ADC工作模式配置------------------*/

        // 设置adc工作在独立模式

        adc_mode_config(ADC_MODE_FREE);

        // 多通道用扫描模式

        //    adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);

        // 单通道用连续转换模式

//        adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE); 



        // 结果转换右对齐

        adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);

        // 转换通道1个

        adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 3);


    /* 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_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);

        adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);


        // 使能ADC

        adc_enable(ADC0);

        delay_1ms(1);                                                   // 等待1ms

        // 使能ADC校准

        adc_calibration_enable(ADC0);

ADC1初始化

/*************时钟配置******************/


    /*使能GPIOA时钟 */

    rcu_periph_clock_enable(RCU_GPIOB);

    /*使能ADC时钟 */

    rcu_periph_clock_enable(RCU_ADC1);

    /* 配置ADC速率 */

    rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8);

ADC1配置

/*------------------ADC GPIO配置------------------*/

// 必须为模拟输入

    gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_MAX, GPIO_PIN_7);

    gpio_init(GPIOB, GPIO_MODE_AIN, GPIO_OSPEED_MAX, GPIO_PIN_0 | GPIO_PIN_1);

/*------------------ADC工作模式配置------------------*/

        // 设置adc工作在独立模式

        adc_mode_config(ADC_MODE_FREE);

        // 多通道用扫描模式

        //    adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);

        // 单通道用连续转换模式

//        adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE); 



        // 结果转换右对齐

        adc_data_alignment_config(ADC1, ADC_DATAALIGN_RIGHT);

        // 转换通道1个

        adc_channel_length_config(ADC1, ADC_REGULAR_CHANNEL, 3);


    /* ADC regular channel config */

    adc_regular_channel_config(ADC1, 0, ADC_CHANNEL_7, ADC_SAMPLETIME_55POINT5);

    adc_regular_channel_config(ADC1, 1, ADC_CHANNEL_8, ADC_SAMPLETIME_55POINT5);

    adc_regular_channel_config(ADC1, 2, ADC_CHANNEL_9, ADC_SAMPLETIME_55POINT5);



        // 不用外部触发转换,软件开启即可

        adc_external_trigger_source_config(ADC1, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);

        adc_external_trigger_config(ADC1, ADC_REGULAR_CHANNEL, ENABLE);


        // 使能ADC

        adc_enable(ADC1);

        delay_1ms(1);                                                   // 等待1ms

        // 使能ADC校准

        adc_calibration_enable(ADC1);

ADC数据采集

uint16_t  get_adc(uint32_t adc_periph , uint8_t adc_channel)

{

/* 配置规则通道采集*/

    adc_regular_channel_config(adc_periph, 0, adc_channel, ADC_SAMPLETIME_55POINT5);

        // 由于没有采用外部触发,所以使用软件触发ADC转换

        adc_software_trigger_enable(adc_periph, ADC_REGULAR_CHANNEL);   


        while(!adc_flag_get(adc_periph, ADC_FLAG_EOC));                       // 等待采样完成

        adc_flag_clear(adc_periph, ADC_FLAG_EOC);                             // 清除结束标志


        return  adc_regular_data_read(adc_periph);                         // 读取ADC数据

}

数据采集

while (1){


        uint16_t adc0Value0 = 0;

        uint16_t adc0Value1 = 0;

        uint16_t adc0Value2 = 0;


        adc0Value0=get_adc(ADC0 ,ADC_CHANNEL_0);

        adc0Value1=get_adc(ADC0 ,ADC_CHANNEL_1);

        adc0Value2=get_adc(ADC0 ,ADC_CHANNEL_2);



    printf('\nadc0_IN0(PA0)=%4.0d,电压=%1.4f',adc0Value0,adc0Value0*3.3f/4095);

    printf('\nadc0_IN1(PA1)=%4.0d,电压=%1.4f',adc0Value1,adc0Value1*3.3f/4095);

    printf('\nadc0_IN2(PA2)=%4.0d,电压=%1.4f',adc0Value2,adc0Value2*3.3f/4095);


        uint16_t adc1Value0 = 0;

        uint16_t adc1Value1 = 0;

        uint16_t adc1Value2 = 0;


        adc1Value0=get_adc(ADC1 ,ADC_CHANNEL_7);

        adc1Value1=get_adc(ADC1 ,ADC_CHANNEL_8);

        adc1Value2=get_adc(ADC1 ,ADC_CHANNEL_9);


    printf('\nadc1_IN7(PA7)=%4.0d,电压=%1.4f',adc1Value0,adc1Value0*3.3f/4095);

    printf('\nadc1_IN8(PB0)=%4.0d,电压=%1.4f',adc1Value1,adc1Value1*3.3f/4095);

    printf('\nadc1_IN9(PB1)=%4.0d,电压=%1.4f',adc1Value2,adc1Value2*3.3f/4095);

    delay_1ms(1000);                    

    }


测试结果

输入固定电压进行测试。

在这里插入图片描述

测试结果如下。

在这里插入图片描述


关键字:GD32F303  固件库开发  双ADC 引用地址:GD32F303固件库开发(10)----双ADC轮询模式扫描多个通道

上一篇:GD32F103C8单片机的PWM输出试验
下一篇:GD32F103C8T6 Uart3无法发送数据

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

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固件库开发(11)----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
[单片机]
<font color='red'>GD32F303</font><font color='red'>固件库</font><font color='red'>开发</font>(11)----<font color='red'>ADC</font>在DMA<font color='red'>模式</font>下<font color='red'>扫描</font>多个通道
GD32F303固件库开发(15)----外部中断EXTI
概述 本章配置GD32F303使用EXTI进行驱动LED。 需要GD样片的可以加群申请:615061293 。 视频教学 https://www.bilibili.com/video/BV1ig411Y7bB/ csdn课程 课程更加详细。 https://download.csdn.net/course/detail/37144 生成例程 这里准备了自己绘制的开发板进行验证。 查看原理图,PB14为按键管脚。 LED管脚为PB7. 配置中断口 GPIO 口连接到 16 个外部中断 / 事件线如下图 。可以看到PC13应该是在EXTI14上。 外部中断/事件控制器用于产生事件/中断请求的边沿检测器。每根输入线都
[单片机]
<font color='red'>GD32F303</font><font color='red'>固件库</font><font color='red'>开发</font>(15)----外部中断EXTI
《嵌入式-STM32开发指南》第一部分 入门篇 - 第7章 STM32固件库与STM32Cube产品介绍
自STM32标准库出道以来,备受广大工程师和公司的喜爱,但是,从2013年开始,ST逐渐停止了对标准外设库的更新和维护。目前,ST全力推崇HAL库,STM32Cube就是与HAL库配合使用图形化编程官方IDE。 7.1 STM32库简介 到目前为止,ST有标准外设库(SPL 库)、HAL 库、LL 库 三种。前两者都是常用的库,后面的 LL 库是 ST 最近才添加,随 HAL 源码包一起提供,目前支持的芯片也偏少。各库如下所示: 图1 标准库、HAL 库、LL 库对比.png 其中,SPL 库 和 HAL 库两者相互独立,互不兼容。几种库的比较如下: 图2各个库对比.png 目前几种库对不同芯片的支持情况如下: 图
[单片机]
STM32固件库3.3版本在STM3210e-eval开发板上的移植
首先建立工程,我习惯性在工程文件夹下建立以下几个文件夹,分别放不同的文件,以区别不同文件的不同作用,方便寻找和移植。如下: 在PROJECT文件夹下建立工程项目,启动keil,开始建立工程。 注意建立在PROJECT文件夹下。 随便起个名字,我起的名字是MDK,建立后,会提示你选择器件型号 我的器件如上图,所以选择。确定后会询问你是否加入启动文件。我们用stm32的固件库,所以不用mdk的,选择否。 下面配置工程的选项option,右键点Target会看到Options。 以下是各个选项卡的配置内容。 这里注意的是在output选项卡里要选择目标文件存放的位置,
[单片机]
STM32<font color='red'>固件库</font>3.3版本在STM3210e-eval<font color='red'>开发</font>板上的移植
【STM32F429学习记录】HAL库版——ADC+DMA缓冲采样和软件滤波例程
本次移植参考了安富莱V7的ADC+DMA双缓冲例程,双缓冲编程的核心就是利用DMA传输一半和传输完成的标志位进行搞事情,将弱定义的DMAx_Streamy_IRQHandler()函数重新定义一下,要注意修改DMAx_Streamy_IRQHandler()中断函数中DMAx- LISR的传输一半和传输完成寄存器的值,要和你自己使用的DMA通道对应上,我自己刚开始学习DMA移植的时候忽略的这一点导致程序卡死不能运行,剩下的部分根据F429的例子进行了小修改,欢迎大家提出补充意见。 下载地址:https://www.lanzous.com/iaisahi /* *********************************
[单片机]
STM32ADC采集基本知识介绍
双ADC基本介绍 双 ADC 的机制就是使用两个 ADC 同时采样一个或者多个通道。双重ADC 模式较独立模式一个最大的优势就是提高了采样率,弥补了单个 ADC 采样不够快的缺点。 双ADC工作框图 双ADC模式 在双ADC模式里,根据ADC1_CR1寄存器中DUALMOD 位所选的模式,转换的启动可以是ADC1主和ADC2从的交替触发或同步触发。 注意:在双ADC模式里,当转换配置成由外部事件触发时,用户必须将其设置成仅触发主ADC,从ADC设置成软件触发,这样可以防止意外的触发从转换。但是,主和从ADC的外部触发必须同时被激活。 注意:在双ADC模式里,为了在主数据寄存器上读取从转换数据,必须使能DMA位,即使不使用D
[单片机]
STM32<font color='red'>双</font><font color='red'>ADC</font>采集基本知识介绍
stm32 ADC 使用DMA缓存
半缓存中断 https://www.bilibili.com/read/cv5242250/
[单片机]
stm32 <font color='red'>ADC</font> 使用DMA<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