圏9研究所 工作室

圏9研究所の開発情報資料など

STM32F103 clone & BluePill その3:クローンチップ概要

1.概要
 前回書いた通り安価なBluePillポードにはSTM32F103のクローンチップが実装されています
 このチップについていくつかボードを購入してあるので調べつつ使ってみようと思います

2.クローンチップの状況
 よくまとめられているページがあるのでリンクを貼ります

eetimes.itmedia.co.jp

 STM32F103のクローンについては例えば

tech-blog.cerevo.com

さらに魔改造されたチップもあったりしてこちらは購入して調査中です

3.オリジナルチップとの違い
 ハードの特性については適切な測定機器がないので解析できませんがソフト的な違いについて少々調べてみました
 上のリンク内にもあるようにIDCODEとか異なりますがコードはフルコンパチのようです

4. IDCODE関連調査
1)IDCODE関連調査アイテム
 STM32F103(Cortex-M3)はコード実行中にメモリーを見れたりとか優れたデバッグ環境が売りのようでこれが使えます

(1)ハード:MINI ST-LINK V2
 ・ネットでは 中華ST-LINK と呼ばれていてSTマイクロ社製品のクローンらしい
 ・名称は基板にシルク印刷されていた MINI ST-LINK V2 にしました
 ・USBメモリー用のパーツを流用してコンパクトに作られていてこれも相当安価で100円台で買えます
 ・チップもSTM32F103のクローンが実装されていますがこちらはそのままファームウエアのアップデートもできて問題なく動いています
 ・別途詳細書く予定

(2)ソフト:openOCD
 ・Open On-Chip Debugger

2)MINI ST-LINK V2 接続
 ・USB    パソコンに接続
 ・SWD    3.3V,GND,SWCLK,SWDIO 合計4本をBluePillポードのSWDヘッダーへ接続

3)openOCD準備
(1)Homebrew インストール
 ・Homebrew のページにあるコマンドラインをターミナルに貼り付けて実行する
 ・インストール後にPATHを通す(インストール完了メッセージ内に書かれている)

% (echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/xxxx/.zprofile
% eval "$(/opt/homebrew/bin/brew shellenv)"
% brew –v		確認

(2)OpenOCD インストール
 ・Homebrew でインストールする

% brew install openocd
% openocd –version		確認

(3)各ファイルの場所

opencode	/opt/homebrew/Cellar/open-ocd/0.12.0/bin/openocd
cfg:interface	/opt/homebrew/Cellar/open-ocd/0.12.0/share/openocd/scripts/interface/stlink-dap.cfg
cfg:targer	/opt/homebrew/Cellar/open-ocd/0.12.0/share/openocd/scripts/target/stm32f1x.cfg

(4)cfgファイル修正 今回は stm32f1x.cfg をコピーして新たに stm32f11.cfg を作成
 CPUTAPID を変更 0x1ba01477 -> 0x2ba01477

#jtag scan chain
if { [info exists CPUTAPID] } {
   set _CPUTAPID $CPUTAPID
} else {
   if { [using_jtag] } {
      # See STM Document RM0008 Section 26.6.3
      set _CPUTAPID 0x3ba00477
   } {
      # this is the SW-DP tap id not the jtag tap id
      #set _CPUTAPID 0x1ba01477
      set _CPUTAPID 0x2ba01477
   }
}

4)IDCODE等読込コマンド
 ターミナルで openOCD 実行 DBGMCU_IDCODE:0xE0042000 の内容を表示した例

% openocd -f interface/stlink-dap.cfg -f target/stm32f11.cfg -c "init" -c "$target_name mdw 0xE0042000 1" -c "exit"
Open On-Chip Debugger 0.12.0
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "dapdirect_swd". To override use 'transport select <transport>'.
Info : STLINK V2J41S7 (API v2) VID:PID 0483:3748
Info : Target voltage: 3.273740
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : clock speed 950 kHz
Info : stlink_dap_op_connect(connect)
Info : SWD DPIDR 0x2ba01477
Info : [stm32f1x.cpu] Cortex-M3 r2p1 processor detected
Info : [stm32f1x.cpu] target has 6 breakpoints, 4 watchpoints
Info : starting gdb server for stm32f1x.cpu on 3333
Info : Listening on port 3333 for gdb connections
0xe0042000: 000fa410 

・IDCODEはエコーバック中程に表示される
 Info : SWD DPIDR 0x2ba01477

スクリプトにすると

#!/bin/bash
#
# openOCD
# read STM32F1 ID codes with ST-LINK V2
# file name:stm32id.sh
#
openocd\
        -f interface/stlink-dap.cfg\
        -f target/stm32f11.cfg\
        -c "init"\
        -c "$target_name mdw 0xE000ED00 1"\
        -c "$target_name mdw 0xE0042000 1"\
        -c "$target_name mdh 0x1FFFF7E0 1"\
        -c "$target_name mdb 0xE00FFFD0 1"\
        -c "$target_name mdb 0xE00FFFE0 1"\
        -c "$target_name mdb 0xE00FFFE4 1"\
        -c "$target_name mdb 0xE00FFFE8 1"\
        -c "exit”

スクリプト実行結果(クローンチップ)

% ./stm32id.sh
Open On-Chip Debugger 0.12.0
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
Info : auto-selecting first available session transport "dapdirect_swd". To override use 'transport select <transport>'.
Info : STLINK V2J41S7 (API v2) VID:PID 0483:3748
Info : Target voltage: 3.272148
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : Unable to match requested speed 1000 kHz, using 950 kHz
Info : clock speed 950 kHz
Info : stlink_dap_op_connect(connect)
Info : SWD DPIDR 0x2ba01477
Info : [stm32f1x.cpu] Cortex-M3 r2p1 processor detected
Info : [stm32f1x.cpu] target has 6 breakpoints, 4 watchpoints
Info : starting gdb server for stm32f1x.cpu on 3333
Info : Listening on port 3333 for gdb connections
0xe000ed00: 412fc231 

0xe0042000: 000fa410 

0x1ffff7e0: 0040 

0xe00fffd0: 04 

0xe00fffe0: c3 

0xe00fffe4: b4 

0xe00fffe8: 0b 

5.IDCODE等一覧
1)コード一覧

アドレス

名称

bit

内容

STM32F103CBT

SWD CMD=0xA5

SWD IDCODE

32

SW-DP tap ID

0x1BA01477

0xE000ED00

CPUID

32

CPUコアID

0x411FC231

0xE0042000

DBGMCU_IDCODE

32

DBGMCU_IDCODE

user mode:0

debug mode:0x20036410

0x1FFFF7E0

Flash memory size

16/32

モリーサイズ=下位16bit[Kbytes]

0x0080->128Kbytes

0xE00FFFD0

0xE00FFFE0

0xE00FFFE4

0xE00FFFE8

Peripheral ID4

Peripheral ID0

Peripheral ID1

Peripheral ID2

JEP 106 continuation code [3:0]

Part Number [7:0]

JEP 106 ID code [3:0] - Part Number [11:8]

Revision - JEP 106 ID code [6:4]

0x00

0x10

0x04

0x0A

2)購入品チップのコード

Address/Code

純正(We Act実装)

STM32F103CBT

MINI ST-Link V2

APM32F103CBT6

捺印フェイク

STM32F103C8T

SWD IDCODE

0x1BA01477

0x2BA01477

×

0x1FFFF7E0

0x0080

×

0xE00FFFD0

0x04

0xE00FFFE0

0x10

0xC3

×

0xE00FFFE4

0x04

0xB4

×

0xE00FFFE8

0x0A

0x0B

×

4KB count

0x00

JEP 106 continue

0x00

0x04

×

Part Number

0x410

0x4C3

×

JEP 106 ID

0x20

0x3B

×

Revision

0x00

捺印フェイククローンはMINI ST-Link V2に実装されていたチップと同じ
モリーが多かったり色々おかしいけど動く