STM32F103 闪存保护部分
Posted
技术标签:
【中文标题】STM32F103 闪存保护部分【英文标题】:STM32F103 Protect section of flash memory 【发布时间】:2021-06-08 17:56:59 【问题描述】:当我断开 ST-Link、连接它然后通过 OpenOCD 对微控制器进行编程时,我无法保护 USER_FLASH 中的数据。 我使用链接描述文件中的选项 (NOLOAD) 对其进行测试,但数据总是被删除。
STM32F103C8TX_FLASH.ld:
...
/* Memories definition */
MEMORY
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 63K
USER_FLASH (xrw) : ORIGIN = 0x0800FC00, LENGTH = 1K
/* Sections */
SECTIONS
/* User data to be stored in the flash memory goes into USER_FLASH */
.user_data_flash (NOLOAD):
. = ALIGN(4);
*(.user_data_flash) /* .user_data_flash sections */
*(.user_data_flash*) /* .user_data_flash sections */
. = ALIGN(4);
>USER_FLASH
...
该功能在不断开程序员的情况下运行良好:
void testFlash(void)
uint32_t temp = 0;
//writeFlash(test);
//Flash_Read_Data(0x0800FC00, temp);
temp = readFlashTest((uint32_t *)0x0800FC00);
temp = temp + 4;
writeFlash((uint32_t)temp);
uint32_t readFlashTest(uint32_t *mem)
uint32_t temp = 0;
HAL_FLASH_Unlock();
temp = *mem;
HAL_FLASH_Lock();
return temp;
void writeFlash(uint32_t toWrite)
eraseFlash(); // Necesario si o si sino no escribe
HAL_FLASH_Unlock();
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, 0x0800FC00, toWrite);
HAL_FLASH_Lock();
【问题讨论】:
应该是 0x0800FC00 而不是 0x8000FC00。 我已经修改了内存地址,但我仍然有同样的问题......也许我需要修改OpenOCD中的一些参数。控制台返回:Info : device id = 0x20036410 Info : flash size = 128kbytes
但微控制器有 64K 的 Flash。
请更好地描述您预期会发生什么以及会发生什么。我对“保护”一词有点困惑。另外添加readFlashTest
和writeFlash
的代码。
断开编程器并重新连接后,USER_FLASH返回值0xFFFFFFFF。
【参考方案1】:
解决方案是将 BOOT0 和 BOOT1 设置为 1。这样,启动模式是从嵌入式 SRAM 完成的,而不是从主闪存。
【讨论】:
我有点怀疑这是解决方案。我没有看到闪存编程问题的链接,也没有看到您如何在通电时将程序放入 SRAM。您的问题很可能出在 eraseFlash() 中。您是否在擦除页面后等待操作完成?以上是关于STM32F103 闪存保护部分的主要内容,如果未能解决你的问题,请参考以下文章