stm32f103can总线过滤器配置
CAN過(guò)濾器的配置(f103 hal1.8 系列)
can的過(guò)濾器的配置是對(duì)can接收到的報(bào)文進(jìn)行過(guò)濾的配置,在STM32芯片中,可以對(duì)can的報(bào)文進(jìn)行過(guò)濾,從而省略cpu的處理過(guò)程。
can的過(guò)濾模式
f103中為應(yīng)用程序提供了14個(gè)位寬可變、可配置的過(guò)濾器組,每個(gè)過(guò)濾器組由2個(gè)32位寄存器,CAN_FxR0和CAN_FxR1組成。
每個(gè)過(guò)濾器組的位寬都可以單獨(dú)設(shè)置,以滿足應(yīng)用程序的不同需求。根據(jù)位寬的不同,可以配置為1個(gè)32位過(guò)濾器和2個(gè)16位過(guò)濾器。
can過(guò)濾器還可以分為屏蔽位模式和標(biāo)識(shí)符列表模式。
其中:
所有的過(guò)濾器都是并聯(lián)的,一個(gè)報(bào)文只要能通過(guò)一個(gè)過(guò)濾器就算是有效的。
hal中的解釋
在can的過(guò)濾器的配置的時(shí)候,需要用到結(jié)構(gòu)體中FilterIdHigh,FilterIdLow,FilterMaskIdHigh,FilterMaskIdLow,這幾個(gè)配置。在標(biāo)識(shí)符列表模式下:ID和maskID在32位模式和16位模式的過(guò)濾器中都是代表著一個(gè)意思。在屏蔽位模式下,ID代表著標(biāo)準(zhǔn)值,而maskID代表著需要關(guān)心ID中的哪些位。其中高對(duì)應(yīng)著高,低對(duì)應(yīng)著低。
其中IDE = 0為標(biāo)準(zhǔn)ID,IDE為1為擴(kuò)展ID,RTR = 0為代表數(shù)據(jù)幀,RTR = 1代表遠(yuǎn)程幀,MASK設(shè)置屏蔽碼,ID設(shè)置標(biāo)準(zhǔn)幀。
使用cube生成代碼過(guò)程:
1、進(jìn)行can配置
上圖主要的配置是進(jìn)行can總線波特率的配置,波特率由p、tq1、tq2這三個(gè)數(shù)值進(jìn)行確定。
2、進(jìn)行中斷配置
使用HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxMessage, RxData);可以讀取CAN數(shù)據(jù)(RxMessage 的定義:CAN_RxHeaderTypeDef RxMessage;)
3、生成工程后進(jìn)行添加過(guò)濾器的配置
進(jìn)行32位過(guò)濾器屏蔽位模式設(shè)置
進(jìn)行16位過(guò)濾器屏蔽位模式配置
HAL_StatusTypeDef CAN_User_Init(CAN_HandleTypeDef *h_can) {CAN_FilterTypeDef sFilterConfig;sFilterConfig.FilterBank = 0; //chenal 0sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; //屏蔽模式sFilterConfig.FilterScale = CAN_FILTERSCALE_16BIT; //設(shè)置為32位模式sFilterConfig.FilterIdHigh = 0xC020; //代表著設(shè)置的參考ID為0x601,標(biāo)準(zhǔn)ID,數(shù)據(jù)幀sFilterConfig.FilterIdLow = 0xD020;//代表著設(shè)置的參考ID為0x681,標(biāo)準(zhǔn)ID,數(shù)據(jù)幀//MASK bit 0 means don't care,bit 0 means match sFilterConfig.FilterMaskIdHigh = 0xFFFF;//代表著需要是0x601的標(biāo)準(zhǔn)數(shù)據(jù)幀才能進(jìn)行通過(guò)sFilterConfig.FilterMaskIdLow = 0xFFDF;//代表著需要是0x68x的標(biāo)準(zhǔn)數(shù)據(jù)幀才能通過(guò)。sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0; //FIFO0的中斷和FIFO1的中斷是不一樣的,這里是把接收到的報(bào)文放入到FIFO0中sFilterConfig.FilterActivation = CAN_FILTER_ENABLE; //enable filtersFilterConfig.SlaveStartFilterBank = 0; //為從屬can選擇開(kāi)始的過(guò)濾庫(kù),對(duì)于單個(gè)CAN實(shí)例,這個(gè)參數(shù)沒(méi)有意義 }注意以上只是一個(gè)過(guò)濾器的配置過(guò)程,f103可以進(jìn)行14組過(guò)濾器的配置。
4、發(fā)送數(shù)據(jù):
/*使用can總線發(fā)送數(shù)據(jù)*/ uint8_t CANx_SendNormalData(CAN_TxHeaderTypeDef TxHeader,uint32_t std_id ,uint8_t *TxData ,uint16_t lengh) {uint32_t TxMailbox; uint8_t FreeTxNum=0;//用來(lái)表示郵箱是否空閑TxHeader.RTR = CAN_RTR_DATA;TxHeader.IDE = CAN_ID_STD; TxHeader.StdId = std_id;TxHeader.TransmitGlobalTime = DISABLE;TxHeader.DLC = lengh;FreeTxNum = HAL_CAN_GetTxMailboxesFreeLevel(&hcan);while(0==FreeTxNum){FreeTxNum=HAL_CAN_GetTxMailboxesFreeLevel(&hcan);}if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, TxData, &TxMailbox) != HAL_OK){/* Transmission request Error */Error_Handler();}return 1; }5、接收中斷
/*采用接收中斷函數(shù)*/ void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *h_can) {uint8_t Data[8] = {0};uint16_t nodeid = 0;HAL_StatusTypeDef HAL_RetVal;uint8_t cmd = 0x2F; // uint16_t control_Mode = 0x6060;if (h_can == &hcan){//retrive data by calling HAL_CAN_GetRxMessageHAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &RxMessage, Data);nodeid = RxMessage.StdId;//對(duì)can1的速度進(jìn)行接收if((nodeid&0x581) == 0x581){if(Data[0] == cmd){if(Data[1] == 0x60){if(Data[2] == 0x60){Real_Speed =(int32_t)((uint32_t)(Data[4]&0xFF)|(uint32_t)((Data[5]<<8)&0xFFFF)|(uint32_t)((Data[6]<<16)&0xFFFF)|(uint32_t)((Data[7]<<24)&0xFFFF));}}}}if((nodeid&0x582) == 0x582){//對(duì)can2的速度進(jìn)行接收if(Data[0] == cmd){if(Data[1] == 0x60){if(Data[2] == 0x60){Real_Speed =(int32_t)((uint32_t)(Data[4]&0xFF)|(uint32_t)((Data[5]<<8)&0xFFFF)|(uint32_t)((Data[6]<<16)&0xFFFF)|(uint32_t)((Data[7]<<24)&0xFFFF));}}}}} }總結(jié)
以上是生活随笔為你收集整理的stm32f103can总线过滤器配置的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [django项目] 后台菜单管理功能
- 下一篇: Nutanix 推出 Karbon 2.