打印

GD32A503RDT3 ADC+DMA顺序转换问题,没有数据

[复制链接]
4331|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
guozengpeng|  楼主 | 2023-8-28 16:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void rcu_config(void)
{
    /* enable GPIO clock */
    rcu_periph_clock_enable(RCU_GPIOB);
    rcu_periph_clock_enable(RCU_GPIOE);
    /* enable ADC0 clock */
    rcu_periph_clock_enable(RCU_ADC0);
    /* enable DMA0 clock */
    rcu_periph_clock_enable(RCU_DMA0);
}

/*!
    \brief      configure the GPIO peripheral
    \param[in]  none
    \param[out] none
    \retval     none
*/
void gpio_config(void)
{
    /* config the GPIO as analog mode */
    gpio_mode_set(GPIOB, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_1);//GPIOB1,
                gpio_mode_set(GPIOE, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_13);
}

/*!
    \brief      configure the DMA peripheral
    \param[in]  none
    \param[out] none
    \retval     none
*/
void dma_config(void)
{
    /* ADC_DMA_channel configuration */
    dma_parameter_struct dma_data_parameter;
    /* ADC DMA_channel configuration */
    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)adc_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       = 2;//长度
    dma_data_parameter.priority     = DMA_PRIORITY_HIGH;//优先级高
    dma_init(DMA0, DMA_CH0, &dma_data_parameter);
    dma_circulation_enable(DMA0, DMA_CH0);
    /* enable DMA channel */
    dma_channel_enable(DMA0, DMA_CH0);
}

/*!
    \brief      configure the ADC peripheral
    \param[in]  none
    \param[out] none
    \retval     none
*/
void adc_config(void)
{
           /* config ADC clock */
    rcu_adc_clock_config(RCU_CKADC_CKAHB_DIV10);
                adc_deinit(ADC0);
                adc_mode_config(ADC_MODE_FREE);//ADC工作在独立模式
    /* ADC continous function enable */
    adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
    adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE);
    /* ADC trigger config */
    adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_NONE);//外部触发源设置
    /* 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, 1, ADC_CHANNEL_7, ADC_SAMPLETIME_55POINT5);
                adc_regular_channel_config(ADC0, 2, ADC_CHANNEL_9, ADC_SAMPLETIME_55POINT5);
    adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
    /* enable ADC interface */   
    adc_enable(ADC0);
                /* ADC DMA function enable */
    adc_dma_mode_enable(ADC0);
    /* ADC calibration and reset calibration */
    adc_calibration_enable(ADC0);
}


main.c
/* system clocks configuration */
    rcu_config();
/* GPIO configuration */
    gpio_config();
/* DMA configuration */
    dma_config();
/* ADC configuration */
    adc_config();
    adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);

使用特权

评论回复
沙发
Bowclad| | 2023-9-5 23:46 | 只看该作者
ADC转换时间太快了吗

使用特权

评论回复
板凳
lzbf| | 2023-9-7 09:45 | 只看该作者
DMA传输错误               

使用特权

评论回复
地板
updownq| | 2023-9-7 09:50 | 只看该作者
如果没有数据需要采集,ADC将不会工作,也无法进行数据采集和转换。

使用特权

评论回复
5
timfordlare| | 2023-9-7 10:14 | 只看该作者
在使用DMA进行连续数据输入时,确保输入数据是已知的,并按照正确的顺序进行输入。如果没有正确输入数据,可能导致DMA数据传输错误。

使用特权

评论回复
6
maqianqu| | 2023-9-7 10:20 | 只看该作者
参考GD32A503RDT3的数据手册和参考手册

使用特权

评论回复
7
gygp| | 2023-9-7 10:36 | 只看该作者
在ADC转换完成之后,DMA传输能够及时进行,并且DMA的传输完成中断能够正确触发。

使用特权

评论回复
8
adolphcocker| | 2023-9-7 10:53 | 只看该作者
检查中断处理程序是否正确处理了DMA和ADC的中断,包括中断服务例程的入口和出口语句是否正确,以及中断标志位是否正确清除。

使用特权

评论回复
9
sdCAD| | 2023-9-7 10:59 | 只看该作者
ADC和DMA配置是否正确              

使用特权

评论回复
10
cemaj| | 2023-9-7 11:05 | 只看该作者
在使用DMA进行数据传输时,您可以轮询或使用中断等方式来检查DMA传输完成标志

使用特权

评论回复
11
sheflynn| | 2023-9-7 11:18 | 只看该作者
需要检查ADC模块的配置参数,例如通道选择、采样频率、采样位数等,是否正确设置。

使用特权

评论回复
12
robertesth| | 2023-9-7 11:22 | 只看该作者
DMA通道的配置与ADC的通道匹配,并且DMA的源和目标地址正确。检查DMA通道的传输模式、数据传输方向、链表和中断等配置。

使用特权

评论回复
13
tabmone| | 2023-9-7 11:41 | 只看该作者
可以尝试重新编译和烧录程序,或者检查硬件连接是否正确。

使用特权

评论回复
14
wangdezhi| | 2023-9-7 11:47 | 只看该作者
建议检查相关配置,确保GPIO、ADC和DMA的配置正确

使用特权

评论回复
15
saservice| | 2023-9-7 12:01 | 只看该作者
查阅GD32A503RDT3的参考手册,以获取关于ADC和DMA配置的详细信息

使用特权

评论回复
16
kkzz| | 2023-9-7 12:12 | 只看该作者
可能是时序问题引起的              

使用特权

评论回复
17
mattlincoln| | 2023-9-7 12:26 | 只看该作者
检查ADC和DMA相关的寄存器配置是否正确。确保您已正确配置ADC的采样时间、转换模式、通道顺序等参数,并设置DMA的数据传输大小、通道选择和触发条件等。

使用特权

评论回复
18
loutin| | 2023-9-7 13:08 | 只看该作者
将ADC通道正确连接到所需的模拟信号源,并将DMA通道正确连接到适当的存储区域。还要确保与ADC和DMA相关的引脚配置正确。

使用特权

评论回复
19
modesty3jonah| | 2023-9-7 13:30 | 只看该作者
可以参考GD32A503RDT3单片机的官方文档和示例代码

使用特权

评论回复
20
uptown| | 2023-9-7 13:42 | 只看该作者
ADC和DMA所需的时钟已正确配置。GD32A503RDT3微控制器具有多个时钟源,包括主时钟(HCLK)、模拟时钟(PCLK)和ADC时钟。确保这些时钟源的频率和分频器设置正确。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝