在調(diào)試HAL庫下的CAN雙機(雙F103ZET6)通信時,阻塞輪詢接收完全正常,但是中斷接收沒有反應。翻看了GL的燒腦之路總結(一):Cubemx創(chuàng)建CAN通信工程,無法進入CAN中斷的原因這篇文章以后,核實自己的硬件電路沒有問題,于是對自己的工程文件進行整理,把
①HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, CAN_FilterTypeDef *sFilterConfig)//配置can
②HAL_CAN_Start(CAN_HandleTypeDef *hcan)//開始can
③HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs)//使能can
三個函數(shù)放在一起后,成功實現(xiàn)了CAN中斷接收,下面是我在工程中的配置源碼:
void can_filterconfig_and_init(void)
{
CAN_FilterTypeDef filter;
filter.FilterIdHigh = 0x0000;
filter.FilterIdLow = 0x0000;
filter.FilterMaskIdHigh = 0x0000;
filter.FilterMaskIdLow = 0x0000;
//不過濾
filter.FilterFIFOAssignment = CAN_FILTER_FIFO1;
filter.FilterActivation = ENABLE;
filter.FilterMode = CAN_FILTERMODE_IDMASK;
filter.FilterScale = CAN_FILTERSCALE_32BIT;
filter.FilterBank = 0;
//filter.SlaveStartFilterBank =14;
if(HAL_CAN_ConfigFilter(&hcan,&filter) != HAL_OK)
{
Error_Handler();
Usart_SendString("can配置失敗\r\n");
}
else
Usart_SendString("can配置成功\r\n");
if(HAL_CAN_ActivateNotification(&hcan,CAN_IT_RX_FIFO1_MSG_PENDING) != HAL_OK)
{
Error_Handler();
Usart_SendString("開啟掛起中斷允許失敗\r\n");
}
else
Usart_SendString("開啟掛起中斷允許成功\r\n");
if(HAL_CAN_Start(&hcan) != HAL_OK)
{
Error_Handler();
Usart_SendString("can開啟失敗\r\n");
}
else
Usart_SendString("can開啟成功\r\n");
}
以上三個函數(shù)的位置和順序建議參考我的代碼,下圖是以上代碼在工程中的位置。
最終在main函數(shù)中調(diào)用:
(中斷回調(diào)函數(shù)我就不寫了,教程很多)
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_CAN_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
can_filterconfig_and_init();//*這兒!不要忘記聲明哦。*
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
最終代碼運行結果(串口助手中):
花了很長時間踩了這個坑,之前的原因應該是把這三個函數(shù)分開了,建議這三個函數(shù)一輩子捆綁在一起!謝謝大家能看到這里!文章來源:http://www.zghlxwxcb.cn/news/detail-760213.html
源碼自取,開源萬歲!
鏈接:https://pan.baidu.com/s/1jQTEc2XtnRRcrEVfafYuWg?pwd=ivml
提取碼:ivml文章來源地址http://www.zghlxwxcb.cn/news/detail-760213.html
到了這里,關于STM32 HAL庫 CAN雙機通信接收無法進入中斷、中斷沒有反應的解決方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!