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


















暂无评论内容