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.

[参考译文] 编译器/TM4C123GH6PGE:中断例程跳转。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/613245/compiler-tm4c123gh6pge-interrupt-routine-jump

器件型号:TM4C123GH6PGE

工具/软件:TI C/C++编译器

你好。

中断 ISR 跳转有两种不同的状态。

Case1 (无跳转)、 CASE2 (跳转正常), 为什么它不同?

在两种情况下,这是否都相同?

有什么区别?

谢谢。

[案例1]

void
PM0IntHandler (void)
{
ROM_IntMasterDisable ();
GPIOIntClear (GPIO_PORTM_BASE、GPIO_PIN_0);
UARTprintf ("GPIOM 下降沿中断\n");
ROM_IntMasterEnable ();

}


int
main (void)
{

//为板载 LED 启用 GPIOG。
//为板载向上按钮启用 GPIOM。

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIO2


);// GPIOG 端口 PIN2,输出组 GPIOPinTypeGPIOOutput (GPIO_PORTG_base、GPIO_PIN_2);

// UART Func Call
Config2,GPIO_PIN_PIN_0|GPIO_PIN_GPIO_SET_GPIO_PIN_GPIO_PIN_PIN_PIN_0|GPIO0|GPIO_PIN_PIN_PIN_PIN_GPIO_SET_GPIO_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_0|GPIO_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_0|GPIO_SET_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_GPIO_0_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_PIN_











// GPIOIOM 中断类型设置(GPIO_LOW_LEVEL 或 GPIO_FALLING_EDGE)
GPIOIntTypeSet (GPIO_PORTM_BASE、GPIO_PIN_0、GPIO_FALLING_EDGE);

// GPIOPin0、中断处理程序重定向
器// GPIOIntRegister (GPIO_PORTM_BASE、PM0IntHandler);


// GPIO_Interrupt
(GPIO_ENABLE_INT_ENINT

);// GPIOInt_GPIO_ENAB_INT_ENABLEINT (GPIO_ENABLE_INT_ININT)

while (1)
{


//打开 LED。

GPIOPinWrite (GPIO_PORTG_base、GPIO_PIN_2、0x04);

UARTprintf ("LED on \n");

SysCtlDelay ((SysCtlClockGet ()/3)*0.1); //100ms 延迟、(高电平)


//关闭 LED。

GPIOPinWrite (GPIO_PORTG_base、GPIO_PIN_2、~(0x04));
UARTprintf ("LED off\n");
SysCtlDelay ((SysCtlClockGet ()/3)*0.05); //50ms 延迟、(低)

UARTprintf ("\n");


}
}

  Keil 的 startup_rvmdk.S  

    

    外部 PM0IntHandler

;矢量表

     DCD  PM0IntHandler      ;GPIO 端口 M

    

     。

    。

 

 [案例2]  

  // GPIOM Pin0,中断处理程序寄存器
  GPIOIntRegister (GPIO_PORTM_BASE、PM0IntHandler);


    Keil 的 startup_rvmdk.S  

  ; 外部 PM0IntHandler

  ;矢量表

     DCD  IntDefaultHandler       ;GPIO 端口 M

     

      。

     。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不使用 Keil、但两者都应该起作用。

    在您的 Case1中、您将在编译期间在矢量表中注册 ISR 地址。
    在 CASE2中、您可以在运行时动态注册 ISR。

    这与 CCS 非常相似、工作正常。 因此、您可能需要在项目上查找一些特定的 Keil 配置... 是否确定编译中包含启动文件? 也许尝试在其中写入一个无效的函数名称、看看它是否抱怨...

    您是否尝试在矢量表上添加任何其他中断并查看其是否正常工作? 可能是 SysTick 这样一个简单的测试用例? 或者、你是否有任何其他与矢量表上的中断一起工作的示例项目?

    布鲁诺
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    ***类似***(sigh -这样的“升级”)