Previous: 13.2.1. フラッシュのアンロック |
Up: 13.2. 書き換えの基本的手順 |
Next: 13.2.3. フラッシュへの書き込み |
次にフラッシュメモリの消去を行うのですが、ここでフラッシュメモリのページの概念を理解しておく必要があります。STM32のフラッシュメモリに限らず、フラッシュメモリは、消去を行う際には、一定の大きさのページ単位でのみ行えるようになっています。例えばSTM32の中容量デバイスの場合、フラッシュメモリの先頭番地から1Kバイト毎に、1枚のページが構成されています(表 20?1)。0x08000000番地から0x080003FF番地までのフラッシュメモリが一つのページで、それ以降も同様です。先頭のページをPage0として、以降順番に番号が付けられています。高容量デバイスの場合、ページの大きさは2Kバイトです(表 20?2)。詳細については「PM0042 STM32F10xxx Flash programming」をご覧ください。
表 20?1 フラッシュメモリのページとアドレスの関係(中容量デバイスの場合)
***再トレース 「ブロック」「名称」「基点アドレス」「サイズ」「メインメモリ」 PM0042 Programming manual / STM32F10xxx Flash programming(STMicroelectronics)より***
表 20?2 フラッシュメモリのページとアドレスの関係(高容量デバイスの場合)
***再トレース 「ブロック」「名称」「基点アドレス」「サイズ」「メインメモリ」PM0042 Programming manual / STM32F10xxx Flash programming(STMicroelectronics)より***
フラッシュの消去がページ単位になるということは、ページ単位より小さい単位での消去ができないということです。0x08001000番地から10バイト分だけ削除したいというときでも、1Kバイト分又は2Kバイト分まとめて消去しないといけないのです。10バイト分だけ削除したいというのであれば、ページの内容全体をRAMなどに待避させておいて、フラッシュの消去後にもう一度書き込みをし直さないといけません。
フラッシュの消去に使用するのが、FLASH_ErasePage関数(ライブラリ 20?3)です。
ライブラリ 20?3 FLASH_ErasePage関数
関数プロトタイプ |
FLASH_Status FLASH_ErasePage (uint32_t Page_Address ) |
|||||||||||
動作 |
フラッシュのページを消去します。 |
|||||||||||
引数 |
Page_Address |
消去するページをアドレスで指定します。ページの先頭アドレスが推奨されますが、中途のアドレスでも指定可能です。 |
||||||||||
戻り値 |
処理結果を返します。
|
サンプルプログラムでは、プログラム冒頭部で定義している、StartPageマクロのページから、PagesToWriteマクロのページ数分ページ消去しています。FLASH_ErasePage関数は一度に1ページ分しか消去を行えませんので、消去したいページ数(PagesToWrite)分、繰り返し実行しています。forループでFLASHStatusの値をチェックしているのは、エラーが帰ってきたときには処理を中断させるためです。
for(EraseCounter = 0; (EraseCounter < PagesToWrite) && (FLASHStatus == FLASH_COMPLETE); EraseCounter++) ? { ??? FLASHStatus = FLASH_ErasePage(FlashBaseAddr + (StartPage * FLASH_PAGE_SIZE) + (FLASH_PAGE_SIZE * EraseCounter)); ??? cprintf(“.”); ? } |
Previous: 13.2.1. フラッシュのアンロック |
Up: 13.2. 書き換えの基本的手順 |
Next: 13.2.3. フラッシュへの書き込み |