大家好、
我尝试编写实现 CAN 串行协议的简单代码、这里是发送器 Launchpad 代码。
当我单步执行时、我会观察到这一点
CANIntRegister (CAN0_BASE、CANIntHandler);
函数白色 LED 只是亮起(查看处理程序代码)、执行在下一行停止
当我单步执行时、我尝试在启动文件中静态注册处理程序
IntEnable (INT_CAN0);
函数它打开白色 LED、执行在代码的下一行停止。
在这两种情况下,我都尝试继续步进以查看 CANmsgSet()之后发生的情况。 我发现代码一直卡在处理程序中(LED 持续闪烁)。
有人能帮忙吗?
此致、
斯里特
#pragma diag_push
#pragma CHECK_MISRA ("无")
#include
#include
include "stdlib.h"
//#include "ih/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_uart.h"
#include "inc/hw_gpio.h"
#include "driverlib/driverh/driver.h"
#include "driverlib/driver.h"#include "driverline/driver.h"#driverlib/driver.h"#include "driverlib#driverline"#driverlib.driver.h"#driverlib.driver.h"#include "driverlib.driver.h"#driverlib#driverlib.driverlib#driver.h"#include "driverline"#include "driver.h"#driverlib.driverlib.driver.h"#include "driverlib.driver.h"#include "driverlib.driver.h"#include "driverlib.driver.h"#driverlib#driverlib#driver.h"#include "driverlib.driverlib#driverlib.driver.h"#include "driver.h"#driver
#include
#include
#include
#pragma diag_pop
void CANIntHandler (void);
int main (void);
int main (void){
SysCtlClockSet (SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHz);
PORTF_Init();
// CAN0和 Porte 配置
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
while (!SysCtlPeripheralReady (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);
while (!SysCtlPeripheralReady (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 消息对象
tCANMsgObject msg;
uint32_t msgData;
uint8_t *msgDataPtr =(uint8_t *)&msgData;
msgData = 0;
MSG.ui32MsgID = 1;
MSG.ui32MsgIDMask = 0;
MSG.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
MSG.ui32MsgLen = sizeof (msgDataPtr);
MSG.pui8MsgData = msgDataPtr;
while (1){
CANMessageSet (CAN0_BASE、1、&msg、MSG_OBJ_TYPE_TX);
SysTick80_delay_10ms (300);
}
返回0;
}
void CANIntHandler (void){
GPIO_PORTF_DATA_R θ^= 0x0E;//切换白色 LED
SysTick80_DELAY_10ms (300);
CANIntClear (CAN0_BASE、1);//清除中断
无符号长整型状态= CANIntStatus (CAN0_BASE、CAN_INT_STS_CAUST);//读取中断状态
if (status =CAN_INT_INTID_STATUS){//控制器状态中断
状态= CANStatusGet (CAN0_BASE、CAN_STS_CONTROL);//读回错误位,对它们执行什么操作?
} 否则、如果(status = 1){//消息对象1
CANIntClear (CAN0_BASE、1);//清除中断
}