gd32f303 ADC注入
时间: 2023-07-08 15:55:52 浏览: 265
GD32F303芯片的ADC模块支持注入模式,注入模式可以在常规模式下同时进行。注入模式允许在CPU的中断请求期间执行转换,并且可以使用DMA进行数据传输。以下是使用注入模式进行ADC采集的示例代码:
1. 配置ADC通道和注入通道
```c
/* 配置ADC通道 */
rcu_periph_clock_enable(RCU_ADC);
adc_deinit(ADC0);
adc_mode_config(ADC_MODE_FREE);
adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL, 1);
adc_inserted_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_239POINT5);
/* 配置注入通道 */
adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, ADC_EXTTRIG_INSERTED_NONE);
adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE);
```
2. 配置DMA传输
```c
dma_parameter_struct dma_init_struct;
dma_deinit(DMA1, DMA_CH1);
dma_struct_para_init(&dma_init_struct);
dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
dma_init_struct.memory_addr = (uint32_t)adc_value;
dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;
dma_init_struct.number = 1;
dma_init_struct.periph_addr = (uint32_t)&ADC_RDATA(ADC0);
dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
dma_init_struct.priority = DMA_PRIORITY_HIGH;
dma_init(DMA1, DMA_CH1, &dma_init_struct);
dma_circulation_enable(DMA1, DMA_CH1);
dma_channel_enable(DMA1, DMA_CH1);
```
3. 启动注入模式
```c
adc_software_trigger_enable(ADC0, ADC_INSERTED_CHANNEL);
```
4. 等待DMA传输完成
```c
while(!dma_flag_get(DMA1, DMA_CH1, DMA_FLAG_FTF));
```
在上述代码中,`adc_value`数组保存了ADC转换结果,`dma_init_struct`结构体配置了DMA传输参数,`dma_channel_enable`函数启动了DMA传输。启动注入模式后,ADC会自动执行转换并将结果存储在`adc_value`数组中,DMA传输完成后可以通过数组读取ADC转换结果。
阅读全文