1. 概要
CH32V003J4M6(以下J4M6) と言う 8Pinの MCU があり購入しました。写真でも判るように本当に小さなMCUです。
最大クロック周波数が 48MHzで最小のMCUで何を作成するかということで
目標を 1-Wire(DS18B20)素子を使ったMODBUS測定器の作成にしたいと思います。
このJ4M6は20個送料含みで 475円 1個あたり 24円で購入できました。
また pin間隔を 2.54mmにする基盤 1枚10円ぐらいを購入してMCUをハンダ付けしたのが右の写真です。(ハンダ盛りすぎです。)
合わせて 34円 で遊べます。
同価格・性能のMCUが日本製にあれば、ぜひ購入したいと思います。
2. 仕様
2.1 特徴
J4M6と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 | PD6 | USART Rx/A6 | T2CH3_3/USART Tx_2 |
| PA1 | T1CH2/A1/OPN0 | OSCI/T1CH2_2 | ||
| 2 | P | VSS | ---- | ---- |
| 3 | I/O/A | PA2 | TICH2N/A0/OPP0 | OSCO/AETR2_1/TICH2N_2 |
| 4 | P | VDD | ---- | ---- |
| 5 | I/O/FT | PC1 | SDA/NSS | T1BKIN_1/T2CH4_1/T2CH1ETR(1)_2/ USART RX_3/T2CH1ETR(1)_3/T1BKIN_3 |
| 6 | I/O/FT | PC2 | SCL/USART RTS/T1BKIN | AETR_1/T2CH2_1/T1ETR_3/USART RTS_1/T1BKIN_2 |
| 7 | I/O/A | PC4 | T1CH4/MCO/A2 | T1CH2N_1/T1CH4_2/T1CH1_3 |
| 8 | I/O/A | PD4 | USART CK/T2CH1ETR(1)/A7/OPO | TIETR_2/T1CH4_3 |
| PD5 | USART Tx/A5 | T2CH4_3/USART Rx_2 | ||
| PD1 | SWIO/T1CH3N/AETR2 | SCL_1/URX_1/T1CH3N_1/T1CH3N_2 | ||
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.
J4M6は Pinが8本しか無いため、(1)や(8)などマルチポートになっている。
特に(8)については、プログラムのダウロードおよび Debug に使用するほか、USART Txを使用する場合は前者の使用と重ねる事ができない
注意が必要。
4. 最初のプログラム
このJ4M6は8ピンのMCUで非常に端子が少ない。
よく紹介されているLEDを点滅するようなプログラムは普通に使用できますが、シリアル通信関係を使用する場合は配慮が必要になっている。
ここでは Moun River StudioⅡを使用して File を New で Project を作成した main.c などのファイルで配慮する内容を説明する。
・Moun River StudioⅡインストール(非常に簡単に説明)については: [Moun River StudioⅡ で]
・PA2を入力、PC4を出力に設定(GPIOの設定)については:プログラミング!下 の[203 GPIO関係]
・シリアル通信関係の設定(USARTの設定)については:プログラミング!下 の[USART(UART)関係]
●その他のページで
・C言語については:[ソフトウェア][C関係][C言語でプログラミング]も参照ください。
よく紹介されているLEDを点滅するようなプログラムは普通に使用できますが、シリアル通信関係を使用する場合は配慮が必要になっている。
ここでは Moun River StudioⅡを使用して File を New で Project を作成した main.c などのファイルで配慮する内容を説明する。
前もって確認してもらいたい 参考ページは
●右のメニューから・Moun River StudioⅡインストール(非常に簡単に説明)については: [Moun River StudioⅡ で]
・PA2を入力、PC4を出力に設定(GPIOの設定)については:プログラミング!下 の[203 GPIO関係]
・シリアル通信関係の設定(USARTの設定)については:プログラミング!下 の[USART(UART)関係]
●その他のページで
・C言語については:[ソフトウェア][C関係][C言語でプログラミング]も参照ください。
4.1 MounRiver StudioⅡの起動
Moun River StudioⅡ を起動した状態から下記に説明します。

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

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


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

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

4.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
その他をコメントアウトする。
4.3 main.c
最初に生成されているmain.cを見ると
#・・ で始まる プリプロセッサと言うものが書かれていて、C言語初心者の私はここから躓きました。
判る範囲でこの部分を説明したい。
#・・ で始まる プリプロセッサと言うものが書かれていて、C言語初心者の私はここから躓きました。
判る範囲でこの部分を説明したい。
4.3.1 開発中のモニター
J4M6は8ピンとピンが少ない。
プログラムをダウンロードするには SWIO の 8番ピン(以降(8)と表記)を使用するが、このピンは USART1 TX と共用になっている。
プログラムの開発中では printf(); をモニターとしてハード的には USART1 TX を使用し、WCH-LinkEなどを使用している場合はWCH-LINKEのRXとSWDIOをJ4M6の(8) に接続することになり、RXからパソコン(以下PCと呼ぶ)側のシリアルモニターの表示にダウンロードの信号が入り不具合が発生する。
これ防ぐため、WCH-LinkEから見て、受信(RX)信号をSWDIOの信号線を通じてPC側にシリアル信号として渡す事が出来るようになっている。
※ただし、SWDIOを通したシリアル信号はPC側から見て受信だけで、送信はできないようなので、注意して下さい。 またUSART1関係のGPIOやUSART1の初期設定を行うとSWDIOは使用できなくなります。
なお、SWDIOを使用して Printf() などでモニターする方法として2箇所の設定が必要となる。
(1) 設定
おそらくになるが、WCH-LinkEの設定とJ4M6の設定と思われる。
a. MounRiver Studio Ⅱ
b. main.cの SDI_PRINT の値を変更
(2) 接続確認
プログラムをダウンロードするには SWIO の 8番ピン(以降(8)と表記)を使用するが、このピンは USART1 TX と共用になっている。
プログラムの開発中では printf(); をモニターとしてハード的には USART1 TX を使用し、WCH-LinkEなどを使用している場合はWCH-LINKEのRXとSWDIOをJ4M6の(8) に接続することになり、RXからパソコン(以下PCと呼ぶ)側のシリアルモニターの表示にダウンロードの信号が入り不具合が発生する。
これ防ぐため、WCH-LinkEから見て、受信(RX)信号をSWDIOの信号線を通じてPC側にシリアル信号として渡す事が出来るようになっている。
※ただし、SWDIOを通したシリアル信号はPC側から見て受信だけで、送信はできないようなので、注意して下さい。 またUSART1関係のGPIOやUSART1の初期設定を行うとSWDIOは使用できなくなります。
なお、SWDIOを使用して Printf() などでモニターする方法として2箇所の設定が必要となる。
(1) 設定おそらくになるが、WCH-LinkEの設定とJ4M6の設定と思われる。
a. MounRiver Studio Ⅱ
MounRiver Studio Ⅱ の [Project] [properties]の
左メニュー[Download Settings]の中に
□Enable SDI Printf
と言う項目が有るので、□に☑を入れ、[Apply]します。
左メニュー[Download Settings]の中に
□Enable SDI Printf
と言う項目が有るので、□に☑を入れ、[Apply]します。
b. main.cの SDI_PRINT の値を変更
main.cの部分で下記プリプロセッサが書かれている。
このため、 #define SDI_PRINT SDI_PR_OPEN を追記する場所になるが、私は debug.h に追記した。
追記前
※SDI_PRINTが記載されている場所を探す方法
#if (SDI_PRINT == SDI_PR_OPEN)
SDI_Printf_Enable();
#else
USART_Printf_Init(115200);
#endif
この中の SDI_PRINT を SDI_PR_OPEN にして 関数 SDI_Printf_Enable();を実行する必要がある。SDI_Printf_Enable();
#else
USART_Printf_Init(115200);
#endif
このため、 #define SDI_PRINT SDI_PR_OPEN を追記する場所になるが、私は debug.h に追記した。
追記前
#ifndef SDI_PRINT
#define SDI_PRINT SDI_PR_CLOSE
#endif
追記後
#define SDI_PRINT SDI_PR_CLOSE
#endif
#define SDI_PRINT SDI_PR_OPEN //追記
#ifndef SDI_PRINT
#define SDI_PRINT SDI_PR_CLOSE
#endif
Build Project(F7)実施後に main.c を見ると下記のように変化している。#ifndef SDI_PRINT
#define SDI_PRINT SDI_PR_CLOSE
#endif
#if (SDI_PRINT == SDI_PR_OPEN)
SDI_Printf_Enable();
#else
USART_Printf_Init(115200);
#endif
なお debug.h の出し方はSDI_Printf_Enable();
#else
USART_Printf_Init(115200);
#endif
※SDI_PRINTが記載されている場所を探す方法
プログラム中の SSDI_PRINT のどこかにカーソルを移動して[Ctrl]+マウス左クリックすると
debug.hが開きSDI_PRINTが定義されている場所へ移動します
debug.hが開きSDI_PRINTが定義されている場所へ移動します
(2) 接続確認
a. J4M6とWCH-LinkEおよびPCを接続する。
J4M6とWCH-LinkEの接続は
b. PCのシリアルターミナルを起動して Port の設定
※1WCH-LinkE のディバイスを選択
私の場合は/dev/tty_ACM0M
c. MounRiver Studio Ⅱから[Build Project And Download]を実行
すると右のようにシリアルターミナルにメッセージが表示される。
J4M6とWCH-LinkEの接続は
| J4M6ピンNo | WCH-LinkE 端子名称 |
|---|---|
| (2) | GND |
| (4) | 3V3 |
| (8) | SWDIO |
b. PCのシリアルターミナルを起動して Port の設定| 項目名 | 設定内容 |
|---|---|
| Port | ※1 |
| Baud Rate | 115200 |
| parity | none |
| Bits | 8 |
| Stopbits | 1 |
| Flow control | none |
私の場合は/dev/tty_ACM0M
c. MounRiver Studio Ⅱから[Build Project And Download]を実行
すると右のようにシリアルターミナルにメッセージが表示される。
4.3.2 USARTを使用する場合
プログラムの中でUSARTを使用する場合、4.3.1で説明したとおり、プログラムのダウンロード用の SWIO とUSART1 TXが
(8)で共用しているのでそのための対応を記載する。
下記はMounRiver Studio Ⅱのダウンロードオプションを選択しますが、ダウンロード後の信号線の観測は5項で説明する。
(1) Moun River StudioⅡの設定
(2) フラッシュメモリーを消したくない場合
下記はMounRiver Studio Ⅱのダウンロードオプションを選択しますが、ダウンロード後の信号線の観測は5項で説明する。
(1) Moun River StudioⅡの設定
UARTを使用出来るようにGPIOやUARTを設定したプログラムをJ4M6へダウンロードし実行させた後、再度ダウンロード使用すると下記エラーがでる。
rror: Failed to configure mcu, please check the target chip model selection and SWD communication status.
これを回避する設定は
rror: Failed to configure mcu, please check the target chip model selection and SWD communication status.
これを回避する設定は
MounRiver Studio Ⅱ のメニュー [Project] [properties]で
右図のダイヤログボックスが表示され
その左メニュー[Download Settings]を選択する。
Download Parametersの項目で
Other Operationsの中に
□Clear CodeFlash by Power-Off
と言う項目が有るので、□に☑を入れ、[Apply]します。
ただしこの方法はフラッシュメモリー全てが消去される。
その左メニュー[Download Settings]を選択する。
Download Parametersの項目で
Other Operationsの中に
□Clear CodeFlash by Power-Off
と言う項目が有るので、□に☑を入れ、[Apply]します。
ただしこの方法はフラッシュメモリー全てが消去される。
(2) フラッシュメモリーを消したくない場合
・□Turn off WCH-Link Power Outputにチェックを入る。
・main.cの最初に1秒程度の待機時間を入れる。
(3) ダウンロード・実行の手順・main.cの最初に1秒程度の待機時間を入れる。
int main (void) {
SystemCoreClockUpdate();
Delay_Init();
Delay_Ms(1000);
GPIO_INIT();
SystemCoreClockUpdate();
Delay_Init();
Delay_Ms(1000);
GPIO_INIT();
プログラムの開発中では printf(); をモニターとしてハード的には USART1 TX を使用し、
WCH-LinkEなどを使用している場合はWCH-LINK E の RX と SWDIO をJ4M6の(8) に接続することになり、
RXからパソコン(以下PCと呼ぶ)側のシリアルモニターの表示にダウンロードの信号が入り不具合が発生する。
このため手順は
a. ダウンロードする場合はWCH-LINK E の RX を J4M6(8)から外しておく。
b. ダウンロードが終わればWCH-LINK E の PC側 USB を外す。
c. WCH-LINK E の SWDIO を外す。
d. J4M6(8)にUSART TXを受けるインターフェースを接続する。(例えばWCH-LINK E の RX など)
e. WCH-LINK E の PC側 USB を接続する。
※ USART RX については接続していても良い。
以上多くの手順が必要なため、特にUSARTを使用するプログラムの開発はJ4M6でなく、F4P6などで開発して最後に3項の手順でJ4M6にダウンロードした方が良いと思う。
このため手順は
a. ダウンロードする場合はWCH-LINK E の RX を J4M6(8)から外しておく。
b. ダウンロードが終わればWCH-LINK E の PC側 USB を外す。
c. WCH-LINK E の SWDIO を外す。
d. J4M6(8)にUSART TXを受けるインターフェースを接続する。(例えばWCH-LINK E の RX など)
e. WCH-LINK E の PC側 USB を接続する。
※ USART RX については接続していても良い。
以上多くの手順が必要なため、特にUSARTを使用するプログラムの開発はJ4M6でなく、F4P6などで開発して最後に3項の手順でJ4M6にダウンロードした方が良いと思う。
5. ダウンロードオプション
MounRiver Studio Ⅱ の メニュー [Project] [properties] で設定のダイアログボックスが表示され
左メニュー[Download Settings]の中に Download Parametersがある
その中の Other Operations として
(1) Turn off WCH-Link Power Output
(2) Clear CodeFlash by Power-Off
(3) Disable MCU Code-Protect
がある。
特に(1)(2)ではダウンロード時にJ4M6の電源及びSWDIOの信号波形を観測して見た。
また比較ように(1)(2)どちらとも選択しない場合の波形も観測した。
5.1 なし
(1),(2)をチェックしない場合のダウンロードの信号波形を右に示す。信号波形
オシロの黄色線はJ4M6(8)のSWDIO、水色線はJ4M6(4)の電源に接続している。
②はプログラムをダウンロードしている部分
③はプログラムが動作している部分
※③については連続で信号が出ている。6項を確認下さい。
5.2 Turn off WCH-Link Power Output
この機能は、単にWCH-LinkEの3.3V/5V出力ピンからの電力供給を停止するだけの操作です。
目的: ターゲット基板への給電を物理的に抜き差しせずにソフトウェア上から停止させます。
動作: WCH-Link本体の電源供給回路をOFFにします。メモリの消去などは行われません。
主な用途: 回路の組み換え時や、ターゲットを完全に再起動(コールドリブート)させたい場合に使用します。
信号波形
①は700(ms)程度電源を切っている。
②はプログラムをダウンロードしている部分
③はプログラムが動作している部分
目的: ターゲット基板への給電を物理的に抜き差しせずにソフトウェア上から停止させます。動作: WCH-Link本体の電源供給回路をOFFにします。メモリの消去などは行われません。
主な用途: 回路の組み換え時や、ターゲットを完全に再起動(コールドリブート)させたい場合に使用します。
信号波形
①は700(ms)程度電源を切っている。
②はプログラムをダウンロードしている部分
③はプログラムが動作している部分
5.3 Clear CodeFlash by Power-Off
この機能は、通常のデバッグ接続(SWIO)ができなくなったチップを強制的に初期化(レスキュー)するためのものです。目的: 書き込み禁止がかかった場合や、SWIOピンを他の用途(UARTなど)に割り当ててしまい、外部から操作不能(ブリック状態)になったMCUを復旧させます。
動作: WCH-LinkEからの給電を一度遮断し、再通電した瞬間の「ブートローダーが起動するわずかな隙」を突いてフラッシュメモリの全消去コマンドを送り込みます。
主な用途: CH32V003などピン数が少ないマイコンで、書き込み用ピンをIOとして使ってしまった際の救済。
信号波形
①はフラッシュメモリーの内容を消している部分と思われる。同時に電源も入り切りを繰返している。
②はプログラムをダウンロードしている部分
③はプログラムが動作している部分
5.4 Disable MCU Code-Protect
プログラムの読み出しや書き換えに対する保護(セキュリティロック)を解除する機能です。
6 動作中のSDI_PRINT=1
SDI_PRINT = SDI_PR_OPEN = 1 の時には、J4M6(8)の信号線がどうなっているかを確認した。
この信号は5.1項の説明波形でダウンロードが完了した以降、J4M6のプログラムが動作し、なんらかの連続した信号になっている。
きっとこの信号がディバングで使用している情報を伝送していると思う。
そして SDI_PRINT = 1 にすることにより J4M6のプログラムをモニターするために仕掛けた Printf(); の情報も伝送するのだと思う。
なお、この信号は WCH-LINK E の USB側端子を外して、再び入れると信号が出なくなる。
このことからもこの信号線はディバング時に使用するのだと思われる。
main.cのプログラムを下記のようにして実行し、J4M6のPC4端子にオシロの記録トリガーとして接続した結果は右図となった。
なおクロックは内蔵48mhzで動作している。
オシロの黄色線はJ4M6(8)、水色線はJ4M6(7)に接続している。
この信号は5.1項の説明波形でダウンロードが完了した以降、J4M6のプログラムが動作し、なんらかの連続した信号になっている。
きっとこの信号がディバングで使用している情報を伝送していると思う。
そして SDI_PRINT = 1 にすることにより J4M6のプログラムをモニターするために仕掛けた Printf(); の情報も伝送するのだと思う。
なお、この信号は WCH-LINK E の USB側端子を外して、再び入れると信号が出なくなる。
このことからもこの信号線はディバング時に使用するのだと思われる。
main.cのプログラムを下記のようにして実行し、J4M6のPC4端子にオシロの記録トリガーとして接続した結果は右図となった。
なおクロックは内蔵48mhzで動作している。
オシロの黄色線はJ4M6(8)、水色線はJ4M6(7)に接続している。
