CH32V003F4 标称 18 个 IO,能自由用的只有 16 个
这几天在给一块小板子挑型号,CH32V003F4P6 看着挺合适:TSSOP20、48 MHz、16 KB Flash、两毛钱。我查看引脚表,准备排一下要接的东西——三个按键、一个 I2C 传感器、一路串口、一路 PWM。
看到第三列就发现不对劲了:
- 官方宣传页写「18 个 I/O 口,映像一个外部中断」。18 个我是信的,但 18 个脚分布在PA / PC / PD三个口上,而PA 口只有 PA1 和 PA2 两个脚——PA0、PA3 到 PA7 全都不存在。
- 「映像一个外部中断」这句话我一开始以为写错了。翻到 EXTI 章节才发现更别扭:它有 8 条边沿检测线,但 8 条线共用一个中断入口,而且同一个线号在三个端口之间只能选一个。
- 更麻烦的是封装。同一颗芯片四种封装,GPIO 数是18 / 18 / 14 / 6——SOP16 少 4 个,SOP8 直接少 12 个。少的不是随机几个,少的正好是PC5(SPI 的 SCK),所以SOP16 和 SOP8 根本没有 SPI。
这篇就是我把数据手册查看了一遍后,整理出来的引脚账。全是手册和源码里查得到、可以自己复核的东西。
一、18 个 IO 的功能
先看这 18 个引脚的功能。下表是 V003 能做到的、和"脚"直接相关的事,以及每件事要吃几个脚:
| 想做的事 | 大概要几个脚 | 靠什么 |
|---|---|---|
| 点灯、驱动继电器、读按键 | 1 个脚 / 一路 | GPIO 推挽输出、上拉输入 |
| 串口和电脑通信 | 2 个(TX/RX) | USART1,有 4 种引脚组合 |
| 接 EEPROM、OLED、传感器 | 2 个(SCL/SDA) | I2C1,有 3 种引脚组合 |
| 接 Flash、LCD、SD 卡 | 3~4 个 | SPI1,只有 20 脚印出来 |
| 采集电压、电位器、NTC | 1 个脚 / 一路 | ADC,最多 8 路外部通道 |
| 放大/比较小信号 | 2~3 个 | 内置 OPA/比较器 |
| 调光、调速、控电机 | 1~6 个 | TIM1 互补 PWM + 死区 |
| 按键立刻响应、低功耗唤醒 | 1 个脚 / 一路 | EXTI,最多 8 条线 |
| 红外接收、测转速、读编码器 | 1~2 个 | 输入捕获 / 计数器 |
| 软件模拟任何时序(单总线、WS2812) | 1 个脚 | 纯 GPIO 翻转 |
看起来不少。但要注意:这些能力不是各自独占一堆脚,而是全都挤在同样那 18 个脚上互相抢。比如串口默认的 PD5/PD6,同时也是 ADC 的 A5/A6;I2C 的 PC2 同时是 TIM1 的刹车输入;OPA 的正输入 OPP1 干脆就长在复位脚 PD7 上。
所以 V003 的引脚问题不是"够不够多",而是**“能不能同时要”**。往下看就明白了。
二、18 个引脚在哪
三个端口,数量极不均匀:
| 端口 | 有哪些脚 | 数量 | 备注 |
|---|---|---|---|
| PA | PA1、PA2 | 2 | 没有 PA0,也没有 PA3~PA7 |
| PC | PC0~PC7 | 8 | 完整 8 位 |
| PD | PD0~PD7 | 8 | 完整 8 位 |
PA 口只有两个脚,这不是我漏抄——数据手册的引脚表里 PA 就只有这两位。它们同时是外部晶振的 OSCI/OSCO,也是 ADC 的 A1/A0,还是 OPA 的负/正输入。
18 个 pad 的完整档案:
| Pad | 复位后的主功能 | 默认复用功能 | 5V 容忍 |
|---|---|---|---|
| PA1 | PA1 | A1 / T1CH2 / OSCI / OPN0 | 否 |
| PA2 | PA2 | A0 / T1CH2N / OSCO / OPP0 | 否 |
| PC0 | PC0 | T2CH3 / UTX_3 / NSS_1 / T1CH3_1 | 否 |
| PC1 | PC1 | SDA/ NSS / T1BKIN_1 / T2CH4_1 / URX_3 | 是(FT) |
| PC2 | PC2 | SCL/ URTS / T1BKIN / T2CH2_1 / AETR_1 | 是(FT) |
| PC3 | PC3 | T1CH3 / T1CH1N_1 / UCTS_1 | 否 |
| PC4 | PC4 | A2 / T1CH4 / MCO / T1CH2N_1 | 否 |
| PC5 | PC5 | SCK/ T1ETR / T1CH3_3 / SCL_2 | 是(FT) |
| PC6 | PC6 | MOSI/ T1CH1_1 / UCTS_2 / SDA_2 | 是(FT) |
| PC7 | PC7 | MISO/ T1CH2_1 / T2CH2_3 / URTS_2 | 否 |
| PD0 | PD0 | T1CH1N / UTX_1 / SDA_1 / OPN1 | 否 |
| PD1 | PD1 | SWIO/ T1CH3N / AETR2 / URX_1 / SCL_1 | 否 |
| PD2 | PD2 | A3 / T1CH1 / T2CH3_1 | 否 |
| PD3 | PD3 | A4 / AETR / T1CH4_1 / T2CH2_2 / UCTS | 否 |
| PD4 | PD4 | A7 / T2CH1ETR / UCK / OPO | 否 |
| PD5 | PD5 | A5 /UTX/ T2CH4_3 | 否 |
| PD6 | PD6 | A6 /URX/ T2CH3_3 | 否 |
| PD7 | PD7 | NRST/ T2CH4 / UCK_1 / OPP1 | 否 |
一个很多人不知道的点:数据手册的绝对最大额定值表写得很清楚——
- FT(5V 容忍)引脚:输入电压 −0.3 ~5.5 V
- 其他引脚:输入电压 −0.3 ~VDD + 0.3 V
而引脚表里标了 FT 的只有PC1、PC2、PC5、PC6这 4 个(正好是 I2C 和 SPI 那几根线)。所以在 3.3 V 供电时,剩下 14 个脚都不是 5V 容忍的,直接接 5 V 信号源会顶到 ESD 二极管上,靠串限流电阻赌运气。网上"V003 全脚 5V 容忍"的说法,和手册这张表对不上。
三、四种封装各自砍掉了什么
这颗芯片有四个型号,资源和封装如下(数据来自数据手册的型号资源表):
| 型号 | 封装 | 引脚数 | GPIO | ADC 通道 | SPI | I2C | USART |
|---|---|---|---|---|---|---|---|
| CH32V003F4P6 | TSSOP20 | 20 | 18 | 8 | 1 | 1 | 1 |
| CH32V003F4U6 | QFN20 | 20 | 18 | 8 | 1 | 1 | 1 |
| CH32V003A4M6 | SOP16 | 16 | 14 | 6 | 无 | 1 | 1 |
| CH32V003J4M6 | SOP8 | 8 | 6 | 6 | 无 | 1 | 1 |
缺的不是随便砍的,缺的是特定的 pad:
| 封装 | 少了哪些 pad | 后果 |
|---|---|---|
| TSSOP20 / QFN20 | 一个不少 | 18 个全给 |
| SOP16 | PC5、PD0、PD2、PD3 | 少了 PC5 =没有 SCK,SPI 直接没了 |
| SOP8 | 除 PD6/PA2/PC1/PC2/PC4/PD1 外全部 | 只剩 6 个,连复位脚都没有 |
SOP16 为什么没有 SPI
这个值得单独说,因为它经常被误解成"资源表印错了"。
V003 的 SPI1 引脚是固定的一组:SCK=PC5、MOSI=PC6、MISO=PC7、NSS=PC1。而 SPI 的重映射(GPIO_Remap_SPI1)只把 NSS 从 PC1 挪到 PC0,SCK/MOSI/MISO 三个一动不动。
SOP16 恰好没有 PC5。SCK 无处可去 → SPI 用不了 → 资源表老老实实写-。
对比一下 20 脚封装:SCK/MOSI/MISO 一个不少,所以 SPI 能用。这就是"同一颗芯片,换个封装少个外设"的真实原因——不是外设被裁了,是它的时钟脚没引出来。
SOP8 那 6 个脚
J4M6 的引出脚(两处独立来源交叉核对的结果):
| 脚号 | Pad | 说明 |
|---|---|---|
| 1 | PD6 | 也是 ADC A6、USART RX |
| 2 | VSS | 地 |
| 3 | PA2 | 也是 ADC A0、OSC |
| 4 | VDD | 电源 |
| 5 | PC1 | I2C SDA(FT) |
| 6 | PC2 | I2C SCL(FT) |
| 7 | PC4 | ADC A2 |
| 8 | PD1 | SWIO,下载调试就靠它 |
这 6 个脚带来两个后果,都挺硬:
- 没有 NRST。SOP8 上根本没有复位脚,复位只能靠上电复位(POR)或者软件复位,想加个复位按键都没地方接。
- 默认的串口 TX(PD5)没引出来。剩下 6 个脚里没有 PD5,而 USART 的另外几种重映射落点(PD0、PC0)也都没引出。所以SOP8 上串口实际只能收(PD6),发不出去——要用 TX 只能软件模拟,或者换封装。这条是我按封装图推出来的,务必自己再核一遍。
20 脚的两种封装
TSSOP20 和 QFN20 的pad 完全一样,只是引脚排列不同(QFN 的 VSS 是 4 号脚 + 背面散热焊盘)。所以从 TSSOP20 换到 QFN20,代码一行不用改,只改 PCB。
四、脚号对照
画板子和查原理图时最常翻的就是这张表。空着的格子表示这个封装没有这个 pad。
| Pad | SOP16 | TSSOP20 | QFN20 |
|---|---|---|---|
| PA1 | 12 | 5 | 2 |
| PA2 | 13 | 6 | 3 |
| PC0 | 16 | 10 | 7 |
| PC1 | 1 | 11 | 8 |
| PC2 | 2 | 12 | 9 |
| PC3 | 3 | 13 | 10 |
| PC4 | 4 | 14 | 11 |
| PC5 | — | 15 | 12 |
| PC6 | 5 | 16 | 13 |
| PC7 | 6 | 17 | 14 |
| PD0 | — | 8 | 5 |
| PD1 | 7 | 18 | 15 |
| PD2 | — | 19 | 16 |
| PD3 | — | 20 | 17 |
| PD4 | 8 | 1 | 18 |
| PD5 | 9 | 2 | 19 |
| PD6 | 10 | 3 | 20 |
| PD7 | 11 | 4 | 1 |
| VDD | 15 | 9 | 6 |
| VSS | 14 | 7 | 4(+EP) |
注意三件事:
- 引脚排列不是按端口顺序来的。TSSOP20 的 1 号脚是 PD4,20 号脚是 PD3,中间夹着 PA1/PA2/VDD/VSS——完全不是 PA 一段、PC 一段的直观排法。
- QFN20 的 4 号脚是 VSS,而且背面还有一片散热焊盘(EP),通常也要接地。只接 4 号脚、把 EP 悬空,是 QFN 封装最常见的翻车方式。
- SOP16 的 1、2 号脚是 PC1 和 PC2,正好是 I2C。想用 SOP16 接 I2C 传感器,这两根线挨在一起,走线很省事——这是 SOP16 唯一的"引脚友好"之处。
五、看其余引脚
"18 个 IO"是芯片内部的 pad 数,不是你能随便用的数。有三个脚有特殊身份:
1. PD1 = SWIO(单线调试/下载)
V003 没有 JTAG,也没有 SWD 的两根线,只有一根SWIO,就长在 PD1 上。WCH-Link 靠这根线下载和调试。
- 想拿 PD1 当普通 IO?库里有开关:
GPIO_PinRemapConfig(GPIO_Remap_SDI_Disable, ENABLE)。 - 但关了之后WCH-Link 就再也连不上了,除非你手里有"上电瞬间抢占"的办法。实际项目里 PD1 就当它是死的。
2. PD7 = NRST(复位)
PD7 复位后的主功能就是 NRST。它同时也是 TIM2 的 CH4、OPA 的正输入 1。
- V003 的库头