尊敬的先生/女士
问题:如何使用应用程序代码编写 pflash?
为什么2K 下的程序可以安全 地写入 pflash?
此致、
黄上
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.
尊敬的先生/女士
问题:如何使用应用程序代码编写 pflash?
为什么2K 下的程序可以安全 地写入 pflash?
此致、
黄上
您可以从程序闪存中的任何位置写入程序闪存。 您只需将写入程序下载到 RAM 中、进入监控器模式、然后跳转到 RAM 来执行程序。 然后、程序必须保持在 RAM 中、直到写入完成。
这是因为在写入期间、程序闪存将返回所有 FFs。 不能同时读取和写入。
如果您使用的是引导闪存、通常从启动开始就只保持在监控器模式、因此无需将其置于监控器模式。
当您处于 ROM 模式时、ROM 映射到0至0x7fff、因此您必须查看0x10000至0x17fff 以查看程序闪存。
当它进入闪存模式时、即当闪存被映射到0至0x7fff 时。 然后 ROM 被映射到0xa000。
我已经向您发送了我的电子邮件、因此您可以向我发送您的代码来查看。
由于引导校验和功能、我们将引导程序放置在低存储器中-它使用2K 校验和、即使程序闪存的其余部分损坏、也允许引导闪存区域启动。
我们较大的存储器件 UCD3138064和128器件具有多个程序闪存。 借助这些、您实际上可以在从另一个闪存块执行时对一个闪存块进行编程。 因此、您可以从一个块运行电源、同时下载到另一个块。 您可以非常快速地切换程序、从而使电源保持运行。
您说您发送给我的代码之一起作用。 我建议您采用这个方法并对其进行一些小改动、直到您得到想要的结果。 如果您进行了特定的小更改、并且它导致了您无法理解的复位、我可以帮助您进行此操作。 这就是我调试此类问题的方式、尤其是在我有一个起始点可以正常工作的情况下。 写入编程闪存非常复杂、一切都必须正确。
在具有多个闪存块的芯片上、写入另一个块要容易得多。 您可以在不将代码复制到 RAM 的情况下执行此操作。 在 您返回之前、您不必等待写入完成:
它如下所示:
情况15://将字写入其它闪存块
if (((arg1)< 0x8000)||((arg1)> 0xFFfc))
{//if out of other block range
返回;
}
if (DecRegs.MFBALR1.bit.address = 0)//此处如果闪存块1为0
{
while (DecRegs.PFLASHCTL2.bit.BUSY!= 0)//以防我们在它仍处于繁忙状态时被调用
{
;//在进行编程时不执行任何操作
}
DecRegs.FLASHILOCK.ALL = program_FLASH2_SHOSHON_KEY;
*(uint32 *)(arg1 & 0xfffffffc)= arg2;
}
else //如果是编程闪存2;
{
while (DecRegs.PFLASHCTL1.bit.BUSY!= 0)//以防我们在它仍处于繁忙状态时被调用
{
;//在进行编程时不执行任何操作
}
DecRegs.FLASHILOCK.ALL = program_FLASH1_OSHON_KEY;
*(uint32 *)(arg1 & 0xfffffffc)= arg2;
}
中断;
它仍处于软件中断状态、因为您必须进入特权模式。 您不需要专用的引导闪存、因为两个程序中的每个程序(每个块中有1个) 都可以有效地用作另一个程序的引导程序。 我不确定是将其称为"密友启动"还是"集成启动"。 如果您始终使用专用 引导闪存或引导 ROM、则很难理解。
您好 Ian
您是否会通过电子邮件将工作项目总数发送回给我? 如果可能、我想在应用中写入 pflash。
学习完您的代码后、我有一些问题
if (DecRegs.MFBALR1.bit.address = 0)//此处如果闪存块1为0
{
while (DecRegs.PFLASHCTL2.bit.BUSY!= 0)//如果我们在它仍然忙时被调用
{
;//在它程序
}
DecRegs.FLASHILOCK.ALPHONIF_FLASH2_PROGRAM 时不执行任何操作};= FLAS-H2 = FLAS_SHIF_UNCH_SHIF_UNCHONGSION_FL_FLAS_CH_
//对于 UCD3183A64为 PROGMRAM_FLASH2_SHOCH_KEY = 184219b3
*(uint32 *)(arg1 & 0xfffffffc)= arg2;
}
否则//如果它是程序闪存2;
{
while (DecRegs.PFLASHCTL1.bit.BUSY!= 0)//如果我们没有得到任何
忙程序 FLASH1_程序;{while (DFLASHCLK_FLASHCRL.BUSY.FLASH_BUSH)= 0)
//对于 UCD3138061为 program_FLASSH1_intersuck_key = 0x6c97D0C5
*(uint32 *)(arg1 & 0xfffffffffffc)= arg2;
}
break;
第0页如何?
如何调用此 SWI? 我提出此问题是因为我不知道如何在 SWI 中使用 var arg1、arg2。
此致、
黄上