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

相关推荐
yutian06062 小时前
Keil MDK下载程序后MCU自动重启设置
单片机·嵌入式硬件·keil
析木不会编程5 小时前
【小白51单片机专用教程】protues仿真独立按键控制LED
单片机·嵌入式硬件·51单片机
枯无穷肉9 小时前
stm32制作CAN适配器4--WinUsb的使用
stm32·单片机·嵌入式硬件
不过四级不改名6779 小时前
基于HAL库的stm32的can收发实验
stm32·单片机·嵌入式硬件
嵌入式科普10 小时前
十一、从0开始卷出一个新项目之瑞萨RA6M5串口DTC接收不定长
c语言·stm32·cubeide·e2studio·ra6m5·dma接收不定长
嵌入式大圣10 小时前
单片机UDP数据透传
单片机·嵌入式硬件·udp
云山工作室10 小时前
基于单片机的视力保护及身姿矫正器设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
嵌入式-老费10 小时前
基于海思soc的智能产品开发(mcu读保护的设置)
单片机·嵌入式硬件
qq_3975623112 小时前
MPU6050 , 设置内部低通滤波器,对于输出数据的影响。(简单实验)
单片机
liyinuo201712 小时前
嵌入式(单片机方向)面试题总结
嵌入式硬件·设计模式·面试·设计规范