STM32F10xx CAN BUS相關庫文件的庫函數(shù)解析
一、背景:
還是繼續(xù)CAN通信,要節(jié)省開發(fā)時間,使用庫函數(shù)可大大降低開發(fā)周期,并且還能確保寄存器的配置幾
乎是萬無一失,所以,在此就STM32F10xx的CAN操作庫函數(shù)的使用做個簡析。
STM32有庫函數(shù)這件事,對軟件開發(fā)人員來說是極其利好的,對庫函數(shù)有褒有貶,說不好的,無非就是
庫函數(shù)會占用一些額外Ram,并且不利于新手對于這款單片機更深層次的理解等等。我倒覺得,不應當有這
些顧慮,首先,庫函數(shù)那都是由一些非常牛,并且對該型MCU極其了解的廠方工作人員編寫,不去說萬無一
失,但也是絕對按照標準來的好東西;其次,開發(fā)最重要的既是時間,先利用庫函數(shù)實現(xiàn)快速開發(fā),如若需
要深層次定制或者更改,再來對其進行研究,這樣就可以節(jié)省時間去完成別人還未做過的事情,然后自己努
力去變成一個為別人提供庫函數(shù)的人 :) ;至于新手,若需要知道如何正確使用庫函數(shù),必然會去研究手冊
上那些東西。所以,推薦有庫函數(shù)則優(yōu)先使用庫函數(shù)。貌似跑題了 - -! 繼續(xù),開始正文。
二、正文:
1、void CAN_DeInit(CAN_TypeDef* CANx)
// 操作APB1外設復位寄存器。對CAN進行復位操作。
// 在STM32F10xx中,CAN的時鐘由APB1分頻提供。
2、uint8_t CAN_Init(CAN_TypeDef* CANx, CAN_InitTypeDef* CAN_InitStruct)
// 根據(jù)CAN_InitStruct結構體(詳見以下),對CAN進行初始化操作。
typedef struct
{
// CAN_Mode(Loop back mode)
/* 0: 禁止環(huán)回模式。
* 1:允許環(huán)回模式。
*/
uint8_t CAN_Mode;
// 以下4個參數(shù),決定了CAN的波特率(具體如何配置,網(wǎng)上有計算工具)
uint16_t CAN_Prescaler;
uint8_t CAN_SJW;
uint8_t CAN_BS1;
uint8_t CAN_BS2;
// TTCM(Time Triggered communication mode)
/* 在該模式下,CAN硬件的內(nèi)部定時器被激活,并且被用于產(chǎn)生(發(fā)送與接收郵箱的)時間戳,
* 分別存儲在CAN_RDTxR/CAN_TDTxR寄存器中。內(nèi)部定時器在每個CAN位時間(見22.7.7節(jié))累加。
* 內(nèi)部定時器在接收和發(fā)送的幀起始位的采樣點位置被采樣,并生成時間戳。
*/
FunctionalState CAN_TTCM;
// ABOM(Automatic Bus-off managerment)
/* 0:軟件對CAN_MCR寄存器的INRQ位置"1"隨后清"0"后,一旦硬件檢測到128次11位連續(xù)的隱形位,
* 則退出離線狀態(tài)。
* 1:硬件檢測到128次11位連續(xù)的隱形位,則自動退出離線狀態(tài)。
*/
FunctionalState CAN_ABOM;
// AWUM (Automatic wakeup mode)
/* 0:由軟件清除CAN_MCR的"SLEEP"位后,喚醒睡眠模式。
* 1:檢測到報文,由硬件自動喚醒,且自動清零"SLEEP""SLAK"
*/
FunctionalState CAN_AWUM;
// NART(No Automatic retransmission)
/* 0:按照CAN標準,CAN硬件在發(fā)送報文失敗后會一直重新發(fā)送直至發(fā)送成功。
* 1:CAN報文只發(fā)送一次。不管發(fā)送結果如何。
*/
FunctionalState CAN_NART;
// RFLM (Receive FIFO Locked mode)
/* 0:接收溢出后,F(xiàn)IFO未被鎖定,即報文會被新報文覆蓋。
* 1:接收溢出后,F(xiàn)IFO被鎖定,即新報文會被丟棄。
*/
FunctionalState CAN_RFLM;
// TXFP(Transmit FIFO priority)
/* 0:優(yōu)先級由報文的標識符來決定。
* 1:優(yōu)先級由發(fā)送請求的順序來決定。
*/
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)
// 根據(jù)結構體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: 過濾器被關聯(lián)到了FIFO0
* CAN_Filter_FIFO1: 過濾器被關聯(lián)到了FIFO1
*/
uint16_t CAN_FilterFIFOAssignment;
// 是否使能對應的CAN_FilterNumber濾波器
FunctionalState CAN_FilterActivation;
} CAN_FilterInitTypeDef;
5、void CAN_DBGFreeze(CAN_TypeDef* CANx, FunctionalState NewState)
/* 調(diào)試凍結,即在調(diào)試時,CAN有兩種工作模式
* -->照常工作
* -->凍結其收發(fā),但仍可對FIFO進行讀寫。
* 操作寄存器為"CAN_MCR"的"DBF"位(Debug Freeze)。
*/
6、void CAN_SlaveStartBank(uint8_t CAN_BankNumber)
/* 內(nèi)部對CAN過濾器主控制器(CAN_FMR)進行操作。
* 功能