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.

[参考译文] TM4C1294NCPDT:两个 TM4C1294NCPDT 之间的 CAN 消息

Guru**** 2538955 points
Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/988600/tm4c1294ncpdt-can-message-between-two-tm4c1294ncpdt

器件型号:TM4C1294NCPDT
主题中讨论的其他器件:TM4C123EK-TM4C1294XL

大家好!
我对 TM4C 和 CAN 协议以及实际嵌入式软件非常陌生。
在我的工作中、我需要在两个 TM4C1294之间作为主器件和从器件与 CAN 协议进行通信。 在网上冲浪时、我在这个网站上找到了一个代码。

( ohm.ninja/.../ )我按照现场所示设置电路。

但是、当涉及代码部分时、我会遇到一些问题。

这是我在主(发送器)端的代码:

#include
#include
#include
#include
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_ca.h"
#include "inc/hw_ints.h"
#include "driverlib/CAN.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/uart.h"
#include "driverlib/pin_map.h"

#include "utils/uartstdio.h"
#include "utils/uartstdio.c"

#define PI 3.14159265359f

易失性 bool 错误标志= 0;//传输错误标志
unsigned int sysClock;//时钟速度,单位为 Hz

void delay (unsigned int milliseconds){
SysCtlDelay ((sysClock / 3)*(毫秒/ 1000.0f));

// CAN 中断处理程序
void CANIntHandler (void){

无符号长整型状态= CANIntStatus (CAN1_base、CAN_INT_STS_CAUST);//读取中断状态

if (status =CAN_INT_INTID_STATUS){//控制器状态中断
状态= CANStatusGet (CAN1_base、CAN_STS_CONTROL);//读回错误位,对它们执行什么操作?
错误标志= 1;
}否则、如果(status ==1){//消息对象1
CANIntClear (CAN1_base、1);//清除中断
错误标志= 0;//清除任何错误标志
}否则{//永远不会发生
UARTprintf ("意外的 CAN 总线中断\n");

int main (void){

tCANMsgObject msg;// CAN 报文对象
unsigned int msgData;//消息数据长度为四个字节,我们可以将其分配为 int32
unsigned char * msgDataPtr =(unsigned char *)&msgData;//创建指向 msgData 的指针,以便我们可以访问各个字节

//从 PLL 以120MHz 运行。
SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_main | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);

//设置调试 UART
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);//启用 UART0 GPIO 外设
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
UARTStdioConfig (0、115200、sysClock);// 115200波特

//设置 CAN1
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);//启用 CAN1 GPIO 外设
GPIOPinConfigure (GPIO_PB0_CAN1RX);
GPIOPinConfigure (GPIO_PB1_CAN1TX);
GPIOPinTypeCAN (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1);
SysCtlPeripheralEnable (SYSCTL_Periph_CAN1);
CANInit (CAN1_base);
CANBitRateSet (CAN1_base、sysClock、50000);
CANIntRegister (CAN1_base、CANIntHandler);//使用动态矢量表分配
CANIntEnable (CAN1_base、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
IntEnable (INT_CAN1);
CANEnable (CAN1_base);

//设置 msg 对象
msgData = 0;
MSG.ui32MsgID = 1;
MSG.ui32MsgIDMask = 0;
MSG.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
MSG.ui32MsgLen = sizeof (msgDataPtr);
MSG.pui8MsgData = msgDataPtr;

unsigned int t = 0;//循环计数器
float freq = 0.3;//频率分频器

while (1){

//设置下一个颜色(缩放正弦(0-1)到0-255)
msgDataPtr[0]=(0.5 + 0.5*sinf (t*freq))* 0xFF;
msgDataPtr[1]=(0.5 + 0.5*sinf (t*freq +(2*PI/3)))* 0xFF;// 120度异相
msgDataPtr[2]=(0.5 + 0.5*sinf (t*freq +(4*PI/3)))* 0xFF;// 240度异相
msgDataPtr [3]= 128;// 50%强度*/

UARTprintf ("发送颜色\tr:%d\TG:%d\TB:%d\n"、msgDataPtR[0]、msgDataPtR[1]、msgDataPtR[2]);//将颜色写入 UART 以进行调试
CANMessageSet (CAN1_base、1、&msg、MSG_OBJ_TYPE_TX);//作为 msg 对象1发送

延迟(100);//等待100ms

if (errFlag){//检查错误
UARTprintf ("CAN 总线错误%d\n"、errFlag);

T++;//溢出正常

//返回0;

----------------------------------------------------------------------

首先 、在主器件侧、我的 CAN 消息未传输。 正如您看到的、有一个 CAN 总线错误标志为1。

在将我的头转到接收端之前、我的传输代码可能会有什么问题? 我需要更改什么?

我还没有机会使用示波器测量输出。

实际上、我以前看过一个类似主题的标题、但对我来说、这有点太复杂了。 我想知道是否有人可以更容易地在这方面帮助我?

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

    您好!

     我 不会发现代码有什么问题。 发送器很可能未连接到 CAN 总线网络、从而导致错误。  

     - CAN 网络上是否有收发器?

     - CAN 网络上是否至少有两个节点。 网络上不能只有一个节点(例如、只有一个发送器)。  

     -您能否探测 PB1引脚、即 CAN1TX? 您是否在 PB1引脚上看到任何活动? 对收发器的 TxD 输入执行同样的操作。 确保连接正确。

     -从收发器探测 CAN_H 和 CAN_L。 这两个是 CAN 的差分信号。 如果您看到 TXD 活动、但在 CAN_H 和 CAN_L 上看不到活动、则需要检查收发器。 您是否为收发器等正确供电  

     -接收器节点的位速率是否与配置为500k 的发送器相同?

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

    您好 Charles

    [引用 userid="93620" URL"~/support/microcontrollers/other/f/other-microcontrollers-forum/988600/tm4c1294ncpdt-can-message-between-two-tm4c1294ncpdt/3651667 #3651667"]

    - CAN 网络上是否有收发器?

     - CAN 网络上是否至少有两个节点。 网络上不能只有一个节点(例如、只有一个发送器)。  

    [/报价]

    是的、我有两个 MCP2551、它们的连接方式与原理图中的连接方式相同。

    [引用 userid="93620" URL"~/support/microcontrollers/other/f/other-microcontrollers-forum/988600/tm4c1294ncpdt-can-message-between-two-tm4c1294ncpdt/3651667 #3651667"]–您能否探测 PB1引脚、即 CAN1TX? 您是否在 PB1引脚上看到任何活动? 对收发器的 TxD 输入执行同样的操作。 确保连接正确。

    我测量了 PB1 和 TXD 引脚、它提供大约3.3V 的恒定输出、似乎不发送任何消息。

    [引用 userid="93620" URL"~/support/microcontrollers/other/f/other-microcontrollers-forum/988600/tm4c1294ncpdt-can-message-between-two-tm4c1294ncpdt/3651667 #3651667"]-从收发器探测 CAN_H 和 CAN_L。 这两个是 CAN 的差分信号。 如果您看到 TXD 活动、但在 CAN_H 和 CAN_L 上看不到活动、则需要检查收发器。 您是否为收发器等正确供电  [/报价]

    I probe CAN_H 和 CAN_L、下图显示了差分信号。 这里似乎什么都不像。  我将使用 TI Launchpad 提供的5V 电压为两个 mcp2551s 进行馈送。

    [引用 userid="93620" URL"~/support/microcontrollers/other/f/other-microcontrollers-forum/988600/tm4c1294ncpdt-can-message-between-two-tm4c1294ncpdt/3651667 #3651667"]-接收器节点的位速率是否与配置为500k 的发送器相同?

    我  还没有下载接收器端的代码。 因为在原始项目中、他使用 tm4c123作为接收器、并发送 CAN 消息来点亮 RGB LED。 但我使用两个 TM4C1294作为接收器和发送器、我只想将这两个 MCU 作为主从通信。  

    当我看到主器件正确发送 CAN 消息时、我将从器件代码下载到从 MCU。

    顺便说一下、页面链接和原始代码在我的第一条消息中不可见、因此我将重新发送它。

    https://ohm.ninja/tiva-c-series-can-bus-with-mcp2551/

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

    您好!

     这很奇怪。 我不知道问题是什么。 您可以尝试此示例吗? 该示例使用 CAN0而不是 CAN1? 在 LaunchPad 上、您需要将 J4和 J5跳线从水平位置更改为垂直位置。 您需要将 UARTprintf 映射到 UART2。 有关详细信息、请参阅 EK-TM4C1294XL Launchpad 用户指南。  

    #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 端口 A 外设(用于 CAN0引脚)
    //! - CAN0RX - PA0
    //! - CAN0TX - PA1
    //!
    //! 此示例使用以下中断处理程序。 来使用该示例
    //! 在您自己的应用程序中、您必须将这些中断处理程序添加到
    //! 矢量表。
    //! - INT_CAN0 - CANIntHandler
    //
    //

    //
    //
    //跟踪 TX 中断次数的计数器
    //发生,它应与发送的 TX 消息数匹配。
    //
    //
    volatile uint32_t g_ui32MsgCount = 0;

    //
    //
    //指示发生了某些传输错误的标志。
    //
    //
    volatile bool g_BErrFlag = 0;

    //
    //
    //此函数使用简单的轮询方法提供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)
    #if 0
    ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_OSC)、
    25000000);
    其他
    //
    //从 PLL 以120MHz 运行。
    //
    ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、120000000);

    #endif

    其他
    SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
    SYSCTL_XTAL_16MHz);
    #endif

    //
    //对于此示例、CAN0与端口 A0和 A1上的 RX 和 TX 引脚一起使用。
    //您使用的实际端口和引脚可能有所不同,请参阅
    //数据表以了解更多信息。
    // GPIO 端口 B 需要启用、以便可以使用这些引脚。
    // TODO:将其更改为您正在使用的 GPIO 端口
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);

    //
    //配置 GPIO 引脚复用以选择这些引脚的 CAN0功能。
    //此步骤选择可用于这些引脚的替代功能。
    //如果您的器件支持 GPIO 引脚功能多路复用、这是必需的。
    //请查阅数据表以查看每个引脚分配的函数。
    // TODO:更改此选项以选择您正在使用的端口/引脚
    //
    GPIOPinConfigure (GPIO_PA0_CAN0RX);
    GPIOPinConfigure (GPIO_PA1_CAN0TX);

    //
    //启用 GPIO 引脚上的复用功能。 以上步骤选择
    //可用的备用功能。 此步骤实际上启用
    //这些引脚的替代功能、而不是 GPIO。
    //待办事项:更改此项以匹配您正在使用的端口/引脚
    //
    GPIOPinTypeCAN (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);

    //
    //已为 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)

    //
    //使用对象1发送 CAN 消息(与不一样
    // CAN ID、在本例中也是1)。 此函数将导致
    //要立即传输的消息。
    //
    CANMessageSet (CAN0_BASE、1、&sCANMessage、MSG_OBJ_TYPE_TX);

    //
    //现在等待1秒后再继续
    //
    SimpleDelay();

    //
    //检查错误标志以查看是否发生错误
    //
    if (g_bErrFlag)


    其他

    //
    //递增消息数据中的值。
    //
    ui32MsgData++;

    //
    //返回无错误
    //
    返回(0);

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

    您好 Charles。

    我将 J4和 J5从水平位置移到了垂直位置。 我下载了您提供的代码、但当我使用探头检查 PA1上的信号时、它是恒定的3.3V。 终端中也没有任何显示。

    [引用 userid="93620" URL"~/support/microcontrollers/other/f/other-microcontrollers-forum/988600/tm4c1294ncpdt-can-message-between-two-tm4c1294ncpdt/3652711 #3652711"]您需要将 UARTprintf 映射到 UART2。[/quot]

    我想知道是否需要更改头文件或主代码中的任何内容以将 UARTprintf 映射到 UART2?

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

    抱歉、我忘记说这个示例不使用 UARTprintf。 在 CAN0TX 上看不到任何内容是很奇怪的。 您是否有另一个可以尝试的 Launchpad。

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

    是的、我在两个不同的 LaunchPad 上尝试过它、但结果相同。 此问题可能是由头文件引起的? 尽管 头文件是我安装 Tiva 驱动程序时附带的原始头文件。 我没有对它们做任何更改。

    因此、如果我们返回到欧姆忍者代码、 由于某种原因、代码的以下部分会出现 errorFlag 1。

    // CAN 中断处理程序
    void CANIntHandler (void){

    无符号长整型状态= CANIntStatus (CAN1_base、CAN_INT_STS_CAUST);//读取中断状态

    if (status =CAN_INT_INTID_STATUS){//控制器状态中断
    状态= CANStatusGet (CAN1_base、CAN_STS_CONTROL);//读回错误位,对它们执行什么操作?
    错误标志= 1;
    }否则、如果(status ==1){//消息对象1
    CANIntClear (CAN1_base、1);//清除中断
    错误标志= 0;//清除任何错误标志
    }否则{//永远不会发生
    UARTprintf ("意外的 CAN 总线中断\n");

    ------------------------------------------------------------------

    你对此有什么想法吗?

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

    我将把你的问题提交给我们的 CAN 专家,征求意见。  

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

    谢谢 Charles。 我期待您和专家的意见。

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

    在 EK-TM4C1294X Launchpad 上使用 CAN1时、需要禁用 TARGET_VBUS。 用户 指南中提供了原理图。 PB1连接到信号 TARGET_VBUS、当开关 U4启用时、该信号连接到5V。 您需要将 PD6配置为高电平、可以将其配置为输出高电平、也可以添加上拉电阻器。

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

    如果您尚未这样做、您可能需要查看此应用手册和示例。

    www.ti.com/.../spna245.pdf

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

    Bob、您好!

    我通过添加以下代码配置了 PD6输出高电平:

    //将 PD6输出设置为高电平
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
    GPIOPinTypeGPIOOutput (GPIO_PORTD_base、GPIO_PIN_6);
    GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_6、GPIO_PIN_6);

    ------------------------------------------------------

    但没有任何变化。errorFlag 仍然为1。 此代码是否有任何问题?

    以下 pic 是 PA1的输出( "GPIOPinConfigure (GPIO_PA1_U0TX"))

    这个图是来自 PB1的输出:( "GPIOPinConfigure (GPIO_PB1_CAN1TX)")

    正如您看到的、PA1的 UART 消息大约为3.3V、但 PB1的输出为恒定5V。

    此外、您是否还对错误标志为何仍然为1有任何了解?