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.

[参考译文] TMS570LS3137:代码、GIO 仿真模式和调试器交互

Guru**** 2555630 points
Other Parts Discussed in Thread: TMS570LC4357, TMS570LS3137

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1282948/tms570ls3137-code-gio-emulation-mode-and-debugger-interaction

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

上一篇文章中 、我曾试图了解为什么我的 GIO 中断是间歇性工作的。 我自己做了一些实验后、得出了两段代码、一段代码总是有效的、另一段代码永远不起作用(我想这样):

这绝不会调用中断:

/* This would never increment DEBUG_counter */

int main(void)
{
/* USER CODE BEGIN (3) */
    _enable_IRQ();

    gioInit();
    gioEnableNotification(gioPORTB, 2); //Pin 2 is the one being tested

    while(1){
        asm(" nop");
        asm(" nop");
        asm(" nop");
    }

/* USER CODE END */

    return 0;
}

uint32 DEBUG_counter = 0;
void gioHighLevelInterrupt(void)
{
    uint32 offset = gioREG->OFF1;

/* USER CODE BEGIN (14) */
    DEBUG_counter++;
}

每次都会调用此函数:

/* This would always increment DEBUG_counter */

int main(void)
{
/* USER CODE BEGIN (3) */
    _enable_IRQ();

    gioInit();
    gioEnableNotification(gioPORTB, 2); //Pin 2 is the one being tested


    while(1){
        DEBUG_counter[5] = pmmREG->GLOBALSTAT;
    }


/* USER CODE END */

    return 0;
}

uint32 DEBUG_counter = 0;
void gioHighLevelInterrupt(void)
{
    uint32 offset = gioREG->OFF1;

/* USER CODE BEGIN (14) */
    DEBUG_counter++;
}

经过大量的挖掘、文档读取和三角测量、我发现中断故障的根本原因是调试器:如果我尝试读取寄存器 GIOB 的任何值、可能是由于仿真模式、中断将停止在该调试会话中工作。 只要在刷新时打开 CCS 中的寄存器结构树就足以导致此问题、但是 仅限 替换为上面的第一个代码。 第二个似乎不受这个问题的影响。

现在我知道导致这种情况的原因、以及如何回避问题、但为了防止这种情况通过其他方式再次发生、我有一些关于这种行为的问题:

1.如果在调试期间中断被停止(我想是仿真模式)、为什么中断标志会被清除? 它是否应该保持开启、因为读取偏移不会清除标志或偏移?

2.为什么读取另一个不相关寄存器的代码会阻止这种情况发生? 此代码对仿真模式有何影响? 即使在调试期间、在代码与不相关外设状态之间出现这些意想不到的动态变化也会让人感到有点不安。

3.在第一个代码中触发仿真模式后、是否可以在不复位 CPU 的情况下手动将外设恢复为正常模式?

4.是否有任何关于 TI TMS570控制器上调试器其他效果的文档? 我怎样才能确信我的测试不会妨碍我观察代码行为? 我在 TRM 的其他外设部分发现了稀疏的注释、但和 GIO 中的情况一样、这些注释非常肤浅。

5.是否有任何可检测这种情况的编程方法?

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

    你好,这是几天,我试图寻找有关这方面的更多文档,但找不到。 有人有任何答案吗?

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

    尊敬的 Gustavo Bruno:

    很抱歉我的回应延迟,在印度我们得到了几个假期。

    现在、我已经开始处理您的问题、我想重现您在最后提到的问题。 我将尽快为您提供更新。

    --
    谢谢。此致、
    Jagadish。

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

    尊敬的 Gustavo Bruno:

    在我的回答中,我被其他问题所困扰。

    刚才、我在我的 TMS570LC4357板上测试了您要讨论的问题、因为我没有 TMS570LS3137板。

    下面是代码片段:

    这里我没有看到您说的问题、我的意思是我始终会获得中断。 我甚至在 while (1)中注释掉了标志代码、但仍然一切都很完美。

    我只是怀疑您的代码中有一件事、  

    您不应在 main.c 中重新定义"gioHighLevelInterrupt"函数、因为其定义将已在 Gio.c 文件中、如下所示

    我们需要做的是、我们只需调用 main.c 中的"gioNotification"函数即可验证 GIO 中断、就像我在 main.c 中所做的那样。

    那么、您能否尝试以这种方式进行测试并向我提供更新?

    下面是我的完整项目供您参考:

    e2e.ti.com/.../GIO_5F00_Input_5F00_Interrupt_5F00_Test_5F00_LC4357.zip

    --
    谢谢。此致、
    Jagadish。

    --
    谢谢。此致、
    Jagadish。