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

概述

本章主要配置,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);//重置串口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;
  }
}

最后

以上的代码会在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);
    }

测试结果

输入固定电压进行测试。

在这里插入图片描述

测试结果如下。

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记帖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值