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.

[参考译文] TM4C123FH6PM:有关中断跳转的问题

Guru**** 2512785 points
Other Parts Discussed in Thread: TM4C123FH6PM

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/885622/tm4c123fh6pm-questions-about-interrupt-jump

器件型号:TM4C123FH6PM
主题中讨论的其他器件: TM4C123

你好。

Q1> 按下 PA [2]至 PA[5]按钮时、无法从主()跳转至 ISR (ButtonKeyIntHandler)。

    请解释错误的地方  

此致、

Jame、Shin

ButtonKeyIntHandler ()

    uint32_t ui32Ints;

    ui32Ints = GPIOIntStatus (GPIO_Porta_base、true);

    if (ui32Ints = GPIO_INT_PIN_2)

    {

       …

    }

    if (ui32Ints = GPIO_INT_PIN_3)

    {

      …

    }

   if (ui32Ints = GPIO_INT_PIN_4)

   {

     …

    }

   if (ui32Ints =GPIO_INT_PIN_5)

   {

     …

    }

 

 }

 

MAIN ()

          。

  //设置中断配置 GPIO PA[2]、PA[3]、PA[4];PA[5]

 //

 SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

 GPIOPadConfigSet (GPIO_Porta_base、GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5、 GPIO_Strength _8mA、GPIO_PIN_TYPE_STD_WPU);

 GPIOIntTypeSet (GPIO_Porta_base、GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5、GPIO_FALLING_EDGE);

 GPIOIntRegister (GPIO_Porta_base、ButtonKeyIntHandler);

 //

 // GPIO 提交控制 PA[5:2]、GPIO 锁定

 //

 HWREG (GPIO_PORta_base + GPIO_LOCK)= GPIO_LOCK_KEY;

 HWREG (GPIO_PORta_base + GPIO_CR)|=(GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5);

  …μ A。

 GPIOIntEnable (GPIO_Porta_base、GPIO_INT_PIN_2|GPIO_INT_PIN_3|GPIO_INT_PIN_4|GPIO_INT_PIN_5);

  while (1)

  {

    。

  }

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

    无中断问候语、

    再次-年轻的员工、"感受(但不分享)您的痛苦。"

    您是否可以考虑:

    •  您选择了"GPIOIntRegister ()"、它会在"run-time"配置中断。   然后、MCU 手册建议:"中断处理程序的运行时配置要求将中断处理程序表放置在 SRAM 中的1KB 边界上(通常这位于 SRAM 的开头)。 否则会导致为响应中断而获取不正确的矢量地址。"   因此,年轻的工作人员问:"您是否注意到(并遵守)了额外的需求和细节?"
    • 此外- MCU 手册还会继续注意、"中断的运行时配置会给中断响应时间增加较小的延迟、因为堆栈操作(写入 SRAM)和中断处理程序表获取(从 SRAM 读取)必须按顺序执行。"    因此、员工问:"为什么您会在该过程中"增加工作量"并受到处罚(由于响应时间较慢)?
    • 该手册接着指出:"中断处理程序可以通过两种方式之一进行配置:在编译时以静态方式配置、或在运行时以动态方式配置。 中断处理程序的静态配置是通过编辑应用程序启动代码中的中断处理程序表来完成的。   静态配置中断表可提供最快的中断响应时间。"   "静态配置"似乎不是一个极大(宽松)、更快的响应-因此是一个更好的选择吗?

    虽然 PA2-PA5 (您选择的"开关/按钮使用"(默认)至 SPI 的引脚)-我们不确定它们是否需要"解锁"。   同样、MCU 手册(在锁定/解锁寄存器对说明中-(显示)表示只有"JTAG 引脚(4)和 NMI 引脚(2)"- 需要此类处理。    一种潜在的担心是、此类"解锁/锁定尝试"可能会失败-并且"撤消"您之前的 PA2-PA5配置。   另请注意-您是否应该"先"(解锁/锁定)这些引脚-在之前(之前)尝试配置/重新配置它们?

    工作人员建议"避免使用任何需要"特别注意"的引脚"(在可能的情况下)。   (请额外努力(即麻烦)总是不明智的。)

    没有显示"IntMasterEnable()"的证据-不能将其包括在内。

    最后-您(真的)是否确认了您的开关"在按下/激活时将其目标引脚拉至接地?"   (当您的中断寻找一个"下降沿"时。)

    我们相信(有些)在这里可以成功实现"中断生成!"   (员工(和我)在使用"IntRegister ()!"时看到的价值极小(但地平线上的大风暴云)   (将其“板载”... Bob 和我的帆船-包括合适的"步行板"。)

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

    Jame、您好!

    除之外

    IntMasterEnable(); 

    您还需要:

    IntEnable (INT_GPIOA); 

    您好 CB1、

    除非客户正在编辑处理 SRAM 中断矢量位置的文件、否则 GPIOIntRegister 将正确地将中断放置在正确的位置。 我怀疑 Jame 在这方面还可以、但实际上错过了我提供的 API。

    也就是说、我喜欢自己手动将 ISR 添加到 startup_ccs.c、它更干净、更高效。

    还同意这种解锁似乎没有必要。

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

    您好、Ralph、

    也许、"中断生成问候语"是按顺序进行的。   

    [引用用户="Ralph Jacobi"]…… GPIOIntRegister 将正确地将中断放置在正确的位置。

    尊敬的- MCU 用户随后必须"质疑 MCU 手册中提供的值"-其中指出:

    "中断处理程序的运行时配置要求将中断处理程序表放置在 SRAM 中的1KB 边界上(通常位于 SRAM 的开头)。 否则会导致为响应中断而获取不正确的矢量地址。   矢量表位于名为“VTABLE”的段中,必须使用链接器脚本适当地放置。   我们的海报(或多个其他海报)是否准备了这样的"链接器脚本?"   

    是否也可能存在(轻微)"Fly in the "INTEnable (INT_GPIOA)"(输入启用(INT_GPIOA))"(注)?   再次从 MCU 手册中获取:

    "当使用 IntRegister()时,中断也必须像以前一样启用;当在每个单独的驱动程序中使用模拟时,IntEnable()由驱动程序调用,而不需要由应用程序调用。   这似乎(极其)"容易错过!"

    这里的员工注意到没有"INTEnable (INT_GPIOA)"(正如您很好地注意到的。)   但是-他们(和我)相信海报、

    "GPIOIntEnable (GPIO_Porta_base、GPIO_INT_PIN_2|GPIO_INT_PIN_3|GPIO_INT_PIN_4|GPIO_INT_PIN_5);"

    (可能且逻辑上)符合"相同目的!"   如果不是这样-存在不需要的和(非常)细线-并且可能值得(一些)(即将推出)最新/最大的 API 中进行放大。   

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

    您好 CB1、

    它不是。

    GPIOIntEnable 在 GPIO 外设的外设级别启用中断、配置为触发中断。

    IntEnable 启用 NVIC 中的中断、以便接受来自外设的中断请求、并在它成为最高优先级的活动中断时通知内核对其执行操作。

    IntMasterEnable 为整个 MCU 启用全局中断。

    现在、GPIO 端口 A 中断已启用、但卡在 NVIC 上、NVIC 不需要来自该外设的中断、因此它不会被内核处理。

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

    您好、Ralph、

    这是一个很好的解释-我们感谢您添加的澄清。

    请注意、"员工(某种程度上)编辑了他们的原始帖子(您已对此进行了响应)、并"突出显示了"链接器脚本"的要求、以支持"中断处理程序的运行时配置!"

    MCU 手册中是否有误、从而注意到链接器脚本的额外需求?

    总而言之-正如运行时处理程序所要求的:

    • 高度细致、工作量更大
    • 增加中断延迟

    您可能会发现哪些好处(如果有)?   我们不能识别任何中断-除非此类中断是由程序即时添加和/或修改的!   (目前、雷达正因如此(可能的)优势而变得如此...)

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

    您好、(Pest Alert 递增至高电平!)

    工作人员前往 driverlib (API 使用的真正法律依据)、发现:

    //
    无效
    GPIOIntRegister (uint32_t ui32Port、void (* pfnIntHandler)(void))

    uint32_t ui32Int;

    //
    //检查参数。
    //
    assert (_GPIOBaseValid (ui32Port));

    //
    //获取与指定 GPIO 关联的中断号。
    //
    ui32Int =_GPIOIntNumberGet (ui32Port);

    assert (ui32Int!= 0);

    //
    //注册中断处理程序。
    //
    IntRegister (ui32Int、pfnIntHandler);

    //
    //启用 GPIO 中断。
    //
    IntEnable (ui32Int);

    请注意、这与我们之前介绍的 MCU 手册是一致的。

    函数调用的(有效的)烧断肯定是"邀请灾难"(如果不是立即)、那么肯定是及时的。

    是否不需要(现在)对"IntEnable()"的(添加的)调用?    (正如年轻员工先前所说的-并通过 MCU 手册记录!)

    此外-"外设驱动程序库"(中断部分)提供了一个全面的(GPIO 丰富)示例-从不会出现"IntEnable()"!

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

    您好 CB1、

    很好的收获、那么是的、呼叫被考虑在内。 说到我自己使用 GPIOIntRegister 的程度...

    正确、则不需要添加的呼叫。

    也许主启用是当时缺失的部分。

    此外、我想知道是否需要更早地完成 GPIO 解锁、我通常会在早期执行、而不是作为最后一个步骤。 尝试其他一些方法。

    回复:优点、我还没有机会深入探讨-仍然处理一些积极的问题、因此需要对这些问题进行分类、以便有时间进行更多调查。

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

    您好、Ralph、

    我是"老学校/东海岸大学教授"-我们(真的)阅读手册!   (工作人员也是如此-在最初不情愿之后。)

    您现在注意到-正如我们先前所做的那样-"解锁和锁定"(之后)是不正确的(几乎肯定的)、这些特殊引脚已经(尝试)被初始化/配置。   同样,年轻的工作人员注意到,PA2-PA5“要求这样的关注”是令人怀疑的!

    实际上-正如我们的第一个(应答帖子)所指出的、主中断使能不会受到伤害。   (像你一样、我被教导、"最好包括而不是(希望/祈祷)"、因为它包括了...)

    员工和我仍然关注"链接器脚本"所规定的要求- MCU 手册对此进行了详细介绍。   海报对此"没有提及"。

    最后-应该将海报从"IntRegister"(即我们首选的静态中断配置)"退出"-然后需要"IntEnable()"!   令人愉快-您(或其他人)能说"谢谢您的努力?"

    海报应具有  "现成供应"的绿色墨水、以奖励年轻/裂缝员工(多个和深入)发现/指示...

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

    您好 CB1、

    是的、起初感觉没有必要、但我不记得早点看到。 也就是说、D/S 不会指示它 应该导致问题... 但确实需要检查。

    正确设置提交的 D/S 状态允许写入相应的 GPIOAFSEL、GPIOPUR、GPIOPDR 或 GPIODEN 位。 因此、我看不到会撤消设置的任何内容。 但是、为了安全起见、我想看到不必要的步骤已被删除。

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

    您好!

    正义人 CB1  和  快兔拉尔夫

    我是小海龟、但请告诉我。

    在上一个帖子中跳转到 ISR (ButtonKeyIntHandler)而不设置 IntMasterEnable ()。

    我缺乏观察。 但是、NVIC 需要启用处理器中断。

    Q1>但我不知道为什么 ISR 在不声明 IntMasterEnable ()的情况下跳转。

    另一个中断不跳转(USBUART1 IntHandler、.3...、.2...、.5...、USBUART7IntHandler)

    从 UART0、1、3、2、5、 7个模块连接到每个 Rx 引脚。

    但只有 UART0跳转 ISR。 UART1、3、5、7不跳过 ISR。

    检查示波器并在每个 ISR 函数中的 UARTIntClear (UART0_BASE、ui32INT)中的同一点设置断点。

    Q2>为什么无法跳转到 UART1、3、2、5、7的 ISR?

        仅 UART0 ISR 跳转(USBUARTIntHandler)。

       请解释错误的地方

    (请附加下面的设置源代码),  请使用设备: TM4C123FH6PM

    ------------------------------------------------------

    (startup.rvmdk.S)脚本声明

    ;外部声明

    外部 USBUARTIntHandler

    外部 USBUART1内部处理程序

    外部 USBUART3IntHandler

    外部 USBUART2IntHandler

    外部 USBUART5IntHandler

    外部 USBUART7IntHandler

     

    ;矢量表。

    DCD    USBUARTIntHandler          ;UART0 Rx 和 Tx

    DCD    USBUART1 IntHandler        ;UART1 Rx 和 Tx

    DCD    USBUART2IntHandler        ;UART2 Rx 和 Tx

    DCD    USBUART3IntHandler        ;UART3 Rx 和 Tx

    DCD    USBUART5IntHandler        ;UART5 Rx 和 Tx

    DCD    USBUART7IntHandler        ;UART7 Rx 和 Tx

    //

    // UART0、ISR  外部函数声明

    //

    USBUARTIntHandler (空)

      uint32_t ui32Ints;

      int32_t i32Errors;

      ui32Ints = UARTIntStatus (UART0_BASE、TRUE);

      UARTIntClear (UART0_BASE、ui32INT);  // 调试、同一点的断点 检查跳转是否正常!

      …μ A。

     

    // UART1、ISR

    USBUART1 IntHandler (空)

      uint32_t ui32Ints;

      int32_t i32Errors;

      ui32Ints = UARTIntStatus (UART1_base、true);

      UARTIntClear (UART1_base、ui32Ints);  // 相同点处的断点  检查、无跳转!

      …μ A。

     

    // UART3,ISR

    USBUART3IntHandler (空)

      uint32_t ui32Ints;

      int32_t i32Errors;

      ui32Ints = UARTIntStatus (UART3_base、true);

      UARTIntClear (UART3_base、ui32Ints);  // 相同点处的断点  检查、无跳转 

      …μ A。

     

    // UART2、ISR

    USBUART2IntHandler (空)

      uint32_t ui32Ints;

      int32_t i32Errors;

      ui32Ints = UARTIntStatus (UART2_base、true);

      UARTIntClear (UART2_base、ui32Ints);  // 相同点处的断点  检查、无跳转 !

      …μ A。

     

    // UART5、ISR

    USBUART5IntHandler (空)

      uint32_t ui32Ints;

      int32_t i32Errors;

      ui32Ints = UARTIntStatus (UART5_BASE、TRUE);

      UARTIntClear (UART5_BASE、ui32INT);  // 相同点处的断点  检查、无跳转 !

      …μ A。

    // UART7、ISR

    USBUART7IntHandler (空)

      uint32_t ui32Ints;

      int32_t i32Errors;

      ui32Ints = UARTIntStatus (UART7_BASE、TRUE);

      UARTIntClear (UART7_BASE、ui32INT);  // 相同点处的断点  检查、无跳转 !

      …μ A。

    MAIN ()

    …μ A。

    //
    //启用我们将重定向的 UART0、1、3、2、5、7。
    //

    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART0);  //启用 UART0
    //等待 UART0模块准备就绪。
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_UART0))


    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART1);  //启用 UART1
    //等待 UART1模块准备就绪。
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_UART1))


    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART3);  //启用 UART3
    //等待 UART3模块准备就绪。
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_UART3))


    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART2);  //启用 UART2
    //等待 UART2模块准备就绪。
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_UART2))


    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART5);  //启用 UART5
    //等待 UART5模块准备就绪。
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_UART5))


    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART7);  //启用 UART7
    //等待 UART7模块准备就绪。
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_UART7))

    //

    //启用和配置 UART0、1、3、2、5、7 RX 和 TX 引脚

    //

    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);        // PA Enable

    GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0);// U0.Rx[PA0]

    GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_1);// U0.Tx[PA1]   

     

    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC);       // PC Enable

    GPIOPinTypeUART (GPIO_PORTC_BASE、GPIO_PIN_4);// U1.Rx[PC4]

    GPIOPinTypeUART (GPIO_PORTC_BASE、GPIO_PIN_5);// U1.Tx[PC5]   

    GPIOPinTypeUART (GPIO_PORTC_BASE、GPIO_PIN_6);// U3.Rx[PC6]

    GPIOPinTypeUART (GPIO_PORTC_BASE、GPIO_PIN_7);// U3.Tx[PC7]   

     

    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG);       // PG Enable

    GPIOPinTypeUART (GPIO_PORTG_base、GPIO_PIN_4);// U2.Rx[PG4]

    GPIOPinTypeUART (GPIO_PORTG_base、GPIO_PIN_5);// U2.Tx[PG5]

     

    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);       // PE Enable

    GPIOPinTypeUART (GPIO_Porte _BASE、GPIO_PIN_4);// U5.Rx[PE4]

    GPIOPinTypeUART (GPIO_Porte _BASE、GPIO_PIN_5);// U5.Tx[PE5]   

    GPIOPinTypeUART (GPIO_Porte _BASE、GPIO_PIN_0);// U7.Rx[PE0]

    GPIOPinTypeUART (GPIO_Porte _BASE、GPIO_PIN_1);// U7.Tx[PE1]   

     

    //

    //设置默认 UART0配置。

    //

      UARTConfigSetExpClk (UART0_BASE、SysCtlClockGet ()、

                              default_bit_rate、default_uart_config);

      UARTFIFOLevelSet (UART0_BASE、UART_FIFO_TX4_8、UART_FIFO_RX4_8);

     

    // UART1配置。

      UARTConfigSetExpClk (UART1_base、SysCtlClockGet ()、

                              default_bit_rate、default_uart_config);

     UARTFIFOLevelSet (UART1_base、UART_FIFO_TX4_8、UART_FIFO_RX4_8);

     

    // UART3配置。

      UARTConfigSetExpClk (UART3_base、SysCtlClockGet ()、

                              default_bit_rate、default_uart_config);

      UARTFIFOLevelSet (UART3_BASEE、UART_FIFO_TX4_8、UART_FIFO_RX4_8);

     

    // UART2配置。

      UARTConfigSetExpClk (UART2_base、SysCtlClockGet ()、

                              default_bit_rate、default_uart_config);

      UARTFIFOLevelSet (UART2_base、UART_FIFO_TX4_8、UART_FIFO_RX4_8);

     

    // UART5配置。

      UARTConfigSetExpClk (UART5_BASE、SysCtlClockGet ()、

                              default_bit_rate、default_uart_config);

      UARTFIFOLevelSet (UART5_BASE、UART_FIFO_TX4_8、UART_FIFO_RX4_8);

     

    // UART7配置。

      UARTConfigSetExpClk (UART7_BASE、SysCtlClockGet ()、

                              default_bit_rate、default_uart_config);

      UARTFIFOLevelSet (UART7_BASE、UART_FIFO_TX4_8、UART_FIFO_RX4_8);

     

     

    //

    //配置和启用 UART0中断。

    //

      UARTIntClear (UART0_BASE、UARTIntStatus (UART0_BASE、false));

      UARTIntEnable (UART0_BASE、(UART_INT_OE | UART_INT_be | UART_INT_PE |

                        UART_INT_FE | UART_INT_RT | UART_INT_TX | UART_INT_RX);

     

    // UART1中断。

      ROM_UARTIntClear (UART1_base、UARTIntStatus (UART1_base        、false));

      ROM_UARTIntEnable (UART1_base、(UART_INT_OE | UART_INT_be | UART_INT_PE |

                        UART_INT_FE | UART_INT_RT | UART_INT_TX | UART_INT_RX);

     

    // UART3中断。

      UARTIntClear (UART3_base、UARTIntStatus (UART3_base、false));

      UARTIntEnable (UART3_base、(UART_INT_OE | UART_INT_be | UART_INT_PE |

                        UART_INT_FE | UART_INT_RT | UART_INT_TX | UART_INT_RX);

     

    // UART2中断。

      UARTIntClear (UART2_base、UARTIntStatus (UART2_base、false));

      UARTIntEnable (UART2_base、(UART_INT_OE | UART_INT_be | UART_INT_PE |

                        UART_INT_FE | UART_INT_RT | UART_INT_TX | UART_INT_RX);

     

    // UART5中断。

      UARTIntClear (UART5_BASE、UARTIntStatus (UART5_BASE、false));

      UARTIntEnable (UART5_BASE、(UART_INT_OE | UART_INT_be | UART_INT_PE |

                        UART_INT_FE | UART_INT_RT | UART_INT_TX | UART_INT_RX);

     

    // UART7中断。

      UARTIntClear (UART7_BASE、UARTIntStatus (UART7_BASE、false));

      UARTIntEnable (UART7_BASE、(UART_INT_OE | UART_INT_be | UART_INT_PE |

                        UART_INT_FE | UART_INT_RT | UART_INT_TX | UART_INT_RX);

     

    //

    //现在应用程序已准备好启动,就启用中断。

    //

    IntEnable (INT_UART0);        // B1 ACH

    内部使能(INT_UART1);        // B1通道

    内部使能(INT_UART3);        // B2 ACH

    IntEnable (INT_UART2);        // B2通道

    IntEnable (INT_UART5);        // AP ACH

    IntEnable (INT_UART7);        // AP 通道

     

    IntMasterEnable();

      while (1)

       {

        …μ A。

       }

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

    Jame、您好!

    您能否为该项目附加您的 startup_ccs.c 文件? 请附加、不要将其文本发布、因为内容很长、这样线程就不会太长。

    此外、将来还可以尝试与代码的语法编辑器共享您的源代码、您可以通过单击看起来类似于</>的符号来访问这些代码

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

    我们这个小技术团体的(水)眼睛…… 缓慢恢复问候语,

    您的"线程扩展"帖子"伪装或以其他方式使我们看不见"您的"识别出"您如何解决"原始问题吗?"    (如果"解决方案"被有效屏蔽或保持有效屏蔽、(任何)后续读取器是否会受益令人怀疑!)

    此主题很快就会"失控螺旋"、并且会与您(声称) 的"亲吻支持"(始终建议"一个小问题及其"测量/确认"解决方案)发生距离太远!"     这种"焦点"最能使线程正确分类、以便有效地" 在论坛主题搜索期间找到!"

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

    您好 CB1、

    CB1表示>“确定“如何解决”原始问题?”

              (如果"解决方案"被有效屏蔽或保持有效屏蔽、(任何)后续读取器是否会受益令人怀疑!)

         a>正如我在前一张海报中提到的、这是我粗心的观察结果。

            总之、GPIO_INT_PIN_2、3、4、5例程正常进入。

    对此进行了更详细的解释。

    中断处理程序未在脚本文件中注册。 仅在 GPIO IntRegister ()函数中注册。

    并且我没有在 main 函数中设置 IntMasterEnable ()。

    Debugging 1>未输入任何 ISR 1't 断点设置。 (所有例程、GPIO_INT_PIN_2、3、4和5)

    Debugging 2>在不使用 IntMasterEnable ()函数的情况下注册为脚本。

    •  问题,请在 E2E 论坛中创建一个主题。

    调试3>确认输入2n 的断点设置

    •  E2E 论坛答案、主函数中需要 IntMasterEnable ()函数设置。

    再次使用 GPIOIntRegister ()函数进行调试。

                用于稳定 NVIC 控制的 IntMasterEnable ()设置。

    •  E2E 论坛中的问题、

    Q1>为什么 ISR 跳转而不设置 IntMasterEnable ()函数? (请说明。)

    ButtonKeyIntHandler ()

       uint32_t ui32Ints;            //#<-第1个断点集

        ui32Ints = GPIOIntStatus (GPIO_Porta_base、true);  //#<-设置第二个断点

       if (ui32Ints = GPIO_INT_PIN_2)//和3和4,以及5

        {

          IntMasterDisable();

          GPIOIntClear (GPIO_PORta_base、GPIO_PIN_2);//和3和4以及5.

          …

          ……μ A

          IntMasterEnable();

        }

    Q2> UART0 ISR 跳转但不跳转至 UART1、3、4、5、7 ISR。

        每个 UART 端口发送数据时、都需要执行相同的操作。

    此致、

    Jame、Shin

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

    您好 Ralph,

    Ralph Said >您能否为该项目附加您的 startup_ccs.c 文件?

           a>我将使用 Keil 工具将其作为 STARTUP_rvmdk.s 文件附加。

    Ralph 说>……… 您可以通过单击看起来像 </>的符号来访问

           a>是的、我会。

    除 UART0外、较长的测试时间不会跳转到 UART1、3、2、5、7 ISR。

    请解释错误的地方

    此致、

    Jame、Shin

    这是 DK-TM4C123G 固件包的修订版本2.1.4.178的一部分。
    ;
    
    
    ;********
    ;
    堆栈大小(以字节为单位)<0x0-0xFFFFFFFF:8>
    ;
    *********
    堆栈 EQU 0x00000400
    
    ;*********
    ;
    堆大小(以字节为单位)<0x0-0xFFFFFFFF:8>
    ;
    *********
    堆 EQU 0x00000000
    
    ;*********
    ;
    ;为堆栈分配空间。
    ;
    
    区域堆栈、NOINIT、READWRITE、ALIGN=3
    StackMem
    太空堆栈
    __initial;
    
    *********
    ;
    ;为堆分配空间。
    ;
    
    区域堆、NOINIT、READWRITE、align=3
    _heap_base
    HeapMem
    空间堆
    _heap_limit
    
    ;*********
    ;
    指示此文件中的代码保留堆栈的8字节对齐。
    ;
    
    PRESERVE8
    
    
    ;
    ;将代码放入复位代码部分。
    ;
    
    区域复位、代码、只读
    拇指
    
    
    ;
    ;应用程序使用的中断处理程序的外部声明。
    ;
    
    extern SysTickIntHandler
    外部 USBUARTIntHandler
    外部 USBUART1IntHandler
    外部 USBUART3IntHandler
    外部 USBUART2IntHandler
    外部 USBUART5IntHandler
    外部 USBUART7IntHandler 外部
    extern USB0DeviceIntHandler
    ;externButtonKeyIntHandler
    
    ;*********
    ;
    ;向量表。
    ;
    
    导出__Vectors
    __Vectors
    DCD StackMem +堆栈 ;栈顶
    DCD RESET_Handler ;重置处理程序
    DCD NmiSR ; NMI 处理程序
    DCD FaultISR ;硬故障处理程序
    DCD IntDefaultHandler ;MPU 故障处理程序
    DCD IntDefaultHandler ;总线故障处理程序
    DCD IntDefaultHandler ;用法故障处理程序
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD IntDefaultHandler ; SVCall 处理程序
    DCD IntDefaultHandler ;调试监视器处理程序
    DCD 0 ;保留
    DCD IntDefaultHandler ; PendSV 处理程序
    DCD SysTickIntHandler ; SysTick 处理程序
    DCD IntDefaultHandler ;GPIO 端口 A
    DCD IntDefaultHandler ;GPIO 端口 B
    DCD IntDefaultHandler ;GPIO 端口 C
    DCD IntDefaultHandler ;GPIO 端口 D
    DCD IntDefaultHandler ;GPIO 端口 E
    DCD USBUARTIntHandler ;UART0 Rx 和 Tx
    DCD USBUART1内部处理程序 ;UART1 Rx 和 Tx
    DCD IntDefaultHandler ;SSI0 Rx 和 Tx
    DCD IntDefaultHandler ; I2C0主机和从机
    DCD IntDefaultHandler ;PWM 故障
    DCD IntDefaultHandler ; PWM 发生器0
    DCD IntDefaultHandler ;PWM 发生器1
    DCD IntDefaultHandler ;PWM 发生器2
    DCD IntDefaultHandler ;正交编码器0
    DCD IntDefaultHandler ;ADC 序列0
    DCD IntDefaultHandler ;ADC 序列1
    DCD IntDefaultHandler ;ADC 序列2
    DCD IntDefaultHandler ;ADC 序列3.
    DCD IntDefaultHandler ;看门狗定时器
    DCD IntDefaultHandler ; Timer 0子定时器 A
    DCD IntDefaultHandler ; Timer 0子定时器 B
    DCD IntDefaultHandler ; Timer 1子定时器 A
    DCD IntDefaultHandler ; Timer 1子定时器 B
    DCD IntDefaultHandler ; Timer 2子定时器 A
    DCD IntDefaultHandler ; Timer 2子定时器 B
    DCD IntDefaultHandler ;模拟比较器0
    DCD IntDefaultHandler ;模拟比较器1
    DCD IntDefaultHandler ;模拟比较器2.
    DCD IntDefaultHandler ;系统控制(PLL、OSC、BO)
    DCD IntDefaultHandler ; Flash 控制
    DCD IntDefaultHandler ;GPIO 端口 F
    DCD IntDefaultHandler ;GPIO 端口 G
    DCD IntDefaultHandler ;GPIO 端口 H
    DCD USBUART2 IntHandler ;UART2 Rx 和 Tx
    DCD IntDefaultHandler ;SSI1 Rx 和 Tx
    DCD IntDefaultHandler ; Timer 3子计时器 A
    DCD IntDefaultHandler ; Timer 3子定时器 B
    DCD IntDefaultHandler ; I2C1主设备和从设备
    DCD IntDefaultHandler ;正交编码器1
    DCD IntDefaultHandler ;CAN0
    DCD IntDefaultHandler ;CAN1
    DCD 0 ;保留
    DCD 0 ;保留
    DCD IntDefaultHandler ;休眠
    DCD USB0DeviceIntHandler ;USB0
    DCD IntDefaultHandler ;PWM 发生器3.
    DCD IntDefaultHandler ;UDMA 软件传输
    DCD IntDefaultHandler ; UDMA 错误
    DCD IntDefaultHandler ;ADC1序列0
    DCD IntDefaultHandler ;ADC1序列1
    DCD IntDefaultHandler ;ADC1序列2.
    DCD IntDefaultHandler ;ADC1序列3.
    DCD 0 ;保留
    DCD 0 ;保留
    DCD IntDefaultHandler ;GPIO 端口 J
    DCD IntDefaultHandler ;GPIO 端口 K
    DCD IntDefaultHandler ;GPIO 端口 L
    DCD IntDefaultHandler ;SSI2 Rx 和 Tx
    DCD IntDefaultHandler ;SSI3 Rx 和 Tx
    DCD USBUART3内部处理程序 ;UART3 Rx 和 Tx
    DCD IntDefaultHandler ;UART4 Rx 和 Tx
    DCD USBUART5IntHandler ;UART5 Rx 和 Tx
    DCD IntDefaultHandler ;UART6 Rx 和 Tx
    DCD USBUART7IntHandler ;UART7 Rx 和 Tx
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD IntDefaultHandler ; I2C2主设备和从设备
    DCD IntDefaultHandler ; I2C3主设备和从设备
    DCD IntDefaultHandler ;计时器4子计时器 A
    DCD IntDefaultHandler ;定时器4子定时器 B
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD IntDefaultHandler ; Timer 5子计时器 A
    DCD IntDefaultHandler ; Timer 5子定时器 B
    DCD IntDefaultHandler ;宽定时器0子定时器 A
    DCD IntDefaultHandler ;宽定时器0子定时器 B
    DCD IntDefaultHandler ;宽定时器1子定时器 A
    DCD IntDefaultHandler ;宽定时器1子定时器 B
    DCD IntDefaultHandler ;宽定时器2子定时器 A
    DCD IntDefaultHandler ;宽定时器2子定时器 B
    DCD IntDefaultHandler ;宽定时器3子定时器 A
    DCD IntDefaultHandler ;宽定时器3子定时器 B
    DCD IntDefaultHandler ;宽定时器4子定时器 A
    DCD IntDefaultHandler ;宽定时器4子定时器 B
    DCD IntDefaultHandler ;宽定时器5子定时器 A
    DCD IntDefaultHandler ;宽定时器5子定时器 B
    DCD IntDefaultHandler ;FPU
    DCD 0 ;保留
    DCD 0 ;保留
    DCD IntDefaultHandler ; I2C4主设备和从属设备
    DCD IntDefaultHandler ; I2C5主设备和从设备
    DCD IntDefaultHandler ;GPIO 端口 M
    DCD IntDefaultHandler ;GPIO 端口 N
    DCD IntDefaultHandler ;正交编码器2.
    DCD 0 ;保留
    DCD 0 ;保留
    DCD IntDefaultHandler ;GPIO 端口 P (摘要或 P0)
    DCD IntDefaultHandler ;GPIO 端口 P1
    DCD IntDefaultHandler ;GPIO 端口 P2
    DCD IntDefaultHandler ;GPIO 端口 P3
    DCD IntDefaultHandler ;GPIO 端口 P4
    DCD IntDefaultHandler ;GPIO 端口 P5
    DCD IntDefaultHandler ;GPIO 端口 P6
    DCD IntDefaultHandler ;GPIO 端口 P7
    DCD IntDefaultHandler ;GPIO 端口 Q (摘要或 Q0)
    DCD IntDefaultHandler ;GPIO 端口 Q1
    DCD IntDefaultHandler ;GPIO 端口 Q2
    DCD IntDefaultHandler ;GPIO 端口 Q3
    DCD IntDefaultHandler ;GPIO 端口 Q4
    DCD IntDefaultHandler ;GPIO 端口 Q5
    DCD IntDefaultHandler ;GPIO 端口 Q6
    DCD IntDefaultHandler ;GPIO 端口 Q7
    DCD IntDefaultHandler ;GPIO 端口 R
    DCD IntDefaultHandler ;GPIO 端口 S
    DCD IntDefaultHandler ;PWM 1发生器0
    DCD IntDefaultHandler ;PWM 1发生器1
    DCD IntDefaultHandler ;PWM 1发生器2
    DCD IntDefaultHandler ;PWM 1发生器3
    DCD IntDefaultHandler ;PWM 1故障
    
    ;*********
    ;
    ;这是处理器首次开始执行
    时调用的代码;在复位事件之后。
    ;
    
    导出 Reset_Handler
    Reset_Handler
    ;
    ;启用浮点单元。 必须在此处执行此操作才能处理
    ; main()使用浮点且函数 prologueue 保存的情况
    ;浮点寄存器(如果浮点不是浮点则会出现故障)
    ;已启用)。 使用的浮点单元的任何配置
    ; DriverLib API 必须在浮点单元之前在此处完成
    ;正在启用。
    ;
    ;请注意,这不使用 DriverLib,因为它可能不包含在内
    ;在该项目中。
    ;
    MOVW R0、#0xED88
    MOVT R0、#0xE000
    LDR R1、[R0]
    OR R1、#0x00F00000
    结构 R1、[R0]
    
    ;
    ;调用 C 库处理启动的足够点。 这将复制
    ;.data 段初始化闪存至 SRAM,并填充零
    ;.bss 段。
    ;
    导入_main
    B _main
    
    ;*********
    ;
    ;这是当处理器接收到 NMI 时被调用的代码。 这样
    ;只需通过
    调试器进入无限循环,保持系统状态以供检查。
    ;
    
    NmiSR
    B NmiSR
    
    
    ;
    ;这是处理器收到故障
    ;中断时调用的代码。 这只是进入一个无限循环,保留系统状态
    ;供调试器检查。
    ;
    
    FaultISR
    B FaultISR
    
    ;*********
    ;
    ;这是当处理器收到意外
    的;中断时被调用的代码。 这只是进入一个无限循环,保留系统状态
    ;供调试器检查。
    ;
    
    IntDefaultHandler
    B IntDefaultHandler
    
    ;*********
    ;
    ;确保此段的末尾对齐。
    ;
    
    align
    
    
    ;
    ;正常代码部分中用于初始化堆和堆栈的一些代码。
    ;
    
    区域|.text|,代码,只读
    
    ;*********
    ;
    ; C 库启动代码用于定义栈的预期函数
    ;和堆内存位置。 对于启动代码的 C 库版本
    ;提供此函数,以便 C 库初始化代码可以找到
    ;堆栈和堆的位置。
    ;
    
    如果:DEF:__MICROLIB
    导出_initial sp
    导出_heap_base
    导出_heap_limit
    其他
    导入__use_two_region_memory
    导出__user_initial_stackheap
    __user_initial_stackheap
    LDR R0 = HeapMem
    LDR R1、=(StackMem +堆栈)
    LDR R2、=(HeapMem +堆)
    LDR R3、=StackMem
    BX LR
    endif
    
    ;*********
    ;
    ;确保此段的末尾对齐。
    ;
    
    align
    
    
    ;
    ;告诉汇编器我们已完成。
    ;
    
    结束
    

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

    [引用 USER="CB1_MOBILE"]

    尊敬的- MCU 用户随后必须"质疑 MCU 手册中提供的值"-其中指出:

    "中断处理程序的运行时配置要求将中断处理程序表放置在 SRAM 中的1KB 边界上(通常位于 SRAM 的开头)。 否则会导致为响应中断而获取不正确的矢量地址。   矢量表位于名为“VTABLE”的段中,必须使用链接器脚本适当地放置。   我们的海报(或多个其他海报)是否准备了这样的"链接器脚本?"  

    在 TivaWare_C_Series-2.1.4.178/driverlib/interrupt.c 源文件 中、RAM 中的 g_pfnRAMVectors 矢量表标有编译器特定属性/ pragma、以指定链接器放置的数组具有1024字节对齐方式、即在1KB 地址边界上:

    //
    //
    //处理器矢量表。
    //
    //此列表包含
    //系统中各种中断源的处理程序列表。 该列表的布局由硬件定义;
    中断的置位//会使处理器直接在
    该列表中相应位置的//地址开始执行。
    ////
    *****************
    //
    ////将向量表的大小设置为
    //任意器件的最大中断数
    //
    #undef NUM_INTERRUPTS
    #define NUM_INTERRUPTS 155
    #if defined (ewarm)
    #pragma DATA_alignment=1024
    static __no_init void (* g_pfnRAMV133[NUM_INTERRUS])@"VTABLE ";
    #Elif defined (MVcertygxx)
    static __attribute__(* g.f240.regions-head.NUM_interrupts))(
    * nature_nature_pragma (v1024_inc)
    
    
    
    
    
    
    (nature_nature_nature_princ)(nature_nature_nature_printres_)(nature_nature_nature_intres_prag_inations_(nature_prag_nature_ines_prag_ines_ines_inations_)(#prag_prag_inature_ines_siv_prag_prag_prag_prag_prag_prag_inations[nvoid)(nvoid (nature_ines_inations_in
    

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

    感谢您的参与、您的"卓越的软件知识和广泛的软件知识"早已得到认可。

    从逻辑上和从"经理/教师的角度"来看-您是否(回避)了 MCU 手册中的"注意事项指导"-我的员工对此进行了很好的引述?   这可能是一个"更大"的问题-我的员工(适当)进一步识别了这个问题并 提供了详细信息...

    我大学的培训时间长且高声地说、"反对"关键功能调用、其他"帮助机制"以及(甚至)此类重要属性/ pragma 的(有效)烧毁!"   这种"帮助"是不能接受的,因为它鼓励"盲目依赖"这种"救援机制"--它不是吗?   (您是否相信(甚至一秒钟)这里的海报(以及其他人) "认可/了解"严格的位置 要求?")   (几乎)不能肯定他的拯救(以及许多其他人的拯救)是"计划外和幸运"(仅限于)通过"埋葬地点"方案实现的?

    那么,明显的危险----"哪些职能、程序(类似)将得到这种援助?"   (以及由(部分)"未知标准"接收的"无此类救援?")

    因此、MCU 手册中相当"强"(和重复)的警告 (即置于1KB 边界上)已(有效)呈现为"空!"   这个问题甚至会引起   一个更大的问题-"API"在哪里产生了与 MCU 的"管理机构"的"明显冲突"?   (即 MCU 手册)

    仅软件聚焦可能无法充分证明-这一点是否得到充分证明?    认识到"冰山一角"、而不是(水线以下)"大容量损害潜能"、这证明存在问题、需要(动机)和其他重新思考...

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

    您好 CB1、Ghester、Ralph、

    感谢您讨论专家对 中断跳跃问题的看法和见解。

    UART0跳转到 ISR 并接收数据。 但 UART1、3、2、5、7无法跳转到 ISR。

    Q1>为什么我检查了每个 Rx 引脚上的数据输入、但无法跳转到 ISR?

    Q2>如何设置正确的源代码应跳转到 ISR?

    请解释错误的地方

    (其他问题)

    在 Keil uVision 工具 的“目标选项”窗口中有一个“预处理器符号”输入。

    我按以下方式指定了它。

    定义:rvmdk part_TM4C123FH6PM target_is_TM4C123_RB1 UART_buffered

    Q3>"TARGET_IS_TM4C123_RB1 UART_buffed"是什么意思?

    此致、

    Jame、Shin

    //
    
    // UART0、ISR 外部函数声明
    
    //
    
    USBUARTIntHandler (void)
    
    {
    
    uint32_t ui32Ints;
    
    int32_t i32Errors;
    
    ui32Ints = UARTIntStatus (UART0_BASE、TRUE);
    
    UARTIntClear (UART0_BASE、 ui32Ints);//调试,同一点的断点检查跳转确定!
    
    …
    
    。}
    
    
    
    // UART1、ISR
    
    USBUART1 IntHandler (void)
    
    {
    
    uint32_t ui32Ints;
    
    int32_t i32Errors;
    
    ui32Ints = UARTIntStatus (UART1_base、true);
    
    UARTIntClear (UART1_base、 ui32Ints);//在同一个点处断点检查,无跳转!
    
    …
    
    。}
    
    
    
    // UART3、ISR
    
    USBUART3IntHandler (void)
    
    {
    
    uint32_t ui32Ints;
    
    int32_t i32Errors;
    
    ui32Ints = UARTIntStatus (UART3_base、true);
    
    UARTIntClear (UART3_base、 ui32Ints);//在同一个点处断点检查,无跳转!
    
    …
    
    。}
    
    
    
    // UART2、ISR
    
    USBUART2IntHandler (void)
    
    {
    
    uint32_t ui32Ints;
    
    int32_t i32Errors;
    
    ui32Ints = UARTIntStatus (UART2_base、true);
    
    UARTIntClear (UART2_base、 ui32Ints);//在同一个点处断点检查,无跳转!
    
    …
    
    。}
    
    
    
    // UART5、ISR
    
    USBUART5IntHandler (void)
    
    {
    
    uint32_t ui32Ints;
    
    int32_t i32Errors;
    
    ui32Ints = UARTIntStatus (UART5_BASE、TRUE);
    
    UARTIntClear (UART5_BASE、 ui32Ints);//在同一个点处断点检查,无跳转!
    
    …
    
    。}
    
    // UART7、ISR
    
    USBUART7IntHandler (void)
    
    {
    
    uint32_t ui32Ints;
    
    int32_t i32Errors;
    
    ui32Ints = UARTIntStatus (UART7_BASE、TRUE);
    
    UARTIntClear (UART7_BASE、 ui32Ints);//在同一个点处断点检查,无跳转!
    
    …
    
    。}
    
    
    
    main()
    
    {
    
    ......
    
    //
    //启用我们将重定向的 UART0、1、3、2、5、7。
    //
    
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART0);//启用 UART0
    //等待 UART0模块准备就绪。
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_UART0)
    ){
    }
    
    
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART1);//启用 UART1
    //等待 UART1模块准备就绪。
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_UART1)
    ){
    }
    
    
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART3);//启用 UART3
    //等待 UART3模块准备就绪。
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_UART3)
    ){
    }
    
    
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART2);//启用 UART2
    //等待 UART2模块准备就绪。
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_UART2)
    ){
    }
    
    
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART5);//启用 UART5//
    等待 UART5模块准备就绪。
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_UART5)
    ){
    }
    
    
    ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART7);//启用 UART7
    //等待 UART7模块准备就绪。
    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_UART7)
    ){
    }
    
    
    
    //
    
    //启用和配置 UART0、1、3、2、5、7 RX 和 TX 引脚
    
    //
    
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);// PA Enable
    
    GPIOPintl UART (GPIO_Porta_Base、GPIO0[GPIO_PIN_PIN_0]/ USPIC.0[GPIO0]_PIN_PIN_PIN_PIN_PIN_0]]
    
    
    
    
    
    // PC 启用
    
    GPIOPinTypeUART (GPIO_PORTC_BASE、GPIO_PIN_4);// U1.Rx[PC4]
    
    GPIOPinTypeUART (GPIO_PORTC_BASE、GPIO_PIN_5);// U1.Tx[PC5]
    
    GPIOPinTypeUART (GPIO_PORTC_BASE、 GPIO_PIN_6);// U3.Rx[PC6]
    
    GPIOPinTypeUART (GPIO_PORTC_BASE、GPIO_PIN_7);// U3.Tx[PC7]
    
    
    
    SysCtlEnable (SYSCTL_Periph_GPIOG);// PG Enable
    
    GPIOCtlUART (GPIO_PORTG_4)
    
    
    
    
    
    、GPIO5_BASE (GPIOUT_4);GPIO4_PIN_GPIO_PET.R2[GPIO_PERUT_4) // PE 启用
    
    GPIOPinTypeUART (GPIO_Porte _BASE、GPIO_PIN_4);// U5.Rx[PE4]
    
    GPIOPinTypeUART (GPIO_Porte _BASE、GPIO_PIN_5);// U5.Tx[PE5]
    
    GPIOPinTypeUART (GPIO_Porte _BASE、 GPIO_PIN_0);// U7.Rx[PE0]
    
    GPIOPinTypeUART (GPIO_Porte _BASE、GPIO_PIN_1);// U7.Tx[PE1]
    
    
    
    //
    
    设置默认 UART0配置。
    
    //
    
    UARTConfigSetExpClk (UART0_BASE、SysCtlClockGet ()、
    
    DEFAULT_BIT_RATE、DEFAULT_UART_CONFIG);
    
    UARTFIFOLevelSet (UART0_BASE、UART_FIFO_TX4_8、UART_FIFO_RX4_8);
    
    
    
    // UART1配置。
    
    UARTConfigSetExpClk (UART1_base、SysCtlClockGet ()、
    
    DEFAULT_BIT_RATE、DEFAULT_UART_CONFIG);
    
    UARTFIFOLevelSet (UART1_BASE、UART_FIFO_TX4_8、UART_FIFO_RX4_8);
    
    
    
    // UART3配置。
    
    UARTConfigSetExpClk (UART3_base、SysCtlClockGet ()、
    
    DEFAULT_BIT_RATE、DEFAULT_UART_CONFIG);
    
    UARTFIFOLevelSet (UART3_BASEE、UART_FIFO_TX4_8、UART_FIFO_RX4_8);
    
    
    
    // UART2配置。
    
    UARTConfigSetExpClk (UART2_base、SysCtlClockGet ()、
    
    default_bit_rate、default_UART_config);
    
    UARTFIFOLevelSet (UART2_base、UART_FIFO_TX4_8、UART_FIFO_RX4_8);
    
    
    
    // UART5配置。
    
    UARTConfigSetExpClk (UART5_BASE、SysCtlClockGet ()、
    
    DEFAULT_BIT_RATE、DEFAULT_UART_CONFIG);
    
    UARTFIFOLevelSet (UART5_BASE、UART_FIFO_TX4_8、UART_FIFO_RX4_8);
    
    
    
    // UART7配置。
    
    UARTConfigSetExpClk (UART7_BASE、SysCtlClockGet ()、
    
    DEFAULT_BIT_RATE、DEFAULT_UART_CONFIG);
    
    UARTFIFOLevelSet (UART7_BASE、UART_FIFO_TX4_8、UART_FIFO_RX4_8);
    
    
    
    
    
    //
    
    //配置并启用 UART0中断。
    
    //
    
    UARTIntClear (UART0_BASE、UARTIntStatus (UART0_BASE、false));
    
    UARTIntEnable (UART0_BASE、(UART_INT_OE | UART_INT_be | UART_INT_PE |
    
    UART_INT_FE | UART_INT_RT | UART_INT_TX | UART_INT_RX);
    
    
    
    // UART1中断。
    
    ROM_UARTIntClear (UART1_BASE、UARTIntStatus (UART1_BASE) 、false);
    
    ROM_UARTIntEnable (UART1_base、(UART_INT_OE | UART_INT_be | UART_INT_PE |
    
    UART_INT_FE | UART_INT_RT | UART_INT_TX | UART_INT_RX);
    
    
    
    // UART3中断。
    
    UARTIntClear (UART3_base、UARTIntStatus (UART3_base、false));
    
    UARTIntEnable (UART3_base、(UART_INT_OE | UART_INT_be | UART_INT_PE |)
    
    UART_INT_FE | UART_INT_RT | UART_INT_TX | UART_INT_RX);
    
    
    
    // UART2中断。
    
    UARTIntClear (UART2_base、UARTIntStatus (UART2_base、false));
    
    UARTIntEnable (UART2_base、(UART_INT_OE | UART_INT_be | UART_INT_PE |
    
    UART_INT_FE | UART_INT_RT | UART_INT_TX | UART_INT_RX);
    
    
    
    // UART5中断。
    
    UARTIntClear (UART5_BASE、UARTIntStatus (UART5_BASE、false));
    
    UARTIntEnable (UART5_BASE、(UART_INT_OE | UART_INT_be | UART_INT_PE |)
    
    UART_INT_FE | UART_INT_RT | UART_INT_TX | UART_INT_RX);
    
    
    
    // UART7中断。
    
    UARTIntClear (UART7_BASE、UARTIntStatus (UART7_BASE、FALSE));
    
    UARTIntEnable (UART7_BASE、(UART_INT_OE | UART_INT_BE | UART_INT_PE |)
    
    UART_INT_FE | UART_INT_RT | UART_INT_TX | UART_INT_RX);
    
    
    
    //
    
    //现在应用已准备好启动就启用中断。
    
    //
    
    IntEnable (INT_UART0);
    
    IntEnable (INT_UART1);
    
    IntEnable (INT_UART3);
    
    IntEnable (INT_UART2);
    
    IntEnable (INT_UART5);
    
    IntEnable (INT_UART7);
    
    
    
    IntMasterEnable();
    
    
    
    while (1)
    
    {
    
    
    
    。}
    
    }
    
    

    a>我将  使用 Keil 工具将其作为 STARTUP_rvmdk.s 文件附加。

    这是 DK-TM4C123G 固件包的修订版本2.1.4.178的一部分。
    ;
    
    
    ;********
    ;
    堆栈大小(以字节为单位)<0x0-0xFFFFFFFF:8>
    ;
    *********
    堆栈 EQU 0x00000400
    
    ;*********
    ;
    堆大小(以字节为单位)<0x0-0xFFFFFFFF:8>
    ;
    *********
    堆 EQU 0x00000000
    
    ;*********
    ;
    ;为堆栈分配空间。
    ;
    
    区域堆栈、NOINIT、READWRITE、ALIGN=3
    StackMem
    太空堆栈
    __initial;
    
    *********
    ;
    ;为堆分配空间。
    ;
    
    区域堆、NOINIT、READWRITE、align=3
    _heap_base
    HeapMem
    空间堆
    _heap_limit
    
    ;*********
    ;
    指示此文件中的代码保留堆栈的8字节对齐。
    ;
    
    PRESERVE8
    
    
    ;
    ;将代码放入复位代码部分。
    ;
    
    区域复位、代码、只读
    拇指
    
    
    ;
    ;应用程序使用的中断处理程序的外部声明。
    ;
    
    extern SysTickIntHandler
    外部 USBUARTIntHandler
    外部 USBUART1IntHandler
    外部 USBUART3IntHandler
    外部 USBUART2IntHandler
    外部 USBUART5IntHandler
    外部 USBUART7IntHandler 外部
    extern USB0DeviceIntHandler
    ;externButtonKeyIntHandler
    
    ;*********
    ;
    ;向量表。
    ;
    
    导出__Vectors
    __Vectors
    DCD StackMem +堆栈 ;栈顶
    DCD RESET_Handler ;重置处理程序
    DCD NmiSR ; NMI 处理程序
    DCD FaultISR ;硬故障处理程序
    DCD IntDefaultHandler ;MPU 故障处理程序
    DCD IntDefaultHandler ;总线故障处理程序
    DCD IntDefaultHandler ;用法故障处理程序
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD IntDefaultHandler ; SVCall 处理程序
    DCD IntDefaultHandler ;调试监视器处理程序
    DCD 0 ;保留
    DCD IntDefaultHandler ; PendSV 处理程序
    DCD SysTickIntHandler ; SysTick 处理程序
    DCD IntDefaultHandler ;GPIO 端口 A
    DCD IntDefaultHandler ;GPIO 端口 B
    DCD IntDefaultHandler ;GPIO 端口 C
    DCD IntDefaultHandler ;GPIO 端口 D
    DCD IntDefaultHandler ;GPIO 端口 E
    DCD USBUARTIntHandler ;UART0 Rx 和 Tx
    DCD USBUART1内部处理程序 ;UART1 Rx 和 Tx
    DCD IntDefaultHandler ;SSI0 Rx 和 Tx
    DCD IntDefaultHandler ; I2C0主机和从机
    DCD IntDefaultHandler ;PWM 故障
    DCD IntDefaultHandler ; PWM 发生器0
    DCD IntDefaultHandler ;PWM 发生器1
    DCD IntDefaultHandler ;PWM 发生器2
    DCD IntDefaultHandler ;正交编码器0
    DCD IntDefaultHandler ;ADC 序列0
    DCD IntDefaultHandler ;ADC 序列1
    DCD IntDefaultHandler ;ADC 序列2
    DCD IntDefaultHandler ;ADC 序列3.
    DCD IntDefaultHandler ;看门狗定时器
    DCD IntDefaultHandler ; Timer 0子定时器 A
    DCD IntDefaultHandler ; Timer 0子定时器 B
    DCD IntDefaultHandler ; Timer 1子定时器 A
    DCD IntDefaultHandler ; Timer 1子定时器 B
    DCD IntDefaultHandler ; Timer 2子定时器 A
    DCD IntDefaultHandler ; Timer 2子定时器 B
    DCD IntDefaultHandler ;模拟比较器0
    DCD IntDefaultHandler ;模拟比较器1
    DCD IntDefaultHandler ;模拟比较器2.
    DCD IntDefaultHandler ;系统控制(PLL、OSC、BO)
    DCD IntDefaultHandler ; Flash 控制
    DCD IntDefaultHandler ;GPIO 端口 F
    DCD IntDefaultHandler ;GPIO 端口 G
    DCD IntDefaultHandler ;GPIO 端口 H
    DCD USBUART2 IntHandler ;UART2 Rx 和 Tx
    DCD IntDefaultHandler ;SSI1 Rx 和 Tx
    DCD IntDefaultHandler ; Timer 3子计时器 A
    DCD IntDefaultHandler ; Timer 3子定时器 B
    DCD IntDefaultHandler ; I2C1主设备和从设备
    DCD IntDefaultHandler ;正交编码器1
    DCD IntDefaultHandler ;CAN0
    DCD IntDefaultHandler ;CAN1
    DCD 0 ;保留
    DCD 0 ;保留
    DCD IntDefaultHandler ;休眠
    DCD USB0DeviceIntHandler ;USB0
    DCD IntDefaultHandler ;PWM 发生器3.
    DCD IntDefaultHandler ;UDMA 软件传输
    DCD IntDefaultHandler ; UDMA 错误
    DCD IntDefaultHandler ;ADC1序列0
    DCD IntDefaultHandler ;ADC1序列1
    DCD IntDefaultHandler ;ADC1序列2.
    DCD IntDefaultHandler ;ADC1序列3.
    DCD 0 ;保留
    DCD 0 ;保留
    DCD IntDefaultHandler ;GPIO 端口 J
    DCD IntDefaultHandler ;GPIO 端口 K
    DCD IntDefaultHandler ;GPIO 端口 L
    DCD IntDefaultHandler ;SSI2 Rx 和 Tx
    DCD IntDefaultHandler ;SSI3 Rx 和 Tx
    DCD USBUART3内部处理程序 ;UART3 Rx 和 Tx
    DCD IntDefaultHandler ;UART4 Rx 和 Tx
    DCD USBUART5IntHandler ;UART5 Rx 和 Tx
    DCD IntDefaultHandler ;UART6 Rx 和 Tx
    DCD USBUART7IntHandler ;UART7 Rx 和 Tx
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD IntDefaultHandler ; I2C2主设备和从设备
    DCD IntDefaultHandler ; I2C3主设备和从设备
    DCD IntDefaultHandler ;计时器4子计时器 A
    DCD IntDefaultHandler ;定时器4子定时器 B
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD 0 ;保留
    DCD IntDefaultHandler ; Timer 5子计时器 A
    DCD IntDefaultHandler ; Timer 5子定时器 B
    DCD IntDefaultHandler ;宽定时器0子定时器 A
    DCD IntDefaultHandler ;宽定时器0子定时器 B
    DCD IntDefaultHandler ;宽定时器1子定时器 A
    DCD IntDefaultHandler ;宽定时器1子定时器 B
    DCD IntDefaultHandler ;宽定时器2子定时器 A
    DCD IntDefaultHandler ;宽定时器2子定时器 B
    DCD IntDefaultHandler ;宽定时器3子定时器 A
    DCD IntDefaultHandler ;宽定时器3子定时器 B
    DCD IntDefaultHandler ;宽定时器4子定时器 A
    DCD IntDefaultHandler ;宽定时器4子定时器 B
    DCD IntDefaultHandler ;宽定时器5子定时器 A
    DCD IntDefaultHandler ;宽定时器5子定时器 B
    DCD IntDefaultHandler ;FPU
    DCD 0 ;保留
    DCD 0 ;保留
    DCD IntDefaultHandler ; I2C4主设备和从属设备
    DCD IntDefaultHandler ; I2C5主设备和从设备
    DCD IntDefaultHandler ;GPIO 端口 M
    DCD IntDefaultHandler ;GPIO 端口 N
    DCD IntDefaultHandler ;正交编码器2.
    DCD 0 ;保留
    DCD 0 ;保留
    DCD IntDefaultHandler ;GPIO 端口 P (摘要或 P0)
    DCD IntDefaultHandler ;GPIO 端口 P1
    DCD IntDefaultHandler ;GPIO 端口 P2
    DCD IntDefaultHandler ;GPIO 端口 P3
    DCD IntDefaultHandler ;GPIO 端口 P4
    DCD IntDefaultHandler ;GPIO 端口 P5
    DCD IntDefaultHandler ;GPIO 端口 P6
    DCD IntDefaultHandler ;GPIO 端口 P7
    DCD IntDefaultHandler ;GPIO 端口 Q (摘要或 Q0)
    DCD IntDefaultHandler ;GPIO 端口 Q1
    DCD IntDefaultHandler ;GPIO 端口 Q2
    DCD IntDefaultHandler ;GPIO 端口 Q3
    DCD IntDefaultHandler ;GPIO 端口 Q4
    DCD IntDefaultHandler ;GPIO 端口 Q5
    DCD IntDefaultHandler ;GPIO 端口 Q6
    DCD IntDefaultHandler ;GPIO 端口 Q7
    DCD IntDefaultHandler ;GPIO 端口 R
    DCD IntDefaultHandler ;GPIO 端口 S
    DCD IntDefaultHandler ;PWM 1发生器0
    DCD IntDefaultHandler ;PWM 1发生器1
    DCD IntDefaultHandler ;PWM 1发生器2
    DCD IntDefaultHandler ;PWM 1发生器3
    DCD IntDefaultHandler ;PWM 1故障
    
    ;*********
    ;
    ;这是处理器首次开始执行
    时调用的代码;在复位事件之后。
    ;
    
    导出 Reset_Handler
    Reset_Handler
    ;
    ;启用浮点单元。 必须在此处执行此操作才能处理
    ; main()使用浮点且函数 prologueue 保存的情况
    ;浮点寄存器(如果浮点不是浮点则会出现故障)
    ;已启用)。 使用的浮点单元的任何配置
    ; DriverLib API 必须在浮点单元之前在此处完成
    ;正在启用。
    ;
    ;请注意,这不使用 DriverLib,因为它可能不包含在内
    ;在该项目中。
    ;
    MOVW R0、#0xED88
    MOVT R0、#0xE000
    LDR R1、[R0]
    OR R1、#0x00F00000
    结构 R1、[R0]
    
    ;
    ;调用 C 库处理启动的足够点。 这将复制
    ;.data 段初始化闪存至 SRAM,并填充零
    ;.bss 段。
    ;
    导入_main
    B _main
    
    ;*********
    ;
    ;这是当处理器接收到 NMI 时被调用的代码。 这样
    ;只需通过
    调试器进入无限循环,保持系统状态以供检查。
    ;
    
    NmiSR
    B NmiSR
    
    
    ;
    ;这是处理器收到故障
    ;中断时调用的代码。 这只是进入一个无限循环,保留系统状态
    ;供调试器检查。
    ;
    
    FaultISR
    B FaultISR
    
    ;*********
    ;
    ;这是当处理器收到意外
    的;中断时被调用的代码。 这只是进入一个无限循环,保留系统状态
    ;供调试器检查。
    ;
    
    IntDefaultHandler
    B IntDefaultHandler
    
    ;*********
    ;
    ;确保此段的末尾对齐。
    ;
    
    align
    
    
    ;
    ;正常代码部分中用于初始化堆和堆栈的一些代码。
    ;
    
    区域|.text|,代码,只读
    
    ;*********
    ;
    ; C 库启动代码用于定义栈的预期函数
    ;和堆内存位置。 对于启动代码的 C 库版本
    ;提供此函数,以便 C 库初始化代码可以找到
    ;堆栈和堆的位置。
    ;
    
    如果:DEF:__MICROLIB
    导出_initial sp
    导出_heap_base
    导出_heap_limit
    其他
    导入__use_two_region_memory
    导出__user_initial_stackheap
    __user_initial_stackheap
    LDR R0 = HeapMem
    LDR R1、=(StackMem +堆栈)
    LDR R2、=(HeapMem +堆)
    LDR R3、=StackMem
    BX LR
    endif
    
    ;*********
    ;
    ;确保此段的末尾对齐。
    ;
    
    align
    
    
    ;
    ;告诉汇编器我们已完成。
    ;
    
    结束