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.

[参考译文] TMS320F2.8377万D:GPIO和#39;S驱动高/低以及闪存擦除操作期间系统挂起。

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/578677/tms320f28377d-gpio-s-driven-high-low-and-system-hanging-during-flash-erase-operation

部件号:TMS320F2.8377万D

我正在使用 TMS320F2.8377万D处理器。 我修改了双闪存应用程序示例,以便在CPU1-2上实现闪存擦除/写入。

两个处理器上的应用程序都启用了监视程序,并在闪存操作之间为其提供服务。

CPU1上的应用程序擦除多个闪存扇区(C,H,I,J),然后使用USB中的数据写入它们。 然后将IPC标记设置为允许CPU2执行相同操作。  

启动时,CPU2等待设置IPC标志。 然后擦除多个扇区(C,H,I,J),为CPU1设置IPC标志并进入无限循环。

CPU2设置IPC标记后,CPU1将擦除一个闪存扇区(A),并进入无限循环,而不维修看门狗。 这将触发系统重新引导和操作重新启动。

单独运行此应用程序会导致多个扇区被擦除,并在引导之间进行编程。

大多数时间操作正常。 但是,有时在擦除操作期间,系统会挂起,并在监视程序过期时重新引导。

令人不安的是,在崩溃和重新启动之间,设置为输出的多个GPIO会改变其状态(一些以前的低GPIO会变为高电平,而一些高电平的GPIO会变为低电平)。

这种现象可在下图中看到。 某些GPIO线路在代码操作期间设置,以可视化何时发生的情况。

图像顶部的完整时间线波形显示了重启之间的多个操作。

当黄线变低时,操作开始,当变高时,CPU1将变为无限循环,并停止对看门狗进行维护。 当线条变低时,程序被重置并重新启动。

可以看到两个完整的操作-重新引导循环,其中一个循环失败。

屏幕截图的放大部分显示更改其状态的GPIO行。 这些更改都不会在代码中执行。

蓝色和黄色GPIO在闪存擦除之前设置为高电压,其余切换在系统崩溃时进行。

我已确保已擦除的闪存未分配给命令链接程序文件中的系统资源。

FAPI函数是从RAMLS3-4加载和运行的。

运行此程序一段时间并在不应写入的GPIO上触发,表明在闪存擦除期间发生此崩溃和GPIO故障。

有时是在应用程序中间,有时是在应用程序结束时。

任何关于可能导致这种情况的想法都很有帮助。

谢谢Ugnius。

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

    我正在努力让您与我们的闪存编程专家取得联系。

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

    Ugnius,

    以下是一些调试建议:  

    1) 表5-20。  DataManual中200 MHz时的闪存参数表示典型擦除时间为110 ms (考虑32KW扇区)。  您在决定监督员的服务速率时是否考虑了此规格?   

    2)如TRM中所述,Flash API是可中断的。  因此,即使正在执行Flash API,您也可以通过中断为看门狗提供服务。  希望您了解这一点。  但是 ,擦除/程序操作正在进行中的闪存库不应有任何读取/提取访问权限。  因此,您应该在RAM中安装ISR。

    3)您是否确定您没有擦除包含Flash API的闪存扇区?  您是否有ITRAP处理程序?  您是否尝试从该处理程序切换GPIO?  您的应用程序是否正在尝试执行已擦除闪存中的某些内容,从而获得了ITRAP并卡在ITRAP处理程序导致看门狗重置的无限循环中?    

    4)您是否将 Fapi_UserDefinedFunctions.c中的函数映射到RAM以执行运行时?  它们应该映射到 .TI.ramfunc部分。

    5)您可能已经知道。  但希望再次提及Flash API不配置(启用/禁用)监视程序。 用户应用程序可以配置监视程序并根据需要为其提供服务。   Fapi_UserDefinedFunctions.c中提供的Fapi_serviceWatchdogTimer()函数仅在  Flash API参考指南中提到的Fapi_doVerify()和Fapi_doBlankCheck()函数中调用。

    谢谢,此致,
    Vamsi

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

    您好,Vamsi:

    感谢您的回复。

    1.在闪存操作之前,看门狗被维修。 看门狗过期需要800毫秒。

    2-3.  代码从闪存B,E,F,G运行 我正在擦除和写入C,H,I,J和A区

    4..cmd内存分配显示在 下面的“FAPI memory allocation”答复中。

    5.过期的看门狗不是问题。

    在进一步调查该问题后,我发现问题是由设置FAPI而不是擦除闪存引起的。

    查看擦除和写入闪存的示例,将代码拆分至函数。

    导致问题的函数位于下面的“失败函数”答复中。

    我在尝试擦除任何内容之前调用此功能。

    有时,执行函数Fapi_setActiveFlashBank(Fapi_FlashBank0)时会崩溃;

    在这种情况下,全球公益物被驱动到不同的状态。 正常代码停止执行,并且在看门狗未被服务时,处理器重新启动。 崩溃本身不是问题,因为看门狗重置处理器。 问题是GPIOs改变了他们的状态。 受影响引脚的范围未知,因为我观察到不同时间段内不同的GPIO驱动过高。 如果在连接敏感硬件时打开不及时,这可能会导致损坏。

    我添加了GPIOs和DAC操作来指示正在发生的情况。

    当功能工作时,观察到正确的信号:

    黄色- DAC A (添加延迟并在Fapi_initializeAPI完成和Fapi_setActiveFlashBank启动时指示。)

    绿色- DAC B。(添加延迟并在Fapi_setActiveFlashBank完成且功能退出时指示。)

    蓝色- GPIO70。 (只是一个测试点)

    紫色- GPIO4。 (可配置为PWM输出的引脚。)

    当它崩溃时,会观察到奇怪的GPIO行为:

     

    它看起来像是 Fapi_setActiveFlashBank(Fapi_FlashBank0)从未完成执行,因为 DAC B从未增加。

    另外,其他GPIO会降低或提高,而代码中没有设置这些值。

    在独立模式下,代码将以2.5秒的时间运行并重新引导。

    启动代码后,5分钟内出现此故障。 有时更早,有时更晚。

    需要注意的几点:

    1.在功能 Fapi_initializeAPI(F021_CPU0_base_address, 200);和 Fapi_setActiveFlashBank(Fapi_FlashBank0)之间更改DAC缓降; 如果超过80ms, 似乎可以消除故障或降低在测试时间内看不到故障的可能性。

    2.在 Flash_operation_init(void) 函数运行时禁用中断似乎会停止出现故障。

    正在运行的唯一中断是25us计时器中断,它会增加一些计数器。 我已经初始化了i2c和SPI模块并设置了中断,但它们被配置为从操作,并且没有运行。

    FAPI函数来自库,因此我无法看到它们的作用并进一步调试它。

    如果计时器中断发生在 Fapi_setActiveFlashBank(Fapi_FlashBank0)执行过程中,是否会导致问题(ISR从闪存运行)?

     

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

    "FAPI内存分配"

    // RAMLS3:原点= 0x0.98万,长度= 0x0.08万
    // RAMLS4:原点= 0x00A000,长度= 0x0.08万
    RAMLS34:原点= 0x0.98万,长度= 0x0.1万
    // FLASHF:原点= 0x9万,长度= 0x0.8万 /*片上闪存*/
    FLASHF1:原点= 0x9万,长度= 0x0.01万 /*片上闪存*/
    FLASHF2 : Origin = 0x9.01万,length = 0x0.05万 /*片上闪存*/
    FLASHF3:原点= 0x9.06万,长度= 0x0.26万 /*片上闪存*/
    FLASHF4 :原点= 0x092C00,长度= 0x0.54万 /*片上闪存*/



    fapifuncs {-l F021_API_F2837xD_FPU32.lib }
    }
    负载= FLASHF3,
    RUN = RAMLS34,
    Run_start(_FapifuncsRunStart),
    load_start(_FapifuncsLoadStart),
    load_size (_FapifuncsLoadSize),
    页面= 0

    ramfuncs:load = FLASHF1,
    RUN = RAMLS34,
    run_start(_RamfuncsRunStart),
    load_start(_RamfuncsLoadStart),
    load_size (_RamfuncsLoadSize),
    页面= 0

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

    "故障功能"

    无效
    闪存_操作_初始化(void)

     uINT16_t test_ind;
     SeizeFlashPump();
     GpioDataRegs.GPCSET.bit.GPIO70 = 1;
     EALLOW;
      Flash0EccRegs.ecc_enable.bit.enable = 0x0;
      //此函数是初始化基于系统的Flash API所必需的
      //执行任何其他Flash API操作之前的频率
      oReturnCheck = Fapi_initializeAPI(F021_CPU0_BACK_ADDRESS,200);


      对于(test_ind = 0;test_ind < 4096;test_ind++)
      {
       DacaRegs.DACVALS.bit.DACVALS = test_ind;
       DELAY _US (1U);
      }

      如果(oReturnCheck!= Fapi_Status_Success)
      {
       GpioDataRegs.GPCCLEAR.bit.GPIO69 = 1;
       GpioDataRegs.GPCSET.bit.GPIO70 = 1;
       DELAY _US (10万U);
       示例_错误(oReturnCheck);
      }


      GpioDataRegs.GPCSET.bit.GPIO71 = 1;
      // Fapi_setActiveFlashBank函数可进一步设置闪存库和FMC (闪存模块控制器)
      //要在银行上执行的闪存操作
      oReturnCheck = Fapi_setActiveFlashBank(Fapi_FlashBank0);


      对于(test_ind = 0;test_ind < 4096;test_ind++)
      {
       DacbRegs.DACVALS.bit.DACVALS = test_ind;
       DELAY _US (1U);
      }


      如果(oReturnCheck!= Fapi_Status_Success)
      {
       GpioDataRegs.GPCCLEAR.bit.GPIO69 = 1;
       GpioDataRegs.GPCSET.bit.GPIO70 = 1;
       DELAY _US (10万U);
       示例_错误(oReturnCheck);
      }
     EDIS;
     GpioDataRegs.GPCCLEAR.bit.GPIO71 = 1;
    }

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

    1)在调用Fapi_setActiveFlashBank()函数之前,是否启用了ECC? 如果是,在执行此功能之前,是否可以尝试禁用ECC (Flash0EccRegs.ecc_enable.bit.enable = 0x0;-此操作需要EALLOW)并查看是否可以清除问题?

    2)在执行Flash API操作时,不应存在任何Flash访问。 因此,将ISR映射到RAM。

    谢谢,此致,
    Vamsi
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1.正如我在上一篇文章中所看到的示例代码,我首先使用EALLOW,然后将ECC设置为0,然后调用其它闪存函数。

    2.如果我有ISR (从闪存E运行)中断闪存初始化功能从RAM运行,这可能会导致问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ugnius,

    2:是的。 查看是否可以解决您的问题。

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

    第2点似乎可以解决问题。 此外,一旦ISR从闪存中运行,定时器频率的提高也会加速浮故障发生。

    然而,当发生这种情况时,驾驶不同的GPIO是一种非常危险的故障。
    我有GPIOs控制H桥。
    这种故障导致直通损坏FET。

    您能否解释一下在Fapi_setActiveFlashBank执行过程中从闪存运行ISR会如何损坏GPIO寄存器,从而使某些引脚过高?
    FAPI中是否应该存在针对此类非法闪存访问的内置处理程序?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Ugnius,

    当闪存API操作在一个插槽上进行时,该插槽获得的电压将与正常读取/提取的电压不同。 因此,在任何Flash API操作正在进行时,不应执行读取/提取操作。 我们在TRM和Flash API参考指南中记录了此限制,以便用户应用程序考虑此问题。 Flash API是软件,它不能阻止对Flash的访问。

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

    非常感谢Vamsi的帮助。

    这一切现在更有意义了。

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

    很高兴知道您的应用程序现在正在运行。 我要结束这条线。

    谢谢,此致,
    Vamsi