STM32固件库CAN控制相关结构体

本文章是在野火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)。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值