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.

[参考译文] TM4C123AE6PM:UART 中断未触发。

Guru**** 2442090 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1547457/tm4c123ae6pm-uart-interrupt-not-firing

器件型号:TM4C123AE6PM


工具/软件:

从先前过流替换 MPU 后、系统节拍中断现在有效。  现在、我尝试让 UART 中断正常工作。  我在 ISR 中设置了一个断点、它从不会出现陷阱。  代码:

Void UartInterrupt ( Void ){

 

   const int Error_Mask = 0x00000F00;

   const int  Data_Mask = 0x000000FF;

 

   INT IntStatus = UARTIntStatus (UART4_BASE、 );   //清除中断。

   UARTIntClear (UART4_BASE、IntStatus);

   while (! (UART4_FR_R 和 UART_FR_RXFE){    //直到 FIFO 为空、接收字符。

      int Data_And_Errors = UART4_DR_R;

      int 错误= Data_And_Errors 和 Error_Mask;

      U8 字符  = Data_And_Errors 和 Data_Mask;

      if(! 错误){UARTCharPut (UART4_BASE、Char);}

}

 

int 主要 ( Void ){

 

   SysCtlClockSet (SysCtl_SYSDIV_2_5 | SysCtl_XTAL_20MHz | SysCtl_USE_PLL);    //应为 80MHz

   SysCtlPeripheralEnable (SYSCTL_PERIPH_GPIOC);

   while (! SysCtlPeripheralReady (SYSCTL_PERIPH_GPIOC)){}

   SysCtlPeripheralEnable (SYSCTL_PERIPH_UART4);               //启用 UART4 调试端口。

   while (! SysCtlPeripheralReady (SYSCTL_PERIPH_UART4)){}

   GPIOPinTypeUART (GPIO_PORTC_BASE、PC_DebugRx_bit | PC_DebugTx_bit);

   GPIOPinConfigure (GPIO_PC4_U4RX);

   GPIOPinConfigure (GPIO_PC5_U4TX);

 

   UARTConfigSetExpClk (UART4_BASE、80000,000,9600、

            ( UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE );

   UARTFIFOEnable (UART4_BASE);

   UARTIntRegister (UART4_BASE、UartInterrupt);           //寄存器中断处理程序。

   UARTIntEnable (UART4_BASE、UART_INT_RX | UART_INT_TX | UART_INT_OE | UART_INT_FE | UART_INT_RT);

   IntEnable (INT_UART4);

 

   while ( ){}

}

谢谢、Doug

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

    尊敬的 Doug:

     您是否将 UART4 连接到 FTDI 芯片、然后再连接到 PC? 或者是否将 UART4 直接连接到 另一个 UART 器件? 在任何情况下、您是否会看到另一端将数据发送到 UART4RX 输入? 在代码中、您只是在循环中等待而不发送任何内容。 这就是为什么我认为您正在等待数据输入的原因。 我在代码中看到的唯一问题是您的时钟配置。  在中缺少 SysCtl_OSC_MAIN  SysCtlClockSet。 相对于您在 UARTConfigSetExpClk 中输入的硬编码 80000000、您的系统时钟将错误。 为什么不首先修复 SysCtlClockSet 并重试。 此外、在示波器上观察 UART4RX、并确保其源具有 9600 波特的有效输入。  

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

    尊敬的 Charles:

    是的、UART4 转到 FTDI UART 转 USB 接口。  是的、我可以看到它发送到 MPU 引脚的字符、我可以将字符输出到 UART4、并在终端仿真器上正确显示、以确保波特率和连接正确。  我向 SysCtlClockSet 添加了 SysCtl_OSC_MAIN、并在 while (true) 下方添加了 IntMasterEnable ()。  我还发送了足够长的字符串输出(通过循环缓冲器)来填充 UART FIFO、只有最初填充 FIFO 的字符才显示、中断也没有触发。

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

    我在* while (true) 之前添加了 IntMasterEnable()。

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

    尊敬的 Doug:

     如果禁用 FIFO 会发生什么情况? 您仍然没有中断?

     您是否还可以显示 UART4 的寄存器转储?

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

    图解加厚。  如果我在 ISR 中没有设置断点、那么它是有效的、如果我在其中有断点、则没有设置断点。  ???  我想这是 CCS 论坛中的一个问题?

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

    好的、我取消选中“Allow software breakpoints“、现在它可以正常工作。

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

    尊敬的 Doug:

     很高兴您自己解决了该问题。 不能将软件断点用于调试存储在闪存上的代码。 只有在 RAM 外运行代码时、才能使用软件断点。 软件断点需要调试器修改指令。 由于闪存不能像 RAM 一样写入、因此软件断点将不起作用。

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

    这很有趣、因为我能够在 SysTick ISR 中得到一个断点。  我认为 CCS 默认为使用硬件断点、直到在使用软件断点之前没有更多可用点。