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.

[参考译文] RTOS/TM4C1294NCPDT:TM4C1294NCPDT UART 中断创建

Guru**** 2473960 points
Other Parts Discussed in Thread: TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/684566/rtos-tm4c1294ncpdt-tm4c1294ncpdt-uart-interrupt-creation

器件型号:TM4C1294NCPDT

工具/软件:TI-RTOS

您好!

我正在尝试在 TIRTOS 中为 TM4C1294NCPDT 控制器实现 UART 中断、并在尝试注册中断处理程序时卡住。

EK_TM4C1294XL.c 中的 init 函数:

/*
=== EK_TM4C1294XL_initUART ===
/void
EK_TM4C1294XL_initUART (void)
{
/* UART 0 */
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
UARTConfigSetExpClk (UART0_BASE、120000000、9600、
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));

/*初始化 UART 驱动程序*/
#if TI_DRIVERS_UART_DMA
EK_TM4C1294XL_initDMA ();
#endif
UART_INIT();

/*启用 UART FIFO */
UARTFIFOEnable (UART0_BASE);

/*将 RX FIFO 中断设置为最大值、将 TX 中断设置为最小值*/
UARTFIFOLevelSet (UART0_BASE、UART_FIFO_RX7_8、UART_FIFO_TX1_8);

/*绑定中断处理程序函数*/
UARTIntRegister (UART0_BASE、UART0InterruptHandler);

/*启用中断*/
UARTIntEnable (UART0_BASE、UART_INT_RX);

} 

UART0InterruptHandler 函数在其他位置定义:

空 UART0InterruptHandler (空){

uint32_t intStatus = UARTIntStatus (UART0_BASE、false);//false = 0
UARTIntClear (UART0_BASE、UART_INT_RX);
UARTIntDisable (UART0_BASE、UART_INT_RX);
if (intStatus & UART_INT_RX){//Rx 中断
while (UARTCharsAvail (UART0_BASE)){
UART_buffer[UART_buffer_index]= UARTCharGet (UART0_BASE);//逐一提取字符
UART_buffer_index++;
}
}

返回;

} 

问题是、当我尝试使用包含 UARTIntRegister 函数的函数运行代码时、一旦代码加载到控制器中(即使在我点击"run"之前)、控制器就会运行到 loader_exit 函数、并且控制台会显示以下消息:

FSR = 0x0000
HFSR = 0x40000000
DFSR = 0x00000008
MMAR = 0x00016400
BFAR = 0x00016400
AFSR = 0x00000000
正在终止执行...

如果我不包含 UARTIntRegister 函数、那么一切都可以正常工作(很明显、没有中断)。 我出了什么问题? 是否有一个全局中断我在某个位置未启用? 或者、我是否需要对.cfg 文件进行一些更改才能使其正常工作?

谢谢、

svl123

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

    RTOS 负责分配中断。 我对细节很模糊、但我知道您无法在 TI-RTOS 项目中的 TivaWare 函数中注册中断。

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

    以下是 Peter 提到的详细信息: e2e.ti.com/.../2347913 (不同的器件、但概念相同)。

    您只需使用 TI-RTOS 中提供的 UART 驱动程序(例如、查看 TI-RTOS 中的 UART 回显示例)。 它为您执行所有中断管理。 或者、如果代码不完全符合您的需求、您也可以将其用作模板/起点。

    Todd

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

    1.我知道我可以使用该示例、但我不确定示例代码的运行速度-我的理解是、它创建了一个任务、而我希望在 UART 中断触发时运行 HWI 或 SWI、以便我可以快速复制 将 RX FIFO 中的内容发送到我自己的缓冲区。

    uartecho 示例仅对接收的字节做出反应-实际上、在这种情况下、在没有 FIFO 的情况下启用 UART_INT_RX 中断、对吧? 例如、如果我想在接收超时条件上产生中断、那么我还如何实现该中断呢?

    是否可以按照我在原始帖子中所述的方式使用中断? 还是 TIRTOS 不支持使用 UART.c 中的函数?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="svl123"]1. 我知道我可以使用该示例、但我不确定示例代码的运行速度-我的理解是、它会创建一个任务、而我希望在 UART 中断触发时运行 HWI 或 SWI、以便我可以快速复制内容 到我自己的缓冲器中。 [/报价]

    TI-RTOS UART 驱动程序在执行任务时更加自然。 如果你使用回调模式、它可以在 Hwi 或 Swi 上下文中使用。 使用提供的驱动程序只是一个建议。 您可以使用所采用的方法(除了不需要使用 driverlib 来插入中断)。

    [引用 user="svl123"]2. uartecho 示例仅对接收的字节做出反应-实际上、在这种情况下、在没有 FIFO 的情况下启用 UART_INT_RX 中断、对吧? 例如、如果我想在接收超时条件上产生中断、那么我还如何实现该中断呢? [/报价]

    这只是一个示例。 驱动程序可以处理更大的数据块并使用超时。 请参阅驱动程序的 doxygen 文档(在已安装的 TI-RTOS 产品中打开文档概述以查找链接)。

    [引用 user="svl123)]是否可以按照我在原始帖子中所述的方式使用中断? 或者、是否在 TIRTOS 中不支持使用 UART.c 中的函数?[/quot]

    是的、但只需确保你告诉内核有关中断的信息(例如、使用 Hwi_create 或 Hwi_constructure 让内核管理 ISR 或使 ISR 成为零延迟中断)。

    Todd

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

    谢谢 Todd。 要做的是摆脱 initUART 函数中的 IntRegister 调用、而是在 cfg 编辑器中创建 UART0 HWI、并在此处输入回调函数。

    谢谢、

    svl123