⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 周立功公司的ARM处理器
💻 CPP
字号:
//////////////////////////////////////////////////////////////
// 基于C++类库CCAN及CLUT的LPC2000 CAN演示程序
// 周立功单片机版权所有
//////////////////////////////////////////////////////////////

#include "config.h"

#include "CAN.H"
#include "LUT.H"

#define  	TASK_STK_SIZE                  128
OS_STK		TaskStk[TASK_STK_SIZE];
OS_STK		TaskStartStk[TASK_STK_SIZE];

void  TaskStart(void *pdata);
volatile UINT32 err;
OS_EVENT *pCANTxEvt;

class CMyCAN : public CCAN		// 从CCAN基类派生出CMyCAN,目的是实现虚拟函数的重载,改写原有的中断处理
{
public:
	CMyCAN(UINT32 index,UINT32 RxBufZise) : CCAN(index,RxBufZise)
	{
		// 直接使用构造函数,在此可以不用做任何处理;
		// 注意带参数的构造方法!!!
	}
	
protected:
	virtual void OnTI(_CANICR icr)
	{
		OSSemPost(pCANTxEvt);			//产生一个通知消息
		UNREFERENCED_PARAMETER(icr);
	}
};


CMyCAN Can1(1,16);

void __irq CAN1TxRxINT(void)	// CAN1的发送接收VIC中断函数
{
	Can1.IntEntry();			// 调用成员函数处理接收、发送中断
	VICVectAddr = 0;
}

void __irq LUTINTorOther(void)	// 表格错误或其他CAN中断入口
{
    err = CANLUTerrAd;			// debug
	Can1.IntEntry();			// 调用成员函数处理CAN的其他中断

	VICVectAddr = 0;
}

void delay()
{
	for(int i=5000;i;i--);
}

extern "C" void TargetInit(void);		//注意在C++中声明C文件函数的方法

int main()
{
	TargetInit();
	
	OSInit();

    OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
    OSStart();
    return 0;
}


void  TaskStart(void *pdata)
{
	VICIntSelect &= ~((0x01L << 19) | (0x01L << 20) | (0x01L << 26));

	// CAN1 中断入口设定
	VICVectCntl10 = 0x20 | 20;
	VICVectAddr10 = (UINT32)CAN1TxRxINT;
	VICVectCntl11 = 0x20 | 26;
	VICVectAddr11 = (UINT32)CAN1TxRxINT;
	
	// 19共享中断入口设定
	VICVectCntl14 = 0x20 | 19;
	VICVectAddr14 = (UINT32)LUTINTorOther;
	
	// 打开相应的VIC中断允许
	VICIntEnable = ((0x01L << 19) | (0x01L << 20) | (0x01L << 26));
	
	// 设置接收过滤器模式
	CLUT::AFSetMode(0);		// 不接任何收数据
	
	_CANBTR btr;

	btr.dwValue = 0;		// 1000K波特律的设置
	btr.Bits.BRP = 0;
	btr.Bits.TSEG1 = 7;
	btr.Bits.TSEG2 = 1;
	btr.Bits.SJW = 0;
	btr.Bits.SAM = 0;

	// 用波特率初始化CAN
	Can1.Initial(btr);

	// 启动总线进入工作模式
	Can1.SoftBusEnable();
	
	_CANTxBUF txbuf;		//
	
	txbuf.fi.Bits.DLC=8;
	txbuf.fi.Bits.FF = 0;
	txbuf.fi.Bits.RTR=0;
	
	txbuf.id.dwValue=0;
	txbuf.da.dwValue=0x01234567;
	txbuf.db.dwValue=0x89abcdef;
	
	pCANTxEvt = OSSemCreate(0);
	if(pCANTxEvt == NULL)
	{
		while(1);		// debug only
	}
	
	INT8U error=0;
	UINT32 bch=1;
	
	while(1)
	{
	
		bch=Can1.Transmit(&txbuf);
		
		OSSemPend(pCANTxEvt,200,&error);
		
		if(OS_TIMEOUT == error)		// 1s 超时
		{
			// 发送超时,失败错误处理
			
			if(!Can1.IsTransCompleted(bch))
			{
				Can1.AbortTransmit(bch);
			
				continue;
			}
		}
		
		txbuf.id.dwValue++;			// ID递增	
		
		OSTimeDlyHMSM(0,0,1,0);		// 简单延时1秒
	
	}
	
	UNREFERENCED_PARAMETER(pdata);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -