文章目录
- STM32 CAN通信-CubeMX环境下CAN通信程序的编程
STM32 CAN通信-CubeMX环境下CAN通信程序的编程
STM32F103ZE芯片 CAN通信测试代码:
#include "main.h"
#include "can.h"CAN_HandleTypeDef hcan1;void SystemClock_Config(void);int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_CAN1_Init();while (1) {// 初始化CAN消息结构体和数据缓冲区CAN_TxHeaderTypeDef txHeader;uint8_t txData[8];CAN_RxHeaderTypeDef rxHeader;uint8_t rxData[8];// 填充CAN消息结构体和数据txHeader.StdId = 0x123;txHeader.RTR = CAN_RTR_DATA;txHeader.IDE = CAN_ID_STD;txHeader.DLC = 2;txData[0] = 0xAA;txData[1] = 0xBB;// 发送CAN消息HAL_CAN_AddTxMessage(&hcan1, &txHeader, txData, NULL);// 等待CAN消息接收HAL_CAN_GetRxMessage(&hcan1, CAN_RX_FIFO0, &rxHeader, rxData);// 处理接收到的CAN消息if (rxHeader.StdId == 0x123 && rxHeader.RTR == CAN_RTR_DATA && rxHeader.IDE == CAN_ID_STD && rxHeader.DLC == 2 && rxData[0] == 0xCC && rxData[1] == 0xDD) {// 接收到的CAN消息符合预期,进行处理// do something ...}// 延时一段时间后重复执行以上代码,进行CAN通信测试HAL_Delay(1000);}
}void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}
这个例子中,将所有CAN通信相关的代码放在while循环中,并在每次循环结束后延时一段时间,以实现循环执行的效果。需要根据具体的应用需求,修改循环间隔时间和循环内容。
请注意,为确保CAN通信成功,需要在代码中增加一些异常处理的代码,例如在HAL_CAN_AddTxMessage和HAL_CAN_GetRxMessage函数返回值不为HAL_OK时进行重试等。