本文主要是介绍gd32F450单片机 ADC+DMA,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
接触国产单片机不久,好多配置的东西记不住,写下来分享然后也方便自己以后拿来看看。欢迎大家把踩坑的部分分享一下。
本次是ADC配置和DMA采集的配置部分。某些参数错误会导致内存溢出,影响到其他变量或者参数表的值。
引脚为PB0和PB1两个。
一、相关时钟初始化
首先是时钟配置,根据手册可以查到两个引脚对应ADC0或者ADC1(此处属于猜测,但是配置为ADC0功能正常)

使能DMA1的时钟,并且给对应的时钟分频(8分频是由时钟树查询得知可以进行8分频来选择,也可以自行根据时钟树来选择)
rcu_periph_clock_enable(RCU_GPIOB);rcu_periph_clock_enable(RCU_ADC0);rcu_periph_clock_enable(RCU_DMA1);adc_clock_config(ADC_ADCCK_PCLK2_DIV8);
二、GPIO初始化
gpio_mode_set(GPIOB, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_0);gpio_mode_set(GPIOB, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_1);
这个部分就不多讲了,主要是配置成模拟输入的模式。
三、ADC初始化
基本的常规配置和例程相差不大,大概了解了一下
注意adc_channel_length_config函数的 长度 的配置
/* ADC mode config */adc_sync_mode_config(ADC_SYNC_MODE_INDEPENDENT);//独立模式/* ADC contineous function disable */adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);//连续转换/* ADC scan mode disable */adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);//扫描模式/* ADC data alignment config */adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);//大端模式和小端模式的选择/* ADC channel length config */adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 2);/* ADC regular channel config */adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_8, ADC_SAMPLETIME_15);//手册截图中的IN8adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_9, ADC_SAMPLETIME_15);//IN9/* ADC trigger config *由于我没有使用外部触发所以使用默认的不使用的配置方法/adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_T0_CH0); adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, EXTERNAL_TRIGGER_DISABLE);/* ADC DMA function enable */adc_dma_request_after_last_enable(ADC0);adc_dma_mode_enable(ADC0);/* enable ADC interface */adc_enable(ADC0);/* wait for ADC stability */delay_1ms(1);/* ADC calibration and reset calibration */adc_calibration_enable(ADC0);/* enable ADC software trigger */adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
四、DMA配置
注意:dma_single_data_parameter.number的值要对应我的adc_value数组的成员数相同,否则会造成内存溢出,影响内存中其他数据的值。
/* ADC_DMA_channel configuration */dma_single_data_parameter_struct dma_single_data_parameter;/* ADC DMA_channel configuration */dma_deinit(DMA1, DMA_CH0);/* initialize DMA single data mode */dma_single_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADC0));//绑定了ADC0模块dma_single_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE;dma_single_data_parameter.memory0_addr = (uint32_t)(adc_value);//由于我要进行两个脚的adc转换 所以uint16_t adc_value[2];这样来进行的定义dma_single_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;dma_single_data_parameter.periph_memory_width = DMA_PERIPH_WIDTH_16BIT;dma_single_data_parameter.direction = DMA_PERIPH_TO_MEMORY;dma_single_data_parameter.number = 2;//注意内存溢出时 确认此处是否正确dma_single_data_parameter.priority = DMA_PRIORITY_HIGH;dma_single_data_mode_init(DMA1, DMA_CH0, &dma_single_data_parameter);dma_channel_subperipheral_select(DMA1, DMA_CH0, DMA_SUBPERI0);/* enable DMA circulation mode */dma_circulation_enable(DMA1, DMA_CH0);/* enable DMA channel */dma_channel_enable(DMA1, DMA_CH0);
五、ADC数值计算
adc_value[1]*电压V/4096
电压V的值,单位是v,问硬件设计
六、结束语
如果由其他的疑问,可以评论留言。我调试中主要遇到的问题就是内存溢出的问题,如果有其他问题大家可以一起讨论一下。
这篇关于gd32F450单片机 ADC+DMA的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!