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.

[参考译文] UCD3138:写入 UCD3138 pflash、然后复位 UCD3138。

Guru**** 2458270 points
Other Parts Discussed in Thread: UCD3138, UCD3138064

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/566817/ucd3138-write-ucd3138-pflash-then-ucd3138-reset

器件型号:UCD3138

尊敬的先生/女士

问题:如何使用应用程序代码编写 pflash?

为什么2K 下的程序可以安全 地写入 pflash?   

此致、

黄上

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Kami,
    如果您是中文、您可以向我发送一封使用中文的电子邮件、以澄清您的问题。 我的电子邮件地址是 Frank-Tang@ti.com
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Frank
    我已經寄Email給你了 μ Email標題 UCD3138在写入闪存时复位
    E2E以及Email上面的內容、簡單來說 我要寫入Pflash。 我拿到TI flash的範例程式 Boot_M Ω。 開發環境是CCS3.3的 μ A。
    我在APP裡面寫Pflash UCD3138會Reset 使用SWI μ A (μ A)
    我在Boot μ flash超過2K的地方寫也會Reset μ A
    我在Bootflash 2K內寫 μ 就可以完整的寫入我想寫的內容。
    目標在APP裡面寫、因為APP可以做PWM控制。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您可以从程序闪存中的任何位置写入程序闪存。  您只需将写入程序下载到 RAM 中、进入监控器模式、然后跳转到 RAM 来执行程序。  然后、程序必须保持在 RAM 中、直到写入完成。

    这是因为在写入期间、程序闪存将返回所有 FFs。  不能同时读取和写入。

    如果您使用的是引导闪存、通常从启动开始就只保持在监控器模式、因此无需将其置于监控器模式。  

    当您处于 ROM 模式时、ROM 映射到0至0x7fff、因此您必须查看0x10000至0x17fff 以查看程序闪存。  

    当它进入闪存模式时、即当闪存被映射到0至0x7fff 时。  然后 ROM 被映射到0xa000。

    我已经向您发送了我的电子邮件、因此您可以向我发送您的代码来查看。  

    由于引导校验和功能、我们将引导程序放置在低存储器中-它使用2K 校验和、即使程序闪存的其余部分损坏、也允许引导闪存区域启动。  

    我们较大的存储器件 UCD3138064和128器件具有多个程序闪存。  借助这些、您实际上可以在从另一个闪存块执行时对一个闪存块进行编程。  因此、您可以从一个块运行电源、同时下载到另一个块。  您可以非常快速地切换程序、从而使电源保持运行。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ian
    感谢你的帮助。
    我非常感兴趣的是存储器重映射功能(动态切换)。 我已经申请芯片样片、但销售回复一直到2017年4月25日。 目前、我只有 UCD3138 (40引脚和64引脚)。 在此之前、我必须解决无法写入 pflash 的问题。
    此致、
    黄上
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您说您发送给我的代码之一起作用。  我建议您采用这个方法并对其进行一些小改动、直到您得到想要的结果。  如果您进行了特定的小更改、并且它导致了您无法理解的复位、我可以帮助您进行此操作。  这就是我调试此类问题的方式、尤其是在我有一个起始点可以正常工作的情况下。  写入编程闪存非常复杂、一切都必须正确。  

    在具有多个闪存块的芯片上、写入另一个块要容易得多。  您可以在不将代码复制到 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。

    此致、
    黄上

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Ian
    我仍然不理解如何对闪存进行编程。 我是否应该写入 DecRegs.MFBALR1.ALL?
    我在 technical 参考手册(SNIU028A)第523页看到了以下示例 TI 示例代码。
    请您解释更多详细信息吗?
    此致、
    黄上