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.

[参考译文] MSP432P401R:从 GPIO 按钮 ISR 调用 UART_READ()时不起作用。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/869440/msp432p401r-uart_read-not-working-when-called-from-gpio-button-isr

器件型号:MSP432P401R

大家好、

我已使用以下设置设置 UART

writeDataMode = UART_DATA_TEXT;
readDataMode = UART_DATA_TEXT;
readReturnMode = UART_RETURE_NEWLINE;
readEcho = UART_ECHO_OFF;
波特率= 115200;
readTimeout = 200;
writeTimeout = 400;

当我尝试从 GPIO 按钮 ISR 读取一些 UART 数据时、我会遇到问题。

当没有可供读取的数据时、并且每当来自按钮 ISR 的 UART_READ (uartA2Handle、input、sizeof (input))尝试读取时、它都会返回输入缓冲区的大小、并且每个缓冲区索引都保持'0x0E'。 相反、它应该返回零。

当从任务调用时,它工作正常。

有关详细信息、请参阅以下代码。

*==== gpioButtonFxn0 ===
* Board_GPIO_BUTTON0上 GPIO 中断的回调函数。
*/
void gpioButtonFxn0 (uint_least8_t index)
{
字符输入[100];
int rxlen = 0;

memset (input、0、sizeof (input));

/*清除 GPIO 中断并切换 LED */
GPIO_TOGGLE (Board_GPIO_LED0);

rxlen = uart_read (uartA2Handle、input、sizeof (input));//此处 rxlen 在没有可读数据时仍为100。
while (1);
}

/*
=== mainThread ====
//
void * mainThread (void * arg0)
{
/*调用驱动程序初始化函数*/
GPIO_init();
UART_INIT();

uartA2Params.writeDataMode = UART_DATA_TEXT;
uartA2Params.readDataMode = UART_DATA_TEXT;
uartA2Params.readReturnMode = UART_return_NEWLINE;
uartA2Params.readEcho = UART_ECHO_OFF;
uartA2Params.baudrate = 115200;
uartA2Params.readTimeout = 200;
uartA2Params.writeTimeout = 400;

uartA2Handle = UART_OPEN (Board_UART1、&uartA2Params);
if (uartA2Handle ==空)
{
/* UART_open()失败*/
while (1);
}

/*配置 LED 和按钮引脚*/
GPIO_setConfig (Board_GPIO_LED0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
GPIO_setConfig (Board_GPIO_LED1、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
GPIO_setConfig (Board_GPIO_BUTTON0、GPIO_CFG_IN_pu | GPIO_CFG_IN_INT_INT_FALLING);

/*打开用户 LED */
GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_ON);

/*安装按钮回调*/
GPIO_setCallback (Board_GPIO_BUTTON0、gpioButtonFxn0);

/*启用中断*/
GPIO_enableInt (Board_GPIO_BUTTON0);


睡眠(2);

字符输入[100];
int rxlen = 0;
memset (input、0、sizeof (input));

/*清除 GPIO 中断并切换 LED */
GPIO_TOGGLE (Board_GPIO_LED0);

rxlen = uart_read (uartA2Handle、input、sizeof (input));//此处在没有要读取的数据时、在 uart_read()之后 rxlen 变为零。
while (1);

返回(NULL);
} 

此致、

Keshav Aggrarwal

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

    您好!

    我们将仔细研究它、尽快返回给您。 请多多包涵。

    谢谢、

    PM

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

    您好!

    我想回调中的 while (1)可能是问题所在。

    谢谢、

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

    您好、FI、

    我在回调中添加了 while (1)以进行调试、这样我就可以设置断点并查看缓冲区的内容。

    此致、

    Keshav Aggrarwal

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

    您好 Keshav、

    我尝试重复您的问题、但我没有看到同样的问题。 我的缓冲区返回所有零。

    此致、

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

    您好、FI、

    我刚刚发现 GPIO 外设和 UART 具有相同的中断优先级。 这肯定会导致该问题。

    我将为 UART 提供比 GPIO 输入引脚更高的优先级、并将很快更新。

    BR、

    Keshav Aggrarwal