GD32F303固件库开发.11----双ADC轮询模式扫描多个通道

  • 概述
  • 视频教学
  • csdn课程
  • 样品申请
  • 硬件准备
  • keil配置
  • 使能串口
  • 串口重定向
  • ADC通道设置
  • DMA设置
  • ADC0初始化
  • GPIO初始化
  • ADC0配置
  • DMA0初始化
  • DMA0_Channel0_IRQHandler()
  • 最后
  • 初始化定义
  • 数据采集
  • 测试结果

概述

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

ADC通道配置

视频教学

https://www.bilibili.com/video/BV1at4y1n7jy/

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

csdn课程

课程更加详细。
https://download.csdn.net/course/detail/37144

样品申请

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);//重置串口0usart_baudrate_set(USART0, 115200U);//设置串口0的波特率为115200usart_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;}
}

最后

以上的代码会在Q_qun里分享。Q_qun:615061293。
或者关注『记帖』,持续更新文章和学习资料!

初始化定义

        /* 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固件库开发(11)----ADC在DMA模式下扫描多个通道相关推荐

  1. STM32CUBEIDE(10)----ADC在DMA模式下扫描多个通道

    STM32CUBEIDE.10----ADC在DMA模式下扫描多个通道 概述 样品申请 视频教学 csdn课程 代码下载 生成例程 STM32CUBEIDE配置 串口重定向 代码 测试结果 概述 本章 ...

  2. GD32F303固件库开发

    GD32F303固件库开发 芯片申请 GD32F303固件库开发(1)----前期准备与烧录 GD32F303固件库开发(2)----读保护与写保护 GD32F303固件库开发(3)----使用固件库 ...

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

    GD32F303固件库开发.10----双ADC轮询模式扫描多个通道 概述 视频教学 csdn课程 样品申请 硬件准备 keil配置 使能串口 串口重定向 ADC通道设置 ADC0初始化 ADC0配置 ...

  4. GD32F303固件库开发(16)----移植兆易创新SPI Nor Flash之GD25Q64Flash

    spi概述 SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的 ...

  5. GD32F303固件库开发(7)----printf打印配置

    GD32F303固件库开发.7----printf打印配置 概述 视频教学 csdn课程 样品申请 硬件准备 keil配置 串口初始化 最后 串口重定向 打印测试 测试结果 概述 本章主要配置prin ...

  6. GD32F303固件库开发(5)----GPIO输出模式,速率测试、开漏和输出说明

    GD32F303固件库开发.5----GPIO输出模式,速率测试.开漏和输出说明 概述 样品申请 视频教学 csdn课程 硬件准备 开发板管脚配置 不同速率对应的波形 GPIO_OSPEED_2MHZ ...

  7. GD32F303固件库开发(14)----IIC之配置OLED

    GD32F303固件库开发.13----定时器TIM捕获PWM测量频率与占空比 概述 视频教学 csdn课程 参考文档 时钟使能 初始化IO IIC初始化 配置IIC接口 修改IIC发送代码 OLED ...

  8. GD32F303固件库开发(13)----定时器TIM捕获PWM测量频率与占空比

    GD32F303固件库开发.13----定时器TIM捕获PWM测量频率与占空比 概述 视频教学 csdn课程 样品申请 生成例程 keil配置 使能串口 串口重定向 占空比与频率计算 GPIO初始化 ...

  9. GD32F303固件库开发(17)----内部Flash读写

    概述 本例程主要讲解如何对芯片自带Flash进行读写,用芯片内部Flash可以对一些需要断电保存的数据进行保存,无需加外部得存储芯片,本例程采用的是GD32F303ZET6主控,512K大小的Flas ...

最新文章

  1. 从一道题浅说 JavaScript 的事件循环
  2. 五大分布式事务,你了解多少?
  3. 重在参与吗。。。。。。。。
  4. 协同OA对业务和管理进行流程的梳理
  5. DLA实现跨地域、跨实例的多AnalyticDB读写访问
  6. 升级版的数据透视表!用一工具,做出了HR羡慕的人力数据分析
  7. Linux常用命令(第二版) --系统开关机命令
  8. RemoteApp登录到特定的域
  9. flutter 返回指定界面_Flutter 即学即用系列博客——04 Flutter UI 初窥
  10. matlab 计算矩阵a的离散余弦变换
  11. window media player 内部应用程序出错
  12. Scrapped or attached views may not be recycled. isScrap:false isAttached:true android.support.v7.wid
  13. 百度地图 -- 离线地图开发
  14. 【STL】STL空间配置器
  15. ORACLE的统计分析
  16. 华为校园招聘笔试题(机考题目)
  17. 从u盘到计算机内存的过程,U盘装系统步骤图解(超详细)
  18. 怀化学院计算机不过能毕业吗,面对困境,你会如何选择?
  19. 如何将视频文件在线压缩,压缩的方法
  20. Vue项目中使用swiper插件开发3d轮播图

热门文章

  1. 决策树-CART回归树
  2. NGINX启动报错,端口被占用
  3. C语言中阶第五篇:写一个强制关机的程序,以及goto语句跳出多层循环的应用
  4. 计算机主机光驱弹不出来,电脑光驱弹不出来如何解决
  5. 网易极客战记-KITHGARD地牢--虚幻干扰
  6. IN_ARRAY用了这么多年才会用!真尴尬
  7. 手机提醒便签设置周末免打扰模式在哪里
  8. 华为OD机试 -Excel 单元格数值统计(Python) | 机试题+算法思路+考点+代码解析 【2023】
  9. 在vscode中创建vue项目
  10. 墨者学院-浏览器信息伪造