📄 main.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 + -