uchan が 2024年07月28日17時28分47秒 に編集
初版
タイトルの変更
CH32V003 の IO プルアップ設定は周辺機能でも有効
タグの変更
CH32V
CH32V003
プルアップ抵抗
メイン画像の変更
記事種類の変更
セットアップや使用方法
本文の変更
多くのマイコンと同様、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" を次に示します。 ![CH32V003 GPIOを入力に設定したときの回路構成](https://camo.elchika.com/07cc8d7e0b3a6fc3028a60a5d8fca363dc0cb2bf/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63333936313234302d643365342d346361652d396632662d3965396366383634616562342f35336163396464652d393733322d346536382d616239662d303331633537333035643462/) 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" です。 ![CH32V003 GPIOに多重化された周辺機能を割り当てたときの回路構成](https://camo.elchika.com/ecf2d1751d4d166f68575584e6aa649d5adbce29/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63333936313234302d643365342d346361652d396632662d3965396366383634616562342f64323265333033382d366637302d343162322d626139642d336463616266323861326137/) この図にはプルアップ/プルダウン抵抗が描かれていません。このことから、周辺機能の使用時はプルアップ/プルダウンができない可能性があると思いました。これが、今回の検証を実施した理由です。 ## プルアップ抵抗の測定 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 間の電圧を測りました。 ![](https://camo.elchika.com/d72bdda1a41f937a1287125f6a545b7c1b283f22/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63333936313234302d643365342d346361652d396632662d3965396366383634616562342f61613539383034352d646532612d343231392d383830322d653037633838306466643132/) | ピン | 電圧 | プルアップ抵抗 | |------|-------|----------------| | PD0 | 2.58V | 47.0kΩ | | PD2 | 2.59V | 46.6kΩ | | PD3 | 0.0mV | ∞ | | PD4 | 0.0mV | ∞ | 実はプルアップ/プルダウン抵抗の値はデータシートで規定されています。CH32V003 の場合、最低 35kΩ、典型値 45kΩ、最大 55kΩ です。今回測定された値はこの範囲に収まっていて、仕様通り(ほぼ典型値)であることが分かりました。