本文章是在野火STM32教程的基础上写下并加以补充写出
(错误可在评论区指出)
初始化结构体: CAN_InitTypeDef
发送及接收结构体: CanTxMsg及 CanRxMsg
筛选器结构体: CAN_FilterInitTypeDef
初始化结构体CAN_InitTypeDef
如果是F103就只能使用CAN1,如果是F105,107,403等有两组CAN控制器,其中CAN1是主设备,CAN2无法直接访问存储区域,所以使用CAN2的时候必须使能CAN1外设的时钟。
1,时钟分频
这里直接写就好,虽然Tq=(BRP[9: 0]+1)X TPCLK,但是写入的值会直接减1,例如我写入3,但是事实上3放进去后,由于stm32f10x_can.c第256行会将这个数字减去1再输入,即BRP[9: 0]为2,再加上1,实际值与输入值相等,即.Tq=CAN_Prescaler*TPCLK
2,配置工作模式
正常模式( CAN_Mode_Normal)
回环模式(CAN_Mode_LoopBaαk)
静默模式( CAN_Mode_ Silent)
回环静默模式(CAN_Mode_Silent_Loopback)
3,SJW极限值
本成员可以配置SJW的极限长度,即CAN重新同步时单次可增加或缩短的最大长度,它可以被配置为1-4Tq( CAN_SJW_1/2/3/4tq)。
注意:
SJW如果设置得过大,可能会导致过多的时间窗口选择,可能会降低通信的效率。
SJW如果设置得过小,可能导致位同步的时间窗口变得很小,使得系统对时钟偏差的容忍度降低。
这可能导致网络中节点之间的时钟差异不可容忍,从而影响通信的稳定性。
如果节点之间的时钟同步问题严重,可能导致数据帧的错误和重新发送,从而影响整体通信性能。
4,BS1长度
使用CAN_BS1配置,可以配置为1~16Tq
注意:地址假如配置的是1tq,地址是0x00而不是0x01,BS2也是如此
5,BS2长度
使用CAN_BS2配置,可以配置为1~8Tq
将SYNC_SEG,BS1,BS2段长度相加即一个数据位长度
T1bt=1Tq+Ts1+Ts2=1+(TS1[3:0]+1)+(TS2[2:0]+1)=1Tq+CAN_BS1+CAN_BS2
6,TTCM时间触发功能
针对那些对通信时序要求非常高的特定应用,一般情况下不使用,可以选择使用CAN的传统事件触发通信模式(ETCM)。
7,ABOM自动离线管理
用于处理节点由于错误而进入总线脱网状态。
总线脱网状态是指节点发生了太多错误,导致它主动退出通信,以防止对整个CAN网络造成更多的干扰。当 ABOM 被设置为 ENABLE 时,节点会尝试在发生总线脱网状态后自动处理,以尽量减少对整个系统的影响。这可以提高系统的容错性和稳定性。
当 ABOM 被设置为 DISABLE 时,节点在发生总线脱网状态后不会尝试自动恢复。此时,软件可能需要手动干预以使节点重新进入通信状态。
8,AWUM自动唤醒
一般情况下使能。各个节点(如传感器、控制器、执行器等)经常需要在不发送或接收数据的时候进入低功耗模式,以节省能源。包括自动进入低功耗模式,自动唤醒,快速响应。
9,NART自动重传
如果发送失败,就会一直发送,如果不使能,发送失败就算了
10,RFLM锁定FIFO
锁定后,当接收FIFO溢出时,会丢弃下一个接收的报文。若不锁定,则下一个接收到的报文会覆盖最旧的报文。
11,TXFP报文优先级判定方法
TXFP报文发送优先级的判定方法,当CAN外设的发送邮箱中有多个待发送报文时,本功能可以控制它是根据报文的ID优先级还是报文存进邮箱的顺序来发送。(一般根据ID,ID代表了紧急程度)
发送及接收结构体: CanTxMsg及 CanRxMsg
1,ID配置
如果是标准标识的话只用写StdId,如果是扩展标识的话只用写EztId
2,IDE配置
扩展标准位,如果是CAN_ID_STD表示标准帧,如果是CAN_ID_EXT表示扩展帧
3,RTR配置
本成员存储的是报文类型标志RTR位
当它的值为宏 CAN_RTR_Data时表示本报文是数据帧;当它的值为宏 CAN_RTR_Remote时表示本报文是遥控帧,由于遥控帧没有数据段,所以当报文是遥控帧时,下面的Data[8]成员的内容是无效的。
4,DLC配置
储存的是数据帧和数据段的长度,值得范围是0~8,当报文是遥控帧时DLC值为0
5,FMI配置(只有接受结构体才有)
储存了筛选器编号,储存了本报文是由哪个筛选器存储进接受FIFO的
发送使用
uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage);
查看是否发送成功使用
uint8_t CAN_TransmitStatus(CAN_TypeDef* CANx, uint8_t TransmitMailbox);
接受使用
CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage)
筛选器结构体: CAN_FilterInitTypeDef

CAN_FilterFIFOAssignment
用于设置当报文通过筛选器的匹配后,该报文会被存储到哪一个接收FIFO,它的可选值为FIFO0/1
CAN_FilterNumber
用于设置筛选器的编号,即本过滤器结构体配置的是哪一组筛选器,CAN共有28组,F103只能设置0~13,F105是0~27。
CAN_FilterMode
用于设置筛选器模式,可选列表模式和掩码模式
CAN_FilterScale
用于设置筛选器尺度,可以设置32位长及16位长
CAN_FilterActivation
用于设置是否激活这个筛选器(宏 ENABLE/ DISABLE)。