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.

[参考译文] CC3200MOD:CC3200 UART 中断无法正常工作

Guru**** 2782485 points

Other Parts Discussed in Thread: CC3200

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/811984/cc3200mod-cc3200-uart-interrupt-not-working-properly

器件型号:CC3200MOD
Thread 中讨论的其他器件:CC3200

我有一个 CC3200MOD-Launchpad 可供使用。 我正在尝试在中断模式(仅接收中断)下实现 UARTA0。 为了简单起见、我只回显在终端上发送的字符。 但是、中断显示出一种突然的行为、例如、在我逐个发送5个字符并将我发送的第一个字符打印为回显并重复同样的操作之后、中断会发生。 我将随附以下代码:

#define application_version "1.1.1"
#define APP_NAME "UART 回波
"#define 屏幕 UARTA0_BASE
#define UartGetChar() MAP_UARTCharGet (screen)
#define UartPutChar (c) MAP_UARTCharPut (screen、c)
#define MAX_STRING_LENGTH 80

unsigned long intrpt=0;

静态空 SCREEN_IRQ_handler ()
{

unsigned char charc;
inpt=UARTIntStatus (screen、true);
if (inpt&UART_INT_RX))
}{
MAP_UARTIntClear (screen、UART_INT_RX);
charc=map_UARTCharGetNonBlocking (screen);
MAP_UARTCharPutNonBlocking (screen、charc);
}


}void main ()
{

//
//对电路板进行初始化
//
BoardInit();
//
//启用 UART_TX 和 UART_RX 的多路复用。
//
PinMuxConfig();
//
//初始化终端。
//

MAP_UARTDisable (UARTA0_BASE);
MAP_UARTConfigSetExpClk (UARTA0_BASE、MAP_PRCMPeripheralClockGet (SCREEN_PERIPh)、UART_BAUD_RATE (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));
MAP_UARTFlowControlSet (UARTA0_BASE、UART_FlowControl_NONE);
MAP_UARTFIFODisable (UARTA0_BASE);
MAP_UARTIntRegister (screen、screen_IRQ_handler);
MAP_UARTEnable (UARTA0_BASE);
MAP_UARTIntEnable (UARTA0_BASE、UART_INT_RX);

//
//清除终端。
//
ClearTerm();
DisplayBanner (app_name);
消息("\t\t******** \n\n");
消息("\t\t\t CC3200 UART 回波用法 \n\n");
消息("\t\t\t 键入字母数字字符串和\n");
message("\t\t pressenter,字符串将被回传。 \n\n");
Message ("\t\t\t 注意:如果字符串长度达到80个字符、它将\n");
消息("\t\t\t 回显字符串而不等待输入命令\n");
信息("\t\t" \n\n");
消息("\n\n\r\n");
消息("cmd#");
while (1)
{
}
} 

看看、让我知道问题在哪里。

谢谢、

Shivam

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

    您好、Shivam、

    您可以使用此代码  

    // Driverlib 包括
    #include "rom.h"
    #include "rom_map.h"
    #include "hw_memmap.h"
    #include "hw_common_reg.h"
    #include "hw_types.h"
    #include "hw_ints.h"
    #include "UART.h"
    #include "interrupt.h"
    #include "pinmux.h"
    #include "utils.h"
    #include "prcm.h"
    #include
    //通用接口包括
    #include "UART_IF.h"

    //
    //宏
    //
    #define application_version "1.1.1"
    #define APP_NAME "UART 回波"
    #define console UARTA0_BASE
    #define UartGetChar() MAP_UARTCharGet (控制台)
    #define UartPutChar (c) map_UARTCharPut (console、c)
    #define SECONDUART UARTA1_BASE
    #define Uart1GetChar () map_UARTCharGet (SECONDUART)
    #define Uart1PutChar (c) MAP_UARTCharPut (SECONDUART、c)
    #define MAX_STRING_LENGTH 80

    //
    //全局变量--启动
    //
    volatile int g_iCounter = 0;

    #if defined (CCS)(如果已定义)
    extern void (* const g_pfnVectors [])(void);
    #endif
    #IF 定义(ewarm)
    extern uVectorEntry __vector_table;
    #endif
    char Cstring[MAX_STRING_LENGTH+1];
    char cString1[MAX_STRING_LENGTH+1];
    char cString2[MAX_STRING_LENGTH+1];
    字符字符字符字符字符字符;
    int iStringLength = 0;
    unsigned char uartRxBuff[128];
    unsigned int uartRxLength = 0;

    静态空
    DisplayBanner (char * AppName)

    报告("\n\n\r\n");
    报告("\t \n\n");
    报告("\t\tCC3200 %s 应用程序\n"AppName");
    报告("\t \n\n");
    报告("\n\n\r\n");

    //
    //
    //! 电路板初始化和配置
    //!
    //! \param 无
    //!
    //! \无返回
    //
    //
    静态空
    BoardInit(空)

    /*如果 TI-RTOS 矢量表由操作系统本身初始化*/
    #ifndef use_TIRTOS
    //
    //设置矢量表基址
    //
    #if defined (CCS)(如果已定义)
    MAP_IntVTableBaseSet ((无符号长整型)&g_pfnVectors[0]);
    #endif
    #IF 定义(ewarm)
    MAP_IntVTableBaseSet ((unsigned long)&__vector_table);
    #endif
    #endif
    //
    //启用处理器
    //
    MAP_IntMasterEnable();
    MAP_IntEnable (FAULT_SysTick);

    PRCMCC3200MCUInit();

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //现在我要从这里进行更改

    空 Uart1IntHandler (空)

    unsigned long intStatus = MAP_UARTIntStatus (UARTA0_BASE、TRUE);
    if (((intStatus & UART_INT_RX)&& MAP_UARTCharsAvail (UARTA0_BASE))

    uartRxLength ++;
    uartRxBuff[uartRxLength ]=(unsigned char) map_UARTCharGetNonBlocking (UARTA0_BASE);
    MAP_UARTCharPut (UARTA0_BASE、uartRxBuff[uartRxLength ]);

    否则 if (intStatus & UART_INT_RT)

    uartRxBuff[0]= uartRxLength;
    uartRxLength = 0;

    MAP_UARTIntClear (UARTA0_BASE、intStatus);

    //
    //!
    //! 处理 UART 回波的主函数。 它从中获取输入字符串
    //! 显示字符串的每个字符时的终端。 只要输入命令
    //! 它将回显字符串(display)。 如果输入为最大输入
    //! 可以是80个字符、之后字符将被视为部分字符
    //! 下一个字符串。
    //!
    //! \param 无
    //!
    //! \无返回
    //!
    //
    void main()

    char Cstring[MAX_STRING_LENGTH+1];
    字符字符字符字符字符字符;
    int iStringLength = 0;
    //
    //对电路板进行初始化
    //
    BoardInit();
    //
    //启用 UART_TX 和 UART_RX 的多路复用。
    //
    PinMuxConfig();
    //
    //初始化终端。
    //
    InitTerm();
    MAP_UARTFlowControlSet (UARTA0_BASE、UART_FlowControl_NONE);
    MAP_UARTFIFODisable (UARTA0_BASE);
    MAP_UARTIntRegister (UARTA0_BASE、UART1IntHandler);
    //MAP_UARTIntEnable (UARTA0_BASE、UART_INT_RX);
    MAP_UARTIntEnable (UARTA0_BASE、UART_INT_RX|UART_INT_RT);//
    //初始化第二个 UART 接口
    MAP_UARTConfigSetExpClk (SECONDUART、MAP_PRCMPeripheralClockGet (console_Periph)、
    UART_BAUD_RATE、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
    UART_CONFIG_PAR_NONE);*
    //
    //清除终端。
    //
    ClearTerm();
    DisplayBanner (app_name);
    消息("\t\t******** \n\n");
    消息("\t\t\t CC3200 UART 回显用法\n");
    消息("\t\t\t 键入字母数字字符串和\n");
    message("\t\t pressenter,字符串将被回传。 \n\n");
    Message ("\t\t\t 注意:如果字符串长度达到80个字符、它将\n");
    消息("\t\t\t 回显字符串而不等待输入命令\n");
    信息("\t\t" \n\n");
    消息("\n\n\r\n");

    while (1)

    /*Report ("输入字符串:\r\n");
    uart0_Rx();
    报告("\n\r Entered String 为:%s\n\r"、Cstring);
    报告("\n\n"为 Uart1输入字符串:\r\n");
    uart1_Rx();
    报告("\n\r Entered String 为:%s\n\r"、cString1);
    报告("\n\r 检查其他终端:\r\n");
    if (strcmp (Cstring、"hi")=0)
    报告("\n\r\n\r\n 您好\n\r\n);*/

    如需任何帮助、请转到我的个人资料、您可以向我发送朋友请求、如果出现任何问题、我们可以直接与您联系

    谢谢、此致  

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

    谢谢 Manish。

    Jesu

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

    Manish、您好!

    感谢您提供代码。 该代码运行良好。 但我不明白我的代码为什么不起作用。 我的代码和此代码中唯一不同的是 IF  (intStatus & UART_INT_RX)&& MAP_UARTCharsAvail (UARTA0_BASE)中的条件。 之前 我没有使用 MAP_UARTCharsAvail()函数。 您能稍微解释一下处理程序代码吗?

    谢谢、

    Shivam

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

    你(们)好,Shivam

    MAP_UARTCharsAvail ()函数将继续通过中断检查 UART 中是否存在任何字符。所有函数均在 CC3200的用户指南中进行了说明。 如果您需要任何澄清、请随时咨询。

    谢谢、此致

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

    Manish、您好!

    我们在检查  if  (intStatus & UART_INT_RX)时是否也会执行相同的操作? 如果发生中断、条件将为真、只有当我们将数据发送到 UART 时才会发生中断。 我们还禁用了 FIFO。 因此、为什么需要检查字符的可用性。

    谢谢、

    Shivam

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

    你(们)好,Shivam

    intStatus 这是一个标志、不是吗? 在调试器中检查是否设置了此标志、我认为它为零、这就是您无法实现的原因。

    谢谢、此致

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

    Shivam、

    您可以通过在调试会话中添加观察表达式来检查变量。

    https://www.youtube.com/watch?v=JlHLqzsb3D4

    Jesu