GD32F450VI ADC转换笔记

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);
    }
}
© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容