以下是STM32F103RC中ADC1和ADC2通道复用的示意图及文字说明,帮助直观理解这种共享关系:
ADC1/ADC2引脚复用示意图
GPIO引脚 ADC1通道 ADC2通道
┌─────────┐ ┌─────────┐ ┌─────────┐
│ PA0 ├───┤ ADC1_IN0├─┬─┤ ADC2_IN0│
├─────────┤ ├─────────┤ │ ├─────────┤
│ PA1 ├───┤ ADC1_IN1├─┬─┤ ADC2_IN1│
├─────────┤ ├─────────┤ │ ├─────────┤
│ ... │ │ ... │ │ │ ... │
├─────────┤ ├─────────┤ │ ├─────────┤
│ PC5 ├───┤ADC1_IN15├─┬─┤ADC2_IN15│
└─────────┘ └─────────┘ │ └─────────┘
│
内部信号通道 │
┌─────────────────────┐ │
│ ADC1_IN16 (温度传感器)│ │
├─────────────────────┤ │
│ ADC1_IN17 (VREFINT) │ │
└─────────────────────┘ │
│
│
┌─────────────────────┐ │
│ ADC2_IN16 (温度传感器├───┘
├─────────────────────┤
│ ADC2_IN17 (VREFINT) │
└─────────────────────┘
以下是用简单示意图来帮助理解STM32F103RC的ADC1和ADC2外部通道与GPIO引脚关系:
整体框架图
+---------------------+
| STM32F103RC芯片 |
+---------------------+
|
| (内部连接)
|
+---------------------+
| ADC1模块 |
+---------------------+
|
| (复用连接)
|
+---------------------+
| GPIO引脚组(PA0 - PC5)|
+---------------------+
|
| (复用连接)
|
+---------------------+
| ADC2模块 |
+---------------------+
具体通道对应关系展开图
GPIO引脚 | ADC1通道 | ADC2通道 |
---|---|---|
PA0 | IN0 | IN0 |
PA1 | IN1 | IN1 |
PA2 | IN2 | IN2 |
PA3 | IN3 | IN3 |
PA4 | IN4 | IN4 |
PA5 | IN5 | IN5 |
PA6 | IN6 | IN6 |
PA7 | IN7 | IN7 |
PB0 | IN8 | IN8 |
PB1 | IN9 | IN9 |
PC0 | IN10 | IN10 |
PC1 | IN11 | IN11 |
PC2 | IN12 | IN12 |
PC3 | IN13 | IN13 |
PC4 | IN14 | IN14 |
PC5 | IN15 | IN15 |
这表示STM32F103RC芯片内,ADC1和ADC2的16个外部通道(IN0 - IN15 )在物理上都连接到了PA0 - PC5这些GPIO引脚上,在使用时可根据需求配置这些引脚作为ADC通道来采集模拟信号 。
关键点解析
-
外部通道共享
- 每个GPIO引脚(如PA0)同时连接到ADC1和ADC2的对应通道。
- 例如:PA0同时是
ADC1_IN0
和ADC2_IN0
,但同一时间只能被一个ADC模块采样。
-
内部通道独立
- 温度传感器(IN16)和内部参考电压(IN17)在ADC1和ADC2中逻辑上独立,但物理上来自同一个传感器源。
-
冲突示例
- 若同时配置
ADC1_IN0
和ADC2_IN0
采样PA0,会导致硬件竞争,结果不可预测。
- 若同时配置
实际电路等效模型
PA0引脚
│
├───[ADC1 MUX]─── ADC1_IN0
│
└───[ADC2 MUX]─── ADC2_IN0
- MUX(多路复用器):STM32内部通过电子开关切换ADC1或ADC2连接到引脚。
使用规则总结
-
允许的操作
- ADC1采样PA0,ADC2采样PA1(不同引脚)。
- ADC1和ADC2分时复用PA0(非同步)。
-
禁止的操作
- ADC1和ADC2同时采样PA0(硬件冲突)。
- ADC1和ADC2同时启用扫描模式并包含同一引脚。
代码示例(安全用法)
// 安全配置:ADC1用PA0,ADC2用PA1
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); // PA0
ADC_RegularChannelConfig(ADC2, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5); // PA1
// 危险配置(冲突!)
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); // PA0
ADC_RegularChannelConfig(ADC2, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); // PA0
通过这种共享设计,STM32在有限的引脚下实现了多ADC灵活性,但需开发者注意合理分配资源。