1、雖然stm32f4系列具有兩個CAN控制器,但是stm32f407只有一個CAN。
2、CAN_Prescaler最終值是等於設置值加一,存儲於BRP寄存器里,Fpclk1是APB1總線的時鍾,最大值為APB2總線時鍾84MHz/2=42MHz。
3、CAN波特率=Fpclk1/((CAN_BS1+CAN_BS2+1)*CAN_Prescaler),舉例:CAN波特率=42MHz/((7tq+6tq+1)*6)=500kbps。
4.0、CAN_InitStruct關鍵成員的含義如下:
4.1、CAN_Prescaler控制時間片tq的長度;
4.2、CAN_Mode包括正常模式、回環模式、靜默模式、回環靜默模式;
4.3、CAN_SJW用於設置極限長度,即重新同步時單次可增加或縮短的最大長度,范圍為1~4tq;
4.4、CAN_BS1、CAN_BS2位時序,前者范圍1~16tq,后者1~8tq;
4.5、FunctionalState使能或失能某些的狀態;
4.6、CAN_TICM是否使用為時間觸發的功能;
4.7、CAN_ABOM是否使用自動離線管理,使能后可在節點離線后自動恢復而不需要軟件來干預;
4.8、CAN_AWUM是否使用自動喚醒功能,使能后可在監測到總線活動后自動喚醒;
4.9、CAN_NART是否使用自動重傳功能,使能后會一直發送報文直到成功為止;
4.10、CAN_RFLM是否使用鎖定接收FIFO,如果使能鎖定,那么當FIFO溢出后就會丟棄新的數據,否則就是使用新的數據覆蓋原有數據;
4.11、CAN_TXFP用於設置發送報文的優先級方法,使能之后將以報文存入郵箱的先后順序來發送,否則按照報文的ID的優先級進行發送;
5.0、CAN_FilterInitStruct的關鍵成員含義如下:
5.1、CAN_FilterMaskId有兩種情況,當篩選器處於標識符列表模式下時,和CAN_FilterId類似,都是存儲要篩選的ID,而當篩選器工作在掩碼模式下,存儲的是CAN_FilterId對應的掩碼;
5.2、CAN_FilterFIFOAssignment用於設置當報文通過篩選器以后存儲到哪一個接收的FIFO里,范圍為FIFO0或FIFO1;
5.3、CAN_FilterNumber的范圍為0~27,一共28個篩選器;
5.4、CAN_FilterMode可設置成列表模式和掩碼模式;
5.5、CAN_FilterScale用於設置篩選器的位寬,可選16位或32位;
5.6、CAN_FilterActivation用於設置是否激活該篩選器;
6、CAN_IT_FMPO:消息掛號允許中斷
7.0、CanTxMsg結構體關鍵成員含義如下:
7.1、StdId存儲報文的11位標准標識符,范圍為0x0~0x7FF;
7.2、ExtId存儲報文的29位擴展標識符;
7.3、IDE用於配置選擇使用StdId還是ExtId;
7.4、RTR是用於存儲報文類型的標志,可配置選擇為數據幀還是遙控幀,通常配置成使用數據幀,因為遙控幀沒有數據段,所以Data[8]中的成員是沒有內容的;
7.5、DLC用於存儲數據幀的數據長度,范圍0~8字節,如果已配置成遙控幀,該參數可配置為0;
8、CanRxMsg結構體中的FMI用於存儲篩選器的編號,也表示了是經過哪個FIFO進行接收的,可用於簡化軟件處理。
9、CAN收發器使用的是TJA1040。
10、開發板作為CAN終端時需要加上120R的匹配電阻,否則應該去掉以免影響通信。
