忍者ブログ

[PR]

2024年03月19日
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【備忘録】STM32F4シリーズのFlash status

2018年12月14日
STM32F4のライブラリであるSPLで定義されたFlash statusの説明がなかなか見つからなかったので備忘録として残しておく。

SPLのマニュアルずっと探してたけど、結局リファレンスマニュアルのレジスタの説明にのってた。
わかりづらい…。

本題
FLASH_Status;の定義は以下。
typedef enum
  FLASH_BUSY = 1,
  FLASH_ERROR_RD,
  FLASH_ERROR_PGS,
  FLASH_ERROR_PGP,
  FLASH_ERROR_PGA,
  FLASH_ERROR_WRP,
  FLASH_ERROR_PROGRAM,
  FLASH_ERROR_OPERATION,
  FLASH_COMPLETE
}FLASH_Status;

説明
  FLASH_BUSY:他のタスクがフラッシュにアクセス中
  FLASH_ERROR_RD,:保護されたフラッシュセクタに属するアドレスに対して、D-bus からの読出し
  FLASH_ERROR_PGS,:プログラミングシーケンスエラー。制御レジスタが正しく設定されていない時にコードによってフラッシュメモリへの書込みアクセスが 実施
  FLASH_ERROR_PGP,:プログラミング並列処理エラー。プログラムシーケンスにおけるアクセスのサイズ(バイト、ハーフワード、ワード、ダブルワード)が 並列処理設定 PSIZE(x8、x16、x32、x64)と一致しない
  FLASH_ERROR_PGA,:プログラミング配置エラー。プログラムするデータを同じ 128 ビットのフラッシュメモリ列に含むことができない
  FLASH_ERROR_WRP,:書込み保護エラー。消去/プログラムするアドレスがフラッシュメモリの書込み保護された部分のアドレスである
  FLASH_ERROR_PROGRAM,:記載見つけられず。F3のを見るに、クリアされていない場所に書き込んだことによるエラー。
  FLASH_ERROR_OPERATION,:操作エラー。フラッシュ操作(プログラミング/消去/読出し)リクエストが検出され、並列処理、配置、書込みま たは読出し(PCROP)保護エラーによってフラッシュ操作を実行できない
  FLASH_COMPLETE:正常
PR

【備忘録】Recipe for target 'post-build' failedが解決できなかった話

2018年09月10日
SW4STM32を使っていてRecipe for target 'post-build' failedという問題に立ちあたって結局解決できなかったが、備忘録として残しておく。
結論としてはプロジェクトを新しく作り直し、ソースコードを手で移植することで対処した。

【環境】
SW4STM32(v1.14)
STM32F405RG

【発端】
これまで問題なくビルドできていたプロジェクトが突然以下のエラーでビルドできなくなる。
・gcc not found in path
・g++ not found in path

【やったこと】
覚えてる範囲で書いておく。

これまで開発してきたプロジェクトに対して
・Gitで過去の状態に戻す(プロジェクト構成等も含む)⇒変わらずgcc,g++がないと言われる。
・gcc,g++のディレクトリを確認。⇒Cygwinのgcc,g++があるディレクトリにパスが通っている。
・Cygwinをインストールしなおす。⇒変わらずgcc,g++がないと言われる。

別のPCにSW4STM32をインストールして、Gitから問題のプロジェクトを持ってきて検証。
その際、gcc,g++はMinGWとCygwinを試した。
⇒エラー内容が変わる。タイトルのRecipe for target 'post-build' failed。gcc,g++は見つけたらしい。

Recipe for target 'post-build' failedを解決するために
・ネットでググると、Recipe for target 'main.o' failedがMake.exeを更新したら直ったという人がいたので真似。⇒変化なし。
・Gitで過去のVerにさかのぼって実行⇒変化なし。
・ProjectのPropertiesからC/C++BuildのGenerate Makefiles automaticallyのチェックを外す⇒エラーが出ない。

【結局どうした】
Twitterで弱音を吐いたらWMMCの優しい人が、Wikiを紹介してくれたので、新しくプロジェクトを作り直した。
ただし、リンク先の
4.「Board」タブが選択されているので,左上の「Mcu」と書いてあるところをクリックして「Mcu」タブに切り替える。
に関して、私がやったときは上部にタブがなく、Boardしか選べなかった。(SW4STM32は昔入れた奴だからVerが古いのかも。)
幸い、使おうとしたSTM32F405RGはBoardとして選べたので事なきをえた。

後は、
C++のStdLib使うためにProject>Properties>C/C++Build>SettingからTool Setting>MCU G++ CompilerのDialectのからISO C++1yを選んだり、
motファイルを生成するように設定を変えたり
したら書き込めるようになって、今のところ動いている。

情弱でもSTM32が使いたい! その2

2016年08月13日



こんにちは。
書こう書こうと思っているうちに気づけばこんなに時間が経ってしまいました。

というわけで第2回書き込み編です。
第1回開発環境編はこちら


System Workbench for STM32の設定について


では書き込みへ、と行く前に少しSystem Workbench for STM32の設定をいじっておきましょう。
System Workbench for STM32はデフォルトの設定ではビルドした後に .binファイルが生成されます。
しかし、これから導入する書き込み方法では .motファイルしか書き込めないので設定を変更する必要があるのです。

System Workbench for STM32を起動すると画面右側にProject Explorer があり、そこに自分が作ったプロジェクトが表示されていることかと思います。
そのプロジェクトを選択した状態で右クリックを押して、そこからPropertiesを開いてください(画像参照)。



一番下のやつですね。
次に開いたPropertiesの中にある C/C++ Build > Setting を開いてください。
下の画像みたいになってればOKです。




この中段にある Post-build steps の中の Command をいじります。
現在は

arm-none-eabi-objcopy -O binary "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.bin"; arm-none-eabi-size "${BuildArtifactFileName}

となっているはずなので

arm-none-eabi-objcopy -O srec "${BuildArtifactFileBaseName}.elf" "${BuildArtifactFileBaseName}.mot"; arm-none-eabi-size "${BuildArtifactFileName}"

としてください。
赤字になっている部分が変更点です。
これで右下のOKから設定を保存すれば.motファイルが生成されるようになったはずです!
ビルドしてご確認ください。


いざ書き込みへ


書き込むためには書き込みソフトが必要です。というわけで、こちら
はい、皆様ご存知マウス界の宇宙人ことこじまさんのプログラムです。
せっかくですので偉大なる先人の功績をありがたく使わせていただきましょう。

導入方法や使い方はリンク先のページに書いてあります。
何はともあれ最初は使用環境を構築しましょう。
リンク先の説明に従って python と pyserial をインストールしてください。

これで使う準備は整いました!
後は説明を読んでパパッと書き込んじゃいましょう!!


…といってできるなら情弱と言われていないわけですね、はい。

リンク先の説明を読んでもよくわからないし、ピンとこないですよね?

よくわからないですよね…?



えっ、もしかして僕だけ?


wirte_main.pyの使い方


皆さんはともかく僕はわからなかったので、軽く使い方を説明しておきます。
大丈夫そうな方は読み飛ばしちゃってください。

まずは、"write_main.py"と"write_static.py"をワークスペースのプロジェクトフォルダの直下にコピーしてください。Debugやsrcフォルダ同じ階層に来てればOKです。

write_main.pyの設定

次に設定を整えましょう。プロジェクトにコピーした”write_main.py"をメモ帳等のテキストエディタで開いてください。


ポーレート
ポーレート設定をしましょう。9行目あたりの baudrate = "xxx" のxxx部分をお望みのポーレートに設定してください。
例:baudrate = "230400"


書き込みポート
次は書き込みポートです。13行目あたりの port = "xxx" のxxx部分を適したポートにしましょう。
Linuxや他のOSを使用している方は15行目、17行目の分岐先の部分を書き換えましょう。
例:port = "com3"
ちなみにWindows場合、ポート番号は コントロールパネル>ハードウェアとサウンド>デバイスマネージャー から調べることができます。


motファイルの指定
続いて書き込むmotファイルを指定してあげましょう。
20行目あたりにあるmot_files = os.path.join("xxx", "yyy", "zzz.mot") のxxxとyyyとzzzを指定してあげます。
これらは"write_main.py"からの相対pathを表しています。これだったら、xxxフォルダの中のyyyフォルダの中にあるzzz.motファイルを書き込むということですね。
今、"write_main.py"はワークスペースのプロジェクトの直下にあるはずなので、以下のようにすれば大丈夫なはずです。
mot_files = os.path.join("Debug", "ProjectName.mot")

※ProjectNameは皆さんが決めたプロジェクトの名前という意味です。僕の場合はプロジェクト名をhalf_mouseにしたので"half_mouse.mot"になります。


ターミナルソフトの起動
このプログラムは書き込み後自動でターミナルソフトが起動するようになっているので、最後にその設定を行います。
27行28行目あたりの termsoft = "xxx.exe" のxxx部分を起動したいターミナルソフトのPathに書き換えましょう。64bitの方は27行目をコメントアウトして28行目のコメントアウトを外しましょう。コメントアウトは#です。
例:termsoft = "C:/PROGRA~2/Renesas/teraterm/ttermpro.exe"

めんどくさかったら56~62行目をコメントアウトしてください。ターミナルソフトの起動自体がなくなるはずです。

write_main.pyの実行

では、設定も終わったことですし、いよいよ書き込んでみましょう!

コマンドプロンプトから"write_main.py"を実行すれば良いそうです。

Linuxを使ってる方はともかく、Windowsだけしか使わない方はコマンドプロンプトにあまりなじみがないのではないでしょうか?
本題からそれてしまうので、コマンドプロンプトやそのコマンドについて説明することはやめておきます。そもそも僕もよく知りません。

ともかく、このプログラムを使うだけなら簡単です。まず、"write_main.py"があるフォルダを開いてください。何も選択していない状態で「Shift+右クリック」です。すると、「コマンドウィンドウをここで開く」が出てくると思います。



これを選択してください。黒い画面が出てきましたね? そこで"write_main.py"と打ち込んでEnterで実行(書き込み)です!



無事書き込めた方はおめでとうございます。
残念ながらうまくいかなかった方は「Ctrl+C」で中断して、何が間違っているのか探す旅を始めましょう。頑張ってください。


おわりに

これで皆さん書き込めるようになったはずです。…はずですよね?
わからないことや間違っていること等あれば、コメントからお願いします。

次回はいよいよプログラム。IOでも叩けたらいいですね。
それでは、ほどほどに期待してお待ちください。
 | HOME |