设置完CAN的引脚之后还需要打开CAN的时钟:/* CAN Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN,ENABLE);
2. 初始化2.1.2 CAN报文过滤器初始化 STM32共有14组过滤器,每组过滤器包括了2个可配置的32位寄存器:CAN_FxR0和CAN_FxR1。 可以将过滤器组配置成屏蔽位模式,这样CAN_FxR0中保存的就是标识符匹配值,CAN_FxR1中保存的是屏蔽码,即CAN_FxR1中如果某一位为1,则CAN_FxR0中相应的位必须与收到的帧的标志符中的相应位吻合才能通过过滤器;CAN_FxR1中为0的位表示CAN_FxR0中的相应位可不必与收到的帧进行匹配。 还可以将过滤器组配置成标识符列表模式,此时CAN_FxR0和CAN_FxR1中的都是要匹配的标识符,收到的帧的标识符必须与其中的一个吻合才能通过过滤。 对CAN报文过滤器的初始化实际上就是对接收FIFO邮箱标识符寄存器(CAN_RixR)(x=0,1)的设置。这些寄存器如下图所示: 31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | STID[10:0] | | r | r | r | r | r | r | r | r | r | r | r | r | r | r | r | r |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | EXID[12:0] | | | | r | r | r | r | r | r | r | r | r | r | r | r | r | r | r | r |
CAN_RIxR寄存器各位域定义: 位 | | | STID[10:0]:标准标识符 标识符的标准部分 | | EXID[17:0]: 扩展标识符 标识符的扩展部分(如果使用了扩展标识符) | | IDE:标识符选择 0:标准标识符;1:扩展标识符 | | | | |
注意:CAN_FilterIdHigh是指高16位,CAN_FilterIdLow是低16位,应该将需要得到的帧和过滤器的设置值坐对齐起。 采用stm32f10x标准外设库时过滤器的完整设置如下: CAN_FilterInitTypeDef CAN_FilterInitStructure; //定义一个过滤器
CAN_FilterInitStructure.CAN_FilterNumber=0; //选定第一组过滤器
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//屏蔽位模式
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; //32位
CAN_FilterInitStructure.CAN_FilterIdHigh=(0x0010 << 5); //接收ID为10的消息,11位标准帧因此左移5位
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0xFFFF;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0xFFFF;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0; //第一组过滤器指向FIFO0
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);
|