我进行adc电压电流采样,想用双缓冲进行配置,目前adc_buffer0 里面数据实时更新,但是进不去中断,把初始化的DMA_INT_FLAG_FTF改成DMA_INT_FLAG_HTF 又可以进入中断了。这是为什么?
- #define BUFFER_SIZE 512
- #define ADC_CHANNEL_CNT 3
- #define DMA_BUFFER_SIZE (ADC_CHANNEL_CNT * BUFFER_SIZE)
- void User_ADC_Init(void)
- {
- /* 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_ROUTINE_CHANNEL, 3);
- /* ADC regular channel config */
- adc_routine_channel_config(ADC0, 0, ADC_CHANNEL_13, ADC_SAMPLETIME_15);/* 电流采样 */
- adc_routine_channel_config(ADC0, 1, ADC_CHANNEL_11, ADC_SAMPLETIME_15);/* 电压采样 */
- adc_routine_channel_config(ADC0, 2, ADC_CHANNEL_12, ADC_SAMPLETIME_15);/* 参考电压1.65V采样 */
- /* ADC trigger config */
- adc_external_trigger_source_config(ADC0, ADC_ROUTINE_CHANNEL, ADC_EXTTRIG_ROUTINE_T0_CH0); ////////ADC_EXTTRIG_ROUTINE_T0_CH0
- adc_external_trigger_config(ADC0, ADC_ROUTINE_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 */
- delay1ms(2);
- /* ADC calibration and reset calibration */
- adc_calibration_enable(ADC0);
-
- /* enable ADC software trigger */
- adc_software_trigger_enable(ADC0, ADC_ROUTINE_CHANNEL);
- }
- uint16_t adc_buffer0[DMA_BUFFER_SIZE];
- uint16_t adc_buffer1[DMA_BUFFER_SIZE];
- void User_DMA_Init(void)
- {
- dma_single_data_parameter_struct dma_init_struct;
- dma_deinit(DMA1, DMA_CH0);
- dma_init_struct.periph_addr = (uint32_t)&ADC_RDATA(ADC0);
- dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
- dma_init_struct.memory0_addr = (uint32_t)&adc_buffer0[0];
- dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
- dma_init_struct.periph_memory_width = DMA_PERIPH_WIDTH_16BIT;
- dma_init_struct.direction = DMA_PERIPH_TO_MEMORY;
- dma_init_struct.number = ADC_CHANNEL_CNT * BUFFER_SIZE;
- dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
- dma_single_data_mode_init(DMA1, DMA_CH0, &dma_init_struct);
- dma_channel_subperipheral_select(DMA1, DMA_CH0, DMA_SUBPERI0);
- /* 启用双缓冲 */
- dma_memory_address_config(DMA1, DMA_CH0, (uint32_t)&adc_buffer1[0], DMA_MEMORY_1);
- dma_switch_buffer_mode_enable(DMA1, DMA_CH0, ENABLE);
- dma_circulation_disable(DMA1, DMA_CH0);
- dma_channel_enable(DMA1, DMA_CH0);
- /* 开启DMA传输完成中断 */
- dma_interrupt_enable(DMA1, DMA_CH0, DMA_INT_FLAG_FTF);
- nvic_irq_enable(DMA1_Channel0_IRQn, 1, 0);
- }
- void DMA1_Channel0_IRQHandler(void)
- {
- if (dma_interrupt_flag_get(DMA1, DMA_CH0, DMA_INT_FLAG_FTF)==SET) {
- dma_interrupt_flag_clear(DMA1, DMA_CH0, DMA_INT_FLAG_FTF);
- dma_current_buffer = (dma_current_buffer == 0) ? 1 : 0;
- buffer_ready_flag = 1;
- }
- }
|