みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

NuttXのSTM32F103 minimum(BluePill)で128Kのフラッシュを使う

はじめに

前回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>

問題なく動作している。