STM32有2個3級深度的接收緩沖區:FIFO0和FIFO1,每個FIFO都可以存放3個完整的報文,它們完全由硬件來管理。如果是來自FIFO0的接收中斷,則用CAN1_RX0_IRQn中斷來處理。如果是來自FIFO1的接收中斷,則用CAN1_RX1_IRQn中斷來處理。在CAN的初始化配置過程中,用CAN_FilterFIFOAssignment來選擇要使用FIFO。
這個fifo是在MX_CAN1_FilterInit函數里定義的,這個函數stm32cubemx不會自動生成,需要手動添加設置,這里
使用的CAN_RX_FIFO0,所以stm32cubemx需要配置中斷為RX0
void MX_CAN1_FilterInit(void) { CAN_FilterTypeDef sFilterConfig; sFilterConfig.FilterBank = 0; sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK; sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; sFilterConfig.FilterIdHigh = 0x0000; sFilterConfig.FilterIdLow = 0x0000; sFilterConfig.FilterMaskIdHigh = 0x0000; sFilterConfig.FilterMaskIdLow = 0x0000; sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; sFilterConfig.FilterActivation = ENABLE; sFilterConfig.SlaveStartFilterBank = 14; if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK) { /* Filter configuration Error */ Error_Handler(); } }
配置時鍾
1、打開can設備
2、配置芯片時鍾樹
3、3.1配置波特率為500Kb/s。計算方法:36M/6/(5+6+1)==500K
中斷配置