大家好,
我正在尝试创建自定义启动加载程序。我从闪存开始就为启动程序和参数预留了 256KB 的空间。我需要使用引导加载程序代码将启动参数存储在同一个块上。我尝试使用 C40 ip,但总是出现 HardFault 错误。我从"AN13388-S32K3 Memories Guide" 上了解到,在读取(执行代码)时,我无法写入或擦除同一个块。
我尝试了一些技术,如 ramcode 和 ITCM,但都没有成功。
我不想使用 Data 闪光灯。因为 HSE 固件使用的是全部内容。
正确的做法是什么?有什么例子吗?
你好,@francescovico、
请创建一个新主题。
不一定要在 Block1 中,闪存驱动器可以在 SRAM 中。
此致,
丹尼尔
你好,丹尼尔、
我正在开发一个位于代码闪存块 0(从 0x400000 到 0x4FFFFF)的引导加载程序。
在此区块内的任何擦除/写入都会导致硬故障。
只允许擦除/写入代码闪存块 1 或 2 或 3。
我的申请必须位于 1 号楼?
残余代码闪存 0 块丢失了?
敬请期待,弗朗切斯科。
你好@Ali22、
当闪存控制器正在对某个数据块中的某些数据进行编程/擦除时,不得访问该数据块。我不知道该如何解释。在 RM 中搜索 RWW 边读边写。
你好,Danielmartynek
"那么,内核不得通过中断访问块。中断必须被屏蔽(PRIMASK = 1),或者矢量表、ISR()函数和 ISR() 访问的数据必须不在块中。" 是什么意思?你的意思是矢量表、ISR()函数和数据不能与 BOOTLOADER 和 APP 放在同一个程序块中,如果是这样的话,矢量表和 ISR() 应该放在哪里,RAM 中吗?
请演示如何将 sampel 代码置于 c40 ip.h 中。
你好@王磊开发、
您能为这个问题创建一个新的主题吗?
谢谢!
BR,丹尼尔
我找到了引导程序项目(unified_bootloader_demo_V2.1.exe)。使用 C40_IP 驱动程序还可以运行硬件 Falut。然后使用 uart 进行调试,在擦除和写入状态下查找程序戳(具体是在 C40_Ip_Compare 内的 C40_Ip_SynchronizeCache 函数)。
谢谢您的回答。你的解决方案对我很有效。
除了您的解决方案,我还需要编辑这个函数原型。
C40_Ip.c中的静态函数
我以 C40 为例进行了尝试。它工作得很好,但却无法运行我的应用程序。
我删除了 C40_Ip 中"Fls Timeout Supervision Enabled" 中的勾。因为使用了"OsIf_GetElapsed" 函数。
我还需要将使用写入和擦除的函数移到 ramcode 中。
此致,
梅苏特
你好,我是@mesutkilicmak、
以下 API 函数必须放入 SRAM (".ramcode)"部分),如下所示。
然后,内核不得通过中断访问该数据块。中断必须被屏蔽(PRIMASK = 1),或者向量表、ISR() 函数和 ISR() 访问的数据必须不在块中。
C40_Ip.h.
在宣布之前
#if ( 1 == C40_RAM_CODE_ENABLE
/* ram code start */
#define FLS_STOP_SEC_CODE
#include"Fls_MemMap.h"
#define FLS_START_SEC_RAMCODE
#include"Fls_MemMap.h"
#endif
声明之后
#if ( 1 == C40_RAM_CODE_ENABLE )
/* ram code end */
#define FLS_STOP_SEC_RAMCODE
#include"Fls_MemMap.h"
#define FLS_START_SEC_CODE
#include"Fls_MemMap.h"
#endif
如果 #define C40_RAM_CODE_ENABLE 1,上述四个闪存 API 函数就会放在".ramcode 中。"节。
此致,
丹尼尔