stm32f103
目次
STM8S-Discovery基板(750円)のST-Link側だけで遊ぶ†
- STM8S-Discoveryの8bitCPUは使わずに、ST-Link側のstm32を使ってみます。
- チップ単価は1個注文で900円くらいなので、どう見ても赤字っぽい気がする。 (もちろん1000個単位なら@500円くらい)
- 確かにクロックは速いし32bitCPUなんだけどFlash容量からするとAVR(ATmega644)とそんなに変わらない規模。
STM32F103C8T6 | 諸元 |
プログラムメモリサイズ | 64K |
RAMのサイズ | 20K |
I/O数 | 37 |
パッケージ/ケース | 48-LQFP |
速度 | 72MHz |
Interface Type: | CAN, I2C, SPI, UART, USB |
Serial Comms: | 2xSPI, 2xI2C, 3xUSART,USB |
Max Supply Voltage: | 3.6V |
Min Supply Voltage: | 2V |
No. of ADC Inputs: | 10 |
Number of bits In Timer: | 16 |
- RISC CPUの72MHzって言ったら、i386(同じ32bit CPUでFPU無し)の144MHz相当くらいなんじゃなかろうか。
- もちろん、セグメントレジスタや仮想記憶は無い。
- RAM 20kBはちょっと狭すぎるけれど。
以下、解析なので間違っている場合があります。(ツッコミ歓迎)
CN5解析(部品面:上から見て)†
8 | PB4(JNTRST) | GND | 7 |
6 | PA15(JTDI) | PA13(JTMS/SWDIO) | 5 |
4 | PA14(JTCK/SWCLK) | PB3(JTDO) | 3 |
- | - | VDD_1 | 1 |
CN7解析(部品面:上から見て)†
CN7 | 1 | 2 | 3 | 4 |
VDD | SB2 | GND | SB1 |
VDD | STM8S側のVDD(5V/3.3VはSTM8S基板側ジャンパーで指定) | ||
SB2 | ST_LINK_SWIM (Single Wire Interface Module) | --- 47Ω---> PB8 | --- 220Ω--->PB9 |
GND | |||
SB1 | RESET# | --- 47Ω---> PB6 | --- 220Ω--->PB5 |
LED†
- LEDはPA8 (Hで点灯) 正論理
- LED + GND <---|<|------510Ω----> PA8
ブートモード†
BOOT1(PB2:pin20) | BOOT0(pin44) | ブートモード | 備考 |
− | 0 | ユーザーFlash | 0800_0000ユーザーFlashからのブート |
0 | 1 | システムメモリー | 1fff_f000からのブート(シリアルブート?uart1から?) |
1 | 1 | 内蔵SRAM | 内蔵SRAMからのブート(内蔵SRAM?誰が書き込むんだろう?JTAGかな) |
作りかけのJTAGライター†
参考にしたURL
今や、ATtiny2313(1個)でJTAGライターを作ることも出来ます。
ターゲット(STM32)と接続したところ†
OpenOCDを動かしてログを取ったところ†
Open On-Chip Debugger 0.5.0-dev-00616-g0672a64 (2010-07-14-09:46) Licensed under GNU GPL v2 For bug reports, read http://openocd.berlios.de/doc/doxygen/bugs.html Info : only one transport option; autoselect 'jtag' 1000 kHz 1000 kHz adapter_nsrst_delay: 100 jtag_ntrst_delay: 100 Info : device: 4 "2232C" Info : deviceID: 67330064 Info : SerialNumber: FTTDJ3SYA Info : Description: JTAGkey A Info : clock speed 1000 kHz Info : JTAG tap: stm32.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba 0, ver: 0x3) Info : JTAG tap: stm32.bs tap/device found: 0x16410041 (mfg: 0x020, part: 0x641 , ver: 0x1) Info : stm32.cpu: hardware has 6 breakpoints, 4 watchpoints Info : accepting 'telnet' connection from 4444
>scan_chain TapName Enabled IdCode Expected IrLen IrCap IrMask -- ------------------- -------- ---------- ---------- ----- ----- ------ 0 stm32.cpu Y 0x3ba00477 0x3ba00477 4 0x01 0x0f 1 stm32.bs Y 0x16410041 0x06412041 5 0x01 0x03 0x06410041 0x06410041 0x06410041 0x06410041
>halt target state: halted target halted due to debug-request, current mode: Handler HardFault xPSR: 0x41000003 pc: 0x08000e58 msp: 0x20001e90
>reg ===== arm v7m registers (0) r0 (/32): 0x00000000 (1) r1 (/32): 0x00000005 (2) r2 (/32): 0x200016D6 (3) r3 (/32): 0x20000240 (4) r4 (/32): 0x20000E84 (5) r5 (/32): 0x20000E85 (6) r6 (/32): 0x20000E8C (7) r7 (/32): 0x20000E94 (8) r8 (/32): 0xFFFEF7DD (9) r9 (/32): 0xF7FBFFB4 (10) r10 (/32): 0xA37732C4 (11) r11 (/32): 0x96520B5D (12) r12 (/32): 0xE000E410 (13) sp (/32): 0x20001E90 (14) lr (/32): 0xFFFFFFF1 (15) pc (/32): 0x08000E58 (16) xPSR (/32): 0x41000003 (17) msp (/32): 0x20001E90 (18) psp (/32): 0x84324460 (19) primask (/1): 0x00 (20) basepri (/8): 0x00 (21) faultmask (/1): 0x00 (22) control (/2): 0x00 ===== cortex-m3 dwt registers (23) dwt_ctrl (/32) (24) dwt_cyccnt (/32) (25) dwt_0_comp (/32) (26) dwt_0_mask (/4) (27) dwt_0_function (/32) (28) dwt_1_comp (/32) (29) dwt_1_mask (/4) (30) dwt_1_function (/32) (31) dwt_2_comp (/32) (32) dwt_2_mask (/4) (33) dwt_2_function (/32) (34) dwt_3_comp (/32) (35) dwt_3_mask (/4) (36) dwt_3_function (/32)
- 一応、接続OK。
遊び方†
まずtelnet(localhost:4444)接続したら、
> reset halt > reg // レジスタを見る. > mdw 0x20000100 0x40 // RAMをメモリーダンプする. > load_image main.hex // 自作hexファイルを(RAMに)ロードする. > reg pc 0x20000250 // 自作hexのエントリーアドレスをpcに入れる. > step > step > reg ・・・気がすむまで・・・
gdb要らないじゃん(笑)
本日の結論
- 意地でも0x800_0000のFlashは読めないようになっている、ということが分かった。
- ひとおもいにERASEしてしまえばいいだけのことだが・・・。(何か悔しい)
- gdbを立ち上げなくても普通にhexファイルを読んで実行するとか簡単にできる
- (おまけにブレークポイントとかステップ実行とかreg dumpとか全部出来る)ということが分かった。
Flashの書き換えを実行する。†
いよいよ、STM8Sとのお別れです。
- あとでどうしてもSTM8Sを使いたくなったら、Versaloonでもいれることにして、STM8Sにお別れを言います。
- 書き換え方法は以下のサイトを参考にさせていただきました。
書き換え方法†
- まず、OpenOCDでST-LINKに接続します。
D:\OpenOCD>openocd.exe -s ./tcl -f daemon.cfg -f jtagkey.cfg -c "jtag_khz 1000" -f target/stm32.cfg
すると、
Open On-Chip Debugger 0.5.0-dev-00616-g0672a64 (2010-07-14-09:46) Licensed under GNU GPL v2 For bug reports, read http://openocd.berlios.de/doc/doxygen/bugs.html Info : only one transport option; autoselect 'jtag' 1000 kHz 1000 kHz adapter_nsrst_delay: 100 jtag_ntrst_delay: 100 Info : device: 4 "2232C" Info : deviceID: 67330064 Info : SerialNumber: FTTDJ3SYA Info : Description: JTAGkey A Info : clock speed 1000 kHz Info : JTAG tap: stm32.cpu tap/device found: 0x3ba00477 (mfg: 0x23b, part: 0xba00, ver: 0x3) Info : JTAG tap: stm32.bs tap/device found: 0x16410041 (mfg: 0x020, part: 0x6410, ver: 0x1) Info : stm32.cpu: hardware has 6 breakpoints, 4 watchpoints
接続しました。
書き換えファームはこれです。
- firmware/main-0000.hex をさっきOpenOCDを起動したディレクトリにコピーしておきます。
- 次は、Teratermで localhost:4444番Portに接続します。
まず、元のST-LinkはFlashROmの内容がロックされた状態になっているので、アンロックします。
Open On-Chip Debugger > reset halt > stm32x unlock 0 > shutdown
- 電源を入れなおしてもう一度、Teratermで localhost:4444番Portに接続します。
Open On-Chip Debugger > reset halt > poll > flash probe 0 > flash write_image erase main-0000.hex > shutdown
- もしかしたら、アンロック後はファームが空になるので、書き込みが不安定になるかもしれません。
- その場合は何回かトライしてみてください。
- ST-Link以外の普通のSTM32チップでは、ロック解除のコマンド投入の必要はありません。
DFU(ブートローダー)の使い方†
- 上記main-0000.hexはHID bootloaderです
- DFUのほうが良いという方はこちらのdfu.zipを展開して、開始番地を0x800_0000に変更、ブートジャンパーのPORTを適当に合わせてから焼いてみてください。
read more : DFU
- DFUはあんまりお勧めできません。
理由
- *.elfから*.dfuに変換するツールがWindows GUIで非常に使いにくい。
- *.dfuをターゲットに転送するツールもWindows GUIで非常に使いにくい。
- *.dfuフォーマットやUSBのDFUクラスを使用することによるメリットが殆ど無い。
DFUに代わる、HIDブートローダーを作ろう。†
- 現在、PIC用のpic18bootやpic18spxを元に、製作中。
まだ、メモリーダンプだけしか出来ません。
ブートローダーとして使えるようになりました。
・・・途中バージョンでよければ、ダウンロード。
- armon.zip --- PIC18spxみたいなやつ。
- STM8S-DiscoveryのST-Link側用です。OpenOCDで書き込みます。
CQ付録-STARM32基板でも使えるはずです。--- BOOT JUMPERの割り当てを書き換えないとだめです。
- ファームサイズは8kBに収まっています。
- SWIM端子のGND <=> RESET# 間にBOOT JUMPERを挟んでください。
JUMPER CLOSE で、BOOTLOADERが起動します。 JUMPER OPEN で、0x0800_2000番地からのファームウェアが起動します。
ARMビルド環境の構築方法†
- WinARMビルド環境の構築方法
- ARMクロスコンパイラ構築(Linux)
- CodeSourcery_G++_Lite ←今のところこれが一番お勧めです。
- WinARMはlibgccのfloat関数が抜けているので、一部差し替えの必要があります。
- また、libc.aの_sbrk_rや_open_r,_read_rなども抜けています。(組み込み用途でファイルオープンは普通しませんが)
- CodeSourcery_G++_Liteはコマンドライン版ですが無償で使用できます。また、gccのバージョンが新しい(4.4.1)ためか、生成コードサイズが小さくなります。
- CodeSourcery_G++_Liteには makeやls,catといったunix標準コマンドがあまり含まれていません(cs_make.exeは付いています)ので、WinAVRを別途インストールされている方は、そちら(C:\WinAVR\utils\bin\)にもPATHを通しておいたほうが良いでしょう。
read more : HIDブートローダー
read more : OpenOCDライター兼AVR/PICライターを作る