STM32F103-P52 モニタ実行サンプルプログラム STM32F103-P52 リセット実行サンプルプログラム
組込プログラムではリセットスタートで起動し、自分自身で必要なハードウェアの初期化をするプログラムが基本となります。
そのようなプログラムの例としてROMモニタをとりあげます。
ここではROMモニタをソースから構築してCPUボードに書込むまでの手順を説明します。
| JSD-STM32F103-P52 CPUボード | JSD-OPENOCD-JTAGボード | ||
![]() |
![]() |
||
| CPU CLOCK USB SCI SPI CAN A/D TIMER ROM RAM 電源 その他 |
STM32F103 72MHz 1CH コネクタ有り 3CH 端子直接接続 2CH 1CH 12bit x 15CH 16bit x 6CH 128KFLASH内蔵 20K内蔵 5V or USBバスパワー ブレッドボード対応の端子 ONボードにLED x 8 圧電ブザー取付可 OPENOCD-JTAG対応 回路図 |
CPU 電源 機能 |
FTD2232D USBバスパワー USB-SERIAL1CH(TTLレベル) オープンソースopenocd互換 Flash書き込み 回路図 |
ターゲットボードとしてSTM32F103-P52を使います。
STM32F103Uはコード効率の良いARMアーキテクチャcortex-m3を採用したCPUで高性能でありながら外付けクロック、リセット回路無しでも動作可能、高分解能A/D内蔵、豊富なタイマ機能内蔵などが組み込み用として使いやすいCPUです。
STM32F103Uはシリアル経由のブート書込も可能ですが、ここではinsight(GDB)を使ったデバッグとフラッシュ書き込みが出来るOPENOCD対応のJTAGボードを使ってブート書き込みをおこないます。
組込プログラムではリセットスタートで起動し、自分自身で必要なハードウェアの初期化をするプログラムが基本となります。
そのようなプログラムの例としてROMモニタをとりあげます。
ここではROMモニタをソースから構築してCPUボードに書込むまでの手順を説明します。
プロジェクトはJDEVer5.07のインストールで JDE\work\stm32f103-p52\mon_stm32f103-p52_V10\mon_stm32f103-p52_v10.jpr としてインストールされています。
メニューからプロジェクト mon_stm32f103-p52.jpr を開き
(再構築)をクリックします。
コンパイルメッセージ欄に「コンパイルとリンクが終わりました」と表示されたら構築完了です。
エラーが発生した時は下図と較べて設定を確認して下さい。

どのようなメモリ配置でプログラムが作成されたかを確認するにはメッセージ欄の文字 mon_stm32f103-p52.map をダブルクリックします。
表示されたエディタウィンドウでまず .text という文字列を検索してみます。
.textはプログラムのセクションでプログラムが0x08000130から0x5384のサイズで展開されていることを示しています。
stm32f103ではフラッシュメモリが0x08000000に配置されており、0x00000000からも同じ内容を読み出すことが出来るようになっています。
同様に .bss .heap .stack 等について検索するとメモリ配置がCPUの内蔵ROM、RAMの範囲を超えていないことを確認できます。
リンカスクリプトで定義されたROM、RAMの範囲を超えてリンカエラーが発生した時以外はこのマップファイルを確認しなければならないことはほとんどありませんが、リンカスクリプトを変更してメモリ配置をカスタマイズする場合はmapファイルの情報が役に立ちます。

次にmon_stm32f103-p52.motをダブルクリックして生成された転送用のSフォーマットファイルを見てみます。
これは下図のようにプログラムのバイナリデータをアスキー文字でフォーマット化したものです。
先頭5-8文字がアドレスで続いて16進表記のデータが続き最後の2文字がチェックサムになっています。
通常はこのファイルを意識する必要はありませんが組み込みプログラムの基礎知識としてどのような形式のファイルが生成・転送されるかを知るために一度は確認しておくと何かの時に役立ちます。

OOCD-JTAGによるブート書き込みを参照してOOCD-JTAGボードとCPUボードを接続し構築したモニタプログラムをCPUボードに書き込んでください。

書き込んだモニタを起動してみます。
青枠で囲んだリセットボタンを一度押して、左端のLEDが点滅を開始したらモニタが正常に動作しています。

モニタ起動のプログラムが存在しないときはリセットボタンでモニタが起動します。
一度プログラムを書き込むとリセットボタンで書き込んだプログラムが起動するようになります、強制的にモニタを起動するときは黄色い枠で囲んだボタンを押したままリセットボタンを押して離しモニタLEDが点滅開始するまでしばらく待ちます。
通信プログラムを起動してENTERキーをたたくとモニタプロンプトが表示され、’?’を入力するとモニタコマンド一覧が表示されます。

プログラムをモニタから起動する場合のメリット、デメリットについてはプログラムのモニタ起動に説明があります。
実際にはターゲットCPUボードによってブート書き込みの方法やメモリの容量が異なるためリセット起動とモニタ起動のどちらを選ぶべきかは変わってきます、ここではstm32f103-p52の場合についてリセット起動とモニタ起動を比較してみます。
| リセット起動 | モニタ起動 | |
|---|---|---|
| 書き込み速度 | 10KB / sec | 8..5KB / 4sec |
| 使用できるRAM | 20KB | 18KB |
| 使用できるROM | 128KB | 100KB |
| 書き込みに必要なツール | OOCD-JTAG | USBケーブルのみ |
| USB標準入出力サポート | 無し | 有り |
| プログラムのCRCチェック | 無し | 有り |
| プログラム名と日付の記録 | 無し | 有り |
デバッグにはJTAGとデバッガソフトinsight(GDB)を使う方法と、printfデバッグがあります。PC上でのプログラム開発はデバッガを使うのが効率的ですがボード上のプログラムをデバッグするには両者をうまく使い分けるのが効率的です。
| JTAGデバッグ | printfデバッグ | |
|---|---|---|
| デバッグの手間 | やや煩雑 | 簡単 |
| プログラムトレース | 可 | 不可 |
| コードの解析 | 得意 | 不得意 |
| デバッグに必要なツール | OOCD-JTAG | USBケーブルのみ |
| プログラム構造の勉強 | 向いている | 不向き |
| プログラム経験の必要性 | 初心者、ベテラン | ベテラン |
| リアルタイム事象のデバッグ | 不得意 | 得意 |