STM32 ADC规则与注入通道全解析

一、基本概念区别

规则通道 (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路)

使用注入通道当:

  • 需要紧急处理或高优先级采集

  • 采集关键安全参数(过流、过压等)

  • 需要精确同步采集多路信号

  • 需要独立存储转换结果

七、注意事项

  1. 资源限制:注入通道数量有限(通常4个),需合理分配

  2. 中断冲突:注意EOC和JEOC中断的优先级设置

  3. 时序考虑:注入转换会延迟规则转换,影响整体采样率

  4. 功耗影响:频繁的注入转换会增加系统功耗

八、典型应用架构

复制代码
系统架构示例:
┌─────────────────────────────────────┐
│         ADC采集系统                 │
├─────────────────────────────────────┤
│ 规则通道组(常规监测)              │
│  - 通道1: 环境温度                  │
│  - 通道2: 环境湿度                  │
│  - 通道3: 电池电压                  │
│  - 通道4: 系统压力                  │
│  (定时触发,DMA传输)                │
├─────────────────────────────────────┤
│ 注入通道组(紧急事件)              │
│  - 注入1: 过流检测 ← 外部中断触发   │
│  - 注入2: 过压检测 ← 外部中断触发   │
│  - 注入3: 紧急温度 ← 比较器触发     │
│  (事件触发,中断处理)                │
└─────────────────────────────────────┘

通过合理配置规则通道和注入通道,可以在STM32中构建高效、可靠的数据采集系统,兼顾常规监测和紧急事件处理需求。

相关推荐
小李做物联网1 小时前
52.1基于单片机stm32物联网嵌入式项目程序开发智体重秤体脂系统
stm32·单片机·嵌入式硬件·物联网·课程设计
阿容12345612 小时前
stm32两轮平衡小车 -04
stm32·嵌入式硬件
silno15 小时前
图解 STM32 USB CDC虚拟串口 的实现
stm32·单片机·stm32f103c8t6·cdc虚拟串口
唐·柯里昂79816 小时前
野火鲁班猫5使用正点原子 RTL8188EUS Wifi模块驱动移植(Linux5.10 Debian系统) 解决zsh报错
linux·c语言·mcu·物联网·ubuntu·硬件工程·软件构建
远创智控研发五部17 小时前
工业级跨协议互通:网关实现 Alicat 流量计与 1500PLC ProfiNet-EtherNet/IP 通讯
数据采集·工业物联网·西门子plc·工业自动化·质量流量计
一枝小雨18 小时前
7 App代码转AES加密文件生成步骤
stm32·单片机·嵌入式·aes·ota·bootloader·加密升级
云山工作室20 小时前
基于ZigBee的温室智能控制系统设计(论文+源码)
stm32·单片机·嵌入式硬件·物联网·课程设计
IT_阿水20 小时前
基于STM32的智慧物联网系统板
stm32·物联网·perl
Bigan(安)20 小时前
【奶茶Beta专项】【LVGL9.4源码分析】03-显示框架-display
linux·c语言·mcu·arm·unix