はじめに
前回はSTM32F103C8T6
のフラッシュは64KiB
だと書いた。
しかし、NuttXのconfigs/stm32f103-minimum/scripts/ld.script
を参照すると、次のように書いてある。
* * NOTE: While the STM32F103C8T6 states that the part has 64Kb of FLASH, * all parts that I have seen do, in fact, have 128Kb of FLASH. That * additional 64Kb of FLASH can be utilized by simply change the LENGTH * of the flash region from 64K to 128K. ...(snip)... MEMORY { flash (rx) : ORIGIN = 0x08000000, LENGTH = 64K sram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K }
つまり、公開しているスペックとしては64Kだが実際には128Kのフラッシュが載っている。
このリンカスクリプトのLENGTHの部分を128K
に書き換えるだけで、フラッシュを128Kまで使用できるということらしい。
実際の作業はここを参考にさせてもらった。
BluePillのフラッシュを128Kにしてみる
まずは、ld.scriptを次のように修正してみる。
diff --git a/configs/stm32f103-minimum/scripts/ld.script b/configs/stm32f103-minimum/scripts/ld.script index ec15a978f8..32649c8c9a 100644 --- a/configs/stm32f103-minimum/scripts/ld.script +++ b/configs/stm32f103-minimum/scripts/ld.script @@ -48,7 +48,7 @@ MEMORY { - flash (rx) : ORIGIN = 0x08000000, LENGTH = 64K + flash (rx) : ORIGIN = 0x08000000, LENGTH = 128K sram (rwx) : ORIGIN = 0x20000000, LENGTH = 20K } -- 2.17.1
なにか機能を増やしてバイナリサイズを増やしてみる。
make menuconfig
でいろいろ機能を増やしてみて、64Kよりも大きいnuttx.bin
を作ってみる。
-rwxr-xr-x 1 mickey mickey 67K 1月 28 10:27 nuttx.bin
67Kのnuttx.binができた。
st-flashで書き込みを試してみる。
st-flashコマンドで書き込みを試してみる。ただ、このコマンドはSTM32F103C8T6
のフラッシュを64Kと認識しているので、うまく行く可能性は低そう。。。
$ st-flash write nuttx.bin 0x8000000 st-flash 1.5.1 2019-01-28T08:43:33 INFO usb.c: -- exit_dfu_mode 2019-01-28T08:43:33 INFO common.c: Loading device parameters.... 2019-01-28T08:43:33 INFO common.c: Device connected is: F1 Medium-density device, id 0x20036410 2019-01-28T08:43:33 INFO common.c: SRAM size: 0x5000 bytes (20 KiB), Flash: 0x10000 bytes (64 KiB) in pages of 1024 bytes 2019-01-28T08:43:33 INFO common.c: Attempting to write 67076 (0x10604) bytes to stm32 address: 134217728 (0x8000000) 2019-01-28T08:43:33 ERROR common.c: addr too high stlink_fwrite_flash() == -1
予想通り失敗した。
OpenOCDで書き込み
ネットの情報を探してみると、OpenOCDでちょっとした細工をすると64Kを超えるイメージを書き込めるようになるらしい。
OpenOCDのインストール
OpenOCD
をソースからビルドしインストールする。
$ git clone http://repo.or.cz/openocd.git $ cd openocd $ ./bootstrap $ ./configure --enable-stlink $ make -j4 $ sudo make install
コンフィグファイルの作成
stm32f1x.cfg
をベースにstm32f103c8t6.cfg
を作成する。
$ cd /usr/local/share/openocd/scripts/target $ sudo cp stm32f1x.cfg stm32f103c8t6.cfg
FLASH_SIZEに0x20000(128K)
を設定する。
--- stm32f1x.cfg 2019-01-27 17:36:28.525946159 +0900 +++ stm32f103c8t6.cfg 2019-01-28 09:11:50.681348394 +0900 @@ -1,5 +1,7 @@ # script for stm32f1x family +set FLASH_SIZE 0x20000 + # # stm32 devices support both JTAG and SWD transports. #
イメージの書き込み
OpenOCDの起動
次のコマンドでOpenOCDを起動する。
$ openocd -f /usr/local/share/openocd/scripts/interface/stlink-v2.cfg -f /usr/local/share/openocd/scripts/target/stm32f103c8t6.cfg
telnetによる接続
シェルを新たに開いて次のコマンドを実行しOpenOCDに接続する。
$ telnet localhost 4444
> reset halt > flash write_image erase /home/mickey/work/nuttx/nuttx/nuttx.bin 0x08000000 > reset run > exit
書き込み結果
> flash write_image erase /home/mickey/work/nuttx/nuttx/nuttx.bin 0x08000000 auto erase enabled device id = 0x20036410 ignoring flash probed value, using configured bank size flash size = 128kbytes target halted due to breakpoint, current mode: Thread xPSR: 0x61000000 pc: 0x2000003a msp: 0x20000f18 wrote 68608 bytes from file /home/mickey/work/nuttx/nuttx/nuttx.bin in 3.809221s (17.589 KiB/s)
68608 bytes
書き込めてることがわかる。
確実にリセットさせるために、電源となるUSBケーブルを抜いて挿し直す。
NuttShell (NSH) nsh> nsh> nsh> nsh> help help usage: help [-v] [<cmd>] [ dd free mb mv rmdir true ? echo help mkdir mw set umount cat exec hexdump mkrd ps sh unset cd exit kill mh pwd sleep usleep cp false ls mount rm test xd Builtin Apps: tee ramtest hello nsh>
問題なく動作している。