工具/软件:
您好、
我正在处理自定义引导加载程序和应用程序代码。 在应用程序代码中、我将 PLL 配置为为该配置提供时钟源、访问出厂区域数据。 当我将应用程序代码单独置于闪存中的 0x00000000 地址时、它可以正常工作。 但是、当我将引导加载程序放置在地址 0x00000000、应用程序放置在闪存中的 0x8800(任何其他)位置时、引导加载程序会跳转到应用程序代码、但应用程序代码在尝试访问出厂区域数据时会进入硬故障。
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.
工具/软件:
您好、
我正在处理自定义引导加载程序和应用程序代码。 在应用程序代码中、我将 PLL 配置为为该配置提供时钟源、访问出厂区域数据。 当我将应用程序代码单独置于闪存中的 0x00000000 地址时、它可以正常工作。 但是、当我将引导加载程序放置在地址 0x00000000、应用程序放置在闪存中的 0x8800(任何其他)位置时、引导加载程序会跳转到应用程序代码、但应用程序代码在尝试访问出厂区域数据时会进入硬故障。
我会仔细检查您是否跳到了内存中的正确位置
TRM 第 2.4.5 节规定、如果使用其中一个高速时钟、则闪存等待状态会设置为 MCLKCFG.FLASHWAIT、该值为=2。 (您可以更改此值,但可能不想更改。)
FLASH_ERR_01 的说明指出读取=2 个等待状态下的出厂区域将触发硬故障。 在禁用 PLL 之前调用 initTrimTable()、因此它仍在运行时钟(以及等待状态)、即从启动(即从引导加载程序继承)。
如果您在引导加载程序中使用高速时钟(例如 PLL) 、我预计您会在调用应用程序入口点之前调用该函数。 或者:不要在引导加载程序中使用高速时钟(与 SYSOSC 保持一致)。
更笼统地说:引导加载程序似乎 应该(尽可能)以类似于复位时的条件调用应用程序、因为应用程序可能期望这样做。