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.

[参考译文] RM48L530:软件复位后 FEE 驱动器不写入闪存

Guru**** 2482105 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/709546/rm48l530-fee-driver-not-writing-to-flash-after-software-reset

器件型号:RM48L530
主题中讨论的其他器件:HALCOGEN

您好!

软件复位后、TI FEE 驱动器似乎无法写入闪存。

我们将使用随 HalcogGen v4.06提供的 TI FEE 驱动器并使用 F021闪存 API v2.01.01。 FEE 在 Halcogen 中设置为1个64字节块、2个虚拟扇区。

我们的引导加载程序在 PBIST 自检和内存初始化运行之前使用 FEE 从 RAM 备份数据。 这发生在 引导加载程序中的启动过程中(_c_int00())。 然后、在 引导加载程序启动实际应用程序之前、将数据从 FEE 读回 RAM。

如果 在执行应用程序期间发生致命错误、我们会将错误信息写入 RAM 的 NO_INIT 部分并导致软件复位(systemREG1->SYSECR |= 0x00008000)。

然后、引导加载程序启动并在复位后运行以下代码:

void _c_int00 (void)

   SL_Init_R4Registers ();

   sl_Init_StackPointers();

   ApplyErrata();

   //初始化系统-时钟、闪存设置,带 Efuse 自检
   systemInit();

   //针对勘误表 PBIST#4的权变措施
   errata_PBIST_4 ();

//初始化 FEE 驱动器

 TI_FEE ();
 操作
 {
  TI_fee_MainFunction();
  delay();
  STATUS=TI_FEE _GetStatus (0);
 }
 while ((Status!= IDLE));

//备份 RAM 以支付费用

TI_fee_WriteAsync (1、(uint8*) u32_pRamBackupDataStartAddress);
 操作
 {
  TI_fee_MainFunction();
  delay();
  STATUS=TI_FEE _GetStatus (0);
 }
 while ((Status!= IDLE));

////////////////////////// 运行自检、包括 PBIST ///////////////////////////////////////////////////////////

//////////////////////// 为 RAM 和外设进行内存初始化////////////////////////////////////////////////////////////

//重新启动 FEE 驱动器,因为 memoryInit 擦除了所有 RAM

 TI_FEE ();
 操作
 {
  TI_fee_MainFunction();
  delay();
  STATUS=TI_FEE _GetStatus (0);
 }
 while ((Status!= IDLE));

//从 FEE 中恢复 RAM

TI_fee_read (1、0、(uint8*) u08_pDataBufferToRead、64);
 操作
 {
  TI_fee_MainFunction();
  delay();
  STATUS=TI_FEE _GetStatus (0);
 }
 while ((Status!= IDLE));

///////////////////////////////////////////////////////////// 启动应用程序//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

当我进行冷启动或 通过 调试器启动时、我可以看到 FEE 被正确写入(通过查看调试器中的闪存7组)。 但是、如果我引起一个软件复位、RAM 数据不会写入 FEE。 我还尝试不使用 TI FEE 驱动器、而是使用 F021库向 FLASH7银行写入数据 -这也导致了从应用程序执行软件复位时出现问题((FAPI_GET_FSM_STATUS!= Fapi_Status_Success)始终为 false)。

我是否可以做些什么来将闪存驱动器正确地准备为与外部复位/调试器复位/上电复位是复位原因时相同的状态? 我们确实必须在 SWRST 之后备份 RAM 数据、以便在引导加载程序中完成 PBIST 和 memoryInit 后诊断应用中的原因。

此致、

Chris

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

    您何时发出软件复位? 您是否使用 TI_fee_read (...)获得了正确的数据 复位前的状态?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 QJ

    顺序如下:

    引导加载程序启动->转到_c_int00
    2.初始化费用
    3.写信至 FEE
    4.自检(PBIST 等)
    5.初始化费
    6.阅读费用
    7.转到 Real Application
    8.实际应用导致软件复位(返回到引导加载程序启动)

    在步骤6中、我读取了费用内容、但没有改变(步骤3中写入费用的 RAM 内容与之前不同、因此必须进行写入)。

    作为一个实验、我还尝试了以下操作:

    引导加载程序启动->转到_c_int00
    2.初始化费用
    3.写信至 FEE
    4.自检(PBIST 等)
    5.初始化费
    6.阅读费用
    引导加载程序导致软件复位(返回到引导加载程序启动)

    现在、费用已写入、并且读取了正确的数据。 似乎我的应用程序导致软件复位、CPU 的状态与引导加载程序导致软件复位时的状态不同(可能是因为应用程序为时钟和外设设置了不同的值)(从未启动应用程序)。

    在软件复位后、我是否可以做些什么来确保在这两种情况下 CPU /闪存模块的状态相同?

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

    我今天上午回答了这个问题,但它失去了。 您能不能以任何方式干燥:

    写入数据后、调用 TI_FEE _GetJobResult (0);
    2.使用 TI_fee_WriteSyn (..) 而不是 TI_fee_WriteAsun (..)

    由于数据未在您的第一个实验代码中成功写入、我认为此问题与软件复位无关。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我按照您的建议进行了更改、但闪存中仍然没有数据、但 JobResult = job_OK。

    如果我单步执行写入操作、它似乎认为一切都正常、实际上会将数据发送到 FAPI、但实际上没有任何数据存储在闪存中。

    我将更深入地探讨闪存和时钟与引导加载程序的应用配置设置之间的差异。

    现在、我可以看到这些差异(此设置在实际应用程序启动时完成):

     /*
     **设置闪存等待状态
     *
     flashWREG->FRDCNTL =((2U <<8U)//////////////////////////// 对于引导加载程序、这是(0 << 8)
                       |(1U <<4U)//////////////////////////////////// 对于引导加载程序、这是(0 << 4)
                       | 1U);  /*管线模式*//////////////////////////////////// 对于引导加载程序、这是(0)

     /*
     **设置闪存组电源模式
     *
     flashWREG->FBFALBACK =((SYS_SLEEP << 14U)//////////////////// 对于引导加载程序、这是(SYS_ACTIVE << 14U)
                           |(SYS_SLEEP << 12U)
                           |(SYS_SLEEP << 10U)
                           |(SYS_SLEEP << 8U)
                           |(SYS_ACTIVE << 6U)//////////////////////////////// 对于引导加载程序、这是(SYS_SLEEP << 6U)
                           |(SYS_ACTIVE << 4U)////////////////////////////////////// 对于引导加载程序、这是(SYS_SLEEP << 4U)
                           |(SYS_ACTIVE << 2U)
                           | SYS_ACTIVE);
     /*
     **设置 PLL
     *
     /**-设置 PLL 控制寄存器1:
      *    -振荡器跳周时的设置复位
      *    -在 PLL 跳周时设置旁路
      *    -设置 PLL 输出时钟分频器
      *    -振荡器发生故障时的设置复位
      *    -设置参考时钟分频器
      *    -设置 PLL 乘法器
      *
     systemREG1->PLLCTL1 =(0
                           | 0x20000000U
                           |((1-1)<< 24U)//////////////////////////////// 对于引导加载程序、这是(1 << 24)
                           |((8-1)<< 16U)
                           |((100-1)<< 8U);

     /**-设置 PLL 控制寄存器1
      *    -启用/禁用频率调制
      *    -设置传播速率
      *    -设置带宽调整
      *    -设置内部 PLL 输出分频器
      *    -设置摊铺量
      *
     systemREG1->PLLCTL2 =(0
                           |(255U << 22U)
                           |(0U < 12U)//////////////////////////////// 对于引导加载程序、这是(7 << 12)
                           |((4-1)<< 9U)////////////////////////////////// 对于引导加载程序、这是(2 - 1 << 9)
                           | 61U);

     /**@b 初始化@b 次 PLL:*/

     systemREG2->PLLCTL3 =(((4-1)<<29)|//////////////////////////    对于引导加载程序、这是(2U - 1U)<< 29U)
                          ((1-1)<<24)|//////////////////////////    对于引导加载程序、这是(1 << 24)
                          ((8-1)<<16)|
                          ((((100-1)<<8));

    Chris

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、尽管 jobResult 为 job_OK、但在 fmstat 寄存器中会设置 Cstat 和 PGV 位。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Chris:

    我稍后会进行测试、然后再回来。