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.

[参考译文] MSP-EXP432E401Y:不为 UART0 TX 中断提供服务

Guru**** 2618835 points

Other Parts Discussed in Thread: MSP-EXP432E401Y

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/676924/msp-exp432e401y-uart0-tx-interrupt-not-being-serviced

主题中讨论的其他器件:MSP-EXP432E401Y

您好!

       我正在 MSP-EXP432E401Y Launchpad 上开发 UART 驱动程序。 我已经使用 FreeRTOS 对 Uartecho 的示例代码进行了更改。 现在我能够处理接收中断、但传输中断不会被触发。 下面是我正在处理的代码片段。 如果我缺少任何内容、请告诉我。

//
//
// UART 中断处理程序。
//
//
空 UART0_IRQHandler (空)

uint32_t ui32Status = 0;
uint8_t ui8RxData = 0;

//
//获取中断状态。
//
ui32Status = MAP_UARTIntStatus (UART0_BASE、TRUE);

if (((ui32Status & UART_INT_RX || ui32Status & UART_INT_RT)&& MAP_UARTCharsAvail (UART0_BASE))

//
//清除已发出的中断。
//
MAP_UARTIntClear (UART0_BASE、UART_INT_RX);

//读取数据
ui8RxData =(无符号字符) map_UARTCharGetNonBlocking (UART0_BASE);

//此处添加全局数据结构

IF (ui32Status 和 UART_INT_TX)

MAP_UARTIntClear (UART0_BASE、UART_INT_TX);
if (TxBuf.ui16NbCharToSend > 0)

MAP_UARTCharPutNonBlocking (UART0_BASE、TxBuf.ui8DatBuf[TxBuf.ui16NbCharToSend]);
TxBuf.ui16NbCharToSend--;

其他

///MAX485方向引脚 RX 操作被置位
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、0);
MAP_UARTIntDisable (UART0_BASE、UART_INT_TX);


空 UART0_Init (uint32_t ui32baud)

UART_Handle UART;
UART_Params uartParams;

/*调用驱动程序初始化函数*/
UART_INIT();

/*将 LED 引脚配置为收发器- PN1*/
GPIO_setConfig (Board_GPIO_LED0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

/*创建一个数据处理关闭的 UART。 *
UART_PARAMS_INIT (uartParams);
uartParams.writeDataMode = UART_DATA_BINARY;
uartParams.readDataMode = UART_DATA_BINARY;
uartParams.readReturnMode = UART_return_full;
uartParams.readEcho = UART_ECHO_OFF;
uartParams.波特 率= ui32波特;

UART = UART_OPEN (Board_UART0、uartParams);

if (UART == NULL){
/* UART_open()失败*/
while (1);

IntRegister (INT_UART0、UART0_IRQHandler);
MAP_IntEnable (INT_UART0);
MAP_UARTIntEnable (UART0_BASE、UART_INT_RX | UART_INT_RT);

//
//
//向 UART 发送字符串。
//
//
空 UARTSend (const uint8_t * pui8Buffer、uint16_t ui16Count)

uint16_t ui16cnt;

//禁用全局中断
MAP_IntMasterDisable();

///MAX485方向引脚 TX 操作被置位
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、2);

for (ui16Cnt = 0;ui16Cnt < ui16Count;ui16Cnt++)

TxBuf.ui8DatBuf[ui16Cnt]=* pui8Buffer++;

TxBuf.ui16NbCharToSend = ui16Count;

//启用 UART 发送中断
MAP_UARTIntEnable (UART0_BASE、UART_INT_TX);

//启用处理器中断
MAP_IntMasterEnable();

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

    使用 TI 驱动程序时、不得启用驱动程序范围之外的中断。 相反、您必须使用处理程序提供的回调函数
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我认为必须删除 TI 驱动程序。 您能否为我提供不使用 TI 驱动程序的 UART 源文件?

    谢谢你。

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

    如果您在 SDK 中使用 RTOS (FreeRTOS 或 TI-RTOS)、则必须使用 TI 驱动程序。 我们不支持混合 driverlib 和 TI 驱动程序调用、因为它会导致调度程序和中断函数不同步。

    要获得写入中断、需要设置 writeCallback 的 UART 参数。 然后调用 UART_WRITE 以发送数据。 发送数据时、调用回调函数。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    代码的逻辑对我来说毫无意义。

    对于 TX 中断、我通常使用指针、加载 TX 缓冲区并启用 ISR。 在 TX ISR 中、测试是否已达到字符串的末尾。

    如果是、禁用 TX 中断。
    否则、加载下一个字符并使指针提前。

    这在 E 芯片上变得更加复杂、只有在缓冲区足够耗尽时才会设置标志。

    如果需要、我可以发布一段代码。 它的实现方式各不相同、但逻辑是相同的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、明白了。

    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    嗯、我使用了一个专门用于传输的 TX 全局结构。 在 Tx ISR 中、我检查正在传输的帧长度(TxBuf.ui16NbCharToSend)。 发送完最后一个字节后、我还会禁用 TX 中断并进入接收模式。
    请务必在我处于实施阶段时共享您的代码、这样有助于我比较设计。
    谢谢你
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    下面是我要做的: github.com/.../MSP432

    相关文件为 uartnisr.h/.c、n=0..3

    逻辑遵循我先前的布局。 例程 uartn_put()、n=0..3、通过 TX ISR 发送一个以 null 结尾的字符串。

    您可以在其他文件夹中找到适用于其他 MCU 的类似文件/方法、但逻辑是相同的。