- #define BUFFER_SIZE 512
- #define ADC_CHANNEL_CNT 3
- #define DMA_BUFFER_SIZE (ADC_CHANNEL_CNT * BUFFER_SIZE)
- 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_HTF);
- nvic_irq_enable(DMA1_Channel0_IRQn, 1, 0);
- }
- void TIMER1_IRQHandler(void)
- {
- if (SET == timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_UP)) {
- // __disable_irq();
- uint16_t *active_buffer = (dma_current_buffer == 0) ? adc_buffer1 : adc_buffer0;
- if (sample_Flag == 0) {
- sample_Flag = 1;
- sample_count = 0;
- }
- if (sample_Flag == 1 && buffer_ready_flag) {
- buffer_ready_flag = 0;
- for (int i = 0; i < BUFFER_SIZE; i++) {
- adc_table.CurVol[sample_count].cur = active_buffer[i * 3 + 0] - active_buffer[i * 3 + 2];
- adc_table.CurVol[sample_count].vol = active_buffer[i * 3 + 1] - active_buffer[i * 3 + 2];
- sample_count++;
- }
- if (sample_count >= 512) {
- sample_Flag = 2; // 表示采集完了
- sample_count = 0;
- }
- }
- // __enable_irq();
- T_counts++;
- timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_UP);
- }
- }
- void DMA1_Channel0_IRQHandler(void)
- {
- if (dma_interrupt_flag_get(DMA1, DMA_CH0, DMA_INT_FLAG_HTF)==SET) {
- dma_interrupt_flag_clear(DMA1, DMA_CH0, DMA_INT_FLAG_HTF);
- dma_current_buffer = (dma_current_buffer == 0) ? 1 : 0;
- buffer_ready_flag = 1;
- }
- }
能不能不要删帖子了,为什么adc_buffer0值可以更新,buffer1值不能更新?
|