STM32F373具有16bitSDADC 以及带了CAN总线。这系列准备做一个基于CAN+SDADC的采集。本篇记录如何驱动CAN总线。
【图形化配置】
首先配置HSE时钟为8M输入,配置总线时钟为72M,基于CAN总线挂载在APB1上,为36MHz
【配置串口】
为了输出日志,这里配置了USART1,波特率为115200。输出IO为PA9、PA10。
【配置CAN】
配置分频为4,Seg1为9,Seg2为8,显示配置为500K。打开RX0的中断
【配置代码】
生成MDK工程,在CAN总线中,配置用户代码如下:
/* USER CODE BEGIN CAN_Init 2 */ /*##-2- Configure the CAN Filter ###########################################*/ 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(&hcan, &sFilterConfig) != HAL_OK) { /* Filter configuration Error */ Error_Handler(); } /*##-3- Start the CAN peripheral ###########################################*/ if (HAL_CAN_Start(&hcan) != HAL_OK) { /* Start Error */ Error_Handler(); } /*##-4- Activate CAN RX notification #######################################*/ if (HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK) { /* Notification Error */ Error_Handler(); } /*##-5- Configure Transmission process #####################################*/ TxHeader.StdId = 0x321; TxHeader.ExtId = 0x01; TxHeader.RTR = CAN_RTR_DATA; TxHeader.IDE = CAN_ID_STD; TxHeader.DLC = 2; TxHeader.TransmitGlobalTime = DISABLE; /* USER CODE END CAN_Init 2 */
重写RX0回调函数:
/* USER CODE BEGIN 1 */ void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) { /* Get RX message */ if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData) != HAL_OK) { /* Reception Error */ Error_Handler(); } /* Display LEDx */ if ((RxHeader.StdId == 0x321) && (RxHeader.IDE == CAN_ID_STD) && (RxHeader.DLC == 2)) { U1_printf("recv data:0x%X 0x%X\r\n",RxData[0],RxData[1]); } } /* USER CODE END 1 */
函数中,判断是否接收到指定的ID,以及接收长度。如果符合,打印出接收到的数据。
【测试】
使用CAN_TTL接到CAN分析仪上,可以使用自动检索,发现总线有500K的CAN总线,发送一帧数据后,在串口中打印出输出内容:
【总结】
使用图形化配置,可以快速的生成CAN总的基础工程。