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.

[参考译文] EK-TM4C1294XL:UART:使用中断

Guru**** 2465890 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/665468/ek-tm4c1294xl-uart-using-interruptions

器件型号:EK-TM4C1294XL

大家好、朋友、我正在尝试使用 UART 使用 TM4C1294Xl 的中断功能。 换句话说,我想在发送字符后使用 ISR 打开 LED。

#include 
#include 
#include 
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"




;




include "uidt_intrap.h"#include "uidt/inuidt_inuidt.h (void)* void uid/u.u.id/u.u.32 uinteg

/*将时钟设置为以120MHz 运行*/
G_ui32SysClock= SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);

char my_char ='J';


SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_1);
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、0x00);

/*初始化 UART*/的 GPIOC
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC);
/*启用 UART7*/
SysCtlPeripheralEnable (SYSCTL_Periph_UART7);

/*为端口 C*/配置 GPIO 引脚
GPIOPinConfigure (GPIO_PC4_U7RX);
GPIOPinConfigure (GPIO_PC5_U7TX);

/*为 UART 功能设置 GPIOC 引脚*/
GPIOPinTypeUART (GPIO_PORTC_BASE、GPIO_PIN_4 | GPIO_PIN_5);

/*设置 UART7配置*/
UARTConfigSetExpClk (UART7_BASE、g_ui32SysClock、19200、
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);

IntMasterEnable();

UARTIntEnable (UART7_BASE、UART_INT_TX);

UARTIntRegister (UART7_BASE、UART7Isr);

UARTCharPutNonBlocking (UART7_BASE、my_char);

返回0;


}

void UART7Isr (void){
UARTIntClear (UART7_BASE、UART_INT_TX);
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、GPIO_PIN_1);
}

到目前为止、LED 未亮起。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    让您的代码循环。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不幸的是、这没有解决问题
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Jamelly Ferreira"] UARTIntRegister (UART7_BASE、UART7Isr);UARTCharPutNonBlocking (UART7_BASE、my_char);return 0;} [/报价]

    考虑 UARTCharPutNonBlocking 返回时会发生什么情况。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "不幸的是、这并未解决问题"

    无论它多么大的一步、它都不会让您完全到达目的地。 调试是一段漫长而愉快的旅程。 尽情享受吧。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Jamelly、

    首先、建议:不要使用"return 0"、而是在该位置添加 while (1){}。 它允许您在保持调试器状态的同时可视化调试器中的所有寄存器和变量。

    现在、对于 UART TX 中断、这里是从数据表中获取的"规则":

    "发送(当满足 UARTIFLS 寄存器中 TXIFLSEL 位定义的条件时、或者如果 UARTCTL 中的 EOT 位置位、则当所有发送数据的最后一位离开串行器时)"

    您的程序中可能会出现几个问题(如"不打开您的 LED "):
    -在 UART 字符离开 HW FIFO 之前、程序肯定会达到"返回0"、从而阻止中断触发。
    -您的 EOL 位可能未设置、因此当 Tx HW 缓冲器变为空时、不会出现中断

    TX 中断的默认用法是让程序知道" FIFO 缓冲区中有更多可用空间"、而不是通知"已发送最后一个字节"。 假设您将 TX 缓冲区电平配置为1/8 (即16个中适合完整 FIFO 的两个字节)。 中断时刻是指 FIFO 计数器从"3个挂起字节"下降到"2个挂起字节"时-如果你只是在那里放置一个字节、这种情况永远不会发生!

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

    运行操作码太远。 一般工作流程是清除标志、启用中断并加载第一个 char、然后前进到下一个 char。 传输将从此处开始。

    在 ISR 中、您必须检测当前字符是否为 EOL -我通常使用0。 如果没有、加载当前字符、然后前进到下一个字符。

    如果是、请关闭中断。

    您可能希望引入标志、以便您知道是否正在使用模块或传输是否已结束。

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

    您好、Jamelly、

     正如 Bruno 所说的、你只放置一个从不触发 FIFO 中断的字符。 默认情况下、FIFO 发送中断级别< 1/2为空。 您将需要9 -> 8转换来触发中断。 您可以尝试以下三个选项中的一个、以查看您的代码进入 ISR 并设置 LED。

     1.调用 UARTCharPutNonBlocking()至少9次。

     2.通过调用 UARTFIFODisable (UART7_BASE)来禁用 FIFO。

     调用 UARTTxIntModeSet (UART7_BASE、UART_TXINT_MODE_EOT)

    上述任何一项都应起作用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bruno 对 UART TX 中断的描述几乎肯定不正确。 假设 TX 缓冲区级别设置正确、将一个字符写入发送缓冲区将触发 UART TX ISR。

    我之前介绍的工作流程已经在从 LM3S、tm4c 到其他芯片的各种芯片上进行了测试。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Danny 和读者、

    如需将来参考、请注意我在上述 XX:39发布的描述是绝对正确的。 如果您再次阅读、您将注意到、给定的示例甚至提到 TX 级别触发器的设置。

    如果您将在 XX:58发布的消息的文本作为"工作流"、我很遗憾无法将这些句子作为编程操作的逻辑序列读取。 他们似乎建议关闭 ISR 内部的中断、这不是我为任何中断选择的策略... 也许您想用更"结构化的文本"重写您的消息、以便我们也能理解您心目中显而易见的内容...

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

    [引用 user="Danny F">Bruno 对 UART TX 中断的描述几乎肯定不正确。 假设 TX 缓冲区级别设置正确、将一个字符写入发送缓冲区将触发 UART TX ISR。

    不、Bruno 是正确的。 UART 在超过 FIFO 阈值时提供中断。 它不同时支持 FIFO 为空时的中断。

    [引用 USER="TM4C129用户手册"]

    发送结束该位决定 UARTRIS 寄存器中 TXRIS 位的行为。
    值 描述  

    • 0当满足 UARTIFLS 寄存器中指定的发送 FIFO 条件时、TXRIS 位置位。
    • 1 TXRIS 位只有在所有发送的数据(包括停止位)清零串行器后才置位

    [/报价]

    因此、除非您将中断更改为发送器空、而不是超过 FIFO 阈值、否则将一个字符放入 UART FIFO 中不会导致发送中断。 但后者是默认设置。

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    解决这个问题很容易、只需问自己两个问题。

    1.在什么条件下设置 TX 标志?

    2.当你把一个字符放进 FIFO 时,这些条件是否满足?

    数据表提供了答案。

    如果这还不足以说服您、也许您可以编写一段代码来显示器件的实际行为?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Danny F">解决此问题很容易,只需问自己两个问题。

    1.在什么条件下设置 TX 标志?[/QUERT]

    当发送 FIFO 水平超过阈值时

    [引用用户="Danny F">2. 当您将字符放入 FIFO 时、是否满足这些条件?

    [报价用户="Danny F"]数据表中有答案。

    是的。 它与我的答案相匹配、尽管它不太清楚。

    [引用 user="Danny F"]如果这还不足以说服您,您可以编写一段代码来显示设备的实际行为?

    这是一个相当常见的问题、因此我可以向您展示已提交给论坛的其他代码以及 TI 对这是一个问题的确认。 请参见以下主题

    e2e.ti.com/.../321856 发送中断

    Robert

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

    返回到 OP。

    这是在 PIC24上实现的中断驱动 TX 例程。

    它的来源是 I LM3S 工作。

    此处提供了 driverlib 上的 lm4f120实现。

    除了在 lm4f 版本中使用 driverlib 之外、这两个 isra 具有相同的逻辑井号、几乎因为 lm4f 版本设计为发送后零、而 PIC24版本不发送后零。

    相同的逻辑可以在其他芯片上实现、也可以在不同类型的芯片上实现:例如、我有一个用于基于 CMSIS 结构的 lm4f。

    希望这对您有所帮助。