arr*_*y_h 2 c read-write stm32 flash-memory
我正在编程stm32l412kb,我将在某一时刻将数据写入闪存(从UART)。从stm32l41xx 参考手册中,我了解了在写入内存之前如何清除内存的步骤,但是在第84页上有一个步骤,我不知道在写入实际数据时该怎么做。那一步是
在所需的存储器地址执行数据写入操作
它提到什么数据写入操作?我看不到内存地址到任何寄存器,所以我假设它要使用指针?我将如何去做呢?
非常感谢您的帮助,非常感谢,
哈里
除了几件事(例如,仅在擦除,定时,对齐,锁定/解锁之后写入),它们在写入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)
如您所见,其中没有魔术。它只是一个取消引用的指针和一个赋值。