了解STM32参考手册中的Flash写入过程

arr*_*y_h 2 c read-write stm32 flash-memory

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

在所需的存储器地址执行数据写入操作

它提到什么数据写入操作?我看不到内存地址到任何寄存器,所以我假设它要使用指针?我将如何去做呢?

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

哈里

Vin*_*nci 6

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

STM自己的HAL库包含一个函数,该函数可以为您完成所有繁琐的样板工作,并允许您“仅编写”:

HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data)
Run Code Online (Sandbox Code Playgroud)

在内部,此函数使用一个子例程来执行实际的写操作,它看起来像这样:

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);
}
Run Code Online (Sandbox Code Playgroud)

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