gd32f303 常规模式adc多通道采集中断
时间: 2023-06-15 08:03:12 浏览: 792
gd32f303 常规模式ADC多通道采集中断的实现步骤如下:
1. 初始化ADC模块,设置ADC时钟和采样时间等参数。
2. 配置ADC的多通道采集模式,设置采集通道和采集顺序等参数。
3. 配置ADC的中断模式,使能ADC中断,并设置中断优先级。
4. 实现ADC中断服务函数,在函数中读取ADC转换结果和通道号等信息。
5. 在主函数中启动ADC转换,并开启全局中断。
下面是一个示例代码,可以参考:
```c
#include "gd32f30x.h"
uint16_t adc_value[4];
void adc_config(void)
{
/* 使能GPIOA时钟 */
rcu_periph_clock_enable(RCU_GPIOA);
/* 使能ADC时钟 */
rcu_periph_clock_enable(RCU_ADC);
/* 配置PA0、PA1、PA2、PA3为模拟输入通道 */
gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3);
/* ADC时钟为PCLK2的2分频,即72/2=36MHz */
adc_clock_config(ADC_CLOCK_SYNC_MODE_NONE, ADC_CLOCK_PCLK2_DIV2);
/* ADC工作模式为常规模式 */
adc_mode_config(ADC_MODE_FREE);
/* ADC采样时间为239.5个周期 */
adc_regular_channel_config(0, ADC_CHANNEL_0, ADC_SAMPLETIME_239POINT5);
adc_regular_channel_config(1, ADC_CHANNEL_1, ADC_SAMPLETIME_239POINT5);
adc_regular_channel_config(2, ADC_CHANNEL_2, ADC_SAMPLETIME_239POINT5);
adc_regular_channel_config(3, ADC_CHANNEL_3, ADC_SAMPLETIME_239POINT5);
/* ADC多通道采集模式,采集4个通道,采集顺序为0123 */
adc_special_function_config(ADC_SCAN_MODE, ENABLE);
adc_special_function_config(ADC_CONTINUOUS_MODE, DISABLE);
adc_special_function_config(ADC_DATAALIGN_RIGHT, ENABLE);
adc_special_function_config(ADC_MULTIPLE_MODE, ENABLE);
adc_special_function_config(ADC_DMA_MODE, DISABLE);
adc_channel_length_config(ADC_REGULAR_CHANNEL, 4);
adc_regular_sequence_config(ADC_CHANNEL_0, ADC_CHANNEL_1, ADC_CHANNEL_2, ADC_CHANNEL_3);
/* ADC中断使能,优先级为0 */
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
nvic_irq_enable(ADC_COMP_IRQn, 0, 0);
adc_interrupt_enable(ADC_INT_EOC);
}
void ADC_COMP_IRQHandler(void)
{
if (RESET != adc_interrupt_flag_get(ADC_INT_FLAG_EOC)) {
adc_value[0] = adc_regular_data_read(ADC_CHANNEL_0);
adc_value[1] = adc_regular_data_read(ADC_CHANNEL_1);
adc_value[2] = adc_regular_data_read(ADC_CHANNEL_2);
adc_value[3] = adc_regular_data_read(ADC_CHANNEL_3);
adc_interrupt_flag_clear(ADC_INT_FLAG_EOC);
}
}
int main(void)
{
adc_config();
/* 启动ADC转换 */
adc_enable();
adc_software_trigger_enable(ADC_REGULAR_CHANNEL);
while(1) {
/* 等待ADC中断 */
}
}
```
在中断服务函数中,通过`adc_regular_data_read`函数读取ADC转换结果。在主函数中,启动ADC转换并等待中断即可。
阅读全文