我正在编程stm32l412kb,在那里我将在某一时刻将数据写入闪存(从UART)。通过stm32l41xx reference manual,我了解了在写入内存之前如何清除内存的步骤,但是在第84页上有一个步骤,我不知道在写入实际数据时该怎么做。那一步是
在所需的存储器地址上执行数据写操作
它提到什么数据写入操作?我看不到内存地址到任何寄存器,所以我假设它要使用指针?我将如何去做呢?
非常感谢您的帮助, 非常感谢,
哈里
答案 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);