0

当我断开 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();
}
4

1 回答 1

0

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

于 2021-03-16T16:37:30.920 回答