Open8

STM32G43X ベアメタルRustでFLASHへのデータ保存

chamachama

STM32G43X ベアメタルRustでFLASHへのデータ保存ができるようになるまでの記録

作業環境

  • STM32G431C6T6
  • rustc 1.68.0
  • cortex-m = "0.6.0"
  • cortex-m-rt = "0.6.10"
  • cortex-m-semihosting = "0.3.3"
  • [dependencies.stm32g4]
    features = ["stm32g431", "rt"]
    version = "0.14.0"
chamachama

FLASHサイズは
6 = 32 Kbyte


[Datasheet - STM32G474xB STM32G474xC STM32G474xE]

chamachama

FLASHサイズ32 KbyteのSTM32G431の場合のアドレス
0x0800 0000 - 0x0800 07FF 2K Page0
0x0800 0800 - 0x0800 0FFF 2K Page1
0x0800 1000 - 0x0800 17FF 2K Page2
0x0800 1800 - 0x0800 1FFF 2K Page3
0x0800 2000 - 0x0800 27FF 2K Page4
0x0800 2800 - 0x0800 2FFF 2K Page5
0x0800 3000 - 0x0800 37FF 2K Page6
0x0800 3800 - 0x0800 3FFF 2K Page7
0x0800 4000 - 0x0800 47FF 2K Page8
0x0800 4800 - 0x0800 4FFF 2K Page9
0x0800 5000 - 0x0800 57FF 2K Page10
0x0800 5800 - 0x0800 5FFF 2K Page11
0x0800 6000 - 0x0800 67FF 2K Page12
0x0800 6800 - 0x0800 6FFF 2K Page13
0x0800 7000 - 0x0800 77FF 2K Page14
0x0800 7800 - 0x0800 7FFF 2K Page15

chamachama

2Kの大きさ

0 4 8 C
0x000 32bit 32bit 32bit 32bit
0x010 32bit 32bit 32bit 32bit
0x000-0x0F0(16個) ...
0x100 32bit 32bit 32bit 32bit
0x800 32bit 32bit 32bit 32bit

32bit * 4 * 16 * 8
= 16384bit = 2048Byte

chamachama

Elaseの実験

  • CubeProgrammerを使って0x08007F00から末尾までを0xAAで埋める
  • Elaseのコードを実行し挙動を確認する
chamachama

rustで実行する場合にここでハマった。
1ラインで書かないとCRレジスタがロックされてしまう。

flash.cr.write(|w| unsafe {w.pnb().bits(15).per().set_bit().strt().set_bit()});

こういう形で設定するのがよい