mbed-nucleo-flashwrite
mbed を使って,NUCLEO-F303ZEのフラッシュメモリにデータ保存する方法
基本的には HALを使えばうまくいくんですが,注意すべきことがあります.
具体的にどこまでOKか調べたわけではありませんが,
フラッシュメモリの領域は最後の方から使った方がよさそうです.
試しに先頭(0x08000000)を使ってみたんですが,うまく書き込めていませんでした.
ここの情報によると,0x08040000が最後の様ですが,0x0807F800に書き込むとうまくいきました.
どこからどこまでがOKなのか試していませんが,何かの参考になれば幸いです.
フラッシュリード
readだけだったらそのままアドレスを読めばいいみたい.
(XXX = *(uint32_t *)address;みたいにね)
問題なさそう.
フラッシュライト(Erase)
書いたり消したりするときはHAL_FLASH_Unlock();
でflash回りをアンロックするとよさそうです.
その後,わざわざFLASH_EraseInitTypeDefで変数作って
FLASH_EraseInitTypeDef x; x.TypeErase = FLASH_TYPEERASE_PAGES; // ページ単位で消すよ. x.PageAddress = PAGE_ADDRESS; // 消したいページアドレス x.NbPages = 2; // 消すページ数
みたいにして,
// pageにはError情報などが入る様だ. if ( HAL_OK != HAL_FLASHEx_Erase(&x, &page) ) { return -1; }
ってしないといけません.
メンドクサイね.
んで↓みたいにすると書き込めた。
HAL_FLASH_Unlock(); if ( HAL_OK != HAL_FLASHEx_Erase(&x, &page) ) { return -1; } int a = 0; int b = 0; int c = 0; int d = 0; address = PAGE_ADDRESS; // 事前に定義してね if ( HAL_OK != HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, a) ) return -1; if ( HAL_OK != HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address+4, b) ) return -1; if ( HAL_OK != HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address+8, c) ) return -1; if ( HAL_OK != HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address+12, d) ) return -1; HAL_FLASH_Lock(); HAL_FLASH_Unlock(); int data1 = 0; int data2 = 0; address = PAGE_ADDRESS2; // 事前に定義してね if ( HAL_OK != HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data1) ) return -1; if ( HAL_OK != HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address+4, data2) ) return -1; HAL_FLASH_Lock(); }
ちなみに一度書きこんだ位置に追加で書き込む場合は,page単位でアクセスすることになるので,必要な情報は一度どっかに確保して,その後,確保した情報に新しい情報を追加してまとめて書き込むと良さそうでした.
mbed便利なのでいっぱい使いたい。