1. 概要
CH32V003F4P6 と言う 20Pinの MCU があり購入しました。CH32V003J4M6も小さいですが、このMCUもPin数が多いですが、Pin間隔が小さいので、コンパクトになっています。 CH32V003J4M6との比較を下表にした。
| J4M6 | F4P6 | ||
|---|---|---|---|
| Pin | 数 | 8 | 20 |
| 間(mm) | 1.27 | 0.65 | |
| 本体 寸法 | X方向(mm) | 3.9 | 4.4 |
| Y方向(mm) | 5.0 | 6.5 | |
最初はCH32V003J4M6がプログラムダンロードとUSART1 Txが同じpinになっているため、このMCUでJ4M6のプログラムを開発しようと思います。
このCH32V003F4P6は20個送料含みで 614円 1個あたり 31円で購入できました。
また pin間隔を 2.54mmにする基盤 1枚10円ぐらいを購入してMCUをハンダ付けしたのが右上の写真です。(汚いハンダ付けです。)合わせて 41円 で遊べます。
当初開発する時の結線方法も判らなかったので、同時に開発ボードも購入しました。
これは、2個で328円でした。右の写真
同価格・性能のMCUが日本製にあれば、ぜひ購入したいと思います。
2. 仕様
2.1 特徴
CH32V003J4M6とCH32V003F4P6との特徴を比較したのが下表です。
| CH32V | 003 | |
|---|---|---|
| 型番 | J4M6 | F4P6 |
| CPU clock speed | 48MHz | 48MHz |
| Package | SOP8 | TSSOP20 |
| Flash memory | 16K | 16K |
| SRAM | 2K | 2K |
| DMA Channels | 7 | 7 |
| OPA x | 2 | 2 |
| GPIO | 6 | 18 |
| AdvancedControlTimer | 1 | 1 |
| GeneralPurposeTimer | 1 | 1 |
| Watchdog | 2 | 2 |
| SystemClockSource | 3 | 3 |
| ADC Chinnel | 6 | 8 |
| USART | 1 | 1 |
| SPI | -- | 1 |
| I2C | 1 | 1 |
2.2 電気的特性
特にCH32V203と違うのはVDDの上限が5.5V(203は4V)であること
| CH32V | 003 | |
|---|---|---|
| 項目 | Min | Max |
| External main supply voltage (VDD) | -0.3(V) | 5.5(V) |
| Sink current on any I/O and control pin | -- | 20(mA) |
| Output current on any I/O and control pin | -- | 20(mA) |
3. Pinの定義
| Pin No | Pin Type | function | ||
|---|---|---|---|---|
| Main | Default | Remapping | ||
| 1 | I/O/A | PD4 | UCK/T2CH1ETR(1)/A7/OPO | TIETR_2/T1CH4_3 |
| 2 | I/O/A | PD5 | UTX/A5 | T2CH4_3/URX_2 |
| 3 | I/O/A | PD6 | URX/A6 | T2CH3_3/UTX_2 |
| 4 | I/O/A | PD7 | NRST/T2CH4/OPP1 | UCK_1/UCK_2/T2CH4_2 |
| 5 | I/O/A | PA1 | T1CH2/A1/OPN0 | OSCI/T1CH2_2 |
| 6 | I/O/A | PA2 | TICH2N/A0/OPP0 | OSCO/AETR2_1/TICH2N_2 |
| 7 | P | VSS | -- | -- |
| 8 | I/O/A | PD0 | TICH1N/OPN1 | SDA_1/UTX_1/TICH1N_2 |
| 9 | P | VDD | -- | -- |
| 10 | I/O | PC0 | T2CH3 | NSS_1/UTX_3/T2CH3_2/T1CH3_1 |
| 11 | I/O/FT | PC1 | SDA/NSS | |
| 12 | I/O/FT | PC2 | SCL/URTS/T1BKIN | AETR_1/T2CH2_1/T1ETR_3/URTS_1/T1BKIN_2 |
| 13 | I/O | PC3 | T1CH3 | T1CH1N_1/UCTS_1/T1CH3_2/T1CH1N_3 |
| 14 | I/O/A | PC4 | T1CH4/MCO/A2 | T1CH2N_1/T1CH4_2/T1CH1_3 |
| 15 | I/O/FT | PC5 | SCK/T1ETR | T2CH1ETR(1)_1/SCL_2/SCL_3/UCK_3/T1ETR_1/T1CH3_3/SCK_1 |
| 16 | I/O/FT | PC6 | MOSI | T1CH1_1/UCTS_2/SDA_2/SDA_3/UCTS_3/T1CH3N_3/MOSI_1 |
| 17 | I/O | PC7 | MISO | T1CH2_1/URTS_2/T2CH2_3/URTS_3/T1CH2_3/MISO_1 |
| 18 | I/O/A | PD1 | SWIO/T1CH3N/AETR2 | SCL_1/URX_1/T1CH3N_1/T1CH3N_2 |
| 19 | I/O/A | PD2 | T1CH1/A3 | T2CH3_1/T1CH2N_3/T1CH1_2 |
| 20 | I/O/A | PD3 | A4/T2CH2/AETR/UCTS | T2CH2_2/T1CH4_1 |
2.再マッピング機能の下線部の後の値は、AFIOレジスタの対応するビットの設定値を示します。
例:T1CH4_3は、AFIOレジスタの対応するビットが11bに設定されていることを示します。
3.表の略語の説明:
I = TTL/CMOS level Schmitt input.
O = CMOS level tri-state output.
P = power supply.
FT = 5V tolerant.
A = Analog signal input or output.
4. テスト回路と開発方法
4.1 テスト回路
右図の回路でプログラムを作成、動作確認をする。
回路では
・PA2にSWを取り付け
将来のプログラムではMODBUSの通信速度とDeviceAddressを初期値に戻すための SW で使用する。
・PC4には将来 1-Wire のDS18B20を取り付けます。
・PC2,PC1についてはI2Cの端子としてテストしてみたいと思う。
なお各端子名称に黄色マーカーしているのが、003J4M6の端子です。
また、003J4M6については Tx と SWIO 端子は同じ端子になっている。
回路では
・PA2にSWを取り付け
将来のプログラムではMODBUSの通信速度とDeviceAddressを初期値に戻すための SW で使用する。
・PC4には将来 1-Wire のDS18B20を取り付けます。
・PC2,PC1についてはI2Cの端子としてテストしてみたいと思う。
なお各端子名称に黄色マーカーしているのが、003J4M6の端子です。
また、003J4M6については Tx と SWIO 端子は同じ端子になっている。
4.2 使用IDE
IDEとは Integrated Development Environment の略で統合開発環境と呼ばれている。
主なIDEには
・MounRiver Studio
・Arduino
などがある
ただし Arduino はオブラートに包まれているのでプログラムは簡単そうですが、 少し踏み込んでソフトを作成する時に判らなくなる事がありそうなので、 Arduino よりMCUの動きが分かりやすいプログラム開発環境として MounRiver StudioⅡ を使用します。
主なIDEには
・MounRiver Studio
・Arduino
などがある
ただし Arduino はオブラートに包まれているのでプログラムは簡単そうですが、 少し踏み込んでソフトを作成する時に判らなくなる事がありそうなので、 Arduino よりMCUの動きが分かりやすいプログラム開発環境として MounRiver StudioⅡ を使用します。
4.3 IDE(PC)と003F4P6を接続
・WCH-LinkEによる接続
WCH-LinkE については右メニューの WCH-LinkEエミュレーター を参照ください。
WCH-LinkE については右メニューの WCH-LinkEエミュレーター を参照ください。
5. 最初のプログラム
最初のプログラムはLEDの点灯ではなく、SW を押している間 PC4 に HiーLo電圧を繰り返すものを作成します。
・Moun River StudioⅡインストール(非常に簡単に説明)については: [Moun River StudioⅡ で]
・PA2を入力、PC4を出力に設定(GPIOの設定)については:プログラミング!下 の[203 GPIO関係]
・シリアル通信関係の設定(USARTの設定)については:プログラミング!下 の[USART(UART)関係]
●その他のページで
・C言語については:[ソフトウェア][C関係][C言語でプログラミング]も参照ください。
前もって確認してもらいたい 参考ページは
●右のメニューから・Moun River StudioⅡインストール(非常に簡単に説明)については: [Moun River StudioⅡ で]
・PA2を入力、PC4を出力に設定(GPIOの設定)については:プログラミング!下 の[203 GPIO関係]
・シリアル通信関係の設定(USARTの設定)については:プログラミング!下 の[USART(UART)関係]
●その他のページで
・C言語については:[ソフトウェア][C関係][C言語でプログラミング]も参照ください。
5.1 MounRiver StudioⅡの起動
Moun River StudioⅡ を起動した状態から下記に説明します。

[File]➡[New]➡[Moun River Project]で下記 NeW Moun River Project が表示されます。

[CH32V003[RISC-V]]➡[CH32V003F4P6]➡文字を追記[_test]➡[Finish]によりプログラムを作成する場所が下記表示されます。
左側の EXPLORER 下に表示されている [User] をクリックすると下図のように ヘッダーファイルと C言語プログラムの ファイルが表示されます
ファイルの中で、system_ch32v00x.c と Main.c をクリックすると下図、右のようにクリックしたファイル内容が表示され、以降編集が可能になります。


[File]➡[New]➡[Moun River Project]で下記 NeW Moun River Project が表示されます。

[CH32V003[RISC-V]]➡[CH32V003F4P6]➡文字を追記[_test]➡[Finish]によりプログラムを作成する場所が下記表示されます。
左側の EXPLORER 下に表示されている [User] をクリックすると下図のように ヘッダーファイルと C言語プログラムの ファイルが表示されます
ファイルの中で、system_ch32v00x.c と Main.c をクリックすると下図、右のようにクリックしたファイル内容が表示され、以降編集が可能になります。

5.2 system_ch32v00x.c
このファイルはプログラムするMCUのクロックを簡単に設定するものです。
今回は内部クロックで48MHzのクロックとするため
コメントアウトを外します。
// #define SYSCLK_FREQ_48MHZ_HSI 48000000
↓
#define SYSCLK_FREQ_48MHZ_HSI 48000000
その他をコメントアウトする。
今回は内部クロックで48MHzのクロックとするため
コメントアウトを外します。
// #define SYSCLK_FREQ_48MHZ_HSI 48000000
↓
#define SYSCLK_FREQ_48MHZ_HSI 48000000
その他をコメントアウトする。
5.3 Main.c
最初に作された状態を下記に示す。
下記のように変更する。
・void GPIO_INIT (void) {} を追加。
・Main(){} の while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){}の中に
u8 pin_data = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2);
if (pin_data == Bit_RESET) {
GPIO_WriteBit(GPIOC, GPIO_Pin_4, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET));
}
を追加している。
下記のように変更する。
・void GPIO_INIT (void) {} を追加。
・Main(){} の while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){}の中に
u8 pin_data = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2);
if (pin_data == Bit_RESET) {
GPIO_WriteBit(GPIOC, GPIO_Pin_4, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET));
}
を追加している。
5.4 動作確認
オシロ波形線について
黄色線がMCUのUSART1のRx(PD6 1番)端子の波形
水色線が SWIO および USART1 Tx(PD5 8番)端子の波形
①がプログラムをダウンロードしている部分
②が printf の部分
③がSWを押した時にPC4の電圧がHi-Loを繰り返している。

②の部分を拡大
[ 時間軸を小さくした 200(ms/div)➡500(us/div)に変更 ] GPIO_INIT();の中の PA2のプルアップされてから、printf出力までの時間は約 60(us)かかっているのが判る。
③の部分を拡大
[ 時間軸を小さくした 上が100(ms/div) ,下が5(us/div)に変更 ]
上の赤枠の赤線では SWが約180(ms)押し下げられ、その間PC4(青線)の電圧がHo-Lo繰り返している事が判る。
下の赤枠の青線では PC4の Loー Hiー の時間が約3(us)かかっていることが判る。
つまり1回繰り返す※1 のに1.5(us)かかっていることになる。
MCUのクロックが48MHzなので、1サイクル時間は約21(ns)なので
1回※1 につき、150 / 21 ≒ 71サイクルかかった事になる。

※1 1回とは main(); の中に記載の While の中で繰り返されている時間をさす。
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){
/* waiting for receiving finish */
u8 pin_data = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2);
if (pin_data == Bit_RESET) {
GPIO_WriteBit(GPIOC, GPIO_Pin_4, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET));
}
}
今回はここまでにしたい。
黄色線がMCUのUSART1のRx(PD6 1番)端子の波形
水色線が SWIO および USART1 Tx(PD5 8番)端子の波形
①がプログラムをダウンロードしている部分
②が printf の部分
③がSWを押した時にPC4の電圧がHi-Loを繰り返している。

②の部分を拡大
[ 時間軸を小さくした 200(ms/div)➡500(us/div)に変更 ] GPIO_INIT();の中の PA2のプルアップされてから、printf出力までの時間は約 60(us)かかっているのが判る。

③の部分を拡大
[ 時間軸を小さくした 上が100(ms/div) ,下が5(us/div)に変更 ]
上の赤枠の赤線では SWが約180(ms)押し下げられ、その間PC4(青線)の電圧がHo-Lo繰り返している事が判る。
下の赤枠の青線では PC4の Loー Hiー の時間が約3(us)かかっていることが判る。
つまり1回繰り返す※1 のに1.5(us)かかっていることになる。
MCUのクロックが48MHzなので、1サイクル時間は約21(ns)なので
1回※1 につき、150 / 21 ≒ 71サイクルかかった事になる。

※1 1回とは main(); の中に記載の While の中で繰り返されている時間をさす。
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){
/* waiting for receiving finish */
u8 pin_data = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2);
if (pin_data == Bit_RESET) {
GPIO_WriteBit(GPIOC, GPIO_Pin_4, (i == 0) ? (i = Bit_SET) : (i = Bit_RESET));
}
}
今回はここまでにしたい。
