工具/软件:TI-RTOS
我一直在尝试在 TI-RTOS 上运行 CANIntHandler(),作为中断编号为55的硬件中断(Hwi)(从数据表55开始,为 CAN0分配)。 但中断状态最终显示错误。
我 已将 CAN_Rx()分配为任务。
请帮我处理该代码
/* XDCtools 头文件*/
#include
#include
#include
/* BIOS 头文件*/
#include
/*板头文件*/
#include "Board.h"
#include
#include
#include
void "inc/hw_gpio.h"#include "void/hw_types.h"#include "inc/hw_ints.h"#include "inc/hw_memmap.h"#include "driverlib/sysctL.h"#include "driverlib/pin_map.h"#include "driverlib/volatile trl.h";包含"driverlib#driverlib/volature.h"#br/volature.eh"#include "driverlib#br/volatile/driveride"#br/trl.eh"#include #br/包含#b#b#br/volatile/r.eh"
void CANIntHandler (void);
void main (void)
{
hardware_init ();
BIOS_start();
}
void hardware_init (void)
{
//将时钟设置为直接从晶体运行。
SysCtlClockSet (SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN);
//设置调试 UART
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
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、SysCtlClockGet ());
//设置 CAN0
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
GPIOPinConfigure (GPIO_PE4_CAN0RX);
GPIOPinConfigure (GPIO_PE5_CAN0TX);
GPIOPinTypeCAN (GPIO_Porte _BASE、GPIO_PIN_4 | GPIO_PIN_5);
SysCtlPeripheralEnable (SYSCTL_Periph_CAN0);
CANInit (CAN0_BASE);
CANBitRateSet (CAN0_BASE、SysCtlClockGet ()、50000);
//CANIntRegister (CAN0_BASE、CANIntHandler);//使用动态矢量表分配
CANIntEnable (CAN0_BASE、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
IntEnable (INT_CAN0);
CANEnable (CAN0_BASE);
}
// CAN 中断处理
程序 void CANIntHandler (void){
无符号长整型状态= CANIntStatus (CAN0_BASE、CAN_INT_STS_CAUST);//读取中断状态
if (status =CAN_INT_INTID_STATUS){//控制器状态中断
STATUS = CANStatusGet (CAN0_BASE、CAN_STS_CONTROL);
UARTprintf ("%l/"、status);//这在我的代码中显示了错误
错误标志= 1;
} 否则、如果(status ==1){// msg 对象1
CANIntClear (CAN0_BASE、1);//清除中断
rxFlag = 1;//设置 Rx 标志
错误标志= 0;//清除任何错误标志
} 否则{//永远不会发生
UARTprintf ("意外的 CAN 总线中断\n");
}
}
void CAN_Rx (void)
{
tCANMsgObject msg;// CAN msg 对象
// uint8_t msgData[8];
unsigned char msgData[8];//用于 Rx 消息数据的8字节缓冲区
unsigned int uIdx;
//使用 ID 和掩码0接收包含任何 CAN ID 的消息
MSG.ui32MsgID = 0;
MSG.ui32MsgIDMask = 0;
MSG.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
MSG.ui32MsgLen = 8;//最多允许8个字节
//将 msg 加载到 CAN 外设报文对象1中,以便它可以触发任何匹配的 Rx 报文上的中断
CANMessageSet (CAN0_BASE、1、&msg、MSG_OBJ_TYPE_RX);
while (1){
if (rxFlag){//发生 Rx 中断
MSG.pui8MsgData = msgData;//设置指向 Rx 缓冲区的指针
CANMessageGet (CAN0_BASE、1、&msg、0);//从 CAN 外设读取 CAN 消息对象1
rxFlag = 0;//清除 Rx 标志
if (msg.ui32Flags & MSG_obj_data_lost){//检查消息是否丢失
UARTprintf ("检测到 CAN 消息丢失\n");
}
UARTprintf ("Msg ID=0x%08X len=%u data=0x"、msg.ui32MsgID、msg.ui32MsgLen);
for (uIdx = 0;uIdx < msg.ui32MsgLen;uIdx++)
{
UARTprintf ("%d\"、msgData[uIdx]);
}
}
返回0;
}