stm32f103can总线过滤器配置
CAN過濾器的配置(f103 hal1.8 系列)
can的過濾器的配置是對can接收到的報文進行過濾的配置,在STM32芯片中,可以對can的報文進行過濾,從而省略cpu的處理過程。
can的過濾模式
f103中為應用程序提供了14個位寬可變、可配置的過濾器組,每個過濾器組由2個32位寄存器,CAN_FxR0和CAN_FxR1組成。
每個過濾器組的位寬都可以單獨設置,以滿足應用程序的不同需求。根據位寬的不同,可以配置為1個32位過濾器和2個16位過濾器。
can過濾器還可以分為屏蔽位模式和標識符列表模式。
其中:
所有的過濾器都是并聯的,一個報文只要能通過一個過濾器就算是有效的。
hal中的解釋
在can的過濾器的配置的時候,需要用到結構體中FilterIdHigh,FilterIdLow,FilterMaskIdHigh,FilterMaskIdLow,這幾個配置。在標識符列表模式下:ID和maskID在32位模式和16位模式的過濾器中都是代表著一個意思。在屏蔽位模式下,ID代表著標準值,而maskID代表著需要關心ID中的哪些位。其中高對應著高,低對應著低。
其中IDE = 0為標準ID,IDE為1為擴展ID,RTR = 0為代表數據幀,RTR = 1代表遠程幀,MASK設置屏蔽碼,ID設置標準幀。
使用cube生成代碼過程:
1、進行can配置
上圖主要的配置是進行can總線波特率的配置,波特率由p、tq1、tq2這三個數值進行確定。
2、進行中斷配置
使用HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxMessage, RxData);可以讀取CAN數據(RxMessage 的定義:CAN_RxHeaderTypeDef RxMessage;)
3、生成工程后進行添加過濾器的配置
進行32位過濾器屏蔽位模式設置
進行16位過濾器屏蔽位模式配置
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; //設置為32位模式sFilterConfig.FilterIdHigh = 0xC020; //代表著設置的參考ID為0x601,標準ID,數據幀sFilterConfig.FilterIdLow = 0xD020;//代表著設置的參考ID為0x681,標準ID,數據幀//MASK bit 0 means don't care,bit 0 means match sFilterConfig.FilterMaskIdHigh = 0xFFFF;//代表著需要是0x601的標準數據幀才能進行通過sFilterConfig.FilterMaskIdLow = 0xFFDF;//代表著需要是0x68x的標準數據幀才能通過。sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0; //FIFO0的中斷和FIFO1的中斷是不一樣的,這里是把接收到的報文放入到FIFO0中sFilterConfig.FilterActivation = CAN_FILTER_ENABLE; //enable filtersFilterConfig.SlaveStartFilterBank = 0; //為從屬can選擇開始的過濾庫,對于單個CAN實例,這個參數沒有意義 }注意以上只是一個過濾器的配置過程,f103可以進行14組過濾器的配置。
4、發送數據:
/*使用can總線發送數據*/ uint8_t CANx_SendNormalData(CAN_TxHeaderTypeDef TxHeader,uint32_t std_id ,uint8_t *TxData ,uint16_t lengh) {uint32_t TxMailbox; uint8_t FreeTxNum=0;//用來表示郵箱是否空閑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、接收中斷
/*采用接收中斷函數*/ 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;//對can1的速度進行接收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){//對can2的速度進行接收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));}}}}} }總結
以上是生活随笔為你收集整理的stm32f103can总线过滤器配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [django项目] 后台菜单管理功能
- 下一篇: Nutanix 推出 Karbon 2.