在 STM32 互联型产品中,带有 2 个 CAN 控制器,而我们使用的STM32F103ZET6 属于增强型,不是互联型,只有 1 个 CAN 控制器.
两个 CAN 都分别拥有自己的发送邮箱和接收 FIFO,但是他们共用 28 个滤波器。
发送邮箱共有3个
具有 3 级深度的 2 个接收 FIFO
通过主控制寄存器的 RFLM 位,可设置锁定模式
CAN 总线上数据是以广播的形式发送的,所有连接在 CAN 总线的节点都会收到所有其它节点发出的有效数据,因而我们的 CAN 控制器大多具有根据 ID 过滤报文的功能,它可以控制自己只接收某些 ID的报文。减少了CPU处理CAN通信的开销。
STM32F103ZET6 只有 14 个(增强型)过滤器组。
STM32 每个过滤器组的位宽都可以独立配置
过滤器可配置为,屏蔽位模式和标识符列表模式。
该寄存器必须在过滤器处于初始化模式下(CAN_FMR 的 FINIT 位=1),才可以进行设置。
对 28 个滤波器组的工作模式,都可以通过该寄存器设置,对 STM32F103ZET6 来说,只有[13:0]这 14 个位有效。
过滤器工作的两种模式
用来存储要筛选的 ID 或掩码
x(CAN_FiRx)(互联产品中 i=0~27,其它产品中 i=0~13;x=1/2)
后两个模式是在互联型产品中的,F103不需要关注。
举个简单的例子,我们设置过滤器组 0 工作在:1 个 32 位过滤器-标识符屏蔽模式,然后设置 CAN_F0R1=0XFFFF0000,CAN_F0R2=0XFF00FF00。
第一步就要使能 CAN 的时钟。其次要设置 CAN 的相关引脚为复用输出,设置 PA11 为上拉输入(CAN_RX 引脚)PA12 为复用输出(CAN_TX 引脚),并使能 PA 口的时钟。使能 CAN1 时钟的函数是:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能 CAN1 时钟
具体函数
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能 PORTA 时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);//使能 CAN1 时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 IO
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 IO
CAN是挂载在APB1之下的。