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。 请更好地描述您预期会发生什么以及会发生什么。我对“保护”一词有点困惑。另外添加readFlashTestwriteFlash 的代码。 断开编程器并重新连接后,USER_FLASH返回值0xFFFFFFFF。 【参考方案1】:

解决方案是将 BOOT0 和 BOOT1 设置为 1。这样,启动模式是从嵌入式 SRAM 完成的,而不是从主闪存。

【讨论】:

我有点怀疑这是解决方案。我没有看到闪存编程问题的链接,也没有看到您如何在通电时将程序放入 SRAM。您的问题很可能出在 eraseFlash() 中。您是否在擦除页面后等待操作完成?

以上是关于STM32F103 闪存保护部分的主要内容,如果未能解决你的问题,请参考以下文章

STM32F103的MCU简介

stm32f407H库和stm32f103H库有区别吗

如何让 printf 在 STM32F103 上工作?

STM32F103(二十)DAC(贼详细)

STM32F103(十八)ADC总结(贼详细)

STM32F103(二十一)DMA(超详细的~)