This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1294NCPDT:TM4C1294闪存擦除问题

Guru**** 2455360 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1494333/tm4c1294ncpdt-tm4c1294-flash-erase-issue

器件型号:TM4C1294NCPDT

工具与软件:

你(们)好

我对引导加载程序 闪存存储器进行了分区、以便 从引导加载程序存储和引导固件应用程序十六进制文件

每次在 升级新固件应用十六进制期间、我都需要 擦除旧应用十六进制  

十六进制的大小约为800KB

当我尝试 在 引导加载程序启动期间擦除旧固件应用程序十六进制的闪存以进行新固件升级时  

这并不是完全擦除  

例如  

引导加载程序代码是星 地址0x00000000

引导加载程序结束 地址为0x0000c000

固件应用十六进制起始地址 0x0000D000

固件应用十六进制结束地址 0x00067570

当我擦除闪存以进行固件升级时、它仅从0x0000D000擦除到0x0000FFFC  

在 0x0000FFFC 地址后、它没有擦除  

请说明如何解决我添加了内存窗口和代码片段 以供您查看的问题

 0x0000FFFC 后、不会将其擦除

这是我的最后一个地址  

下面是我的代码供您参考

uint32_t * pui32App = NULL;
pu32App =(uint32_t *) fw_upgrade_memory;
//UARTprintf ("Erase secondary memory\n");
if ((pui32App[0]!= 0xffffffff)||
(pui32App[1]!= 0xffffffff)

UARTprintf ("擦除辅助存储器\n");
Flash_Erase (fw_upgrade_memory、900);
}

SysCtlDelay (2000);

void Flash_vEnable (void)

//如果设置了 KEY 标志(位4)、则密钥为0xA442。
//否则、密钥为0x71D5 (TM4C123数据表的第583页)。
如果(BOOTCFG & 0x10){
U16_Glob_flashKey = 0xA442;
}
否则{
U16_Glob_flashKey = 0x71D5;
}

}

void Flash_Erase (uint32_t FlashBaseAddress、uint32_t blockCount)/* block 是1k*/

uint32_t i;
Flash_vEnable();
对于(i = 0;i < blockCount;i++)

SysCtlDelay (20);
//清除然后设置写入地址的偏移量(17:0)
FMA 并且= 0xFFFC0000;//从第0位清除到17位

//块在1KiB 边界上被擦除、因此将索引乘以1024
//并将其添加到基地址
FMA |= FlashBaseAddress +(i*flash_block_size);

//设置擦除命令位
FMC =(U16_Glob_flashKey << 16)| 0x2;

//轮询 ERASE 位直到其被清除
while (FMC & 0x2);

UARTprintf ("\rFlasherase count %d\r\n"、i);


}
}

请 帮助我对问题进行排序:是否需要对代码或闪存配置进行任何更改

参考的.cmd 文件

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价 userid="524025" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1494333/tm4c1294ncpdt-tm4c1294-flash-erase-issue "]

    void Flash_Erase (uint32_t FlashBaseAddress、uint32_t blockCount)/* block 是1k*/

    uint32_t i;
    Flash_vEnable();
    对于(i = 0;i < blockCount;i++)

    SysCtlDelay (20);
    //清除然后设置写入地址的偏移量(17:0)
    FMA 并且= 0xFFFC0000;//从第0位清除到17位

    //块在1KiB 边界上被擦除、因此将索引乘以1024
    //并将其添加到基地址
    FMA |= FlashBaseAddress +(i*flash_block_size);

    //设置擦除命令位
    FMC =(U16_Glob_flashKey << 16)| 0x2;

    //轮询 ERASE 位直到其被清除
    while (FMC & 0x2);

    UARTprintf ("\rFlasherase count %d\r\n"、i);


    }

    [报价]

    您的 blockCount 是什么? 您似乎认为一个块只有1KB。 这不是真的。 当擦除一个块时、一个16kB 的大小被擦除。 在您循环遍历要擦除的闪存范围时、需要将 FMA 提高16kB。 请参阅数据表的闪存部分。  

    交错式存储器一次预取256位。 预取缓冲区允许最大值
    使用适合的线性代码或循环来保持120 MHz CPU 速度的性能
    预取缓冲区。 建议在编译代码时将开关设置为消除中所示的"字面量"
    字面量尽可能大、这会导致该字进行闪存访问、并导致等待状态停止。 最多
    编译器支持将文字转换为"内联"代码、这在其中的系统中执行得更快
    存储器子系统比 CPU 速度慢。
    在时、由于存储器是双向交错的、且每个存储体都单独是一个8KB 扇区
    用户使用 Flash 存储器控制(FMC)寄存器中的 ERASE 位擦除扇区
    一个16KB 的擦除。 擦除一个块会将块中的所有位都复位为1。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    #flash_block_size 1024

    定义 FW_UPDATE_SIZE (0x00067700 - 0x0000D000) = 0x5 A700
    #define FW_upgrade_block (FW_upgrade_size / flash_block_size) = 0x 5 A700/1024 = 361个块

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    正如我所说的、您需要将 FLASH_BLOCK_SIZE 更改为16384、并且每次将地址增加为 FMA 16k。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你可以编辑代码16k FMA 增量我实际上不知道 如何使它  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    为什么不参考 bl_main.c 文件来说明它是如何定序通过闪存块进行擦除的。 到作为 Updater ()函数一部分的第547行。 、

     在您的情况下、G_ui32TransferAddress 将是0xD000。  G_ui32TransferSize 将为(0x67570 - 0xD000)。 FLASH_PAGE_SIZE 为0x4000。 了解它是如何根据起始地址和要编程的程序映像的大小来定序通过存储器进行擦除的。  

     

    ui32FlashSize = g_ui32TransferAddress + g_ui32TransferSize;
    #endif

    //
    // Clear the flash access interrupt.
    //
    BL_FLASH_CL_ERR_FN_HOOK();

    //
    // Leave the boot loader present until we start getting an
    // image.
    //
    for(ui32Temp = g_ui32TransferAddress;
    ui32Temp < ui32FlashSize; ui32Temp += FLASH_PAGE_SIZE)
    {
    //
    // Erase this block.
    //
    BL_FLASH_ERASE_FN_HOOK(ui32Temp);
    }

    //
    // Return an error if an access violation occurred.
    //
    if(BL_FLASH_ERROR_FN_HOOK())
    {
    g_ui8Status = COMMAND_RET_FLASH_FAIL;
    }
    }
    while(0);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以使用此函数进行编辑 、不需要引导加载程序演示代码

    uint32_t * pui32App = NULL;
    pu32App =(uint32_t *) fw_upgrade_memory;
    //UARTprintf ("Erase secondary memory\n");
    if ((pui32App[0]!= 0xffffffff)||
    (pui32App[1]!= 0xffffffff)

    UARTprintf ("擦除辅助存储器\n");
    Flash_Erase (fw_upgrade_memory、900);
    }

    SysCtlDelay (2000);

    void Flash_vEnable (void)

    //如果设置了 KEY 标志(位4)、则密钥为0xA442。
    //否则、密钥为0x71D5 (TM4C123数据表的第583页)。
    如果(BOOTCFG & 0x10){
    U16_Glob_flashKey = 0xA442;
    }
    否则{
    U16_Glob_flashKey = 0x71D5;
    }

    }

    void Flash_Erase (uint32_t FlashBaseAddress、uint32_t blockCount)/* block 是1k*/

    uint32_t i;
    Flash_vEnable();
    对于(i = 0;i < blockCount;i++)

    SysCtlDelay (20);
    //清除然后设置写入地址的偏移量(17:0)
    FMA 并且= 0xFFFC0000;//从第0位清除到17位

    //块在1KiB 边界上被擦除、因此将索引乘以1024
    //并将其添加到基地址
    FMA |= FlashBaseAddress +(i*flash_block_size);

    //设置擦除命令位
    FMC =(U16_Glob_flashKey << 16)| 0x2;

    //轮询 ERASE 位直到其被清除
    while (FMC & 0x2);

    UARTprintf ("\rFlasherase count %d\r\n"、i);


    }
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles  

    我通过更改为16 k 尝试它,但当它开始擦除只有3块被擦除,  程序被击中,就像死机  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我今天实际上是在度假。

    您将通过900作为块数。 为什么? 如果每个块为16kB、那么您定序为900 * 16kB、相当于14MB 的内存。 您将无法使用可用的闪存。 为什么不打印要擦除的块编号的日志? 我可以在下周回来。  

    Flash_Erase (fw_upgrade_memory、900);