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.

[参考译文] CCS/TM4C123GE6PM:完全不熟悉中断、需要有关调试中断函数的帮助

Guru**** 2609895 points
Other Parts Discussed in Thread: EK-TM4C123GXL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/761898/ccs-tm4c123ge6pm-completly-new-to-interrupts-need-help-debugging-my-interrupt-function

器件型号:TM4C123GE6PM
Thread 中讨论的其他器件:EK-TM4C123GXL

工具/软件:Code Composer Studio

您好!  

我目前正在尝试使用 Tiva C TM4C123G Launchpad 来使用中断来检测函数发生器输入的上升沿。  

到现在为止、我正在调用下面的中断函数来执行一个中断。 调试程序时、程序卡在 interrupt.c 文件中、这是否正常?

此外 、我甚至不确定这是否是调用/使用中断的正确方法。 我已经生成的代码大多数基于示例代码、因此我们非常感谢您的帮助。

这是我正在调用的中断函数。。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、我还注意到我没有定义 ISR、这可能是我的问题的很大一部分。

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

    您提到过从示例代码中生成大部分中断、但您是否已学习用于 LaunchPad 的 TivaWare 中的中断示例? 可在[Install Path]\TivaWare_C_Series-2.1.4.178\examples\boards\ek-tm4c123gxl\interrupts 中找到它。 这至少会向您展示如何制作 ISR。 对于 ISR、您还需要将它们添加到 startup_ccs.c 文件中、以便它们与中断矢量表相关联。 中断示例还将向您展示如何执行此操作。

    您肯定需要 ISR 正确使用此函数、我将询问它在哪里。

    我还想说、如果您只是学习中断、那么您现在的工作进度会太多。 尝试简化您的代码。 查看是否首先在单个 GPIO 上触发中断、然后添加进一步的功能。

    您将需要调用 IntMasterEnable 来整体启用中断、然后针对要在其上触发中断的每个中断矢量使用 IntEnable。 这些是我第一眼看到的最大的缺失。

    请尝试查看该示例并创建 ISR、如果仍有问题、请重新发布包括 ISR 在内的代码。 这样、您就可以在 E2E 上发布代码而无需屏幕截图、只需单击即可 用于添加图片的同一编辑器中的符号。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph、

    感谢您提供的所有信息、非常有帮助。

    我仔细看了这个例子、发现我出了一些问题。

    我还简化了代码、现在只需输出到单个 GPIO。

    然而、当我调试它时、这个代码仍然无限运行、所以它有可能触发一个故障 ISR。

    感谢你的帮助。

    ISR 代码:

    无效
    IntGPIOA (空)
    {
    int i = 0;
    int ui32loop;
    //
    //将 PE1设置为高电平以指示进入此中断处理程序。
    //
    ROM_GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_1、GPIO_PIN_1);
    
    //
    //将当前中断状态放在 UART 上。
    //
    DisplayIntStatus();
    //触发中断 A
    HWREG (NVIC_SW_TRIG)= INT_GPIOA-16;
    
    //
    //等待两秒钟。
    //
    for (ui32Loop = 0;ui32Loop < 200000;ui32Loop +)
    {
    }
    //
    //保存并递增中断序列号。
    //
    G_ui32GPIOA = g_ui32Index++;
    
    //
    //将 PE1设为低电平表示退出此中断处理程序。
    //
    ROM_GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_1、0);
    } 

    主函数代码:

    空中断使能(空)
    {
    int32_t i32Val;
    
    ROM_IntMasterEnable();
    
    ROM_IntEnable (INT_GPIOA);
    //rom_IntEnable (INT_GPIOB);
    
    //启用 GPIOA 外设
    while (1){
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
    //
    //等待 GPIOA 模块准备就绪。
    //
    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOA))
    {
    }
    //
    //注册端口级中断处理程序。 此处理程序是第一个
    //所有引脚中断的级别中断处理程序。
    //
    GPIOIntRegister (GPIO_Porta_base、IntGPIOA);
    //
    //初始化 GPIO 引脚配置。
    //
    //将引脚2、4和5设置为输入、SW 控制。
    //
    GPIOPinTypeGPIOInput (GPIO_Porta_base、GPIO_PIN_2);//| GPIO_PIN_4 | GPIO_PIN_5);
    //
    //将引脚0和3设置为输出、软件控制。
    //
    GPIOPinTypeGPIOOutput (GPIO_Porta_base、GPIO_PIN_0);//| GPIO_PIN_3);//
    //使引脚2和4上升沿触发中断。
    //
    // GPIOIntTypeSet (GPIO_PORta_base、GPIO_PIN_2 | GPIO_PIN_4、GPIO_RISE_EDGE);
    //
    //使引脚5成为高电平触发中断。
    //
    //GPIOIntTypeSet (GPIO_Porta_base、GPIO_PIN_5、GPIO_HIGH_LEVEL);
    
    //读取一些引脚。
    //
    i32Val = GPIOPinRead (GPIO_PORta_base、(GPIO_PIN_2));//GPIO_PIN_0 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5));
    //
    //写入一些引脚。 即使指定了引脚2、4和5、这些引脚也是如此
    //不受此写入的影响,因为它们被配置为输入。 在
    //写入结束时、引脚0为低电平、引脚3为高电平。
    //
    GPIOPinWrite (GPIO_Porta_base、(GPIO_PIN_0| GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5)、
    (GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7);
    //
    //启用引脚中断。
    //
    GPIOIntEnable (GPIO_Porta_base、GPIO_PIN_2);//| GPIO_PIN_4 | GPIO_PIN_5);
    PWMIntEnable (GPIO_Porta_base、INT_PWM0_0);
    IntEnable (INT_PWM0_0);
    //检测到上升沿时
    // if (GPIO_PIN_3 ==1)
    //{
    /////触发 MOSFET 上的高电平输入
    //GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_3 | GPIO_PIN_0、GPIO_PIN_3);//写入 MOSFET PB0上的高电平引脚
    //}
    //检测到下降沿时
    //否则
    //{
    //触发 MOSFET 上的低输入
    // GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_3、GPIO_PIN_0);//写入 MOSFET PA6上的低电平引脚
    //}
    //}
    
    } 

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

    我看不到 GPIOIntTypeSet API 来配置哪种信号会触发中断。

    此外、您还不需要 ISR 中的中断触发器、因为您已经在 ISR 中了。 该触发器实际上可能是锁定 ISR 的原因。 在本例中、GPIO B 将触发 A、但在本例中、GPIO A 将触发 A、并可能导致环路。 请将其取出并查看 ISR 是否开始工作。

    另外、关于 ISR、由于您好像复制了 TIvaWare 示例-遗憾的是、虽然它对配置很有帮助、但 TivaWare 示例实际上展示了 ISR 的多种不良做法。

    对于实际应用、您不应在 ISR 中等待2秒。 如果您需要通过延迟测量某个内容、请使用触发的计时器在 ISR 中开始计数、然后立即退出 ISR。 我没有编写执行2秒延迟的 TivaWare 示例、也没有批准这方面的使用。

    在同一思路下、我也不会在 ISR 中进行任何 UART 通信。 您希望 ISR 在合理管理的尽可能少的周期内解析、因此任何具有延迟或使用通信外设的内容都应在 ISR 外部寻址。 相反、您应该在 ISR 中读取结果以及有关如何处理结果的许多快速决策、然后退出 ISR。 现在我将通过删除这些内容来减少 ISR、因为它不会让您受益。

    只是一般建议、希望我们的 TivaWare 示例不会给您错误的印象... (我真的希望我知道谁认为在关键示例中使用不良 ISR 做法是个好主意...)