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.

[参考译文] TM4C123GH6PM:如何在 UART 中写入/打印数据

Guru**** 2763595 points

Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/995560/tm4c123gh6pm-how-to-write-print-the-data-in-uart

器件型号:TM4C123GH6PM
Thread 中讨论的其他器件:SYSBIOS

各位专家:

目前、我正在尝试将中断计数写入 UART 并根据 UART 输入打印数据、因此我以 UART 回显和 GPIO 中断示例为例进行此操作、但我无法打印中断计数。我已经尝试了很多方法、但无法实现 因此请建议实现输出的最佳方法  

我已共享我的代码供您参考  

我希望在按下按钮时打印中断计数  

*/======= uartecho.c ====
*

/* XDCtools 头文件*/
#include
#include

/* BIOS 头文件*/
#include
#include

/* TI-RTOS 头文件*/
#include
#include

/*示例/板头文件*/
#include "Board.h"
#include "UARTUtils.h"

#include

#define TASKSTACKSIZE 768

Task_Structtask0Struct;
char task0stack[TASKSTACKSIZE];

INT 计数= 0;

void gpioButtonFxn0 (无符号 int 索引)

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

如果(count++=100){
计数= 0;

void gpioButtonFxn1 (无符号 int 索引)

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

如果(count++=100){
计数= 0;

void echoFxn (UArg0、UArgarg1)

字符输入;
UART_Handle UART;
UART_Params uartParams;
const char echoPrompt[]="\fEchoing Characters:\r\n";

/*创建一个数据处理关闭的 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.baudrate = 9600;
UART = UART_OPEN (Board_UART0、uartParams);

if (UART == NULL){
System_abort ("打开 UART 时出错");

UART_WRITE (UART、echoPrompt、sizeof (echoPrompt));

/*循环永久回显*/
while (1){
UART_READ (UART、INPUT、1);
UART_WRITE (UART、INPUT、1);

/*
*==== main ====
*
int main (空)

/*呼叫板初始化函数*/
Board_initGeneral();
Board_initGPIO();
Board_initUART();

/*构造 BIOS 对象*/
Task_Params taskParams;

Task_Params_init (&taskParams);
taskParams.STACKSIZE = TASKSTACKSIZE;
taskParams.stack =_task0Stack;
taskParams.instance->name ="回波";
Task_construct(&task0Struct,(Task_FuncPtr) echoFxn、&taskParams、NULL);

/*打开用户 LED */
GPIO_WRITE (Board_LED0、Board_LED_ON);

// UARTUtils_systemInit (0);

/*此示例启用了日志记录和许多其他调试功能*/
system_printf ("此示例不会尝试将代码或数据最小化"
"封装\n");
system_flush();

System_printf ("启动 UART 回显示例\n 系统提供程序设置为"
"SysMin。 停止目标以查看"
"ROV.\n");
/* SysMin 仅在您调用 flush 或 exit 时才会打印到控制台*/
system_flush();

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

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

/*
*如果您的器件有多个输入引脚可用、则会中断
将在 Board_Button1上启用*。
*
if (Board_BUTTON0!= Board_Button1){
/*安装按钮回调*/
GPIO_setCallback (Board_Button1、gpioButtonFxn1);
GPIO_enableInt (Board_Button1);

/*启动 BIOS */
BIOS_start();

返回(0);

此致  

Surya

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

    您没有真正描述您尝试的内容、但我知道您会遇到困难。 问题是您尝试将一个外设(UART)与两个异步任务(UART 接收和按钮)配合使用。 TI-RTOS UART 驱动程序会尝试阻止您执行此操作。 您可以想象、在按下按钮的同时按下某个键是可能的。 打印的计数可能会被回显字符损坏。  

    下面是一个建议的解决方案。 我将所有 UART 函数放入一个任务中。 如果按下按钮、则在按钮的回调例程中设置一个易失性静态标志。  UART 任务(printFxn)轮询待设置的标志。 如果置位、它将打印计数。 然后它会检查接收到的字符。 如果接收到一个、则将进行打印。   复杂的情况是、如果使用阻止模式读取字符、任务将停止执行、并且无法检查按钮标志。 因此 UART_READ()函数被配置为使用回调例程。 (回调例程不执行任何操作、因为字符缓冲区本身会轮询以查看新字符是否已到达。)

    我将示例项目导出到.zip 文件中、并将其附加以供您查看。

    e2e.ti.com/.../customer_5F00_EK_5F00_TM4C123GXL_5F00_TI.zip

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

    您好 

    感谢您提供的示例、很抱歉描述不完整、我正在尝试创建一个通用串行函数、例如、 UART 回调函数在串行数据可用时同时读取数据、我将读取数据传递为参数以检查 接收到的请求 、然后我只调用 函数 需要执行哪些操作

    我在您分享的示例中遇到了一些计数和数据损失、下面显示的串行日志供您参考  

    计数= 14

    计数= 15
    UART 数据丢失测试
    DTA OSS TST
    UART 数据丢失测试
    UARTDATA OSSTES
    UART 数据丢失测试
    ATDATA LOSSTES
    UART 数据丢失测试
    ARTDATA LOS TST

    计数= 16

    计数= 17

    我无法理解在共享示例中使用 UART 读写回调的目的、请告诉我如何使用这些回调  

    我的要求需要任何额外的任务创建请与如何创建任务信标、互斥量以完成我的需求分享任务详细信息  

    如何为其他 UART 创建相同的操作、因为 Tiva 有4个 UART

    此致

    Surya

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

    我认为您尝试以不是设计使用的方式使用 TI-RTOS UART 驱动程序。 我建议您为四个 UART 中的每一个实施 HWI 函数、并直接处理 TX 和 RX 中断。  

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

    尊敬的 Bob:

    感谢您的建议、

    我尝试使用另一种方法来获取 UART 滞后示例  

    #include
    #include
    #include
    #include

    /* XDCtools 头文件*/
    #include
    #include
    #include

    /* BIOS 头文件*/
    #include
    #include
    #include

    /* TI-RTOS 头文件*/
    #include
    #include

    /*示例/板头文件*/
    #include "Board.h"
    #include "UARTUtils.h"
    #include "USBCDCD_LoggerIdle.h"

    #define TASKSTACKSIZE 1536

    Task_Structtask0Struct;
    char task0stack[TASKSTACKSIZE];

    int count2 = 0;
    //volatile char outputChar = 0;//要打印的 char
    字符串[80];
    /*
    *==== consoleFxn ===
    *此函数的任务是静态创建的。 请参阅工程的.cfg 文件。
    *
    void consoleFxn (UArg arg0、UArg arg1)

    无符号整型睡眠持续时间
    unsigned int count;
    unsigned int cpuLoad;
    字符输入[128];

    计数= 1;

    /* printf 连接到 UART COM 端口*/
    printf ("\f======= 欢迎使用控制台==== \n");
    printf ("输入一个命令后返回。\n"
    "键入命令列表的帮助。\n\n");

    printf ("%d %%"、count++);
    fflush (stdout);

    /*循环永久接收命令*/
    while (true){
    /*获取用户的输入*/
    scanf ("%s"、输入);
    /*清除 stdin 中的剩余字符,因为它们未被使用。 *
    fflush (stdin);

    if (!strcmp (输入、"load")){
    /*打印 CPU 负载*/
    cpuLoad = Load_getCPULoad();
    printf ("CPU 负载:%d\n"、cpuLoad);

    否则、如果(!strcmp (输入、"SLEEP")){
    /*将任务置于睡眠状态 X ms。 *
    printf ("输入持续时间(ms):");
    fflush (stdout);
    scanf("%d",&slepDur");
    fflush (stdin);
    Task_sleep (sleepDurs);

    否则、如果(!strcmp (input、"exit")){
    /*退出控制台任务*/
    printf("是否确定要退出控制台? 是/否:");
    fflush (stdout);
    scanf ("%s"、输入);
    fflush (stdin);
    if ((input[0]='y'|| input[0]='Y')&& input[1]== 0x00){
    printf ("退出控制台,再见。\n");
    Task_exit();


    否则{
    /*打印有效命令列表。 *
    printf ("有效命令:\n")
    "-加载:获取 CPU 和任务加载。\n"
    "-睡眠:将控制台任务置于睡眠状态。\n"
    "-退出:退出控制台任务。\n");

    printf ("%d %%"、count++);
    fflush (stdout);

    void gpioButtonFxn0 (无符号 int 索引)

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

    if (count2++=100)

    count2 = 0;

    // printf ("Count=%d"、count2);
    //flag = true;
    System_printf ("KARIoT\n");
    sprintf (字符串、"\n\r\n\r\n 计数=%d\n\r\n\r\n"、count2);
    System_printf (string);

    void gpioButtonFxn1 (无符号 int 索引)

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

    if (count2++=100)

    count2 = 0;

    System_printf ("KARIoT\n");

    // printf ("Count=%d"、count2);
    // flag = true;

    /*
    *==== main ====
    *
    int main (空)

    /*呼叫板初始化功能。 *
    Board_initGeneral();
    Board_initGPIO();
    Board_initUART();
    Board_initUSB (Board_USBDEVICE);

    /*构造 BIOS 对象*/
    Task_Params taskParams;

    Task_Params_init (&taskParams);
    taskParams.STACKSIZE = TASKSTACKSIZE;
    taskParams.stack =_task0Stack;
    Task_con构(&task0Struct,(Task_FuncPtr) consoleFxn、&taskParams、NULL);

    /*打开用户 LED */
    GPIO_WRITE (Board_LED0、Board_LED_ON);

    /*
    *将 UART 设备添加到系统中。
    *必须设置所有 UART 外设、并且必须初始化模块
    *打开前。 这由 Board_initUART()完成。 所使用的函数
    *在 UARTUtils.c 中实现
    *
    add_device ("UART"、_MSA、UARTUtils_deviceopen、
    UARTUtils_deviceclose、UARTUtils_deviceread、
    UARTUtils_devicewrite、UARTUtils_devicelseek、
    UARTUtils_deviceunlink、UARTUtils_devicerename);

    /*打开 UART0以写入 stdout 并设置缓冲区*/
    freopen ("UART:0"、"w"、stdout);
    setvbuf (stdout、NULL、_IOLBF、128);

    /*打开 UART0以从 stdin 读取并设置缓冲器*/
    freopen ("UART:0"、"r"、stdin);
    setvbuf (stdin、NULL、_IOLBF、128);

    /*
    *初始化 SysCallback 使用的 UART 端口0。 此和其他 SysCallback
    * UART 函数在 UARTUtils.c 中实现 调用 System_printf
    *将转至 UART0、与 printf 相同。
    *
    UARTUtils_systemInit (0);

    System_printf ("启动 UART 控制台示例\n");

    system_printf ("\f======= 欢迎使用 KARIOT ==== \n");

    /*初始化 USB CDC 设备以进行日志传输*/
    USBCDCD_init();

    GPIO_setCallback (Board_BUTTON0、gpioButtonFxn0);

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

    /*
    *如果您的器件有多个输入引脚可用、则会中断
    将在 Board_Button1上启用*。
    *
    if (Board_BUTTON0!= Board_Button1)

    /*安装按钮回调*/
    GPIO_setCallback (Board_Button1、gpioButtonFxn1);
    GPIO_enableInt (Board_Button1);

    /*启动 BIOS */
    BIOS_start();

    返回(0);

    错误:

    TI.SYSBIS.hal.Hwi:第174行:e_stackOverflow:ISR 栈溢出。
    xdc.runtime.Error.raise:终止执行

    如何解决问题  

    Surya

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

    您可能需要增加中断堆栈的大小:

    下面是一个为 UART0创建 HWI 并使用信标来允许不同任务使用的项目:

    e2e.ti.com/.../TM4C123TiRtosUartHwi.zip

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

    尊敬的 Bob:

    我尝试使用此代码、但遇到源文件丢失错误 Hwi.h、

    错误控制台下方、

    代码标题、

    /* XDCtools 头文件*/
    #include

    /* BIOS 头文件*/
    #include
    #include

    /* TI-RTOS 头文件*/
    #include
    //#include
    //#include
    //#include
    #include
    #include
    //#include
    //#include
    //#include "package/internal/Hwi.XDC.h"

    #include
    #include
    #include
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "driverlib/gpio.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/rom.h"
    #include "driverlib/rom_map.h"
    #include "driverlib/sysctl.h"
    #include
    #include "Uart0Hwi.h"

    /*板头文件*/
    #include "Board.h"

    >>编译失败
    subdir_rules.mk:9:目标'empty.obj'的配方失败
    "./empty.c"、第100行:错误#20:标识符"Hwi_Params"未定义
    "./empty.c"、第101行:错误#20:标识符"Hwi_handle"未定义
    "./empty.c"、第142行:警告#225-D:函数"Hwi_Params_init"隐式声明
    "./empty.c"、第145行:警告#225-D:函数"hwi_create"隐式声明
    在编译"../empty.c"时检测到2个错误。
    gmake:***[empty.obj]错误1.
    gmake:目标"全部"不会由于错误而重新生成。

    ****构建完成****

    请检查并检查以解决此问题,如何在新项目中配置 Hwi 中断?

    谢谢

    Surya

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

    您是否使用 CCS 的"File"->"Import"选项将项目添加到工作区? 如果是、它应该已经包含了路径搜索选项来查找头文件。 检查"ARM 编译器"的"包含选项"是否包含"${COM_TI_RTSC_TIRTTOSTIVAC_INSTALL_DIR}\products\BIOS_6_45_01_29\packages/ti\SysBIOS\hal"

    以下是导入项目时包含选项页面的外观:

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

    您好 、bob、

    如何解决堆栈大小错误和堆栈管理,我尝试实现 hwi.h ,但同样的错误将出现,相同的 hwi 中断和 urat 中断问题,所以请建议工作过程  

    谢谢  

    Surya

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

    我在4月23日的帖子中展示了如何使用 XGCONF 增大 TI-RTOS 项目的堆栈大小。  在 Code Composer 的"Project Explorer"窗口中右键点击.cfg 文件、然后选择"Open with "->"XGCONF"。

    或者、您可以使用普通文本编辑器打开.cfg 文件、并搜索"program.stack"并编辑该值。