stm32f103 の変更点


[[ARM]]

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

----
目次

#contents

----

*STM8S-Discovery基板(750円)のST-Link側だけで遊ぶ [#gbd47671]

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

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

http://psp.dip.jp/web/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解析(部品面:上から見て) [#d5953c57]

|8|PB4(JNTRST)|GND|7|
|6|PA15(JTDI)|PA13(JTMS/SWDIO)|5|
|4|PA14(JTCK/SWCLK)|PB3(JTDO)|3|
|-|-|VDD_1|1|

~

**CN7解析(部品面:上から見て) [#ua8163ad]

|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 [#s8ecdfe1]
-LEDはPA8 (Hで点灯) 正論理

         - LED +
  GND <---|<|------510Ω----> PA8


~

**ブートモード [#bff9a2f8]

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


~
~
~
~

-------

**作りかけのJTAGライター [#j4c1e6c8]

参考にしたURL
-http://micom.hamazo.tv/e1822876.html
-http://www.joernonline.de/

http://psp.dip.jp/web/jpg/ARM/ft2232d.jpg

~
http://psp.dip.jp/web/jpg/wsn216.jpg

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


**ターゲット(STM32)と接続したところ [#te680038]

http://psp.dip.jp/web/jpg/ARM/ft2232jtag.jpg

**OpenOCDを動かしてログを取ったところ [#z689fd3c]

 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。''


~
~
~
**遊び方 [#pfbc3f64]

まず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の書き換えを実行する。 [#bf8e5b51]

いよいよ、STM8Sとのお別れです。

-あとでどうしてもSTM8Sを使いたくなったら、[[Versaloon:http://nemuisan.blog.bai.ne.jp/?eid=178353]]でもいれることにして、STM8Sにお別れを言います。

-書き換え方法は以下のサイトを参考にさせていただきました。

-[[OpenOCDが動くまで:http://www.kimura-lab.net/wiki/index.php/OpenOCD%E3%81%8C%E5%8B%95%E3%81%8F%E3%81%BE%E3%81%A7#Flash.E6.9B.B8.E3.81.8D.E8.BE.BC.E3.81.BF]]

~

----------
*書き換え方法 [#t560fea9]
-まず、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
接続しました。


書き換えファームはこれです。
-[[armon.zip:http://psp.dip.jp/web/upload/STM/armon.zip]] 

-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(ブートローダー)の使い方 [#d4aa0e59]

-上記main-0000.hexはHID bootloaderです
-DFUのほうが良いという方は[[こちら>ARMCortexM3]]のdfu.zipを展開して、開始番地を0x800_0000に変更、ブートジャンパーのPORTを適当に合わせてから焼いてみてください。

read more : [[DFU]]

-DFUはあんまりお勧めできません。

理由
-*.elfから*.dfuに変換するツールがWindows GUIで非常に使いにくい。
-*.dfuをターゲットに転送するツールもWindows GUIで非常に使いにくい。
-*.dfuフォーマットやUSBのDFUクラスを使用することによるメリットが殆ど無い。

~
~

---------

*DFUに代わる、HIDブートローダーを作ろう。 [#gcb1351a]

-現在、PIC用のpic18bootやpic18spxを元に、製作中。

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

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

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

-[[armon.zip:http://psp.dip.jp/web/upload/STM/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ビルド環境の構築方法 [#g5831bcf]
-[[WinARMビルド環境の構築方法>WinARM]]
-[[ARMクロスコンパイラ構築(Linux)>2010-04#b817f226]]
-[[CodeSourcery_G++_Lite:http://www.lineo.co.jp/modules/codesourcery/editions.html]] ←今のところこれが一番お勧めです。


----
-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ブートローダー>armon]]

~

read more : [[OpenOCDライター兼AVR/PICライターを作る>stm8s_blaster]]


~