当前位置:网站首页>GD32F303固件库开发(11)----ADC在DMA模式下扫描多个通道
GD32F303固件库开发(11)----ADC在DMA模式下扫描多个通道
2022-08-06 17:37:00 【记帖】
GD32F303固件库开发.10----双ADC轮询模式扫描多个通道
概述
本章主要配置,ADC在DMA模式下扫描多个通道,通过串口进行打印。
查阅手册可以得知,PA9、PA10为串口0的输出和输入口。
ADC通道配置
视频教学
csdn课程
课程更加详细。
https://download.csdn.net/course/detail/37144
硬件准备
这里准备了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初始化
///*************时钟配置******************/
/*使能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_DIV8);
ADC0配置
/* 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);
/* ADC mode config */
adc_mode_config(ADC_MODE_FREE);
/* 使能或禁能ADC特殊功能 */
adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);//连续模式选择->扫描模式选择
/* 使能或禁能ADC特殊功能 */
adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);//ADC_SCAN_MODE->扫描模式选择
/* ADC data alignment config */
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 trigger config */
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);
delay_1ms(1);
/* ADC calibration and reset calibration */
adc_calibration_enable(ADC0);
/* ADC软件触发使能 */
adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
DMA0初始化
/*DMA初始化*/
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
dma_memory_to_memory_disable(DMA0, DMA_CH4); /* DMA内存到内存模式不开启 */
/* enable DMA transfer complete interrupt */
dma_interrupt_enable(DMA0, DMA_CH0, DMA_INT_FTF); //打开全部完成中断
/* enable DMA channel */
// dma_channel_enable(DMA0, DMA_CH0);//通道0
nvic_irq_enable(DMA0_Channel0_IRQn, 0, 0);
/* enable DMA channel */
dma_channel_enable(DMA0, DMA_CH0);//通道0
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数据
}
DMA0_Channel0_IRQHandler()
void DMA0_Channel0_IRQHandler(void)
{
if(dma_interrupt_flag_get(DMA0, DMA_CH0, DMA_INT_FLAG_FTF))
{
ADC0_Flag=1;
dma_interrupt_flag_clear(DMA0, DMA_CH0, DMA_FLAG_FTF);//清除DMA通道传输完成标志
dma_channel_disable(DMA0, DMA_CH0);//失能DMA0_CH0
}
}
数据采集
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);
dma_memory_address_config(DMA0, DMA_CH0, (uint32_t)ADC0_Value);//配置存储器基地址
dma_transfer_number_config(DMA0, DMA_CH0, 4);
dma_channel_enable(DMA0, DMA_CH0);
ADC0_Flag=0;
}
delay_1ms(1000);
}
测试结果
输入固定电压进行测试。

测试结果如下。
最后
边栏推荐
猜你喜欢

浅谈Jmeter性能测试流程

vsdx用什么软件打开 没有visio怎么打开vsdx文件

使用接口地址池为直连网段分配地址

华硕电脑蓝屏修复按哪个键 电脑一开机就蓝屏反复的解决方法

Flyway error source code analysis - Validate failed: Migrations have failed validation

win7 suffix name is hidden how to open win7 file how to display suffix name

从 VLAN 到 IPVLAN: 聊聊虚拟网络设备及其在云原生中的应用

01 【TypeScript简介 初体验】
See three years of CRUD programmers how to solve the database deadlock

Using the interface address pool for direct networking segment allocation
随机推荐
2022.8.5-----leetcode.623
Linux 安装配置 mysql
Win7 and win10 which takes up less resources Win7 and win10 take up resources in detail
作业8.6 进程间的通信 消息队列与共享内存
See three years of CRUD programmers how to solve the database deadlock
代码越写越乱?那是因为你没用责任链!
`English` 2022/8/4
Flyway报错源码分析——Validate failed: Migrations have failed validation
Windows 7 can't enter the system and security model Windows 7 system crash into safe mode
RSA加密/签名过程
win7运行速度提高90% 怎么提高win7系统运行速度
win7无法进入系统和安全模式 win7系统崩溃进不了安全模式
01 【TypeScript简介 初体验】
Redis 基础
What software is cdr? What software does cdr format use?
Nextcloud -6- 同步上传文件限制1M问题解决方案
论文阅读笔记(二)——Mask R-CNN
inotify 高效改进版 sersync 结合 rsync 实现数据实时增量同步
3年测试经验,突然很迷茫,软件测试工程师的出路在哪?
Nextcloud -4- 连接 MariaDB