多くのマイコンと同様、CH32V003 の I/O ピンにはプルアップ/プルダウン抵抗が内蔵されています。それらが GPIO 以外の周辺機能使用時にも有効なのかを調べてみました。結論は周辺機能でも有効です。
CH32V003 の I/O ピンは GPIO としての役割の他、いくつもの周辺機能のピンが多重化されています。レジスタに設定することで、あるピンをどの目的で使うかを指定できます。
GPIO として使うか、周辺機能のピンとして使うかで、データシートに別のブロック図が載っています。まずは GPIO の入力です。"7.2.6 Input configuration" より "Figure 7-2 GPIO module input configuration structure block diagram" を次に示します。
TTL Schmitt trigger(シュミットトリガ)の前に付いている 2 つの抵抗器がプルアップ/プルダウン抵抗です。GPIOx_CFGLR の CNF フィールドが 10 のとき、これら 2 つの抵抗器のどちらかが ON し、どちらかが OFF します。どちらを ON にするかは GPIOx_OUTDR で設定します。
次に周辺機能として使う場合のブロック図を紹介します。"7.2.8 Multiplexing function configuration" より "Figure 7-4 The structure of GPIO module when it is multiplexed by other peripherals" です。
この図にはプルアップ/プルダウン抵抗が描かれていません。このことから、周辺機能の使用時はプルアップ/プルダウンができない可能性があると思いました。これが、今回の検証を実施した理由です。
PD0、PD2、PD3、PD4 を次のように設定し、挙動を観察しました。その結果、どうやらプルアップされていそうだなと思ったので、具体的なプルアップ抵抗の値を測定しました。
ピン | 割り当てる機能 | モード |
---|---|---|
PD0 | GPIO | 入力(Pull-Up) |
PD2 | TIM1CH1 | 入力(Pull-Up) |
PD3 | TIM2CH2 | 入力(Floating) |
PD4 | GPIO | 入力(Floating) |
検証用のソフトウェアは単純です。PD0 と PD4 は GPIO 入力に設定し、0.5 秒ごとに入力値を読みます。PD2 と PD3 はタイマに設定し、ピンに入力された信号の立ち上がりエッジでカウントアップするようにします。0.5 秒ごとにカウンタの値を読みます。
マイコンの電源を入れ、ピンを指でなでます。すると、PD0、TIM1(PD2)に関しては値が変わらないものの、TIM2(PD3)、PD4 の値はふらふらと変化します。次に、PD0、PD2 と GND を導線で繋いだり離したりすると、そのタイミングで PD0、TIM1 の値が変化しました。したがって、PD0 と PD2 ではプルアップ抵抗が有効に働いていると推測しました。
次に具体的なプルアップ抵抗の値を測定することにしました。次のような回路を組み、GND と TP1 間の電圧を測りました。
ピン | 電圧 | プルアップ抵抗 |
---|---|---|
PD0 | 2.58V | 47.0kΩ |
PD2 | 2.59V | 46.6kΩ |
PD3 | 0.0mV | ∞ |
PD4 | 0.0mV | ∞ |
実はプルアップ/プルダウン抵抗の値はデータシートで規定されています。CH32V003 の場合、最低 35kΩ、典型値 45kΩ、最大 55kΩ です。今回測定された値はこの範囲に収まっていて、仕様通り(ほぼ典型値)であることが分かりました。