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.

[参考译文] TM4C1231D5PZ:端口 C 上的中断未被触发

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1277613/tm4c1231d5pz-interrupt-on-port-c-not-triggered

器件型号:TM4C1231D5PZ

您好

我遇到了一些中断问题。

使用以下代码、不会触发我的中断函数。
(按钮被拉至高电平、按下时应变为0、这通过示波器进行确认)

如果我更改所有内容以进行轮询(在 while 循环中读取引脚)、我可以看到正确的值。
我怀疑我的代码有问题。

("print"函数是在我们的代码中有效使用多次且运行正常的函数)

void setup_rst() 
{
    GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_INT_PIN_5);

    GPIOIntClear(GPIO_PORTC_BASE, GPIO_INT_PIN_5);

    GPIOIntRegisterPin(GPIO_PORTC_BASE, GPIO_INT_PIN_5, rst_btn_pressed);
    GPIOIntTypeSet(GPIO_PORTC_BASE, GPIO_INT_PIN_5, GPIO_FALLING_EDGE);

    GPIOIntEnable(GPIO_PORTC_BASE, GPIO_PIN_5);
}   
    
void rst_btn_pressed()
{
    print((uint8_t *) "rst pressed\r\n");

}

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

    您好!

    我想您遗漏了 IntEnable (INT_GPIOC)和 GPIOPadConfigSet ()。 你需要在 NVIC 级别为 PortC 启用中断,这是我在 setup_rst()中看不到的。 缺少 GPIOPadConfigSet()语句时也是如此。 请参阅以下示例代码、以使用 PP0和 PP1生成中断。  

    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOP);
    while (! SysCtlPeripheralReady (SYSCTL_Periph_GPIOP)
    {

    GPIOPinTypeGPIOInput (GPIO_PORTP_BASE、GPIO_PIN_0 | GPIO_PIN_1);
    GPIOPadConfigSet (GPIO_PORTP_BASE、GPIO_PIN_0 | GPIO_PIN_1、GPIO_Strength_4mA、GPIO_PIN_TYPE_STD_WPU);
    GPIOIntTypeSet (GPIO_PORTP_BASE、GPIO_PIN_0 | GPIO_PIN_1、GPIO_FALLING_EDGE);


    GPIOIntRegisterPin (GPIO_PORTP_BASE、GPIO_PIN_0、UserButton1ISR);
    GPIOIntRegisterPin (GPIO_PORTP_BASE、GPIO_PIN_1、UserButton2ISR);

    GPIOIntEnable (GPIO_PORTP_BASE、GPIO_INT_PIN_0 | GPIO_INT_PIN_1);

    IntEnable (INT_GPIOP0);
    IntEnable (INT_GPIOP1);
    IntMasterEnable();

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

    您好,Charles

    添加  IntEnable(INT_GPIOC),控制器后、只要按下按钮、控制器就会崩溃。

    该外设之前启用过。
    真的需要 padconfig 吗?

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

    您好!

     你可以在 rst_btn_pressed 的开头放置一个断点吗? 如果处理器在 ISR 中暂停、则可以确认您之前的问题是由于 未在 NVIC 级别启用中断所致。 至于崩溃、我认为它可能与 printf 语句有关。 通常、printf 需要大量堆栈和堆。 我们通常不建议使用 printf,而是使用 UARTPrintf()。 如果你真的想使用 printf、增加堆和堆栈。 您需要 使 GPIOPadConfigSet 启用内部上拉、除非您有外部上拉电阻就位。 有时、您的外部电路可能在 MCU 之后已经初始化。 发生这种情况时、GPIO 输入是悬空的、您不需要错误触发。  通常、我将具有 GPIOPadConfigSet。  

    #define APP_BASE 0x00000000
    #define RAM_BASE 0x20000000

    /*系统内存映射*/

    内存
    {
    /*存储在内部闪存中并从内部闪存执行的应用程序*/
    FLASH (RX): origin = APP_BASE , length = 0x00040000
    /*应用程序使用内部 RAM 进行数据*/
    SRAM (rwx):origin = 0x20000000、length = 0x00008000

    /*内存中的段分配*/

    部分
    {
    .intvecs:> app_base
    .text :>闪存
    .const :>闪存
    cinit :>闪存
    请输入您的密码:> FLASH
    init_array:> FLASH

    .vtable:> RAM_BASE
    .data :> SRAM
    bss :> SRAM
    .sysmem:> SRAM
    .stack:> SRAM

    __STACK_TOP =_STACK + 2048

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

    您好,Charles

    谢谢你的解释:)
    有一个到3V3的外部上拉(10K)、所以应该没问题。

    在函数开始处设置断点不会触发。

    我遵循了您的意见、并删除了打印声明。
    现在应该设置 int ,这样我就可以用断点看到它:)

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

    我找到了解决方案。

    GPIOIntRegisterPin() 不会执行它应该执行的操作。
    我  GPIOIntRegister() 现在使用更常规的结构来注册中断。