STM32F767IG平台的CAN1/CAN2/CAN3的驱动调试(寄存器版)

        一开始是基于STM32Cube来生成的驱动进行调试,但是直接生成的项目并不能用,到网上去搜索发现资料不仅少的可怜,而且使用的库不一样,仅仅得到的信息就是使用CAN2前必须使能CAN1的时钟,然而我使能后依然无法使用。尝试无果之后决定采用寄存器来从底层开始弄。

        寄存器基础代码使用正点原子的例子程序。该例子程序使用的是CAN1。

       重点是:多看手册,看手册,手册!!!!!!!!

       CAN配置过程中的要点:

       1、硬件线路,硬件线路必须接对,这是最基本的,硬件线路接不对,软件肯定是跑不通的。

      2、复用CAN,复用CAN的地方CAN1,CAN2是AF9,CAN3是AF11,这个是查手册,中文版中没有CAN3,要看英文版的。在寄存器RCC_APB1RSTR中有说明。

       3、时钟配置,CAN1和CAN3是独立使能自己就行,CAN2使能前必须先使能CAN1,这里的必须是项目中只要在CAN2之前使能过CAN1就可以了,不必分要把使能代码也放在一起。       比如例子工程中的初始化顺序是CAN1 CAN2 CAN3,那么CAN2在初始化时就不再需要使能CAN1了。

     4、配置CAN属性和波特率,这部分很正常,没出现问题。

     5、配置过滤器,STM32Cube创建的项目里没有这一项,导致了怎么调都调不通,也可能是我不太会用这个工具。

          配置这个要分为CAN1&CAN2一组,CAN3一组

          先来看CAN1&CAN2这一组,CAN1也好CAN2也罢,必须要配置CAN1的过滤器才行,配置CAN2是没用的,总共有28个过滤器,CAN1是从0-13   can2从14-27
         再来看CAN3这一组,CAN3是独立的一个CAN通道,所有东西都是自己的,与CAN1和CAN2不关联。它的过滤器是从0开始,总共14个。

         具体的配置过程看各路CAN的配置代码。

     6、配置中断,我是将CAN1和CAN2配置给了FIFO0,这个的FIFO0和前面的过滤器挂在的FIFO要一直,过滤器挂在在FIFO0中断就必须配置在FIFO0,否则是收不到数据的。

 

//------------------------------------------  代码展示 -------------------------------------------------

        CAN1配置代码:

/*
说明:CAN1初始化
输入:tsjw:重新同步跳跃时间单元.范围:1~3;
      tbs2:时间段2的时间单元.范围:1~8;
      tbs1:时间段1的时间单元.范围:1~16;
      brp :波特率分频器.范围:1~1024;(实际要加1,也就是1~1024) tq=(brp)*tpclk1
      注意以上参数任何一个都不能设为0,否则会乱.
      波特率=Fpclk1/((tbs1+tbs2+1)*brp);
      mode:0,普通模式;1,回环模式;
      Fpclk1的时钟在初始化的时候设置为54M,如果设置CAN1_Mode_Init(1,7,10,6,1);
      则波特率为:54M/((7+10+1)*6)=500Kbps
返回:0,初始化OK;
     其他,初始化失败;
*/
u8 CAN1_Init(u8 tsjw,u8 tbs2,u8 tbs1,u16 brp,u8 mode)
{
	u16 i=0;
 	if(tsjw==0||tbs2==0||tbs1==0||brp==0)return 1;
	tsjw-=1;//先减去1.再用于设置
	tbs2-=1;
	tbs1-=1;
	brp-=1;

	RCC->AHB1ENR|=1<<0;  	//使能PORTA口时钟 
	GPIO_Set(GPIOA,PIN11|PIN12,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PA11,PA12,复用功能,上拉输出
 	GPIO_AF_Set(GPIOA,11,9);//PA11,AF9
	GPIO_AF_Set(GPIOA,12,9);//PA12,AF9 	   
 
	RCC->APB1ENR|=1<<25;//使能CAN1时钟 CAN1使用的是APB1的时钟(max:48M)
	CAN1->MCR=0x0000;	//退出睡眠模式(同时设置所有位为0)
	CAN1->MCR|=1<<0;		//请求CAN进入初始化模式
	while((CAN1->MSR&1<<0)==0)
	{
		i++;
		if(i>100)return 2;//进入初始化模式失败
	}
	CAN1->MCR|=0<<7;		//非时间触发通信模式
	CAN1->MCR|=0<<6;		//软件自动离线管理
	CAN1->MCR|=0<<5;		//睡眠模式通过软件唤醒(清除CAN1->MCR的SLEEP位)
	CAN1->MCR|=1<<4;		//禁止报文自动传送
	CAN1->MCR|=0<<3;		//报文不锁定,新的覆盖旧的
	CAN1->MCR|=0<<2;		//优先级由报文标识符决定
	CAN1->BTR=0x00000000;	//清除原来的设置.
	CAN1->BTR|=mode<<30;	//模式设置 0,普通模式;1,回环模式;
	CAN1->BTR|=tsjw<<24; 	//重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位
	CAN1->BTR|=tbs2<<20; 	//Tbs2=tbs2+1个时间单位
	CAN1->BTR|=tbs1<<16;	//Tbs1=tbs1+1个时间单位
	CAN1->BTR|=brp<<0;  	//分频系数(Fdiv)为brp+1
							//波特率:Fpclk1/((Tbs1+Tbs2+1)*Fdiv)
	CAN1->MCR&=~(1<<0);		//请求CAN退出初始化模式
	while((CAN1->MSR&1<<0)==1)
	{
		i++;
		if(i>0XFFF0)return 3;//退出初始化模式失败
	}
	//过滤器初始化
	CAN1->FMR|=1<<0;		//过滤器组工作在初始化模式
	CAN1->FA1R&=~(1<<0);	//过滤器0不激活
	CAN1->FS1R|=1<<0; 		//过滤器位宽为32位.
	CAN1->FM1R|=0<<0;		//过滤器0工作在标识符屏蔽位模式
	CAN1->FFA1R|=0<<0;		//过滤器0关联到FIFO0
	CAN1->sFilterRegister[0].FR1=0X00000000;//32位ID
	CAN1->sFilterRegister[0].FR2=0X00000000;//32位MASK
	CAN1->FA1R|=1<<0;		//激活过滤器0
	CAN1->FMR&=0<&l
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值