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 脚印出来采集电压、电位器、NTC1 个脚 / 一路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 个引脚在哪三个端口,数量极不均匀:端口有哪些脚数量备注PAPA1、PA22没有 PA0,也没有 PA3~PA7PCPC0~PC78完整 8 位PDPD0~PD78完整 8 位PA 口只有两个脚,这不是我漏抄——数据手册的引脚表里 PA 就只有这两位。它们同时是外部晶振的 OSCI/OSCO,也是 ADC 的 A1/A0,还是 OPA 的负/正输入。18 个 pad 的完整档案:Pad复位后的主功能默认复用功能5V 容忍PA1PA1A1 / T1CH2 / OSCI / OPN0否PA2PA2A0 / T1CH2N / OSCO / OPP0否PC0PC0T2CH3 / UTX_3 / NSS_1 / T1CH3_1否PC1PC1SDA/ NSS / T1BKIN_1 / T2CH4_1 / URX_3是(FT)PC2PC2SCL/ URTS / T1BKIN / T2CH2_1 / AETR_1是(FT)PC3PC3T1CH3 / T1CH1N_1 / UCTS_1否PC4PC4A2 / T1CH4 / MCO / T1CH2N_1否PC5PC5SCK/ T1ETR / T1CH3_3 / SCL_2是(FT)PC6PC6MOSI/ T1CH1_1 / UCTS_2 / SDA_2是(FT)PC7PC7MISO/ T1CH2_1 / T2CH2_3 / URTS_2否PD0PD0T1CH1N / UTX_1 / SDA_1 / OPN1否PD1PD1SWIO/ T1CH3N / AETR2 / URX_1 / SCL_1否PD2PD2A3 / T1CH1 / T2CH3_1否PD3PD3A4 / AETR / T1CH4_1 / T2CH2_2 / UCTS否PD4PD4A7 / T2CH1ETR / UCK / OPO否PD5PD5A5 /UTX/ T2CH4_3否PD6PD6A6 /URX/ T2CH3_3否PD7PD7NRST/ 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 容忍"的说法,和手册这张表对不上。三、四种封装各自砍掉了什么这颗芯片有四个型号,资源和封装如下(数据来自数据手册的型号资源表):型号封装引脚数GPIOADC 通道SPII2CUSARTCH32V003F4P6TSSOP2020188111CH32V003F4U6QFN2020188111CH32V003A4M6SOP1616146无11CH32V003J4M6SOP8866无11缺的不是随便砍的,缺的是特定的 pad:封装少了哪些 pad后果TSSOP20 / QFN20一个不少18 个全给SOP16PC5、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说明1PD6也是 ADC A6、USART RX2VSS地3PA2也是 ADC A0、OSC4VDD电源5PC1I2C SDA(FT)6PC2I2C SCL(FT)7PC4ADC A28PD1SWIO,下载调试就靠它这 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。PadSOP16TSSOP20QFN20PA11252PA21363PC016107PC11118PC22129PC331310PC441411PC5—1512PC651613PC761714PD0—85PD171815PD2—1916PD3—2017PD48118PD59219PD610320PD71141VDD1596VSS1474(+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 的库头
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 脚印出来采集电压、电位器、NTC1 个脚 / 一路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 个引脚在哪三个端口,数量极不均匀:端口有哪些脚数量备注PAPA1、PA22没有 PA0,也没有 PA3~PA7PCPC0~PC78完整 8 位PDPD0~PD78完整 8 位PA 口只有两个脚,这不是我漏抄——数据手册的引脚表里 PA 就只有这两位。它们同时是外部晶振的 OSCI/OSCO,也是 ADC 的 A1/A0,还是 OPA 的负/正输入。18 个 pad 的完整档案:Pad复位后的主功能默认复用功能5V 容忍PA1PA1A1 / T1CH2 / OSCI / OPN0否PA2PA2A0 / T1CH2N / OSCO / OPP0否PC0PC0T2CH3 / UTX_3 / NSS_1 / T1CH3_1否PC1PC1SDA/ NSS / T1BKIN_1 / T2CH4_1 / URX_3是(FT)PC2PC2SCL/ URTS / T1BKIN / T2CH2_1 / AETR_1是(FT)PC3PC3T1CH3 / T1CH1N_1 / UCTS_1否PC4PC4A2 / T1CH4 / MCO / T1CH2N_1否PC5PC5SCK/ T1ETR / T1CH3_3 / SCL_2是(FT)PC6PC6MOSI/ T1CH1_1 / UCTS_2 / SDA_2是(FT)PC7PC7MISO/ T1CH2_1 / T2CH2_3 / URTS_2否PD0PD0T1CH1N / UTX_1 / SDA_1 / OPN1否PD1PD1SWIO/ T1CH3N / AETR2 / URX_1 / SCL_1否PD2PD2A3 / T1CH1 / T2CH3_1否PD3PD3A4 / AETR / T1CH4_1 / T2CH2_2 / UCTS否PD4PD4A7 / T2CH1ETR / UCK / OPO否PD5PD5A5 /UTX/ T2CH4_3否PD6PD6A6 /URX/ T2CH3_3否PD7PD7NRST/ 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 容忍"的说法,和手册这张表对不上。三、四种封装各自砍掉了什么这颗芯片有四个型号,资源和封装如下(数据来自数据手册的型号资源表):型号封装引脚数GPIOADC 通道SPII2CUSARTCH32V003F4P6TSSOP2020188111CH32V003F4U6QFN2020188111CH32V003A4M6SOP1616146无11CH32V003J4M6SOP8866无11缺的不是随便砍的,缺的是特定的 pad:封装少了哪些 pad后果TSSOP20 / QFN20一个不少18 个全给SOP16PC5、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说明1PD6也是 ADC A6、USART RX2VSS地3PA2也是 ADC A0、OSC4VDD电源5PC1I2C SDA(FT)6PC2I2C SCL(FT)7PC4ADC A28PD1SWIO,下载调试就靠它这 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。PadSOP16TSSOP20QFN20PA11252PA21363PC016107PC11118PC22129PC331310PC441411PC5—1512PC651613PC761714PD0—85PD171815PD2—1916PD3—2017PD48118PD59219PD610320PD71141VDD1596VSS1474(+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 的库头