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

相关推荐
1+2单片机电子设计26 分钟前
基于 STM32 的太阳能 MPPT 充电控制器设计
stm32·单片机·嵌入式硬件
Stanford_sun1 小时前
基于Zigbee的无线火灾报警系统(云平台版)
网络·嵌入式硬件·物联网·zigbee
CFZPL1 小时前
espidf用CMake文件构建项目
单片机·esp32
猪八戒1.01 小时前
9.5 【定时器】输入捕获
单片机·嵌入式硬件
xiaohai@Linux2 小时前
STM32之移植原生的infoNES nes游戏模拟器源码实现游戏自由!!!(原生纯C版,非汇编版)
stm32·游戏·模拟器·infones·nes游戏机
无人装备硬件开发爱好者2 小时前
初级菜鸟快速学习无人机电调教程:第2节
嵌入式硬件·无人机·电调开发
Wnq100722 小时前
当无人机 “飞” 入生活,安全隐患如何破解?
嵌入式硬件·物联网·网络安全·信息与通信·信号处理
无垠的广袤2 小时前
【启明云端 WT9932S3-Nano 开发板】介绍、环境搭建、工程测试
python·单片机·嵌入式硬件
小李做物联网3 小时前
【单片机毕业设计】143.1基于单片机stm32塔吊控制反馈物联网嵌入式项目程序开发系统
stm32·单片机·嵌入式硬件·物联网
Jcenav12 小时前
OCXO外围电路设计指南
单片机·嵌入式硬件