请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:EK-TM4C1294XL 我正在为 CAN 总线发送器侧编译以下代码:
#include
#include
#include "inc/hw_ca.h"
#include "volatile/hw_ints.h"
#include "inc/hw_memmap.h"
#include "driverlib/ca.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pintru32_itude_intru32"
;include "volatile dio_u32uitude_intru32u_uidu_u.u.ut
= 32nuidi20_intru_u_u.u32u_intru_uidu_u32u_u.u.u.u.idu.u.u.u32ut = volt_u32uidu.u.u.u.u32uuuuuu.idu.u.u32u.u.u.u.u.u.u32u.uidio t = volatile u.uidi20_u.u.u.u.u.u.u.
volatile bMsg_BMsgFlag = 0;
tCANMsgObject g_sCANMsgObject1;
tCANMsgObject g_sCANMsgObject2
;tCANMsgObject g_sCANMsgObject3;
uint8_t g_pui8Msg1[4]={0、0、0、0、0};
uint2、i2、i2 =}
uint8_t g_pui8Msg3[6]={3、3、3、3、3、3、 3};
uint8_t g_pui8Msg4[8]={4、4、4、5、 5、5、5};
void InitConsole (void)
{
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
UARTClockSourceSet (UART0_BASE、UART_CLOCK_PIOSC);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
UARTStdioConfig (0、115200、16000000);
}
void PrintCANMessageInfo (tCANMsgObject * psCANMsg、uint32_t ui32MsgObj)
{
unsigned int uIdx;
UARTprintf ("发送 msg:obj=%d Id=0x%04X msg=0x"、ui32MsgObj、
psCANMsg->ui32MsgID);
for (uIdx = 0;uIdx < psCANMsg->ui32MsgLen;uIdx++)
{
UARTprintf ("%02x "、psCANMsg->pui8MsgData[uIdx]);
}
UARTprintf ("\n");
}
void SimpleDelay (void)
{
SysCtlDelay (16000000 / 3);
}
void CANIntHandler (void)
{
uint32_t ui32Status;
ui32Status = CANIntStatus (CAN1_base、CAN_INT_STS_CAUST);
if (ui32Status = CAN_INT_INTID_STATUS)
{
ui32Status = CANStatusGet (CAN1_base、CAN_STS_CONTROL);
G_bErrFlag = 1;
}
否则、如果(ui32Status = 1)
{
CANIntClear (CAN1_base、1);
G_ui32Msg1Count++;
G_bErrFlag = 0;
}
否则 if (ui32Status = 2)
{
CANIntClear (CAN1_base、2);
G_ui32Msg2Count++;
G_bErrFlag = 0;
}
否则 if (ui32Status = 3)
{
CANIntClear (CAN1_base、3);
G_ui32Msg3Count++;
G_bMsgObj3Sent = 1;
G_bErrFlag = 0;
}
其他
{
}
}
int main (void)
{
uint32_t ui32SysClock;
ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_16MHz |
SYSCTL_OSC_INT |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);
InitConsole();
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
GPIOPinConfigure (GPIO_PB0_CAN1RX);
GPIOPinConfigure (GPIO_PB1_CAN1TX);
GPIOPinTypeCAN (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1);
SysCtlPeripheralDisable (SYSCTL_Periph_CAN1);
SysCtlPeripheralReset (SYSCTL_Periph_CAN1);
SysCtlPeripheralEnable (SYSCTL_Periph_CAN1);
CANInit (CAN1_base);
CANBitRateSet (CAN1_base、ui32SysClock、50000);
CANIntRegister (CAN1_base、CANIntHandler);
CANIntEnable (CAN1_base、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
IntEnable (INT_CAN1);
CANEnable (CAN1_base);
G_sCANMsgObject1.ui32MsgID = 0x1001;
G_sCANMsgObject1.ui32MsgIDMask = 0;
G_sCANMsgObject1.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
G_sCANMsgObject1.ui32MsgLen = sizeof (g_pui8Msg1);
G_sCANMsgObject1.pui8MsgData = g_pui8Msg1;
G_sCANMsgObject2.ui32MsgID = 0x2001;
G_sCANMsgObject2.ui32MsgIDMask = 0;
G_sCANMsgObject2.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
G_sCANMsgObject2.ui32MsgLen = sizeof (g_pui8Msg2);
G_sCANMsgObject2.pui8MsgData = g_pui8Msg2;
for (;;)
{
PrintCANMessageInfo (&g_sCANMsgObject1、1);
CANMessageSet (CAN1_base、1、&g_sCANMsgObject1、MSG_OBJ_TYPE_TX);
PrintCANMessageInfo (&g_sCANMsgObject2、2);
CANMessageSet (CAN1_base、2、&g_sCANMsgObject2、MSG_OBJ_TYPE_TX);
G_sCANMsgObject3.ui32MsgID = 0x3001;
G_sCANMsgObject3.ui32MsgIDMask = 0;
G_sCANMsgObject3.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
G_sCANMsgObject3.ui32MsgLen = sizeof (g_pui8Msg3);
G_sCANMsgObject3.pui8MsgData = g_pui8Msg3;
G_bMsgObj3Sent = 0;
PrintCANMessageInfo (&g_sCANMsgObject3、3);
CANMessageSet (CAN1_base、3、&g_sCANMsgObject3、MSG_OBJ_TYPE_TX);
while (!g_bMsgObj3Sent)
{
}
G_sCANMsgObject3.ui32MsgID = 0x3002;
G_sCANMsgObject3.ui32MsgIDMask = 0;
G_sCANMsgObject3.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
G_sCANMsgObject3.ui32MsgLen = sizeof (g_pui8Msg4);
G_sCANMsgObject3.pui8MsgData = g_pui8Msg4;
PrintCANMessageInfo (&g_sCANMsgObject3、3);
CANMessageSet (CAN1_base、3、&g_sCANMsgObject3、MSG_OBJ_TYPE_TX);
SimpleDelay();
if (g_bErrFlag)
{
UARTprintf ("错误-电缆已连接?\n");
}
其他
{
UARTprintf ("总数=%u\n"、
g_ui32Msg1Count + g_ui32Msg2Count + g_ui32Msg3Count);
}
(*(uint32_t *) g_pui8Msg1)++;
(*(uint32_t *) g_pui8Msg2)++;
(*(uint32_t *) g_pui8Msg3)++;
(*(uint32_t *)&g_pui8Msg4[0])++;
(*(uint32_t *)&g_pui8Msg4[4])-;
UARTprintf ("\n\n");
}
}
我注意到这两个问题:
(1)这些参数不会递增:G_ui32Msg1Count、 g_ui32Msg2Count、 g_ui32Msg3Count
(2)程序在 while (!g_bMsgObj3Sent)之前卡住。 但是、如果我移除该循环、则正在发送消息、但参数 g_ui32Msg1Count、 g_ui32Msg2Count、 g_ui32Msg3Count 仍不会更新
请帮助我解决此问题