Hobby Lab 趣味のモノ作り実験のサイトです。
部品 プロセッサー他 CH32V 003J4M6_開始
1 概要
2 仕様
2.1 特徴
2.2 電気的特性
3 Pinの定義
4 最初のプログラム
4.1 MounRiver StudioⅡの起動
4.2 system_ch32v00x.c
4.3 main.c
4.3.1 開発中のモニター
4.3.2 USARTを使用する場合
5 ダウンロードオプション
5.1 なし
5.2 TurnOffWCH-LinkPowerOutput
5.3 ClearCodeFlashByPower-Off
5.4 DisableMcuCode-Protect
6 SDI_PRINT=1での動作

Pr:Prプロセッサ関係
PrP:プロセッサ
動作比較
 STM32F動作比較
 CH32V203&STM32F 動作比較
 arduino動作比較
raspberrypi関係
 RaspberryPiハード
CH32V関係
 -CH32V開始
 -203K8T6(32Pin)開始
 -203C8T6(48P)開始
 -003J4M6(8Pin)開始
 -003F4P6(20Pin)開始
 -Moun River StudioⅡ
 プログラミング!
  203_GPIO関係
  203_TIME関係
  203_TIME Encoder
  203_I2C関係
  203_1-Wire関係
  003_DS18B20テスター
  USART(UART)関係
  DS18B20をModBus制御
 -マニュアル
 203データシート
 203取説
  MBA メモリとバス方式
  PWR 電力制御
  RCC リセット・拡張・クロック
  BKP バックアップレジスタ
  CRC 巡回冗長検査
  RTC リアルタイムクロック
  GPIO GPIOと代替機能
  DMA ダイレクトメモリアクセス制御
  ADTM 高度な制御タイマー
  GPTM 汎用タイマー
  BCTM 基本タイマー
  USART 同期非同期通信
arduino関係
 ESP12関係
 (a)ESP-8266D1mini注意
PrP:その他  RS485ドライバー
 CP2102 BRIDGE
 WCH-LinkEエミュレーター
Pr:Wire 電線関係
Pr:Resistance 抵抗
Pr:Capacitor コンデンサ
Pr:Coil コイル
Pr:PassiveElmt 受動素子
Pr:Diode ダイオード関係
Pr:OPAMP オペアンプ関係
PrO:送受信機  Si4735
PrO:オペアンプ  LM324
 LM358
Pr:Tr トランジスタ関係
2SC1815
 リレードライバー設計
 アンプ設計
 発振器
TLP152
 TLP152テスト
TLP2361
 TLP2361テスト
TLP5754
 TLP5754テスト
Pr:Source 電源関係  ツェナーダイオード
 TL431
 LM317
PrS:Downモジュール
 EGS002_IR2110S
 SKU011012
 ACDC02
 XH_M299
 LM2596
 Mini360_MP23070N
 DROK
 WH140
PrS:UPモジュール
 MT3608
PrS:充電モジュール
 TP4056
Pr:Sensor_AD_時計等
PrS:電圧、電流
ADS1115 16bit4CH I2C A/D
 Hardware
 RaspberryPi_コマンド接続
 RaspberryPi_Python
 Arduino
 CH23V203 MounRiverStudioⅡ
INA226 I2C 直流電圧電流
 Hardware
 Arduino
 RaspberryPi_Python
WCS 電流ホール素子
 Hardware
PrS:温度、気圧、湿度、照度
BNE280 I2C 気圧,湿度,気温
 Hardware
 Arduino
 RaspberryPi_Python
BH1750 I2C 照度
 Hardware
 Arduino
 RaspberryPi_Python
DS18B20 1-Wire 温度計
 Hardware
 Arduino
 RaspberryPi_Python
PrS:時間、日時
DS3231 I2C 時計
 Hardware
 Arduino
 RaspberryPi_Python
PrS:表示器
MAR3953 320X480 3.95"
 概要と線や点を描く
 フォントを描く
SSD1306 I2C 0.96"OLED
 Hardware
 Arduino
 RaspberryPi_Python
Pr:Old Processor他

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
型番 J4M6F4P6
CPU clock speed 48MHz48MHz
Package SOP8TSSOP20
Flash memory 16K 16K
SRAM 2K 2K
DMA Channels 7 7
OPA x 2 2
GPIO 6 18
AdvancedControlTimer1 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
項目 MinMax
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
MainDefaultRemapping
1I/O/APD6USART Rx/A6T2CH3_3/USART Tx_2
PA1T1CH2/A1/OPN0OSCI/T1CH2_2
2PVSS--------
3I/O/APA2TICH2N/A0/OPP0OSCO/AETR2_1/TICH2N_2
4PVDD--------
5I/O/FTPC1SDA/NSST1BKIN_1/T2CH4_1/T2CH1ETR(1)_2/
USART RX_3/T2CH1ETR(1)_3/T1BKIN_3
6I/O/FTPC2SCL/USART RTS/T1BKINAETR_1/T2CH2_1/T1ETR_3/USART RTS_1/T1BKIN_2
7I/O/APC4T1CH4/MCO/A2T1CH2N_1/T1CH4_2/T1CH1_3
8I/O/APD4USART CK/T2CH1ETR(1)/A7/OPOTIETR_2/T1CH4_3
PD5USART Tx/A5T2CH4_3/USART Rx_2
PD1SWIO/T1CH3N/AETR2SCL_1/URX_1/T1CH3N_1/T1CH3N_2
1. (1). TIM2_CH1, TIM2_ETR;
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言語でプログラミング]も参照ください。

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 をクリックすると下図、右のようにクリックしたファイル内容が表示され、以降編集が可能になります。


4.2 system_ch32v00x.c

このファイルはプログラムするMCUのクロックを簡単に設定するものです。
今回は内部クロックで48MHzのクロックとするため
コメントアウトを外します。
// #define SYSCLK_FREQ_48MHZ_HSI 48000000

#define SYSCLK_FREQ_48MHZ_HSI 48000000
その他をコメントアウトする。

4.3 main.c

最初に生成されているmain.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 Ⅱ
MounRiver Studio Ⅱ の [Project] [properties]の
左メニュー[Download Settings]の中に
□Enable SDI Printf
と言う項目が有るので、□に☑を入れ、[Apply]します。

b. main.cの SDI_PRINT の値を変更
main.cの部分で下記プリプロセッサが書かれている。
#if (SDI_PRINT == SDI_PR_OPEN)
 SDI_Printf_Enable();
#else
 USART_Printf_Init(115200);
#endif
この中の SDI_PRINT を SDI_PR_OPEN にして 関数 SDI_Printf_Enable();を実行する必要がある。
このため、 #define SDI_PRINT SDI_PR_OPEN を追記する場所になるが、私は debug.h に追記した。
追記前
#ifndef SDI_PRINT
#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 を見ると下記のように変化している。
#if (SDI_PRINT == SDI_PR_OPEN)
 SDI_Printf_Enable();
#else
 USART_Printf_Init(115200);
#endif
なお debug.h の出し方は
※SDI_PRINTが記載されている場所を探す方法
プログラム中の SSDI_PRINT のどこかにカーソルを移動して[Ctrl]+マウス左クリックすると
debug.hが開きSDI_PRINTが定義されている場所へ移動します

(2) 接続確認
a. J4M6とWCH-LinkEおよびPCを接続する。
 J4M6とWCH-LinkEの接続は
J4M6ピンNoWCH-LinkE 端子名称
(2)GND
(4)3V3
(8)SWDIO

b. PCのシリアルターミナルを起動して Port の設定
項目名設定内容
Port※1
Baud Rate115200
paritynone
Bits8
Stopbits1
Flow controlnone
※1WCH-LinkE のディバイスを選択
 私の場合は/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Ⅱの設定
UARTを使用出来るようにGPIOやUARTを設定したプログラムをJ4M6へダウンロードし実行させた後、再度ダウンロード使用すると下記エラーがでる。
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]します。
ただしこの方法はフラッシュメモリー全てが消去される。

(2) フラッシュメモリーを消したくない場合
・□Turn off WCH-Link Power Outputにチェックを入る。
・main.cの最初に1秒程度の待機時間を入れる。
int main (void) {
  SystemCoreClockUpdate();
  Delay_Init();
  Delay_Ms(1000);
  GPIO_INIT();
(3) ダウンロード・実行の手順
プログラムの開発中では 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にダウンロードした方が良いと思う。




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)程度電源を切っている。
②はプログラムをダウンロードしている部分
③はプログラムが動作している部分

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)に接続している。




































更新日 2026/02/15 20:54  管理者 平林 剛Hirabayashi Takeshi