gd32F450单片机 ADC+DMA

阅读: 评论:0

gd32F450单片机 ADC+DMA

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_0_addr = (uint32_t)(adc_value);//由于我要进行两个脚的adc转换 所以uint16_t adc_value[2];这样来进行的定义dma_single__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,问硬件设计

六、结束语

如果由其他的疑问,可以评论留言。我调试中主要遇到的问题就是内存溢出的问题,如果有其他问题大家可以一起讨论一下。

本文发布于:2024-02-04 13:17:38,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170708151955922.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:单片机   DMA   ADC
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23