資源簡介
STM32之can 實例+代碼解析.c,比較詳細的注釋。
代碼片段和文件信息
#include?“sysdef.h“
#define?MAX_MAIL_NUM??3
//CAN總線調試:0=運行?1=自環調試
#define?CAN_DEBUG?????0
//CAN總線波特率:0=250kbps1=500kbps2=1Mbps
#define?CAN1_BPS??????0
unsigned?char?can1_addr?=?0;
unsigned?short??Can1_Tx_Count?=0;
unsigned?short??Can1_Rx_Count?=0;
unsigned?short??Can1_Send_Delay?=0;
unsigned?char???Can1_Send_Buf[10]={0xeb0x900x010x550xAA};
unsigned?char???Can1_Recv_Buf[10]={0};
extern?int??angle_num?;
extern?unsigned?int??angle_data?;
static??u8?CAN_msg_num[MAX_MAIL_NUM];???//?發送郵箱標記
void?CAN1_Config_init(void)
{
?????CAN_InitTypeDef????????CAN_InitStructure;
?????CAN_FilterInitTypeDef??CAN_FilterInitStructure;
?????/*?CAN?register?init?*/
?????CAN_DeInit(CAN1);
?????CAN_StructInit(&CAN_InitStructure);
??
?????/*?CAN?cell?init?*/?//36MHz?500Kbps
?????CAN_InitStructure.CAN_TTCM=DISABLE;//禁止時間觸發通信模式
?????CAN_InitStructure.CAN_ABOM=DISABLE;//軟件對CAN_MCR寄存器的INRQ位進行置1隨后清0后一旦硬件檢測
????????????????????????????????????????//到128次11位連續的隱性位就退出離線狀態
?????CAN_InitStructure.CAN_AWUM=DISABLE;//睡眠模式通過清除CAN_MCR寄存器的SLEEP位由軟件喚醒
?????CAN_InitStructure.CAN_NART=DISABLE;//CAN報文是否只發1次不管發送的結果如何(成功/出錯或仲裁丟失)
?????CAN_InitStructure.CAN_RFLM=DISABLE;//在接收到溢出時FIFO未被鎖定當接收到FIFO報文未被讀出下一個收到的報文會覆蓋原有的報文
?????CAN_InitStructure.CAN_TXFP=DISABLE;//發送的FIFO優先級由報文的標識符來決定
??????
#if?CAN_DEBUG
?????CAN_InitStructure.CAN_Mode=?CAN_Mode_LoopBack;
#else
?????CAN_InitStructure.CAN_Mode=?CAN_Mode_Normal;?
#endif
?????//傳輸波特率
?????if(CAN1_BPS?==??0)
?????{
????????CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳躍寬度1個時間單位
????????CAN_InitStructure.CAN_BS1=CAN_BS1_12tq;//時間段1為9個時間單位
????????CAN_InitStructure.CAN_BS2=CAN_BS2_3tq;//時間段2為8個時間單位
????????CAN_InitStructure.CAN_Prescaler=?9;//36M/(1+12+3)/9=?250kbps
????????????????????????????????????????????//36M/(1+5+2)/9?=?500kbps
???????????????????????????????????????????//36M(1+2+1)/9?=?1M
?????}
?????else?if(CAN1_BPS?==?1)
?????{
????????CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳躍寬度1個時間單位
????????CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;//時間段1為9個時間單位
????????CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;//時間段2為8個時間單位
????????CAN_InitStructure.CAN_Prescaler=?9;//36M/(1+12+3)/9=?250kbps
????????
?????}
?????else
?????{
????????CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;//重新同步跳躍寬度1個時間單位
????????CAN_InitStructure.CAN_BS1=CAN_BS1_2tq;//時間段1為9個時間單位
????????CAN_InitStructure.CAN_BS2=CAN_BS2_1tq;//時間段2為8個時間單位
????????CAN_InitStructure.CAN_Prescaler=?9;//36M/(1+12+3)/9=?250kbps
?????????
?????}
?????CAN_Init(CAN1&CAN_InitStructure);?
?????????????????????????????????????????
?????/*?CAN?filter?init?*/
?????CAN_FilterInitStructure.CAN_FilterNumber=0;??//指定了待初始化的過濾器0
?????CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;//指定了過濾器將被初始化到的模式為標識符屏蔽位模式
?????CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;;//給出了過濾器位寬1個32位過濾器?
?????CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;//用來設定過濾器標識符(32位位寬時為其高段位,16位位寬時為第一個)
?????CAN_FilterInitStructure.CAN_FilterIdL
評論
共有 條評論