主题中讨论的其他器件: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.是否有任何可检测这种情况的编程方法?


