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.

[参考译文] TM4C1290NCPDT:GPIO 中断不能#39;t 停止在端口 L 上

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/588337/tm4c1290ncpdt-gpio-interrupt-doesn-t-stop-on-port-l

器件型号:TM4C1290NCPDT
主题中讨论的其他器件:TM4C1294NCPDTENERGIA

您好!

我有一个代码在输入引脚上使用中断进行一些计算。

目前、当我使用端口 M、D、A 或 B 时、它可以正常工作(我已经对所有端口进行了测试)。

问题是、我需要使它专门在端口 L 引脚3上工作、但当我这么做时、中断会被每次调用、程序会卡住。

我甚至尝试使 Timer1中断(我也在使用它)在优先级 C0上工作、GPIO 在优先级 E0上工作、但由于程序滞留在端口 L 中断上、甚至计时器中断都不会被调用。

我启用用于测试代码的所有 GPIO:

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOO);SysCtlPeripheralEnable
(SYSCTL_Periph_GPIOL);
SysCtlPeripheralEnable (SYSCTL_GPIOB) 

我将引脚类型设置为输入:(这里我仅为端口 L 显示它、当我测试其他引脚时、我将此行更改为要测试的端口)。

 GPIOPinTypeGPIOInput (GPIO_PORTL_base、GPIO_PIN_3);

我设置中断:

GPIOIntRegister (GPIO_PORTL_base、TACHandler);
GPIOIntTypeSet (GPIO_PORTL_base、GPIO_PIN_3、GPIO_FALLING_EDGE);
GPIOIntEnable (GPIO_PORTL_BASE、GPIO_INT_PIN_3); 

在中断处理程序"TacHandler"上、我清除中断:

void TacHandler (void){
GPIOIntClear (GPIO_PORTL_base、GPIO_PIN_3);
freqCalc ();
}

内联 void freqCalc (void){
pulseCounter++;
} 

但是、正如我说过的、GPIO 中断不断被调用、软件被卡住。 当我尝试使用其他引脚时、我得到的结果是我想要的。

除了 GPIO 和 Timer1之外、我没有初始化任何其他内容、因此我不使用模拟比较器、USB 或正交编码器(我确实看到它们可以设置为在引脚 PL3上工作)。

我正在使用 Launchpad 板。

是否无法为此使用 PL3?

谢谢你。

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

    你好 Leonardo。
    您的代码中是否可能出现另一个中断处理程序使用相同的 TacHandler()例程或访问相同资源 freqCalc 的错误? pulseCounter 是否为全局变量? 我正在考虑可能的死锁…
    John

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

    Leonardo、我的另一个想法是"直列"限定符可能会使事情变得混乱。 内联向编译器发出指令、将此函数的代码放入平坦地址空间一次、而不会保留用于实现代码和平目的的地址。 INT 调用需要一个地址来处理诸如函数之类的内容。 当可用的闪存不是问题时、内联通常用于代码块以加速代码执行、并且我们有足够的闪存、以便代码可以重复多次、因为代码是静态调用的。

    John

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

    我在这个项目中与 Leonardo 合作。

    只有 GPIO L 和 Timer1的处理程序有效。

    当我们在另一个 GPIO 中尝试其他引脚时、我们得到预期的结果。


    你有其他建议吗?

    谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、John、
    我只有一个 Timer1中断(使用完全不同的处理程序)和 GPIO_PORTL 中断。
    我还通过简单地将 pulseCounter (一个全局变量)增量放在句柄上来删除内联函数。
    此外、奇怪的是、当我使用其他端口时、算法会起作用、但它不能完全在我需要它工作的端口(L 端口)上工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    还可以 如果您只使用 GPIO-L 而不使用任何其他 GPIO、问题是否仍然存在? 不要在代码中初始化任何其他 GPIO、而只初始化 L。 检查在这种情况下您是否仍然遇到相同的问题。 如果是这样、则可能是您的 L 端口出现故障。
    John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、请按原样尝试使用代码、但使用另一个 GPIO 而不是 L 来检查问题是否仍然存在。
    John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Leonardo Muricy"]... 端口 L 引脚3... (然而)中断每次都会被调用-程序会被卡住。

    请勿出现以下情况(如下所示)通常会导致(不需要的)返回(刚刚执行)中断处理程序:

    • 在 ISR 中、"中断清除"被放置得太远(向下)。   (很明显-这不是您的情况)  注意:(某些) ISR 需要有限的时间才能完成!
    • ISR (因此)简短/简短-"中断清除"可能无法完成  注意:与上述内容相同的说明。
    • 您选择的端口不"完全/正确"支持或管理"唯一、单独的位、ISR" 注意:大多数端口不支持如此详尽-基于位-独特的中断!

    我认为 MCU 的"启动文件"应显示存在"仅端口"中断。   (即、不存在"单独列出的端口位"-具有该端口-具有中断矢量表列表中的位!)

    我认为、可以通过将参数"GPIO_INT_PIN_3"替换(而不是)端口 L 中断的名称来解决这一问题。  (TacHandler)

    Fire/I 对129x 器件没有任何经验。   如果 GPIO 端口(或端口中断管理)存在"差异"、我希望这些数据会显示在 MCU 手册中。   您是否真正(深入)阅读/审阅了手册-以了解此类详细信息?

    ***[编辑] 请访问下面的(下一篇)文章,该文章很好地说明了“端口与端口位触发”中断功能的标识。   为了清晰起见、我尝试使用"颜色代码"-语法突出显示器使其无法显示...

    现在、您注意到这个 ISR 会"每次调用"、但它是否可以(相反)只调用一次、并且"从不"(完全/正确)被清除?   这似乎会产生类似的效果-会不会吗?

    一如既往-这(也可能)是(也可能)勘误问题-最好检查一下-也...

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

    ***[编辑] Thru Good Fortune -此处的另一张海报提供了 TM4C1294 (类似) MCU 的"启动文件"。   这为"整个端口与单个端口位"之间的差异提供了一个很好的说明-用作中断触发器。

    IntDefaultHandler、 // GPIO 端口 M 注:举例说明了"端口触发中断"。
    IntDefaultHandler、 // GPIO 端口 N
    0、 //保留
    IntDefaultHandler、 //改动
    IntDefaultHandler、 // GPIO 端口 P (摘要或 P0)和这个-"单个端口位触发!
    IntDefaultHandler、 // GPIO 端口 P1
    IntDefaultHandler、 // GPIO 端口 P2
    IntDefaultHandler、 // GPIO 端口 P3
    IntDefaultHandler、 // GPIO 端口 P4
    IntDefaultHandler、 // GPIO 端口 P5
    IntDefaultHandler、 // GPIO 端口 P6
    IntDefaultHandler、 // GPIO 端口 P7 

    因此、(几乎)可以肯定您的 MCU (缺少)生成"单个端口位中断"的能力。    您可以(仍然)通过使用"正常"的整个端口中断向量来实现您的目标。

    这种超额发帖的原因是我的(无法)在"Syntax Highlighter"命令中使用"颜色代码"。  (证明了 Tortor 的语法。)
      

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Leonardo、在 TM4C1294NCPDT 手册第742页中、列出了仅端口 P 和 Q 支持引脚中断。
    μ■可编程的 GPIO 中断控制
    –中断产生屏蔽
    –上升沿触发、下降沿触发或两者触发
    –对高值或低值进行电平敏感
    –端口 P 和端口 Q 上可用的每个引脚中断<---

    不过、如果理解正确、第109页的位段功能可用于向 GPIO 端口的任何位/引脚发出中断信号。
    例如,ENERGIA IDE (可免费下载和安装)使用类似的技巧,通过函数 attachInterupt()和 detachInterrupt()[Energia.nu,单击顶部菜单 并向下]在其他端口的引脚上执行此操作:
    秘书长的报告
    volatile int state = HIGH;
    volatile int flag = HIGH;
    INT 计数= 0;

    void setup()

    Serial.begin(9600);

    PinMode (GREEN _LED、OUTPUT);
    digitalWrite (green_LED、state);

    /*启用内部上拉。
    *如果没有该引脚、该示例将悬空、并且不起作用*/
    引脚模式(PUSH2、INPUT_PULLUP);
    attachInterrupt (PUSH2、闪烁、下降);//只要按下按钮就会触发中断


    void loop()

    digitalWrite (green_LED、state);//LED 启动
    if (标志)

    count++;
    serial.println (count);
    FLAG =低电平;



    空 blink()

    STATE =!STATE;
    FLAG =高电平;

    (二

    用户还可以使用许多其他技巧来将 TM4C1294xxxxx 上发生的任何事件用作中断驱动程序。
    此致、
    John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    首先、感谢大家的帮助。
    我知道端口 L 没有每个引脚的单独中断、但我习惯这样设置中断、它通常起作用。

    我在端口 A、B 和 D 上尝试了完全相同的代码、它运行得很好! 它不适用于端口 L、这是我真正需要使用的一个端口。
    我将尝试在不启用其他端口的情况下运行代码、而不单独设置引脚。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否"错过了"两篇帖子-昨晚到达(5:14和11:38)-这可能会增加您对问题的见解?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、CB1_MOBILE。
    我确实看到了最后两个帖子、但基本上它们都是关于这样一个事实、即只能在整个端口上使用中断、尽管可以对其进行微调、以便我可以在单个端口上使用中断、正如在 Energia sketch 中所做的那样。
    问题是、就像端口 L 一样、端口 B 也不能与单个引脚一起使用、这就是我仍然不能解决这个问题的原因。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢-减去反馈-我不知道我们的努力是否得到了注意。

    如果端口和操作符合您的报告-没有勘误表和/或详细信息-我也是这样说的、"损失了。"   然后(通常)此类问题需要供应商的注意/响应-始终配备"内部信息"。

    在我的第一个帖子中、有人建议您(整个端口)中断按其名称而不是"端口引脚"引用来标识。   你试过吗?

    此外-(通常情况下)应该能够通过(非常)早期测试来识别"单独的位、触发源"-在(整个端口) ISR 中。  这似乎是"强制 Port_L"满足您的要求的最佳(也许是唯一的)方法...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯、这很奇怪。
    我可以访问同事使用的另一个 Launchpad 板。
    我在完全相同的端口(端口 L)上加载了完全相同的代码、并且正常工作。 中断按应有的方式被清除、计数也很完美。
    他们发生了更令人奇怪的事情。 之后、我立即尝试再次在现在的可疑板上加载代码、它工作正常...
    我不确定在同一电路板上使用相同代码如何实现两种不同的行为、但事实是、在我使用不同代码后、这种行为才起作用。
    我认为我的设备存在硬件问题
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Leonardo Muricy"]我认为我的设备存在硬件问题

    也许不是!   您是否通过供应商的"ICDI"进行编程?

    Fire/I 通过(全球最佳销售)"J-Link" JTAG/SWD Pod 记录非常(改进)的结果。   防止 时间/精力损失-可能合理-卓越设备的(折扣)成本...  (PM ME 以了解折扣详情)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    而且-它也会产生您实现"独立、端口位、中断检测"的能力-当您说端口"未"明确描述/定义为包括该功能时-在"未来/不同" MCU 生产运行时可能不会"继续"!

    "利用"一个"未记录的特性/行为"-可能并不总是证明(完全)稳健-并且可能在修订更新时完全"失败"...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我知道这一点。 我可能只需将其更改为中断整个端口、只需检查在战后读取哪个引脚即可。

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

    好的-好的、你有这种意识。

    过去曾在(类似)大型半公司工作过-我知道"芯片互连资源"-需要适应/支持、"独特/自动、端口位、中断源分辨率"会大幅增加-从而增加 IC 的成本。

    我记得、这种"单个端口位中断"的"主要目的"是"加快此类中断的服务速度"、尤其是当"具有相同端口的多个位处于"高度"活动状态时!"   (我不认为这与您的要求重叠。)

    这通常是"完全适应(即中断位)端口"之所以"减少"的原因-与它们(更多)标准的"仅端口"实现相比...