GD32E230使用ADC+TIMER14触发采样,不能工作,请大神帮忙知道一下

[复制链接]
 楼主| gwlall 发表于 2025-6-3 12:03 | 显示全部楼层 |阅读模式
大家好,请问大家,我在使用GD32E230的定时器触发ADC转换时,基于官方的这个例程把TIMER0改成TIMER14后集成在程序里不能工作(TIMER0在程序里做其他用途了,所以要改成TIMER14)。使能ADC转换完成中断后,未能进中断,用软件触发方式则可以进中断,我感觉是配置有问题未能触发ADC转换。观察TIMER14的寄存器,发现计数器是滚动的。请问大家有没有相关经验,或者哪位大神能帮我解决一下这个问题,可以适当有偿报酬。
  1. /*
  2. ***************************************************************************************************
  3. * Includes
  4. ***************************************************************************************************
  5. */
  6. /* global declarations */
  7. #include "common.h"

  8. /* module import interface */
  9. #include "Adc_Inf.h"

  10. /* private module interface */
  11. #include "Adc_Prv.h"


  12. /*
  13. ***************************************************************************************************
  14. * Variables
  15. ***************************************************************************************************
  16. */
  17. MEMORY_ALIGNED(4) volatile uint16 Adc_aResultValue[2];

  18. /*
  19. ***************************************************************************************************
  20. * used functions
  21. ***************************************************************************************************
  22. */
  23. void Adc_DmaConfig(void);
  24. void Adc_TrigTimerConfig(void);

  25. /**
  26. ***************************************************************************************************
  27. * Adc_Init - Initializes the ADC hardware unit and the driver.
  28. *
  29. *
  30. *
  31. * \param           none
  32. * \return          none
  33. * \retval          none
  34. * \seealso         
  35. * \usedresources
  36. ***************************************************************************************************
  37. */
  38. void Adc_Init(void)
  39. {
  40.     /* Enable ADC clock */
  41.     rcu_periph_clock_enable(RCU_ADC);
  42.     /* Config ADC clock */
  43.     rcu_adc_clock_config(RCU_ADCCK_APB2_DIV6);

  44.     /* Reset ADC */
  45.     adc_deinit();
  46.    
  47.     /* DMA configuration */
  48.     Adc_DmaConfig();

  49. #if (ADC_TRIG_TIMER_ENABLE == STD_ON)
  50.     /* Trigger Timer configuration */
  51.     Adc_TrigTimerConfig();
  52. #endif

  53.     /* ADC scan function enable */
  54.     adc_special_function_config(ADC_SCAN_MODE, ENABLE);
  55.     /* ADC data alignment config */
  56.     adc_data_alignment_config(ADC_DATAALIGN_RIGHT);
  57.     /* ADC channel length config */
  58.     adc_channel_length_config(ADC_REGULAR_CHANNEL, 2);

  59.     /* ADC regular channel config */
  60.     adc_regular_channel_config(0, ADC_CHANNEL_0, ADC_SAMPLETIME_55POINT5);
  61.     adc_regular_channel_config(1, ADC_CHANNEL_1, ADC_SAMPLETIME_55POINT5);
  62.    
  63.     /* ADC trigger config */
  64. #if (ADC_TRIG_TIMER_ENABLE == STD_OFF)
  65.     adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_NONE);
  66. #else
  67.     adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_T14_CH0);
  68. #endif
  69.     adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE);

  70.     /* Enable ADC interface */
  71.     adc_enable();
  72.     Cpu_WaitTime(CPU_MS_TO_TICKS(1));
  73.     /* ADC calibration and reset calibration */
  74.     adc_calibration_enable();

  75. #if (ADC_TRIG_TIMER_ENABLE == STD_OFF)
  76.     /* ADC software trigger enable */
  77.     adc_software_trigger_enable(ADC_REGULAR_CHANNEL);
  78. #endif

  79.     /* ADC DMA function enable */
  80.     adc_dma_mode_enable();

  81. #if (ADC_TRIG_TIMER_ENABLE == STD_ON)
  82.     /* Enable Trigger Timer */
  83.     timer_enable(ADC_TRIG_TIMER);
  84. #endif
  85.    
  86.     /* ADC interrupt config */
  87.     nvic_irq_enable(ADC_CMP_IRQn, 0U);
  88.     adc_interrupt_enable(ADC_INT_EOC);
  89. }


  90. /**
  91. ***************************************************************************************************
  92. * Adc_DmaConfig - DMA configuration function.
  93. *
  94. *
  95. *
  96. * \param           none
  97. * \return          none
  98. * \retval          none
  99. * \seealso         
  100. * \usedresources
  101. ***************************************************************************************************
  102. */
  103. void Adc_DmaConfig(void)
  104. {
  105.     dma_parameter_struct dma_init_struct;

  106.     /* Enable DMA clock */
  107.     rcu_periph_clock_enable(RCU_DMA);
  108.    
  109.     /* Initialize DMA channel */
  110.     dma_deinit(DMA_CH0);
  111.     dma_init_struct.direction    = DMA_PERIPHERAL_TO_MEMORY;
  112.     dma_init_struct.memory_addr  = (uint32)Adc_aResultValue;
  113.     dma_init_struct.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;
  114.     dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;
  115.     dma_init_struct.number       = 2;
  116.     dma_init_struct.periph_addr  = (uint32)&(ADC_RDATA);
  117.     dma_init_struct.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;
  118.     dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
  119.     dma_init_struct.priority     = DMA_PRIORITY_ULTRA_HIGH;
  120.     dma_init(DMA_CH0, &dma_init_struct);
  121.    
  122.     /* configure DMA mode */
  123.     dma_circulation_enable(DMA_CH0);
  124.     dma_memory_to_memory_disable(DMA_CH0);
  125.    
  126.     /* enable DMA channel0 */
  127.     dma_channel_enable(DMA_CH0);
  128. }

  129. /**
  130. ***************************************************************************************************
  131. * Adc_TrigTimerConfig - Initializes the ADC trigger timer.
  132. *
  133. *
  134. *
  135. * \param           none
  136. * \return          none
  137. * \retval          none
  138. * \seealso         
  139. * \usedresources
  140. ***************************************************************************************************
  141. */
  142. void Adc_TrigTimerConfig(void)
  143. {
  144.     timer_oc_parameter_struct timer_ocintpara;
  145.     timer_parameter_struct timer_initpara;

  146.     /* Enable timer clock */
  147.     rcu_periph_clock_enable(RCU_TIMER14);
  148.    
  149.     /* Deinit a timer */
  150.     timer_deinit(TIMER14);
  151.     /* Initialize TIMER init parameter struct */
  152.     timer_struct_para_init(&timer_initpara);
  153.     /* Timer configuration */
  154.     timer_initpara.prescaler         = 5;
  155.     timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
  156.     timer_initpara.counterdirection  = TIMER_COUNTER_UP;
  157.     timer_initpara.period            = 399;
  158.     timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
  159.     timer_initpara.repetitioncounter = 0;
  160.     timer_init(TIMER14, &timer_initpara);

  161.     /* CHx configuration in PWM mode1 */
  162.     timer_ocintpara.ocpolarity  = TIMER_OC_POLARITY_LOW;
  163.     timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
  164.     timer_channel_output_config(TIMER14, TIMER_CH_0, &timer_ocintpara);

  165.     timer_channel_output_pulse_value_config(TIMER14, TIMER_CH_0, 100);
  166.     timer_channel_output_mode_config(TIMER14, TIMER_CH_0, TIMER_OC_MODE_PWM1);
  167.     timer_channel_output_shadow_config(TIMER14, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE);
  168.    
  169.     /* Auto-reload preload enable */
  170.     timer_auto_reload_shadow_enable(TIMER14);
  171.     timer_primary_output_config(TIMER14, ENABLE);
  172. }


官方例程.rar

2.97 KB, 下载次数: 0

我的程序.rar

1.57 KB, 下载次数: 0

tax2r6c 发表于 2025-6-4 12:36 | 显示全部楼层
确保ADC的触发源已正确配置为TIMER14的输出信号。在GD32E230中,ADC的触发源通过ADC_CTL0寄存器的TRGSEL位选择。
b5z1giu 发表于 2025-6-4 13:42 | 显示全部楼层
TIMER14需配置为PWM模式或定时触发模式,输出与ADC触发需求匹配的信号。确保TIMER14的触发信号是上升沿或高电平(具体取决于ADC触发极性配置)。
lamanius 发表于 2025-6-4 14:52 | 显示全部楼层
配置TIMER14为PWM模式,设置合适的占空比(如50%),确保触发信号有效。
kaif2n9j 发表于 2025-6-4 16:01 | 显示全部楼层
若ADC触发极性为上升沿触发,需确保TIMER14输出信号包含上升沿。
d1ng2x 发表于 2025-6-4 17:10 | 显示全部楼层
ADC转换完成中断(EOC)需在ADC_CTL0寄存器中使能,并在NVIC中配置中断优先级
cen9ce 发表于 2025-6-4 18:16 | 显示全部楼层
验证中断服务程序(ISR),确保ADC中断服务程序(ISR)已正确定义,并在其中清除中断标志位。
suw12q 发表于 2025-6-4 19:33 | 显示全部楼层
触发信号与ADC启动时序,ADC需在TIMER14触发信号到来时处于就绪状态。若ADC未准备好,可能丢失触发信号。
w2nme1ai7 发表于 2025-6-5 09:21 | 显示全部楼层
在启动TIMER14之前,先初始化并使能ADC,并添加适当的延时(如delay_ms(20))。
y1n9an 发表于 2025-6-5 11:09 | 显示全部楼层
确保ADC的校准已完成(调用ADC_CAL函数)。
dffzh 发表于 2025-6-5 11:26 | 显示全部楼层
本帖最后由 dffzh 于 2025-6-5 11:30 编辑

基于官方的这个例程把TIMER0改成TIMER14后集成在程序里不能工作”:
我看官网上的例程关于定时器触发ADC采样的,好像只有使用定时器2+ADC配置为注入模式的吧?
2955168410dd691ee7.png
3633268410df0bfd5f.png
7965968410e1d82383.png
不过你这个adc_external_trigger_source_config函数的配置看上去也没问题。
你可以用这个Timer_trigger_injected_channel文件夹demo,认真对比一下初始化配置(按我经验,基本上是代码配置问题),并将触发模式改为
adc_external_trigger_source_config(ADC_INSERTED_CHANNEL,ADC_EXTTRIG_INSERTED_T14_TRGO);
试试。如果还不行,再回复我,我帮你看下。
q1d0mnx 发表于 2025-6-5 13:02 | 显示全部楼层
触发信号频率与ADC采样率匹配,TIMER14的触发频率需低于ADC的最大采样率(GD32E230的ADC最大采样率通常为1MHz)。若频率过高,可能导致ADC无法响应。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

5

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

2

主题

5

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部