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]]
~