STM32参考手册中理解写入flash流程

Understanding the writing to flash process in the STM32 reference manual

我正在对 stm32l412kb 进行编程,我将在某一时刻将数据写入闪存(从 UART)。从 stm32l41xx reference manual,我了解了在写入内存之前如何清除内存的步骤,但是在第 84 页上,有一个步骤在写入实际数据时我不知道该怎么做。那一步就是

Perform the data write operation at the desired memory address

它说的是什么数据写入操作?我看不到内存地址指向的任何寄存器,所以我假设它会使用指针?我该怎么做呢?

非常感谢您的帮助, 非常感谢,

哈利

除了几件事(例如,仅在擦除后写入、计时、对齐,lock/unlock)之外,写入 RAM 和写入闪存之间没有太大区别。因此,如果您按照参考手册中的步骤进行操作并且闪存已准备就绪(即已清除和解锁),那么您只需获取对齐的内存地址并写入即可。

STM 自己的 HAL 库包含一个函数,可以为您完成所有繁琐的样板文件,并允许您 "just write":

HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data)

这个函数在内部使用了一个执行实际写入的子程序,它看起来像这样:

static void FLASH_Program_DoubleWord(uint32_t Address, uint64_t Data)
{
  /* Check the parameters */
  assert_param(IS_FLASH_PROGRAM_ADDRESS(Address));

  /* Set PG bit */
  SET_BIT(FLASH->CR, FLASH_CR_PG);

  /* Program first word */
  *(__IO uint32_t*)Address = (uint32_t)Data;

  /* Barrier to ensure programming is performed in 2 steps, in right order
    (independently of compiler optimization behavior) */
  __ISB();

  /* Program second word */
  *(__IO uint32_t*)(Address+4U) = (uint32_t)(Data >> 32);
}

如您所见,其中没有任何魔法。它只是一个取消引用的指针和一个赋值。

What data write operation is it mentioning?

"data write" 只是对闪存中内存地址的正常写入。通常是 STR 汇编指令。看了你的datasheet,我猜闪存地址在0x08080000和0x00080000之间。

例如。以下 C 代码会将值 42 写入第一个闪存地址:

 *(volatile uint32_t*)0x00080000 = 42.

有关参考实现,您可以查看 stm32 hal drivers:

  /* Set PG bit */
  SET_BIT(FLASH->CR, FLASH_CR_PG);

  /* Program the double word */
  *(__IO uint32_t*)Address = (uint32_t)Data;
  *(__IO uint32_t*)(Address+4) = (uint32_t)(Data >> 32);