美文网首页
AT32_ADC+DMA单次传输再触发

AT32_ADC+DMA单次传输再触发

作者: 蜗牛blue_wang | 来源:发表于2023-12-13 13:04 被阅读0次

ADC+DMA软件触发,DMA配置传输完中断

#define Channel_num 4
#define ADC1_BUffer_Size 64
#define DMA_buffer_size  (Channel_num*ADC1_BUffer_Size)
uint16_t ADC1_Buffer[ADC1_BUffer_Size][Channel_num] = {0};

//采样率:ADC_CLK=25M,转换时间=239.5+12.5个周期,252*0.04 = 10.08us,采样率=1/10.08=99.2Khz
/**
  * @brief  init adc1 function.
  * @param  none
  * @retval none
  */
void wk_adc1_init(void)
{
  crm_periph_clock_enable(CRM_ADC1_PERIPH_CLOCK, TRUE);
  crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE);
    
  gpio_init_type gpio_init_struct;
  adc_base_config_type adc_base_struct;

  gpio_default_para_init(&gpio_init_struct);

  /*gpio--------------------------------------------------------------------*/ 
  /* configure the IN10 pin */
  gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
  gpio_init_struct.gpio_pins = GPIO_PINS_0;
  gpio_init(GPIOC, &gpio_init_struct);

  /* configure the IN11 pin */
  gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
  gpio_init_struct.gpio_pins = GPIO_PINS_1;
  gpio_init(GPIOC, &gpio_init_struct);

  /* configure the IN12 pin */
  gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
  gpio_init_struct.gpio_pins = GPIO_PINS_2;
  gpio_init(GPIOC, &gpio_init_struct);

  /* configure the IN13 pin */
  gpio_init_struct.gpio_mode = GPIO_MODE_ANALOG;
  gpio_init_struct.gpio_pins = GPIO_PINS_3;
  gpio_init(GPIOC, &gpio_init_struct);

  crm_adc_clock_div_set(CRM_ADC_DIV_4);//4分频,APB2/4 = 25Mhz

  /*adc_common_settings-------------------------------------------------------------*/ 
  adc_combine_mode_select(ADC_INDEPENDENT_MODE);

  /*adc_settings--------------------------------------------------------------------*/ 
  adc_base_default_para_init(&adc_base_struct);
  adc_base_struct.sequence_mode = TRUE;
  adc_base_struct.repeat_mode = TRUE;
  adc_base_struct.data_align = ADC_RIGHT_ALIGNMENT;
  adc_base_struct.ordinary_channel_length = 4;
  adc_base_config(ADC1, &adc_base_struct);

  /* adc_ordinary_conversionmode-------------------------------------------- */
  adc_ordinary_channel_set(ADC1, ADC_CHANNEL_10, 1, ADC_SAMPLETIME_239_5);
  adc_ordinary_channel_set(ADC1, ADC_CHANNEL_11, 2, ADC_SAMPLETIME_239_5);
  adc_ordinary_channel_set(ADC1, ADC_CHANNEL_12, 3, ADC_SAMPLETIME_239_5);
  adc_ordinary_channel_set(ADC1, ADC_CHANNEL_13, 4, ADC_SAMPLETIME_239_5);

  adc_ordinary_conversion_trigger_set(ADC1, ADC12_ORDINARY_TRIG_SOFTWARE, TRUE);

  adc_ordinary_part_mode_enable(ADC1, FALSE);

  adc_dma_mode_enable(ADC1, TRUE);
  adc_enable(ADC1, TRUE);
  
  /* adc calibration-------------------------------------------------------- */
  adc_calibration_init(ADC1);
  while(adc_calibration_init_status_get(ADC1));
  adc_calibration_start(ADC1);
  while(adc_calibration_status_get(ADC1));

}


uint8_t adc_flag=0;
/**
  * @brief  init dma1 channel1 for "adc1"
  * @param  none
  * @retval none
  */
void wk_dma1_channel1_init(void)
{
  dma_init_type dma_init_struct;
  crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
  dma_reset(DMA1_CHANNEL1);
  dma_default_para_init(&dma_init_struct);
  dma_init_struct.direction = DMA_DIR_PERIPHERAL_TO_MEMORY;
  dma_init_struct.memory_data_width = DMA_MEMORY_DATA_WIDTH_HALFWORD;
  dma_init_struct.memory_inc_enable = TRUE;
  dma_init_struct.peripheral_data_width = DMA_PERIPHERAL_DATA_WIDTH_HALFWORD;
  dma_init_struct.peripheral_inc_enable = FALSE;
  dma_init_struct.priority = DMA_PRIORITY_MEDIUM;
  dma_init_struct.loop_mode_enable = FALSE; 
  
  dma_init_struct.peripheral_base_addr = (uint32_t)&ADC1->odt;
  dma_init_struct.memory_base_addr = (uint32_t)ADC1_Buffer;
  dma_init_struct.buffer_size = DMA_buffer_size;
  dma_init(DMA1_CHANNEL1, &dma_init_struct);
     nvic_irq_enable(DMA1_Channel1_IRQn, 1, 0);
  /* flexible function enable */
  dma_flexible_config(DMA1, FLEX_CHANNEL1, DMA_FLEXIBLE_ADC1);

  dma_interrupt_enable(DMA1_CHANNEL1, DMA_FDT_INT, TRUE);
}

void ADC1_Init()
{
     wk_dma1_channel1_init();
     dma_channel_enable(DMA1_CHANNEL1, TRUE);
     wk_adc1_init();
     adc_ordinary_software_trigger_enable(ADC1, TRUE);//软件触发
}

触发结束后,再次设置DMA传递数据长度并使能

        dma_channel_enable(DMA1_CHANNEL1, FALSE);
        dma_data_number_set(DMA1_CHANNEL1,256);
        dma_channel_enable(DMA1_CHANNEL1, TRUE);
        adc_ordinary_software_trigger_enable(ADC1, TRUE);//软件触发

相关文章

  • 防抖和截流

    固定时间段内的多次触发将被重置为单次触发,防抖就是禁止频繁触发,例如:浏览器滑动,触发频率大约是1次/16ms(刷...

  • Sqlsever 触发器

    第一次使用触发器的时候发现批量插入数据时,只有一条数据会触发触发器 原来触发器不是数据单条去触发,而是一次操作会触...

  • 节流函数 与防抖函数

    // 防抖 就是在事件触发后在一定时间只响应 一次 如果再时间内二次或多次触发 则以最后一次触发的世间为准// 节...

  • 微信小程序列表状态缓存和生命周期的那些故事

    先说结论,平时tabBar中Page的onLoad生命周期只会触发一次,离开页面不会触发onUnload,再...

  • nodejs 开发websocket 笔记

    使用nodejs 开发websocket消息分发系统 websocket使用事件触发机制传输密集传输数据,跟nod...

  • TCP简介

    单工、半双工、全双工 单工通信 单工数据传输只支持数据在一个方向上传输。比如:收音机。 半双工 半双工数据传输允许...

  • Zookeeper状态(02)单次触发器

    在深⼊讨论监视点之前,我们先了解⼀些术语。我们所说的事件(event)表⽰⼀个znode节点执⾏了更新操作。⽽⼀个...

  • click事件重复绑定

    重复绑定触发按钮 (点击此按钮两次及以上,即可触发重复绑定,再点击下面的按钮就可看到结果) click重复绑定测试...

  • JS的节流、防抖及使用场景

    防抖 在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时。 节流 规定在一个单位时间内,只能触发一次...

  • TCP的三次握手与四次挥手

    通常我们进行HTTP连接网络的时候会进行TCP的三次握手,然后传输数据,之后再释放连接。TCP传输如下图所示: T...

网友评论

      本文标题:AT32_ADC+DMA单次传输再触发

      本文链接:https://www.haomeiwen.com/subject/ocibgdtx.html