GD32H757 ADC定时器触发+DMA配置代码

[复制链接]
1090|0
海滨消消 发表于 2025-8-29 16:56 | 显示全部楼层 |阅读模式
c
// 1. 初始化定时器(以TIMER1为例)
void timer_adc_trigger_init(void) {
    timer_parameter_struct timer_init_struct = {0};
    timer_oc_parameter_struct timer_oc_struct = {0};

    rcu_periph_clock_enable(RCU_TIMER1);
    timer_deinit(TIMER1);

    timer_init_struct.prescaler = 0; // 不分频
    timer_init_struct.period = 1000 - 1; // 假设APB2时钟为100MHz,则触发频率为100kHz
    timer_init_struct.counterdirection = TIMER_COUNTER_UP;
    timer_init(TIMER1, &timer_init_struct);

    // 配置定时器通道0为触发输出
    timer_oc_struct.outputstate = TIMER_CCX_ENABLE;
    timer_oc_struct.ocpolarity = TIMER_OC_POLARITY_HIGH;
    timer_channel_output_config(TIMER1, TIMER_CH_0, &timer_oc_struct);
    timer_channel_output_mode_config(TIMER1, TIMER_CH_0, TIMER_OC_MODE_PWM0);
    timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_0, 500); // 50%占空比

    // 配置定时器TRGO为更新事件
    timer_config(TIMER1, TIMER_CH_0, TIMER_OC_MODE_PWM0, 500);
    timer_auto_reload_shadow_enable(TIMER1);
    timer_enable(TIMER1);
}

// 2. 初始化ADC与DMA
void adc_dma_init(void) {
    adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_55POINT5);
    adc_external_trigger_source_config(ADC0, ADC_EXTTRIG_REGULAR_TIMER1_TRGO);
    adc_external_trigger_config(ADC0, ADC_EXTTRIG_REGULAR_ENABLE);
    adc_dma_mode_enable(ADC0);

    dma_parameter_struct dma_init_struct = {0};
    dma_deinit(DMA0, DMA_CH0);
    dma_init_struct.direction = DMA_PERIPH_TO_MEMORY;
    dma_init_struct.periph_addr = (uint32_t)&ADC_RDATA(ADC0);
    dma_init_struct.memory_addr = (uint32_t)adc_buffer;
    dma_init_struct.number = BUFFER_SIZE;
    dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
    dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;
    dma_init_struct.priority = DMA_PRIORITY_HIGH;
    dma_init(DMA0, DMA_CH0, &dma_init_struct);

    dma_interrupt_enable(DMA0, DMA_CH0, DMA_INT_FTF);
    nvic_irq_enable(DMA_Channel0_IRQn, 3, 0);

    dma_channel_enable(DMA0, DMA_CH0);
    adc_enable(ADC0);
    adc_calibration_enable(ADC0);
}

// 3. 主函数
int main(void) {
    rcu_system_clock_config(RCU_CKSYSSRC_HXTAL, RCU_CKSYS_DIV1); // 假设系统时钟已配置
    timer_adc_trigger_init();
    adc_dma_init();

    while(1) {
        if(data_ready_flag) {
            SCB_InvalidateDCache_by_Addr((uint32_t*)adc_buffer, BUFFER_SIZE * sizeof(uint16_t));
            // 处理adc_buffer中的数据
            data_ready_flag = 0;
        }
    }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

275

主题

1988

帖子

2

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