一、基本概念区别
规则通道 (Regular Channels)
-
连续性转换:用于常规、连续的ADC转换
-
单一数据寄存器:所有规则通道共享一个数据寄存器(ADC_DR)
-
队列结构:按预设顺序依次转换
-
典型用途:周期性数据采集、多路传感器轮询
注入通道 (Injected Channels)
-
插入式转换:可打断规则通道转换,具有更高优先级
-
独立数据寄存器:每个注入通道有独立的JDRx寄存器(JDR1-4)
-
灵活性高:可配置触发条件和转换序列
-
典型用途:紧急事件处理、关键参数采集
二、技术特性对比
| 特性 | 规则通道 | 注入通道 |
|---|---|---|
| 通道数量 | 最多16个 | 最多4个 |
| 数据寄存器 | 共用1个DR | 每个通道独立JDR |
| 触发方式 | 软件/硬件触发 | 软件/硬件/自动注入 |
| 中断 | EOC(转换结束) | JEOC(注入转换结束) |
| 优先级 | 低 | 高(可打断规则转换) |
| DMA支持 | 支持 | 不支持 |
三、具体应用场景
规则通道适用场景:
// 例:多路温度传感器轮询
// 配置规则通道序列:通道1,2,3,4循环采集
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_84Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_84Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_84Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 4, ADC_SampleTime_84Cycles);
// 使用DMA自动传输数据
注入通道适用场景:
// 例:过流保护中断采集
// 当发生过流事件时,立即采集关键参数
void EXTI_IRQHandler(void) {
if(EXTI_GetITStatus(OVERCURRENT_EXTI_LINE)) {
ADC_SoftwareStartInjectedConv(ADC1); // 软件触发注入转换
// 注入通道配置了电流、电压关键参数
}
}
四、实际使用示例
混合配置示例:
// 1. 初始化ADC
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InjectedInitTypeDef ADC_InjectedInitStructure;
// 2. 配置规则通道(常规采集)
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 1, ADC_SampleTime_56Cycles); // 温度
ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 2, ADC_SampleTime_56Cycles); // 压力
// 3. 配置注入通道(紧急参数)
ADC_InjectedInitStructure.ADC_InjectedChannel = ADC_Channel_0; // 电流检测
ADC_InjectedInitStructure.ADC_InjectedRank = 1;
ADC_InjectedInitStructure.ADC_InjectedSamplingTime = ADC_SampleTime_28Cycles;
ADC_InjectedInitStructure.ADC_InjectedOffset = 0;
ADC_InjectedInitStructure.ADC_InjectedNbrOfConversion = 1;
ADC_InjectedInit(ADC1, &ADC_InjectedInitStructure);
// 4. 配置触发源
// 规则通道:定时器3触发,每10ms一次
ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_TRGO;
// 注入通道:外部中断触发(紧急事件)
ADC_ExternalTrigInjectedConv = ADC_ExternalTrigInjectedConv_Ext_IT15;
五、注入通道的独特功能
1. 自动注入模式
// 规则通道组转换完成后自动启动注入组
ADC_InjectedSequencerLengthConfig(ADC1, 2); // 2个注入通道
ADC_AutoInjectedConvCmd(ADC1, ENABLE); // 启用自动注入
2. 转换打断与恢复
-
注入转换可打断正在进行的规则转换
-
注入完成后自动恢复规则转换
-
数据不会丢失或混淆
3. 数据偏移功能
// 为注入通道设置数据偏移(用于比较)
ADC_SetInjectedOffset(ADC1, ADC_InjectedChannel_1, 2048); // 设置偏移值
六、选择建议
使用规则通道当:
-
需要连续、周期性采集多路信号
-
使用DMA进行高效数据传输
-
采集非关键性监测数据
-
需要较长的转换序列(>4路)
使用注入通道当:
-
需要紧急处理或高优先级采集
-
采集关键安全参数(过流、过压等)
-
需要精确同步采集多路信号
-
需要独立存储转换结果
七、注意事项
-
资源限制:注入通道数量有限(通常4个),需合理分配
-
中断冲突:注意EOC和JEOC中断的优先级设置
-
时序考虑:注入转换会延迟规则转换,影响整体采样率
-
功耗影响:频繁的注入转换会增加系统功耗
八、典型应用架构
系统架构示例:
┌─────────────────────────────────────┐
│ ADC采集系统 │
├─────────────────────────────────────┤
│ 规则通道组(常规监测) │
│ - 通道1: 环境温度 │
│ - 通道2: 环境湿度 │
│ - 通道3: 电池电压 │
│ - 通道4: 系统压力 │
│ (定时触发,DMA传输) │
├─────────────────────────────────────┤
│ 注入通道组(紧急事件) │
│ - 注入1: 过流检测 ← 外部中断触发 │
│ - 注入2: 过压检测 ← 外部中断触发 │
│ - 注入3: 紧急温度 ← 比较器触发 │
│ (事件触发,中断处理) │
└─────────────────────────────────────┘
通过合理配置规则通道和注入通道,可以在STM32中构建高效、可靠的数据采集系统,兼顾常规监测和紧急事件处理需求。