STM32 + レジスタを直接たたいてFLASHの書き込み読み込みをやってみる

LLAPIには、Flash関連のプログラムが実装されていませんでした。したがって、レジスタを叩いて動かすということをしていきたいと思います。

HALAPIでも書いているので、HALを使用している方は以下に紹介する記事をみていただければと思います。リファレンスマニュアルについて読んだ点は同じだったのでレジスタの中身の確認からしていきます。

 




STM32CubeMXの設定

Flashに読み書きができているかどうかの確認を視覚的に行えるように、USARTを有効にしました。

 

STM32CubeMX USARTの設定

その後、ペリフェラルごとにファイルを分割するというところにチェックをいれて、コード生成をしたのち、printfを使用できる状態にしました。

LLAPIを使用したprintfの実装はこちらの記事を参考にしていただければと思います。

 

レジスタの確認を行う

KEYRレジスタ

RM0090 リファレンスマニュアルより引用

KEY1,KEY2を順番に書き込むことでFLASHレジスタへのアクセスが可能にするためのレジスタです。ここで、ロックを解除しないと書き込みができないということが読み取れます。

 

CRレジスタ

RM0090 リファレンスマニュアルより引用

RM0090 リファレンスマニュアルより引用

セクタ消去のセクタを設定したり、プログラミングのサイズを決めたりといろいろなことができるビットであることが伺えます。リファレンスマニュアルのセクタ消去や標準プログラミングのやり方でも出てきているので、マニュアルに沿って設定をしていきたいと思います。

 

SRレジスタ

RM0090 リファレンスマニュアルより引用

FLASHの作業中の状態を表示してくれるレジスタです。使用するので確認をしました。

 

ソースコードを実装する

今回は、stm32f405xx.hでmacro定義をされているものを上手く使用して書いていきました。定義されていないものは自分で定義を行っています。

また、電圧などに依存しないように8byte書き込みでの実装をしてみました。

こんな感じで実装しました。セクタ11を消去してセクタ11に書き込みを行っています。例によって構造体での書き込みで実装をしました。毎回フラッシュ領域をすべて消去していますがビットが1の場合は消去せずともデータの書き込みが可能なので、上手く扱うことで毎回セクタ消去しなくても使えるかもしれないです。

 

おわりに

LLAPIではFlashのプログラミングにAPIが提供されていなかったのでレジスタを叩いてみました。リファレンスマニュアルを読めばちゃんと動くものが実装できるということが体感できたと思います。次は、LLAPIのUSARTを使用してscanfの実装について書いていきたいと思います。

リクエスト等がありましたら、Twitterまたはコンタクトフォームから連絡を入れていただければ書くかもしれないです。リクエストお待ちしております。

 

参考文献

RM0090 リファレンスマニュアル