stm32f103

ARM

http://www.akizukidenshi.com/img/goods/1/M-03457.jpg


目次


STM8S-Discovery基板(750円)のST-Link側だけで遊ぶ

http://www.eleki-jack.com/mycom2/noritan-stm8s-01-02.jpg

  • STM8S-Discoveryの8bitCPUは使わずに、ST-Link側のstm32を使ってみます。

/ATMEL_AVR/jpg/ARM/stm32f103.png

  • チップ単価は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解析(部品面:上から見て)

8PB4(JNTRST)GND7
6PA15(JTDI)PA13(JTMS/SWDIO)5
4PA14(JTCK/SWCLK)PB3(JTDO)3
--VDD_11


CN7解析(部品面:上から見て)

CN71234
VDDSB2GNDSB1



VDDSTM8S側のVDD(5V/3.3VはSTM8S基板側ジャンパーで指定)
SB2ST_LINK_SWIM (Single Wire Interface Module)--- 47Ω---> PB8--- 220Ω--->PB9
GND
SB1RESET#--- 47Ω---> PB6--- 220Ω--->PB5

LED

  • LEDはPA8 (Hで点灯) 正論理
        - LED +
 GND <---|<|------510Ω----> PA8


ブートモード

BOOT1(PB2:pin20)BOOT0(pin44)ブートモード備考
0ユーザーFlash0800_0000ユーザーFlashからのブート
01システムメモリー1fff_f000からのブート(シリアルブート?uart1から?)
11内蔵SRAM内蔵SRAMからのブート(内蔵SRAM?誰が書き込むんだろう?JTAGかな)






作りかけのJTAGライター

参考にしたURL

/ATMEL_AVR/jpg/ARM/ft2232d.jpg


/ATMEL_AVR/jpg/wsn216.jpg

今や、ATtiny2313(1個)でJTAGライターを作ることも出来ます。

ターゲット(STM32)と接続したところ

/ATMEL_AVR/jpg/ARM/ft2232jtag.jpg

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を元に、製作中。

まだ、メモリーダンプだけしか出来ません。

ブートローダーとして使えるようになりました。

・・・途中バージョンでよければ、ダウンロード。

  • STM8S-DiscoveryのST-Link側用です。OpenOCDで書き込みます。
  • CQ付録-STARM32基板でも使えるはずです。 --- BOOT JUMPERの割り当てを書き換えないとだめです。
  • ファームサイズは8kBに収まっています。
  • SWIM端子のGND <=> RESET# 間にBOOT JUMPERを挟んでください。
    JUMPER CLOSE で、BOOTLOADERが起動します。
    JUMPER OPEN  で、0x0800_2000番地からのファームウェアが起動します。



ARMビルド環境の構築方法


  • 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ライターを作る