STM32 CAN通信-CubeMX环境下CAN通信程序的编程与调试经验

文章目录

    • [STM32 CAN通信-CubeMX环境下CAN通信程序的编程](#STM32 CAN通信-CubeMX环境下CAN通信程序的编程)

STM32 CAN通信-CubeMX环境下CAN通信程序的编程

STM32F103ZE芯片 CAN通信测试代码:

c 复制代码
#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时进行重试等。

相关推荐
SundayBear32 分钟前
基于STM32的RT-Thread移植
单片机·嵌入式硬件
R6bandito_2 小时前
STM32中printf的重定向详解
开发语言·经验分享·stm32·单片机·嵌入式硬件·mcu
清风6666662 小时前
基于单片机的元胞自动机仿真系统设计
单片机·嵌入式硬件·毕业设计·课程设计
千千道2 小时前
利用keil +RASC给瑞萨RA8D1编译烧写程序
单片机·嵌入式硬件·mcu·物联网
武文斌773 小时前
项目学习总结:LVGL图形参数动态变化、开发板的GDB调试、sqlite3移植、MQTT协议、心跳包
linux·开发语言·网络·arm开发·数据库·嵌入式硬件·学习
充哥单片机设计3 小时前
【STM32项目开源】基于STM32的智能家居安防系统
stm32·嵌入式硬件·智能家居
点灯小铭3 小时前
基于单片机的N型热电偶PID锅炉温度控制系统
单片机·嵌入式硬件·毕业设计·课程设计
GilgameshJSS4 小时前
STM32H743-ARM例程15-RTC
c语言·arm开发·stm32·实时音视频
机器视觉知识推荐、就业指导5 小时前
STM32 外设驱动模块【含代码】:SG90 舵机模块
stm32·单片机·嵌入式硬件·学习
北京迅为5 小时前
【北京迅为】iTOP-4412精英版使用手册-第三十五章 WEB控制LED
linux·嵌入式硬件·嵌入式·4412