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

📄 can控制器的程序设计.txt

📁 TMS320C2407 CAN控制器的C语言程序设计
💻 TXT
字号:
程序如下:
1.建立中断向量表(汇编)
		.ref   _nothing,_c_int0,_GRIS5		;声明在其他程序中定义														;并在本程序中需要使用的变量或标号
		.sect	".vectors"					;定义主向量段
RSVECT		B   _c_int0				;复位向量
INT1	  		B   _nothing				;中断向量1
INT2	  		B   _nothing				;中断向量2
INT3	  		B   _nothing				;中断向量3
INT4	  		B   _nothing				;中断向量4
INT5	  		B   _GRIS5				;中断向量5
INT6	  		B   _nothing				;中断向量6
RESERVED  	B   _nothing	
SW_INT8 		B 	_nothing 	
……
SW_INT31  	B    _nothing
2.C语言程序
#include "f2407_c.h"       					// 引用头部文件
int CAN_FLAG;							// 定义标志寄存器
void sytem_init();							// 声明在程序中需要用到的函数
void CANMBX_ISR();
void CAN_INIT();               
void inline disable() 						// 中断屏蔽子程序
{
	asm(" setc INTM");
}
void inline enable()						// 中断使能子程序 
{
	asm(" clrc INTM");
}
(1)	主程序
main() 
{ 
	sytem_init();						// 系统初始化程序
     CAN_FLAG=0X00;					// 清CAN用户标志,CAN_FLAG=01表示接收到数据
     CAN_INIT();						//  CAN初始化程序
     enable(); 							// 中断使能
     for(;;)
     {
          *TCR=0X20;					// MBX3请求发送 
	     while(*TCR&0X2000==0)			// 等待发送应答
continue; 
	     *TCR=0X2000; 					// 清 TA3 和MIF3标志位
	     while(CAN_FLAG==0)
continue;						// 等待接收数据
	     CAN_FLAG=0;					// 清接收到标志
	     *MDER=0X0000;       			// 邮箱不使能
	     *MCR=0X0140;       			//  CDR=1,数据改变请求
	     *MBX3A=*MBX2A+1;			// 邮箱2中数据加1用来更新邮箱3中的数据
	     *MBX3B=*MBX2B+1;
	     *MBX3C=*MBX2C+1;
	     *MBX3D=*MBX2D+1;
	     *MCR=0X04C0;					//  DBO=1,CDR=0,ABO=1,STM=1
	     *MDER=0X04C;   				//  ME2=ME3=1,MBX2接收, MBX3发送
	     }
}
(2)系统初始化子程序
void sytem_init()
{
    	asm(" setc INTM");
	asm(" setc SXM");
	asm(" clrc OVM");
	asm(" clrc CNF");
	*IMR=0x0010;						// 开中断优先级5
	*IFR=0xFFFF;						// 清中断标志位
*SCSR1=0x81FE;                 
*WDCR=0xE8;                   
}
(3)CAN初始化子程序
void CAN_INIT()
{
	*MCRB=*MCRB|0X0C0;      			// 设置IOPC6、IOPC7 为 CANRX,CANTX
	*CAN_IFR=0XFFFF;					// 清所有CAN中断标志
	*LAM1_H=0X7FFF;					// 设置邮箱2、3的屏蔽ID寄存器
	*LAM1_L=0XFFFF;					// 0则ID必须匹配
	*MCR=0X1040;						//  CCR=1 改变配置请求
	while(*GSR&0X0010==0)continue;		// 当CCE=1 时即可配置 BCR2,BCR1 寄存器
	*BCR2=0X01;						// 波特率预分频寄存器
	*BCR1=0X033;						// 波特率设置为1M
	*MCR=*MCR&0XEFFF;				//  CCR=0 改变配置结束请求
	while(*GSR&0X0010!=0)continue; 		// 只有当CEE=0时,BCR2,BCR1 寄存器配置成功
	*MDER=0X040;  					// 不使能邮箱,邮箱2设为接收方式
	*MCR=0X0143;            			//  CDR=1,数据区改变请求
	*MSGID2H=0X2447;					// 设置邮箱2的控制字及ID
									//  IDE=0, AME=0, AAM=0
									// 标准方式为MSGID2H[12-2]
	*MSGID2L=0XFFFF;
	*MSGCTRL2=0X08; 					// 设置控制域
									// 数据长度DCL = 8,RTR=0 数据帧
	*MBX2A=0X0000;					// 邮箱2信息初始化
	*MBX2B=0X0000;
	*MBX2C=0X0000;
	*MBX2D=0X0000;
	*MSGID3H=0X2447;					// 设置邮箱3的标识符
	*MSGID3L=0XFFFF;
	*MSGCTRL3=0X08;					//  RTR=0,DCL=8
	*MBX3A=0X2211;					// 邮箱3信息初始化
	*MBX3B=0X4433;
	*MBX3C=0X6655;
	*MBX3D=0X8877;
	*MCR=0X04C0;						//  DBO=1,ABO=1,STM=1设置为自测试模式
	*MDER=0X4C;						//  ME3=1,MBX3 发送, ME2=1 接收
	*CAN_IMR=0XF7FF;					// 中断MBX3 不使能 ,MBX2使能, 低中断优先级
	*CAN_IFR=0XFFFF;					// 清全部中断标志
}
(4)中断程序		
void interrupt GRIS5() 						// 中断入口程序
{ 
	switch(*PIVR)
	{
		case 64:
CANMBX_ISR();			// 邮箱2接受到相应信息则进入中断服务子程序
			break;
}   
}        
void CANMBX_ISR()						// 邮箱2接收中断服务子程序
{
  	*RCR=0X040;						// 复位 RMP2 和 MIF2
  	CAN_FLAG=1;						// 置用户接收标志
}
void interrupt nothing()						// 假中断程序
{      
}               

⌨️ 快捷键说明

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