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.

[参考译文] TMS570LC4357:软件复位后的数据中止异常

Guru**** 2470760 points
Other Parts Discussed in Thread: TMDS570LS31HDK, TMDX570LC43HDK, HALCOGEN, UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/916063/tms570lc4357-data-abort-exception-after-software-reset

器件型号:TMS570LC4357
主题中讨论的其他器件:TMDS570LS31HDKTMDX570LC43HDKHALCOGENUNIFLASH

您好!
我已经根据 SPNA241在 TMDS570LS31HDK 和 TMDX570LC43HDK 上实现了 CAN 总线引导加载程序。 示例已在 TMDS570LS31HDK 上完全实现。 但在 TMDX570LC43HDK 上、我在将应用程序加载到闪存后遇到了软件复位问题。 软件复位后、CPU 看起来像挂起。

为了探讨此问题、创建了一个简单的测试。 软件复位前、LED 闪烁三次。

int main (void)
{
/*用户代码 begin (3)*/
int i、j;

//配置为输出
hetREG1->DIR =(1 << 5);

while (1)
{
//重置前三次闪烁
对于(j = 0;j < 6;j++)
{
gioToggleBit (hetPORT1、5);
for (i = 0;i<5000000;i++);
}
//软件复位
systemREG1->SYSECR =(0x10)<<14;
};
/*用户代码结束*/

返回0;
} 

在 TMDS570LS31HDK 上、LED 持续闪烁、但在 TMDX570LC43HDK 上仅闪烁三次。 只需通过 POWERON_RESET 即可初始化 TMDX570LC43HDK 上三次闪烁的新周期。
在软件复位后首次运行 gioToggleBit()函数会导致数据中止异常。 具体而言、以下代码中的最后一条指令。

gioToggleBit():
00002c40:E24DD008 子部分 R13、R13、#8
00002c44:E58D1004 结构 R1、[R13、#4]
00002c48:E58D0000 结构 R0、[R13]
381 if ((port->DIN &(uint32)(uint32) 1U << bit)!= 0U)
00002c4c:E59D0000 LDR R0、[R13]
00002c50:E59DC004 LDR R12、[R13、#4]
00002c54:E3A01001 MOV R1、#1
00002c58:E5900004 LDR R0、[r0、#4]

我使用的 CCS 版本:10.0.00010、HALCoGen 04.07.01

您能帮助解决 TMDX570LC43HDK 的问题吗?

此致、
Sergey

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

    您好!

    请通过以下链接下载用于 LC43x 的 CAN 引导加载程序:

    https://git.ti.com/hercules_examples。

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

    您好、王!

    感谢您的快速回复!
    当我根据 SPNA241实现引导加载程序时、我使用了指向文档示例的链接:
    网址: git.ti.com/.../Bootloaders。
    因此、我在通过链路实现代码时遇到了 TMDX570LC43HDK 问题。

    此致、
    Sergey

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

    您好、Sergey、

    我之前在 HDK 上测试过引导加载时没有看到这种问题。 我将对 LC43HDK 进行测试。  

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

    您好、Wang、

    非常感谢您!

    此致、Sergey

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

    大家好、我有一个非常类似的问题。

    软件复位后、读取 SCI 寄存器(SCI1的 GCR1)会导致数据中止异常。

    请帮助、这对我来说是阻止的。

    此致。

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

    您好!

    如果应从受保护或有故障的存储器位置读取或写入数据、则处理器会接受数据中止。 这可能是因为:

    1. 未实现存储器位置
    2. 存储器位置在特权模式下(处理器处于用户模式时)为只读或写
    3. 存储器位置由 MPU 进行读取或写入保护
    4. ECC 检查逻辑在数据中检测到错误

    能否检查 CP15寄存器中的数据故障状态(DFSR)寄存器和地址寄存器?

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

    您好!

    我将提供这些信息、但请告诉我应该查看哪些 CP15寄存器?

    谢谢、

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

    您好!

    CCS 能够读取/写入这些 CP15寄存器。

    CCS->View->Registers:

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

    您好、Wang、

    我已检查了寄存器中写入的第一个帖子中的测试代码。 那么、以下指令给出了一个异常

    00002c58:E5900004 LDR R0、[r0、#4] 

     

    以下是 DFSR 寄存器:

    CP15_DATA_FAULT_STATUS    0x00001008       DFSR [内核]       

    保留       SBZ

    SD      1                  仅外部中止:AXI 解码(0)或 AXI 从器件(1)      

    RW        0                 读取(0)或写入(1)导致中止           

    S            0                 状态[4]             

    Rsv2     00                被保留 SBZ    

    域            0000        SBZ 域       

    状态        1000        STATUS[3:0]- 0x01=Algn、0x00=BG、0x0D=Perm、0x08=SExt、0x16=ASExt、 0x19=SECC、0x18=ASECC、0x02=DBG          

     

    故障数据寄存器:

    CP15_DATA_FAULT_ADDRESS  0xFFF7B850       DFAR [内核]

     

    根据 Cortex-R5技术参考手册、DFSR 寄存器决定同步外部中止

    0xFFF7B850是 HETDIN 寄存器的地址

     

    当我在 TMDS570LS31HDK LDR 指令上运行代码时,使用相同的地址0xFFF7B850,但不会发生异常。

    此致、
    Sergey

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

    您好、Wang 和 Sergey、

    很抱歉耽误您的回答、

    我的情况是:

    故障地址对应于 SCI1的 GCR1。

    此致。

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

    您好 Sergey、

    数据中止问题是否已解决? 您对原始示例代码进行了哪些更改? 我在我的工作台上做了另一个尝试、它的工作没有任何问题。

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

    您好、王!

    感谢您在工作台上再次尝试。

    我没有对  TMDS570LS31HDK 和 TMDX570LC43HDK 的原始引导加载程序示例代码进行任何更改。 我在 TMDS570LS31HDK 上取得了成功  ,并提到 了 TMDX570LC43HDK 的问题。 我尝试 了两项 TMDX570LC43HDK

    相同的示例代码可在您的工作台上成功运行、并且在购买 的 TMDX570LC43HDK 上存在问题。    它允许假设测试的控制器或 IDE 中存在一些差异。 我使用的 CCS 版本:10.0.00010, HALCoGen 04.07.01。

    您是否使用了相同的方法?

     现在我不知道如何解决 TMDX570LC43HDK 的问题。 我正在测试控制器、以验证它们是否可用于我们公司的项目。 所需的职能在某种程度上发挥作用并不是公司管理的令人印象深刻的证据。 我必须在购买的开发套件上演示项目的主要特性。

    因此、如果您知道如何准确解决 TMDX570LC43HDK 的问题、 请告诉我。

    此致、Sergey

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

    您好 Sergey、

    在测试中、已通过 CAN 引导加载程序将应用程序映像上载并编程到闪存中。 引导加载程序发出软件复位后、代码何时跳转到应用程序?  

    在引导加载程序示例中、引导加载程序代码会检查 GIOA[7]是否被拉至低电平、以及应用程序是否已成功编程。 如果 GIOA[7]为低电平或已对应用进行编程、则代码将跳转到应用。 否则、它将调用更新函数来上传数据。

     

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

    您好、王!

    在我的情况下、在软件复位后、代码实际上会跳转到应用程序。 数据中止异常恰好发生在应用程序中。 因此,可以将数据中止异常问题与引导加载程序分开,并考虑以下序列:SW 重置-应用程序。

    我在2020年6月19日的第一个帖子中提交了有关 IT 行为的此类示例和解释。 根据您对 DFSR 的申请、我和 Lukasz Matecki 在2020年7月2日和2020年7月7日的帖子中回答了问题。 寄存器分析表明、在软件复位后、TMDX570LC4357的至少几个存储器区域会受到保护。 但在 TMDS570LS31HDK 上不会出现此问题。

    如果您需要、请解释为什么 TMDS570LS31HDK 上的测试代码如此简单、而 TMDX570LC4357上的测试代码不起作用? 是否可以解决 TMDX570LC4357的问题?

    此致、Sergey

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

    您好 Sergey、

    引导加载程序工作正常:从 PC 下载映像、然后将其编程到闪存。 数据中止可能是由您的应用程序引起的。

    您是否测试过您的代码? 应用程序的链接器 cmd 文件中的矢量不应位于0x00000000。 它应该位于应用程序的起始地址。

      引导程序(X) :origin=0x00000000 length=0x00000020

    否则、它将不起作用。

    在引导加载程序侧、应在调用跳跃指令之前禁用中断。

    另一件事是、应用的 ECC 是否已编程? 在使用闪存 API 对应用程序进行编程时、应使用 Fapi_AutoEccGrneration。 此闪存 API 在 Fapi_BlockProgram (BL_FLASH.c 中的0函数:

    fapi_issueProgrammingCommand ((uint32_t *) dst、
    (uint8_t *) src、
    (uint32_t)字节、
    0、
    0、
    Fapi_AutoEccGeneration);

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

    您好、Wang、

    在本例中、没有闪存(我不使用引导加载程序)、但仍然存在一个非常类似的问题。

    这与由 CCS/Uniflash 计算得出的 ECC 是否相关?

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

    尊敬的 Lukasz:

    是否可以打开新主题? 谢谢

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

    您好、王!

    以下是我的第一个帖子中的代码:

    int main (void)
    {
    /*用户代码 begin (3)*/
    int i、j;
    
    //配置为输出
    hetREG1->DIR =(1 << 5);
    
    while (1)
    {
    //重置前三次闪烁
    对于(j = 0;j < 6;j++)
    {
    gioToggleBit (hetPORT1、5);
    for (i = 0;i<5000000;i++);
    }
    //软件复位
    systemREG1->SYSECR =(0x10)<<14;
    };
    /*用户代码结束*/
    
    返回0;
    }
    

    它在 TMDS570LS31HDK 上工作 、在 TMDX570LC43HDK 上不工作

    如果可以、您可以检查 TMDX570LC43HDK 上的代码吗? 如果它可以正常工作、发送项目以在我 的 TMDX570LC43HDK 上进行尝试

    提前感谢您。

    此致、
    Sergey

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

    您好 Sergey、

    我找到了根本原因。 实际上、它是由通过 HALCoGen 生成的代码引起的。  在 getResetSource (void) 函数和 sys_startup.c 中未正确处理软件复位

    1.将软件重置添加到 getResetSource (void):

    如果((SYS_EXCE异常 和(UINT32) SW_RESET)!=0U)则为其他

        RST_SOURCE = SW_RESET;

        SYS_EXception =(uint32) sw_reset;

    2.将 SW_RESET 移至第132行

    /*SAFETYMCUSW 62 S MR:15.2、15.5 "需要继续处理上电复位"*/
    调试复位情况:
    案例 EXT_RESET:

    /*用户代码开始(6)*/
    案例 SW_RESET:

    随附的是我的 CCS 工程:

    e2e.ti.com/.../2664.TMS570LC4357_5F00_Sergey.zip

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

    您好、王!

    这解决了问题。

    这对我们的项目来说很重要。 我非常感谢,我要感谢你们!

    此致、Sergey

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

    你(们)好。

    此补丁也可以解决我的问题。

    请确保 HalcogGen 团队知道此问题。

    非常感谢、

    此致

    Łukasz μ A

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

     您好 Łukasz、

    我将提交此问题的 TT。 谢谢