ADC_FLAG_EOC = End Of Conversion(转换结束标志)
这个标志位表示ADC常规通道的转换已经完成,可以读取转换结果了。
标志位特性
特性 | 说明 |
---|---|
置位条件 | 常规通道序列中所有通道转换完成 |
清除方式 | 需要软件手动清除 |
读取时机 | 转换完成后立即置位 |
中断关联 | 可以产生EOC中断 |
// 1. 配置并触发ADC转换
adc_software_trigger_enable(ADC0, ADC_ROUTINE_CHANNEL);
// 2. 等待转换完成
while(!adc_flag_get(ADC0, ADC_FLAG_EOC)) {
// 在这里等待…
}
// 此时EOC标志=1,表示所有通道都已转换完成
// 3. 读取转换数据
uint16_t data = adc_routine_data_read(ADC0);
// 4. 清除标志位(重要!)
adc_flag_clear(ADC0, ADC_FLAG_EOC);
基本用法
uint16_t Read_ADC_Channel(uint8_t channel)
{
// 配置单通道
adc_routine_channel_config(ADC0, 0, channel, ADC_SAMPLETIME_15);
adc_routine_channel_length_config(ADC0, 1);
//配置多个通道时
//adc_routine_channel_config(ADC0, 0, channel, ADC_SAMPLETIME_15);
//adc_routine_channel_config(ADC0, 1, channel, ADC_SAMPLETIME_15);
// adc_routine_channel_length_config(ADC0, 2);
// 触发转换
adc_software_trigger_enable(ADC0, ADC_ROUTINE_CHANNEL);
// 等待转换完成
uint32_t timeout = 100000;
while(!adc_flag_get(ADC0, ADC_FLAG_EOC)) {
if (timeout– == 0) {
return 0xFFFF; // 超时错误
}
}
// 读取数据
uint16_t result = adc_routine_data_read(ADC0);
// 清除标志
adc_flag_clear(ADC0, ADC_FLAG_EOC);
return result;
}
void Test_ADC_Read_Mechanism(void) { // 配置3个不同通道 adc_routine_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_15); adc_routine_channel_config(ADC0, 1, ADC_CHANNEL_1, ADC_SAMPLETIME_15); adc_routine_channel_config(ADC0, 2, ADC_CHANNEL_2, ADC_SAMPLETIME_15); adc_routine_channel_length_config(ADC0, 3); // 给不同通道施加不同电压以便区分 // 假设:通道0=1.0V, 通道1=2.0V, 通道2=3.0V adc_software_trigger_enable(ADC0, ADC_ROUTINE_CHANNEL); while(!adc_flag_get(ADC0, ADC_FLAG_EOC)); // 三次读取会得到不同的值 uint16_t read1 = adc_routine_data_read(ADC0); // 应该是通道0的值(约1.0V对应值) uint16_t read2 = adc_routine_data_read(ADC0); // 应该是通道1的值(约2.0V对应值) uint16_t read3 = adc_routine_data_read(ADC0); // 应该是通道2的值(约3.0V对应值) printf("Read1: %d (CH0) ", read1); printf("Read2: %d (CH1) ", read2); printf("Read3: %d (CH2) ", read3); adc_flag_clear(ADC0, ADC_FLAG_EOC); }
中断模式使用
GD32F4xx的ADC有一个数据指针,它:
初始指向第一个转换结果
每次读取后自动递增指向下一个数据
所有数据读取完成后复位到起始位置
=====================================================
验证示例
// 初始化时使能EOC中断 void ADC_Interrupt_Init(void) { // 使能EOC中断 adc_interrupt_enable(ADC0, ADC_INT_EOC); // 配置NVIC nvic_irq_enable(ADC_IRQn, 0, 0); } // ADC中断服务函数 void ADC_IRQHandler(void) { if (adc_flag_get(ADC0, ADC_FLAG_EOC)) { // 常规通道转换完成 uint16_t adc_value = adc_routine_data_read(ADC0); // 处理ADC数据 Process_ADC_Data(adc_value); // 清除标志 adc_flag_clear(ADC0, ADC_FLAG_EOC); } if (adc_flag_get(ADC0, ADC_FLAG_EIC)) { // 插入通道转换完成 adc_flag_clear(ADC0, ADC_FLAG_EIC); } }
暂无评论内容