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时进行重试等。

相关推荐
BreezeJuvenile1 小时前
外设模块学习(5)——DS18B20温度传感器(STM32)
stm32·嵌入式硬件·学习·温度传感器·ds18b20
hollq4 小时前
STM32F103RCT6+STM32CubeMX+keil5(MDK-ARM)+Flymcu实现串口重定向
arm开发·stm32·嵌入式硬件
小鱼儿电子6 小时前
17-基于STM32的宠物饲养系统设计与实现
stm32·嵌入式硬件·物联网·宠物·宠物饲养系统
小莞尔7 小时前
【51单片机】【protues仿真】基于51单片机四层电梯系统
单片机·嵌入式硬件
CFZPL7 小时前
使用江科大串口发送函数发送freertos的vTaskList出现跑飞
单片机
F133168929578 小时前
WD5030A,24V降5V,15A 大电流,应用于手机、平板、笔记本充电器
stm32·单片机·嵌入式硬件·51单片机·硬件工程·pcb工艺
易享电子9 小时前
基于单片机电器断路器保护器系统Proteus仿真(含全部资料)
单片机·嵌入式硬件·fpga开发·51单片机·proteus
爱倒腾的老唐12 小时前
01、如何学习单片机
单片机·嵌入式硬件·学习
点灯小铭12 小时前
基于单片机的夹具压力控制系统设计
单片机·嵌入式硬件·mongodb·毕业设计·课程设计
雾削木18 小时前
stm32解锁芯片
javascript·stm32·单片机·嵌入式硬件·gitee