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);//手册截图中的IN8
    adc_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,问硬件设计

六、结束语

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

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
嗨!对于使用GD32F450微控制器的ADC DMA,您可以按照以下步骤进行配置: 1. 首先,确保您已经初始化了ADCDMA外设,并启用了它们的时钟。 2. 配置ADC的通道和采样时间: - 使用`adc_channel_length`函数设置ADC的通道数。 - 使用`adc_regular_channel_config`函数配置每个通道的采样时间、转换模式和触发源。 3. 配置DMA: - 使用`dma_deinit`函数重置DMA外设。 - 使用`dma_init_struct`结构体配置DMA的通道、数据传输方向、数据宽度和传输模式。 - 使用`dma_mode_config`函数配置DMA的传输模式。 - 使用`dma_circulation_disable`函数禁用DMA的循环传输模式(如果不需要循环传输)。 - 使用`dma_memory_address_config`函数配置DMA的内存地址和外设地址。 - 使用`dma_memory_width_config`函数配置DMA的内存和外设数据宽度。 - 使用`dma_memory_increase_enable`函数启用DMA的内存递增模式。 - 使用`dma_channel_enable`函数启用DMA通道。 4. 启动ADCDMA: - 使用`adc_software_trigger_enable`函数启动ADC转换。 - 使用`dma_channel_enable`函数启动DMA传输。 5. 在DMA传输完成后,您可以使用DMA的中断或轮询方法来处理接收到的数据。 这是一个基本的ADC DMA配置过程的概述。具体的代码实现可能会有所不同,具体取决于您使用的开发环境和库。确保参考GD32F450微控制器的参考手册和相关的库文档以获取更详细的信息和示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值