这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【STM32F373】1、CAN驱动

共1条 1/1 1 跳转至

【STM32F373】1、CAN驱动

菜鸟
2024-12-24 05:45:06     打赏

STM32F373具有16bitSDADC 以及带了CAN总线。这系列准备做一个基于CAN+SDADC的采集。本篇记录如何驱动CAN总线。

【图形化配置】

首先配置HSE时钟为8M输入,配置总线时钟为72M,基于CAN总线挂载在APB1上,为36MHz

image.png

【配置串口】

为了输出日志,这里配置了USART1,波特率为115200。输出IO为PA9、PA10。

【配置CAN】

配置分频为4,Seg1为9,Seg2为8,显示配置为500K。打开RX0的中断

image.png

【配置代码】

生成MDK工程,在CAN总线中,配置用户代码如下:

view plaincopy to clipboardprint?

  1.   /* USER CODE BEGIN CAN_Init 2 */  

  2.   /*##-2- Configure the CAN Filter ###########################################*/  

  3.   sFilterConfig.FilterBank = 0;  

  4.   sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;  

  5.   sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;  

  6.   sFilterConfig.FilterIdHigh = 0x0000;  

  7.   sFilterConfig.FilterIdLow = 0x0000;  

  8.   sFilterConfig.FilterMaskIdHigh = 0x0000;  

  9.   sFilterConfig.FilterMaskIdLow = 0x0000;  

  10.   sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;  

  11.   sFilterConfig.FilterActivation = ENABLE;  

  12.   sFilterConfig.SlaveStartFilterBank = 14;  

  13.   

  14.   if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)  

  15.   {  

  16.     /* Filter configuration Error */  

  17.     Error_Handler();  

  18.   }  

  19.   

  20.   /*##-3- Start the CAN peripheral ###########################################*/  

  21.   if (HAL_CAN_Start(&hcan) != HAL_OK)  

  22.   {  

  23.     /* Start Error */  

  24.     Error_Handler();  

  25.   }  

  26.   

  27.   /*##-4- Activate CAN RX notification #######################################*/  

  28.   if (HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK)  

  29.   {  

  30.     /* Notification Error */  

  31.     Error_Handler();  

  32.   }  

  33.   

  34.   /*##-5- Configure Transmission process #####################################*/  

  35.   TxHeader.StdId = 0x321;  

  36.   TxHeader.ExtId = 0x01;  

  37.   TxHeader.RTR = CAN_RTR_DATA;  

  38.   TxHeader.IDE = CAN_ID_STD;  

  39.   TxHeader.DLC = 2;  

  40.   TxHeader.TransmitGlobalTime = DISABLE;  

  41.   /* USER CODE END CAN_Init 2 */  


重写RX0回调函数:

view plaincopy to clipboardprint?

  1. /* USER CODE BEGIN 1 */  

  2. void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)  

  3. {  

  4.       /* Get RX message */  

  5.   if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK)  

  6.   {  

  7.     /* Reception Error */  

  8.     Error_Handler();  

  9.   }  

  10.   

  11.   /* Display LEDx */  

  12.   if ((RxHeader.StdId == 0x321) && (RxHeader.IDE == CAN_ID_STD) && (RxHeader.DLC == 2))  

  13.   {  

  14.         U1_printf("recv data:0x%X 0x%X\r\n",RxData[0],RxData[1]);  

  15.   }  

  16. }  

  17. /* USER CODE END 1 */  

函数中,判断是否接收到指定的ID,以及接收长度。如果符合,打印出接收到的数据。

【测试】

使用CAN_TTL接到CAN分析仪上,可以使用自动检索,发现总线有500K的CAN总线,发送一帧数据后,在串口中打印出输出内容:

image.png

【总结】

使用图形化配置,可以快速的生成CAN总的基础工程。







关键词: STM32F373    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]