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

时间:2019-07-16 13:28:43

标签: c stm32 read-write flash-memory

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

  

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

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

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

哈里

2 个答案:

答案 0 :(得分:6)

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

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

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);
}

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

答案 1 :(得分:3)

  

它提到什么数据写入操作?

“数据写入”只是对作为闪存的存储器中地址的常规写入。通常是STR汇编指令。从您的数据表中筛选,我想闪存地址在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);