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;
}
}
} |