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总线中,配置用户代码如下:
view plaincopy to clipboardprint?
/* 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回调函数:
view plaincopy to clipboardprint?
/* 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总的基础工程。