STM32F10xx CAN BUS相关库文件的库函数解析
扫描二维码
随时随地手机看文章
一、背景:
还是继续CAN通信,要节省开发时间,使用库函数可大大降低开发周期,并且还能确保寄存器的配置几
乎是万无一失,所以,在此就STM32F10xx的CAN操作库函数的使用做个简析。
STM32有库函数这件事,对软件开发人员来说是极其利好的,对库函数有褒有贬,说不好的,无非就是
库函数会占用一些额外Ram,并且不利于新手对于这款单片机更深层次的理解等等。我倒觉得,不应当有这
些顾虑,首先,库函数那都是由一些非常牛,并且对该型MCU极其了解的厂方工作人员编写,不去说万无一
失,但也是绝对按照标准来的好东西;其次,开发最重要的既是时间,先利用库函数实现快速开发,如若需
要深层次定制或者更改,再来对其进行研究,这样就可以节省时间去完成别人还未做过的事情,然后自己努
力去变成一个为别人提供库函数的人 :) ;至于新手,若需要知道如何正确使用库函数,必然会去研究手册
上那些东西。所以,推荐有库函数则优先使用库函数。貌似跑题了 - -! 继续,开始正文。
二、正文:
1、void CAN_DeInit(CAN_TypeDef* CANx)
// 操作APB1外设复位寄存器。对CAN进行复位操作。
// 在STM32F10xx中,CAN的时钟由APB1分频提供。
2、uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct)
// 根据CAN_InitStruct结构体(详见以下),对CAN进行初始化操作。
typedef struct
{
// CAN_Mode(Loop back mode)
/* 0: 禁止环回模式。
* 1:允许环回模式。
*/
uint8_t CAN_Mode;
// 以下4个参数,决定了CAN的波特率(具体如何配置,网上有计算工具)
uint16_t CAN_Prescaler;
uint8_t CAN_SJW;
uint8_t CAN_BS1;
uint8_t CAN_BS2;
// TTCM(Time Triggered communication mode)
/* 在该模式下,CAN硬件的内部定时器被激活,并且被用于产生(发送与接收邮箱的)时间戳,
* 分别存储在CAN_RDTxR/CAN_TDTxR寄存器中。内部定时器在每个CAN位时间(见22.7.7节)累加。
* 内部定时器在接收和发送的帧起始位的采样点位置被采样,并生成时间戳。
*/
FunctionalState CAN_TTCM;
// ABOM(Automatic Bus-off managerment)
/* 0:软件对CAN_MCR寄存器的INRQ位置"1"随后清"0"后,一旦硬件检测到128次11位连续的隐形位,
* 则退出离线状态。
* 1:硬件检测到128次11位连续的隐形位,则自动退出离线状态。
*/
FunctionalState CAN_ABOM;
// AWUM (Automatic wakeup mode)
/* 0:由软件清除CAN_MCR的"SLEEP"位后,唤醒睡眠模式。
* 1:检测到报文,由硬件自动唤醒,且自动清零"SLEEP""SLAK"
*/
FunctionalState CAN_AWUM;
// NART(No Automatic retransmission)
/* 0:按照CAN标准,CAN硬件在发送报文失败后会一直重新发送直至发送成功。
* 1:CAN报文只发送一次。不管发送结果如何。
*/
FunctionalState CAN_NART;
// RFLM (Receive FIFO Locked mode)
/* 0:接收溢出后,FIFO未被锁定,即报文会被新报文覆盖。
* 1:接收溢出后,FIFO被锁定,即新报文会被丢弃。
*/
FunctionalState CAN_RFLM;
// TXFP(Transmit FIFO priority)
/* 0:优先级由报文的标识符来决定。
* 1:优先级由发送请求的顺序来决定。
*/
FunctionalState CAN_TXFP;
// FunctionalState-----------------------------------------------------|
} CAN_InitTypeDef; |
|
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;<------------|
3、void CAN_StructInit(CAN_InitTypeDef* CAN_InitStruct)
// 将所有的CAN设置均设置为初始值。
4、void CAN_FilterInit(CAN_FilterInitTypeDef* CAN_FilterInitStruct)
// 根据结构体CAN_FilterInitStruct(详见如下)对CAN滤波进行初始化操作。
typedef struct
{
// CANFxR1 高16位
uint16_t CAN_FilterIdHigh;
// CANFxR1 低16位
uint16_t CAN_FilterIdLow;
// CANFxR2 高16位
uint16_t CAN_FilterMaskIdHigh;
// CANFxR2 低16位
uint16_t CAN_FilterMaskIdLow;
// 对应哪一个过滤器
uint8_t CAN_FilterNumber;
// 对应的CAN_FilterNumber过滤器模式选择(FM1R)
/* 过滤器组(14组)的2个32位寄存器工作在标识符屏蔽位模式。
* 过滤器组(14组)的2个32位寄存器工作在标识符列表模式。
*/
uint8_t CAN_FilterMode;
// 对应的CAN_FilterNumber过滤器位宽设置(CAN_FS1R)
/* CAN_FilterScale_16bit: 两个16位过滤器
* CAN_FilterScale_32bit: 单个32位过滤器
*/
uint8_t CAN_FilterScale;
// 报文被过滤后,存放的哪个FIFO中。(CAN_FFA1R)
// 每个FIFO可以存放3条报文。
/* CAN_Filter_FIFO0: 过滤器被关联到了FIFO0
* CAN_Filter_FIFO1: 过滤器被关联到了FIFO1
*/
uint16_t CAN_FilterFIFOAssignment;
// 是否使能对应的CAN_FilterNumber滤波器
FunctionalState CAN_FilterActivation;
} CAN_FilterInitTypeDef;
5、void CAN_DBGFreeze(CAN_TypeDef* CANx, FunctionalState NewState)
/* 调试冻结,即在调试时,CAN有两种工作模式
* -->照常工作
* -->冻结其收发,但仍可对FIFO进行读写。
* 操作寄存器为"CAN_MCR"的"DBF"位(Debug Freeze)。
*/
6、void CAN_SlaveStartBank(uint8_t CAN_BankNumber)
/* 内部对CAN过滤器主控制器(CAN_FMR)进行操作。
* 功能