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.

[参考译文] TM4C129ENCPDT:UART 读取回调模式-即使在不同的任务中、如何触发 ISR?

Guru**** 2463330 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1470971/tm4c129encpdt-uart-read-callback-mode---how-to-get-isr-to-fire-even-when-in-a-different-task

器件型号:TM4C129ENCPDT

工具与软件:

您好!

我已将 UART 4配置为在回调模式中读取。 设置此任务后、我跳转到 TCP 任务。

我希望在软件 FIFO 中捕获传入的 UART 流量、而不管正在执行什么任务。 但是、当我发送 UART 流量(USB 转 UART FTDI 桥接器)时、ISR 不会触发。

在我没有使用 TI RTOS 的情况下可以实现此功能、但现在我使用的是任务、ISR 不会触发。 您能告诉我我哪里出错了吗? 谢谢你。

空 InitRs485BusUartTask
(
Mailbox_Handle rs485MbPtr //<指向邮箱句柄的指针
)


   中频(rs485MbPtr)
   {
       AssignMb (&rs485BusSys.uartSys Vars_Tx.rs485Handle、rs485MbPtr);
   }

   const char echoPrompt[]="\fuart 4 is online!:\r\n";

   InitUartParams (&rs485BusSy.uartParams);//和 rs485BusSys.initStatus);

   volatile bool mailboxPendSuccessess = false;

   rs485BusSys.handle = UART_open (Board_UART4、&rs485BusSys.uartParams);
   if (rs485BusSys.handle == NULL){
       system_abort ("打开 UART 时出错4");
   }
   


   UART_read (rs485BusSys.handle、rs485BusSys.inputString、1);

   Task_Params_(&R 485BusSys.uartSys Vars_Rx.taskParams);
   rs485Bussys.uartSys TASTACKSIZE = Vars_Rx STACKSIZE;
   rs485BusSys.uartSys Vars_Rx.taskParams.stack =&rs485BusSys.uartSys Vars_Rx.task0Stack;
   rs485BusSys.uartSys Vars_Rx.taskParams.instance->name ="rs485SCON" Uart_Rx;
   rs485BusSys.uartSys Vars_Rx。taskParams.priority = UART_RX_task_priority;//1;//TODO 需要考虑此任务的优先级。 目前、此任务处于"正在运行"状态、TCP 处于"就绪"状态
   Task_construction (&R。485BusSys.uartSys Vars_Rx.task0Struct、(Task_Func Ptr) rs485BusU52 Fxn_Rx、&rs485BusSys.uartSys Vars_Rx.taskParams、NULL);
   
   system_printf ("启动 UART Echo 示例\n 系统提供程序设置为"
                 "SYSMIN. 暂停目标以查看"
                 "ROV.\n");
   /* SysMin 只会在您调用 flush 或 exit *时打印到控制台
   system_flush();    
}

//________________________________________________====
/**
@返回
-无效

处理 UART 接收端的任务。 这将在中接收消息
从 RS -485总线到 UART。
*/
void rs485BusU301 Fxn_Rx
(
UArg arg0、 //<TI RTOS 参数0
UArg arg1  ///< TI RTOS 参数1
)



   //const char echoPrompt[]="\fuart 4 is online!:\r\n";

   // InitUartParams (&rs485BusSys.uartParams、&rs485BusSys.initStatus);)



   volatile bool mailboxPendSuccessess = false;
   Volatile Int32_t readRtnVal = 0;
   int32_t fifoSize = 0;
   静态 uint8_t rxBuffer[GENERICE_TEST_FIFO_SIZE];





   /*循环永远回显*/
   while (1)//0 <(fifoSize = GetSizeGenericFifo (&rs485BusSys.rxFifo))
   {
       fifoSize = GetSizeGenericFifo (&rs485Bussys.rxFifo);
       
       if (0 < fifoSize)
       {
           PopGenericFifo (&rs485BusSys.rxFifo、rxBuffer);
           
           //将其发布到 RS485以解析邮箱
           
           //将任务置于睡眠状态
       }

       //readRtnVal = uart_read (rs485Bussys.handle、rs485BusSys.inputString、rs485_buffer_size);
       //否则
       //{
           //Task_sleep (1);
       //}
   }




}

//________________________________________________====
/**
@返回
-无效

回调函数、用于寻址 RS485总线的传入 UART 流量。
*/
静态空 Rs485UartReadCallback
(
UART_Handle handle、   //< RS485 UART handle
void * rxBuf、        //<接收缓冲区
size_t size           ///<缓冲区内接收到的消息的大小
)

   if ((size)&&(rxBuf)&&(handle))
   {
       如果(rs485_buffer_size ==大小)
       {
           PushGenericFifo (&rs485BusSys.rxFifo、rxBuf);
       }
   }
}

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

    你好、Noah、

     您是否在使用中断? 你启用了中断吗?

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

    我的道歉。 我忘记包含 UART Init 函数了。 是的、我已经通过这个 init 调用启用了中断:

    静态 int32_t InitUartParams
    (
    UART_Params* params //<指向 UART 参数的指针

    )

    int32_t returnVal =-1;

    if (params)//&& status)

    returnVal = 1;

    //if (*(status)== UART_init)
    //{
    // returnVal = 2;
    //}
    //否则

    //*(status)= UART_init;

    /*创建一个数据处理关闭的 UART 模块。 */
    UART_Params_init (params);
    Params->writeDataMode = UART_DATA_binary;
    params->readDataMode = UART_DATA_binary;
    Params->readReturnMode = UART_RETURN_FULL;
    params->readEcho = uart_echo_off;
    Params->readMode = UART_MODE_CALLBACK;
    Params->readCallback = Rs485UartReadCallback;
    参数->波特率= RS485_UART_BAUD_RATE;
    }

    }

    返回值;
    }

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

    你好、Noah、

     我想你需要 调用 uart_read()才能调用 Rs485UartReadCallback。 您可以尝试一个更简单的程序、在该程序中 调用 UART_read 来查看是否调用回调。 隔离问题更容易。  

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

    你好、Noah、

     我没有听到你的声音。  我现在将结束该主题。 如果您有任何更新、您可以回写此帖子、并且状态将更改为"已打开"。