[研电赛技术支持] GD32F103使用DMA方式实现ADC0数据循环采集

[复制链接]
 楼主| 慢醇 发表于 2022-1-25 22:15 | 显示全部楼层 |阅读模式
[color=rgba(0, 0, 0, 0.75)]选择合适的DMA通道
[color=rgba(0, 0, 0, 0.75)]ADC0使用ch0
8425261f005f04f333.png
 楼主| 慢醇 发表于 2022-1-25 22:16 | 显示全部楼层
  1. /*!
  2.     \brief      configure the DMA peripheral
  3.     \param[in]  none
  4.     \param[out] none
  5.     \retval     none
  6. */
  7. void dma_config(void)
  8. {
  9.     /* ADC_DMA_channel configuration */
  10.     dma_parameter_struct dma_data_parameter;

  11.     /* enable DMA0 clock */
  12.     rcu_periph_clock_enable(RCU_DMA0);  
  13.   
  14.     /* ADC DMA_channel configuration */
  15.     dma_deinit(DMA0, DMA_CH0);
  16.    
  17.     /* initialize DMA data mode */
  18.     dma_data_parameter.periph_addr  = (uint32_t)(&ADC_RDATA(ADC0));
  19.     dma_data_parameter.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;
  20.     dma_data_parameter.memory_addr  = (uint32_t)(&adc_value);
  21.     dma_data_parameter.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;
  22.     dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
  23.     dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT;  
  24.     dma_data_parameter.direction    = DMA_PERIPHERAL_TO_MEMORY;
  25.     dma_data_parameter.number       = 100;               
  26.     dma_data_parameter.priority     = DMA_PRIORITY_ULTRA_HIGH;
  27.     dma_init(DMA0, DMA_CH0, &dma_data_parameter);

  28.     dma_circulation_enable(DMA0, DMA_CH0);        //采集完100个之后,循环
  29.    
  30.     /* enable DMA transfer complete interrupt */
  31.     dma_interrupt_enable(DMA0, DMA_CH0, DMA_INT_FTF);        //打开全部完成中断
  32.     dma_interrupt_enable(DMA0, DMA_CH0, DMA_INT_HTF);        //打开一半完成中断
  33.   
  34.     /* enable DMA channel */
  35.     dma_channel_enable(DMA0, DMA_CH0);
  36.    
  37.     nvic_irq_enable(DMA0_Channel0_IRQn, 0, 0);
  38. }

  39. /*!
  40.     \brief      configure the TIMER peripheral
  41.     \param[in]  none
  42.     \param[out] none
  43.     \retval     none
  44. */
  45. void timer1_config(void)        //1ms采集一次
  46. {
  47.     timer_oc_parameter_struct timer_ocintpara;
  48.     timer_parameter_struct timer_initpara;

  49.     /* enable timer1 clock */
  50.     rcu_periph_clock_enable(RCU_TIMER1);
  51.   
  52.     /* TIMER1 configuration */
  53.     timer_initpara.prescaler         = 107;
  54.     timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
  55.     timer_initpara.counterdirection  = TIMER_COUNTER_UP;
  56.     timer_initpara.period            = 999;
  57.     timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
  58.     timer_initpara.repetitioncounter = 0;
  59.     timer_init(TIMER1,&timer_initpara);

  60.     /* CH0 configuration in PWM mode1 */
  61.     timer_ocintpara.ocpolarity  = TIMER_OC_POLARITY_HIGH;
  62.     timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
  63.     timer_channel_output_config(TIMER1, TIMER_CH_1, &timer_ocintpara);

  64.     timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_1, 499);
  65.     timer_channel_output_mode_config(TIMER1, TIMER_CH_1, TIMER_OC_MODE_PWM1);
  66.     timer_channel_output_shadow_config(TIMER1, TIMER_CH_1, TIMER_OC_SHADOW_DISABLE);
  67. }

  68. /*!
  69.     \brief      configure the ADC peripheral
  70.     \param[in]  none
  71.     \param[out] none
  72.     \retval     none
  73. */
  74. void adc_config(void)
  75. {
  76.     /* enable ADC0 clock */
  77.     rcu_periph_clock_enable(RCU_ADC0);
  78.    /* reset ADC */
  79.     adc_deinit(ADC0);
  80.     /* ADC mode config */
  81.     adc_mode_config(ADC_MODE_FREE);
  82.     /* ADC continous function enable */
  83.     adc_special_function_config(ADC0, ADC_SCAN_MODE, DISABLE);

  84.     /* ADC data alignment config */
  85.     adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
  86.     /* ADC channel length config */
  87.     adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1);
  88.   
  89.   
  90.     /* ADC regular channel config */
  91.     adc_regular_channel_config(ADC0, 0, AD0_CH, ADC_SAMPLETIME_55POINT5);

  92.     /* ADC trigger config */
  93.     adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_T1_CH1);
  94.         /* ADC external trigger enable */
  95.     adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);

  96.     /* enable ADC interface */
  97.     adc_enable(ADC0);  
  98.     delay_1ms(1);
  99.     /* ADC calibration and reset calibration */
  100.     adc_calibration_enable(ADC0);  

  101.     /* ADC DMA function enable */
  102.     adc_dma_mode_enable(ADC0);
  103. }

  104. /*!
  105.     \brief      this function handles DMA_Channel3_IRQHandler interrupt
  106.     \param[in]  none
  107.     \param[out] none
  108.     \retval     none
  109. */
  110. void DMA0_Channel0_IRQHandler(void)
  111. {
  112.   if(dma_interrupt_flag_get(DMA0, DMA_CH0, DMA_INT_FLAG_FTF))
  113.   {     
  114.     dma_interrupt_flag_clear(DMA0, DMA_CH0, DMA_INT_FLAG_FTF);
  115. //    dma_interrupt_flag_clear(DMA0, DMA_CH0, DMA_INT_FLAG_G);
  116.    
  117.   }
  118.   else if(dma_interrupt_flag_get(DMA0, DMA_CH0, DMA_INT_FLAG_HTF))
  119.   {
  120.     dma_interrupt_flag_clear(DMA0, DMA_CH0, DMA_INT_FLAG_HTF);
  121. //    dma_interrupt_flag_clear(DMA0, DMA_CH0, DMA_INT_FLAG_G);
  122.     dmaHalfIntCnt ++;
  123. //    uart_dma_start();

  124.   }
  125. }

  126. void dma_start(void)
  127. {
  128.   timer1_config();
  129.   dma_config();
  130.   adc_config();
  131.   /* enable TIMER1 */
  132.   timer_enable(TIMER1);

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

本版积分规则

133

主题

1381

帖子

6

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