本ページでは、筆者が作業中にあたった問題等をメモ化して列記する。
問題と原因の関係が一対一であるとは限らないので、
あくまでも一例としてご覧いただきたい。
★ARM関連
① STM32F2でシステムクロック周波数を変更すると、動作がおかしくなる。
◆問題:
◆原因:
◆解決:
② Cortex-M3 でlong long型の計算をするとおかしくなる。
◆問題:
◆原因:
◆解決:
◆参考:
◆問題:
◆原因:
◆解決 その1:
① パソコンのシリアルポート経由でCPUとパソコンを接続できるようにする。
CPUボードに、USB-シリアル変換ICが載っているのであれば、それを利用してもよい。
なければ、USB-シリアル変換器や、RS232のレベルコンバータ等を使っての接続が必要になるかもしれない。
② "STM32 and STM8 Flash loader demonstrator"をSTマイクロのページよりダウンロードする。
③ マイコンのブートモード設定端子をいじり、ブートモードを System memory に設定してマイコンをリセットする。
STM32F2の場合、BOOT1 =0、 BOOT0 = 1にすればよい。
④ Flash loader demonstratorを使ってマイコンのFlashを全部消す。
⑤ マイコンは復活し、JTAG経由でプログラム書き込みできるようになったはず。
ただし、同じプログラムを書き込んだら、また死んでしまう。忘れずに違うプログラムを書き込もう。
◆解決 その2:
設定ミスするたびにその1の手順を踏むのが面倒な場合は、
その1に加えて以下の手順を行えるようにしておくとよい。
(すでにマイコンがおかしくなっている場合は、その1の手順から実施しないとだめです)
⑥あらかじめ、プログラムのスタート地点にできるだけ近い場所※1に、以下のようなコードを入れる。
int main (void) {
RCC->AHB1ENR = 0x000000FF; //IOポートにクロック供給する
//バグった時の救済用。ボタンを押しながらリセットすると、ここでひっかかる。if (((GPIOC->IDR) & 0x00002000) == 0) {while (1);}・・・
つまり、IOポートを読んで、起動時点で何かボタン※2が押されていたら、
無限ループに入るようにしておく。
※1: 問題の発生箇所より手前にないと意味がない。
※2: 上記の場合は、ポートCの13番に負論理でボタンが接続されている。
⑦ ボタンを押しながらマイコンをリセットする。
この時点で、マイコンの処理は無限ループに入るから、
JTAGポートをつぶすような処理もしない。
⑧ ボタンはそのまま押しっぱなしにし、JTAGデバッガをつないで、
デバッグ起動してみる。プログラムはwhile(1); で永久ループしているはず。
JTAGデバッガが使える状態である。
⑨ JTAGポートをつぶさない、正しいプログラムを書き込む。
ボタンをはなして、正規の処理を行わせる。
コメントする