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.

[参考译文] CC1312R:CC1312中使用 nortos 的 Rx 回调功能

Guru**** 2482105 points


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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1258483/cc1312r-rx-callback-function-in-cc1312-with-nortos

器件型号:CC1312R

您好!

基于 uart2echo 示例。

此示例在 LaunchPad 上运行良好。

我想添加 回调函数。

我按如下所示执行初始化 UART。

UART2_Params_init (&uartParams);
uartParams.readMode = UART2_Mode_callback;
uartParams.readCallback =_Uart0_Uart;Rx_Callback
uartParams.baudrate = 115200;

UART = UART2_OPEN (CONFIG_UART2_0、&uartParams);

并将回调函数定义为


_Uart0_UART2_Handle Rx_Callback handle、void * buf、size_t count、void * userArg、int_fast16_t status)
{
RX_DATA =*(char *) buf;

当我将某些字符放入 Rx 引脚时、 不调用回调。
但是、我在 while (1)循环中调用 UART2_read 函数(仅虚拟调用)、回调函数正在运行。

如果存在 Rx 数据、则不会在不调用 UART2_READ 的情况下自动调用回调函数、例如中断函数?

我不使用 RTOS。

Br
保罗

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

    正确的做法是、除非您首先调用 UART2_READ、否则您不会获得任何回调。

    UART2_Mode_callback 是非阻塞的,    当在硬件中断上下文中发送数据时, UART2_READ()和 UART2_WRITE ()将返回。 当所有数据都已从硬件 FIFO 读取或写入硬件 FIFO 时、UART2驱动程序将调用用户的回调函数、并且该驱动程序已准备好接受另一个读取或写入操作。

    您可以在此处了解 UART 驱动程序的工作原理:

    UART2.h 文件参考(TI.com)

    还可以在此处找到使用回调模式的示例:

    uart2callback (TI.com)

    Siri

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

    您好!

    我不使用任何 RTOS。
    所以我必须在 main while (1)中频繁调用 UART2_read ();循环、除非 RX 数据是否存在。
    这是在非 RTOS 中正确的过程?
    当然、我制作了主循环来避免任何阻塞情况。

    Br
    保罗

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

    在调用 UART 读取后、除非您实际收到某些信息(发生这种情况时、您将获得回调)、否则不必再次调用 UART 读取。

    您可以 将 uart2Callback 示例移植到 nortos、只需重写该示例中的信标使用情况。

    例如、您可以使用  uart2echo (nortos)作为起点、然后将 uart2echo.c 替换为以下文件:

    #include <stdint.h>
    #include <stddef.h>
    
    /* Driver Header files */
    #include <ti/drivers/GPIO.h>
    #include <ti/drivers/UART2.h>
    
    /* Driver configuration */
    #include "ti_drivers_config.h"
    
    #include <ti/drivers/Power.h>
    #include DeviceFamily_constructPath(driverlib/interrupt.h)
    
    volatile bool bytesReceived = false;
    static volatile size_t numBytesRead;
    
    void callbackFxn(UART2_Handle handle, void *buffer, size_t count, void *userArg, int_fast16_t status)
    {
        if (status != UART2_STATUS_SUCCESS)
        {
            while (1) {}
        }
    
        numBytesRead = count;
        bool previousHwiState = IntMasterDisable();
        bytesReceived = true;
        if (!previousHwiState)
        {
            IntMasterEnable();
        }
    }
    
    void *mainThread(void *arg0)
    {
        char input;
        const char echoPrompt[] = "Echoing characters:\r\n";
        UART2_Handle uart;
        UART2_Params uartParams;
        uint32_t status = UART2_STATUS_SUCCESS;
    
        GPIO_init();
    
        GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    
        UART2_Params_init(&uartParams);
        uartParams.readMode     = UART2_Mode_CALLBACK;
        uartParams.readCallback = callbackFxn;
        uartParams.baudRate     = 115200;
    
        uart = UART2_open(CONFIG_UART2_0, &uartParams);
    
        if (uart == NULL)
        {
            while (1) {}
        }
    
        GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);
    
        UART2_write(uart, echoPrompt, sizeof(echoPrompt), NULL);
    
        while (1)
        {
            numBytesRead = 0;
    
            status = UART2_read(uart, &input, 1, NULL);
    
            if (status != UART2_STATUS_SUCCESS)
            {
                while (1) {}
            }
    
            bool previousHwiState = IntMasterDisable();
            while (bytesReceived == false)
            {
               IntMasterEnable();
               Power_idleFunc();
               IntMasterDisable();
            }
    
            bytesReceived = false;
            if (!previousHwiState)
            {
                 IntMasterEnable();
            }
    
            if (numBytesRead > 0)
            {
                status = UART2_write(uart, &input, 1, NULL);
    
                if (status != UART2_STATUS_SUCCESS)
                {
                    while (1) {}
                }
            }
        }
    }

    Siri

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

    上面的示例显示了使用回调的阻止过程。

    此处阻止

    while (bytesReceived == false)
    {
    IntMasterEnable();
    power_idleFunc();
    IntMasterDisable();

    在我的代码中、我调用 UART2_READ ()、除非 while 循环中存在或不存在 Rx 数据。  它运行良好。
    在接收到 Rx 数据时、调用回调;在空闲期间、不调用回调。

    不管怎样、我会按照您的建议方式修改我的代码。

    Br
    保罗

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

    UartCallback 示例旨在说明如何在回调模式(非阻塞)下配置 UART2驱动程序。 此示例只能执行读取 UART2和回写操作、但您在应用程序中等待接收某些内容(等待回调)而决定执行的操作由您决定。 我的重点是、UART2驱动程序在使用 RTOS 与使用非 RTOS 方面没有区别、并且在您从先前对 UART2_READ 的调用获得回调之前、不应再次调用 UART2_READ。

    恐怕我很难确切地理解您在代码中正在做什么、或者您正在面临什么问题。

    以便能够进一步帮助您

    • 详细解释您的应用程序应该如何运行
    • 共享一个可在 LP 上运行的代码示例
    • 解释您的示例的行为方式是否与您所需的方式不同(它是如何失败的)

    Br

    Siri

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

    感谢您的友好解释。
    是的、我会遵循您的建议。

    Br
    保罗

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

    另一个问题。
    我正在测试 uart2callback 示例。

    我修改 syscfg 中的引脚映射
    1.使用硬件:XDS110到 NONE
    2. PinMux:将引脚映射更改为 TX 至 DIO16、将 Rx 更改为 DIO17。

    但是、并不能很好地工作。
    接下来、我将 RX 引脚更改为 DIO15。 工作得很好

    问题是什么?

    Br
    保罗

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

    测试时、您使用哪个硬件以及将 TX 和 RX 引脚连接到什么?

    如果您使用的是 LP、请查看参考设计以了解哪些引脚可供您使用:

    https://www.ti.com/lit/zip/swrr160

    Siri

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

    我正在 launchxl-cc1312R 上进行测试

    DIO17似乎被分配给 TDI

    从 launchxl 原理图中分离出来。

    如果我不使用 TDI 和 TDO、我能解决此问题吗。
    我的硬件设计为针对 UART RX 使用 DIO17

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

    我通过移除 lauchxl 板上的 TDI 带解决了此问题。

    谢谢
    保罗