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.

[参考译文] CCS/TM4C1294NCPDT:TM4C1294

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/625744/ccs-tm4c1294ncpdt-tm4c1294

器件型号:TM4C1294NCPDT

工具/软件:Code Composer Studio

您好!

 我正在尝试连接 TM4C1294开发板中的 CAN。 我在路径 C:\ti\TivaWare_C_Series-2.1.3.156\examples\peripheral\can 中找到了 CAN 示例程序。 项目中的配置是什么、或者要在程序中完成哪些更改来构建此程序。 因为通过复制粘贴、我已经尝试过很多次、但不能通过为初学者介绍视频 Code Composer 中的过程来构建。

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

    您好、Azim、

    通常、如果您从裸 CCS 工程开始、为其提供指向 TivaWare DriverLib 的链接、然后导入 示例代码并将其添加到示例代码中、那么您应该是确保工程运行的最佳方式。 我尚未尝试构建该特定示例、因此可能需要执行另一两个步骤、我将尝试帮助您解决该问题。

    编辑:我应该澄清一下、当我说"导入"示例代码时、我本来是要使用你已经完成的复制/粘贴方法。 您无需使用 CCS"import"功能!

    如果遇到构建错误、请在 E2E 上发布相关屏幕截图。 为此、您可以单击"使用丰富的格式"、然后在帖子文本框上方的工具栏上选择图像附件功能。

    此外、请发布您正在使用的主代码、因为如果您对其进行了任何修改、我将想了解具体内容。 您应该使用"Syntax Highligher"来执行此操作、该语法可以在同一 RTF 格式工具栏下找到、并带有符号"</>"。

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

    请允许我注意您的解释、"非常好-详细、涵盖各种(潜在)问题。" 此外、海报也是精心设计和组织的书写方式-表示他的动机和(适当的)请求、以获得更多详细信息。

    现在、尤其是前面提到的、看看他的主题行:"CCS/TMxyz:TMxyz"。 这有什么用处吗? (即您的响应对所有 TM4C 器件均适用-而不仅仅是一个!) 而且-那些能够和有兴趣帮助这张海报的人-对正在寻找的内容"没有线索"! 无/零!

    Ralph -这不是(另一个)最近"论坛(声称但有争议)升级"的深层弱点吗? 这种"盲目重复 MCU 器件型号"没有任何作用-实际上、它可能会"限制读者的使用"、读者可能会从该主题的内容中受益、但也可能会"找不到"(因为他们使用不同的器件型号) 或者被"主题的占空"所"关闭!

    我们知道、您不会"进行此类有缺陷的规则(声称)升级"、但它们确实会造成损害、并且非常"不喜欢!"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    示例程序代码是

    //

    //

    // simple_tx.c -演示简单 CAN 消息传输的示例。

    //

    //版权所有(c) 2010-2017 Texas Instruments Incorporated。  保留所有权利。

    //软件许可协议

    //

    // 以源代码和二进制形式重新分发和使用,有无

    // 如果满足以下条件,则允许进行修改

    // 满足:

    //

    // 重新分发源代码必须保留上述版权

    // 注意、此条件列表和以下免责声明。

    //

    // 二进制形式的重新分发必须复制上述版权

    // 注意、中的条件列表和以下免责声明

    // 随提供的文档和/或其他材料  

    // 分布。

    //

    // 德州仪器公司的名称和的名称都不是

    // 其贡献者可用于认可或推广衍生产品

    // 未经特定的事先书面许可,从该软件下载。

    //

    //本软件由版权所有者和作者提供

    //“原样”以及任何明示或暗示的保证,包括但不包括

    //限于对适销性和适用性的暗示保证

    //一个特定的目的是免责的。 在任何情况下、版权均不得

    //所有者或贡献者应对任何直接、间接、偶然、

    //特殊、典型或必然的损害(包括但不包括)

    //仅限于采购替代货物或服务;

    //数据或利润;或业务中断)

    //责任理论,无论是合同责任、严格责任还是侵权行为

    //(包括疏忽或其他)以任何方式因使用而产生

    //此软件,即使已被告知可能会发生此类损坏。

    //

    //这是 Tiva 固件开发包的修订版2.1.4.178的一部分。

    //

    //

    #include

    #include

    #include "inc/hw_ca.h"

    #include "inc/hw_ints.h"

    #include "inc/hw_memmap.h"

    #include "driverlib/CAN.h"

    #include "driverlib/gpio.h"

    #include "driverlib/interrupt.h"

    #include "driverlib/pin_map.h"

    #include "driverlib/sysctl.h"

    #include "driverlib/uart.h"

    #include "utils/uartstdio.h"

    //

    //

    //! addtogroup CAN_examples_list

    //!

    简单 CAN TX (simple_tx)

    //!

    //! 此示例显示了 CAN 传输消息的基本设置

    //! 总线上的电流。  CAN 外设配置为发送报文

    //! 具有特定的 CAN ID。  然后每秒传输一条消息、

    //! 使用简单的延迟环路进行计时。  发送的消息是4

    //! 包含递增模式的字节消息。  CAN 中断

    //! 处理程序用于确认消息传输并计算数量

    //! 已发送的消息。

    //!

    //! 此示例使用以下外设和 I/O 信号。  您必须执行的操作

    //! 查看这些内容并根据您自己的董事会的需要进行更改:

    //! - CAN0外设

    //! - GPIO 端口 B 外设(用于 CAN0引脚)

    //! - CAN0RX - PB4

    //! - CAN0TX - PB5

    //!

    //! 以下 UART 信号仅配置为显示控制台

    //! 消息。  CAN 的运行不需要这些参数。

    //! - GPIO 端口 A 外设(用于 UART0引脚)

    //! - UART0RX - PA0

    //! - UART0TX - PA1

    //!

    //! 此示例使用以下中断处理程序。  来使用该示例

    //! 在您自己的应用程序中、您必须将这些中断处理程序添加到

    //! 矢量表。

    //! - INT_CAN0 - CANIntHandler

    //

    //

    //

    //

    //跟踪 TX 中断次数的计数器

    //发生,它应与发送的 TX 消息数匹配。

    //

    //

    volatile uint32_t g_ui32MsgCount = 0;

    //

    //

    //指示发生了某些传输错误的标志。

    //

    //

    volatile bool g_BErrFlag = 0;

    //

    //

    //此函数将 UART0设置为用于控制台显示信息

    //因为示例正在运行。

    //

    //

    无效

    InitConsole (空)

      //

      //启用用于 UART0引脚的 GPIO 端口 A。

      // TODO:将其更改为您正在使用的 GPIO 端口。

      //

      SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

      //

      //为端口 A0和 A1上的 UART0功能配置引脚复用。

      //如果您的器件不支持引脚复用、则无需执行此步骤。

      // TODO:更改此选项以选择您正在使用的端口/引脚。

      //

      GPIOPinConfigure (GPIO_PA0_U0RX);

      GPIOPinConfigure (GPIO_PA1_U0TX);

      //

      //启用 UART0以便我们可以配置时钟。

      //

      SysCtlPeripheralEnable (SYSCTL_Periph_UART0);

      //

      //使用内部16MHz 振荡器作为 UART 时钟源。

      //

      UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC);

      //

      //为这些引脚选择替代(UART)功能。

      // TODO:更改此选项以选择您正在使用的端口/引脚。

      //

      GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);

      //

      //初始化控制台 I/O 的 UART

      //

      UARTStdioConfig (0、115200、16000000);

    //

    //

    //此函数使用简单的轮询方法提供1秒的延迟。

    //

    //

    无效

    SimpleDelay (空)

      //

      //延迟周期1秒

      //

      SysCtlDelay (16000000 / 3);

    //

    //

    //此函数是 CAN 外设的中断处理程序。  它会进行检查

    //查找中断原因,并保留所有消息的计数

    //已传输。

    //

    //

    无效

    CANIntHandler (空)

      uint32_t ui32Status;

      //

      //读取 CAN 中断状态以查找中断原因

      //

      ui32Status = CANIntStatus (CAN0_BASE、CAN_INT_STS_CAUST);

      //

      //如果原因是控制器状态中断,则获取状态

      //

      if (ui32Status = CAN_INT_INTID_STATUS)

      {

        //

        //读取控制器状态。  这将返回状态字段

        //可以指示各种错误的错误位。  错误处理

        //本示例中不是为了简单起见。  请参阅

        // API 文档,了解有关错误状态位的详细信息。

        //读取此状态的操作将清除中断。  如果

        // CAN 外设未与其它 CAN 器件连接到 CAN 总线

        //存在,则会发生错误,并在中指示

        //控制器状态。

        //

        ui32Status = CANStatusGet (CAN0_BASE、CAN_STS_CONTROL);

        //

        //设置一个标志来指示可能发生的某些错误。

        //

        G_bErrFlag = 1;

      }

      //

      //检查原因是否是我们正在使用的消息对象1

      //发送消息。

      //

      否则、如果(ui32Status = 1)

      {

        //

        //到达这一点意味着 TX 中断发生在上

        //消息对象1、消息 TX 完成。  清除

        //消息目标中断。

        //

        CANIntClear (CAN0_BASE、1);

        //

        //递增计数器以跟踪已有多少消息

        //已发送。  在实际应用中、这可用于将标志设置为

        //指示何时发送消息。

        //

        G_ui32MsgCount++;

        //

        //由于消息已发送,请清除所有错误标志。

        //

        G_bErrFlag = 0;

      }

      //

      //否则,发生意外导致中断的情况。  这应该是

      //永远不会发生。

      //

      其他

      {

        //

        //可以在此处执行伪中断处理。

        //

      }

    //

    //

    //配置 CAN 并输入循环以传输周期性 CAN 消息。

    //

    //

    内部

    main (空)

    #if defined (target_IS_TM4C129_RA0)||                     \

      已定义(TARGET_IS_TM4C129_RA1)||                     \

      已定义(TARGET_IS_TM4C129_RA2)

      uint32_t ui32SysClock;

    #endif

      tCANMsgObject sCANMessage;

      uint32_t ui32MsgData;

      uint8_t * pui8MsgData;

      pui8MsgData =(uint8_t *) ui32MsgData;

      //

      //将时钟设置为直接从外部晶振/振荡器运行。

      // TODO:必须更改 SYSCTL_XTAL_VALUE 以匹配的值

      板上的//晶体。

      //

    #if defined (target_IS_TM4C129_RA0)||                     \

      已定义(TARGET_IS_TM4C129_RA1)||                     \

      已定义(TARGET_IS_TM4C129_RA2)

      ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |

                       SYSCTL_OSC_MAIN |

                       SYSCTL_USE_OSC)

                       25000000);

    其他

      SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |

             SYSCTL_XTAL_16MHz);

    #endif

      //

      //设置用于显示消息的串行控制台。  这是

      //仅针对此示例程序,CAN 操作不需要。

      //

      InitConsole();

      //

      //对于此示例、CAN0与端口 B4和 B5上的 RX 和 TX 引脚一起使用。

      //您使用的实际端口和引脚可能有所不同,请参阅

      //数据表以了解更多信息。

      // GPIO 端口 B 需要启用、以便可以使用这些引脚。

      // TODO:将其更改为您正在使用的 GPIO 端口

      //

      SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);

      //

      //配置 GPIO 引脚复用以选择这些引脚的 CAN0功能。

      //此步骤选择可用于这些引脚的替代功能。

      //如果您的器件支持 GPIO 引脚功能多路复用、这是必需的。

      //请查阅数据表以查看每个引脚分配的函数。

      // TODO:更改此选项以选择您正在使用的端口/引脚

      //

      GPIOPinConfigure (GPIO_PB4_CAN0RX);

      GPIOPinConfigure (GPIO_PB5_CAN0TX);

      //

      //启用 GPIO 引脚上的复用功能。  以上步骤选择

      //可用的备用功能。  此步骤实际上启用

      //这些引脚的替代功能、而不是 GPIO。

      //待办事项:更改此项以匹配您正在使用的端口/引脚

      //

      GPIOPinTypeCAN (GPIO_PORTB_BASE、GPIO_PIN_4 | GPIO_PIN_5);

      //

      //已为 CAN 设置 GPIO 端口和引脚。  CAN 外设

      //必须启用。

      //

      SysCtlPeripheralEnable (SYSCTL_Periph_CAN0);

      //

      //初始化 CAN 控制器

      //

      CANInit (CAN0_BASE);

      //

      //设置 CAN 总线的比特率。  此函数设置 CAN

      针对标称配置的//总线时序。  您可以实现更多控制

      //使用函数 CANBitTimingSet()代替 CAN 总线时序

      //如果需要。

      //在此示例中、CAN 总线设置为500kHz。  在以下函数中、

      // SysCtlClockGet ()或 ui32SysClock 的调用被用来确定

      //用于为 CAN 外设计时的时钟速率。  这是可以的

      //如果 您知道系统时钟的值,则替换为固定值,

      //保存额外的函数调用。  对于某些器件、CAN 外设是

      //使用固定的8MHz 时钟进行计时,而不管在哪种情况下是系统时钟

      //对 SysCtlClockGet()或 ui32SysClock 的调用应替换为

      // 80000。  有关 CAN 的更多信息、请参阅数据表

      //外设时钟。

      //

    #if defined (target_IS_TM4C129_RA0)||                     \

      已定义(TARGET_IS_TM4C129_RA1)||                     \

      已定义(TARGET_IS_TM4C129_RA2)

      CANBitRateSet (CAN0_BASE、ui32SysClock、50000);

    其他

      CANBitRateSet (CAN0_BASE、SysCtlClockGet ()、50000);

    #endif

      //

      //在 CAN 外设上启用中断。  此示例使用静态

      //分配中断处理程序,表示处理程序的名称

      //位于启动代码的矢量表中。  如果您想使用动态的

      //分配矢量表,然后还必须调用 CANIntRegister()

      //此处。

      //

      // CANIntRegister (CAN0_BASE、CANIntHandler);// if using dynamic vectors

      //

      CANIntEnable (CAN0_BASE、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);

      //

      //在处理器(NVIC)上启用 CAN 中断。

      //

      IntEnable (INT_CAN0);

      //

      //启用 CAN 以进行操作。

      //

      CANEnable (CAN0_BASE);

      //

      //初始化将用于发送 CAN 的消息对象

      //消息。  消息将是包含一个递增的4个字节

      //值。  最初它将设置为0。

      //

      ui32MsgData = 0;

      sCANMessage.ui32MsgID = 1;

      sCANMessage.ui32MsgIDMask = 0;

      sCANMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE;

      sCANMessage.ui32MsgLen = sizeof (pui8MsgData);

      sCANMessage.pui8MsgData = pui8MsgData;

      //

      //输入循环以发送消息。  根据、将发送一条新消息

      //秒。  4字节的消息内容将被视为 uint32_t

      //并每次递增1。

      //

      while (1)

      {

        //

        //将显示消息计数和的消息打印到控制台

        //正在发送的消息的内容。

        //

        UARTprintf ("发送消息:0x%02x %02x %02x %02x %02x"、

             pui8MsgData[0]、pui8MsgData[1]、pui8MsgData[2]、

             pui8MsgData[3]);

        //

        //使用对象1发送 CAN 消息(与不一样

        // CAN ID、在本例中也是1)。  此函数将导致

        //要立即传输的消息。

        //

        CANMessageSet (CAN0_BASE、1、&sCANMessage、MSG_OBJ_TYPE_TX);

        //

        //现在等待1秒后再继续

        //

        SimpleDelay();

        //

        //检查错误标志以查看是否发生错误

        //

        if (g_bErrFlag)

        {

          UARTprintf ("错误-电缆已连接?\n"\});

        }

        其他

        {

          //

          //如果没有错误,则打印已发送消息的计数

          //

          UARTprintf ("总数=%u\n"、g_ui32MsgCount);

        }

        //

        //递增消息数据中的值。

        //

        ui32MsgData++;

      }

      //

      //返回无错误

      //

      返回(0);

    并发现错误为 :

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

    您好、Azim、

    我已识别两个错误。 第一个是该 API 中缺少逗号:

    ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_OSC)
    25000000); 

    正确用法是在 SYSCTL_USE_OSC 之后使用逗号、如下所示:

    ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_OSC)、
    25000000); 

    您可以通过双击第269行的错误来轻松找到此行。

    第二个问题是在第297/298行上报告 的有关 GPIO_PB4_CAN0RX 和 GPIO_PB5_CAN0TX 的问题。 这个问题是因为 您使用的 TM4C1294NCPDT 在这些特定的 GPIO 引脚上没有 CAN 外设。 对于 CAN0RX 和 CAN0TX、您将需要分别使用 PA0和 PA1。

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

    谢谢、我可以避免这两个错误。 仍然存在以下错误。  我要在 CCS 中完成任何配置、例如 Adi=ding 文件、驱动程序或库...?

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

    看起来您有两个具有两个不同 main()例程的独立 C 文件。 请确保从项目中排除不需要的文件。 我猜是有一个 boot_demo1.c 文件、它有一个与您尝试运行 CAN 示例无关的 main()例程。