本篇详细的记录了如何使用STM32CubeMX配置 STM32F103C8T6 的硬件CAN接口与另一个开发板之间通信。

1.硬件设计


我这里使用的TJA1050T作为CAN通信收发器,连接f103的PA11,PA12两个管脚,分别作为接收和发送管脚,CAN收发器的H和L之间需要加120欧姆电阻用来做阻抗匹配。

2.Cubemx配置CAN

先选择芯片,我这里用的是stm32f103c8t6
我这里用的是J-Link,所以要选择Serial Wire,使用DIO和CLK两个管脚下载程序

接着在RCC中设置时序,我使用的是外部时钟,

CAN收发使用的是PCLK1,这里使用外部时钟倍频后,PCLK1的时钟频率为36M

接着配置CAN外设

先设置CAN通信波特率,我们的目标通信波特率是500KHz,分频系数选择6,那么设一个未知数X,X=6M/500K,那么X=12,因此,BS1+BS2+SJW=12,最终我们会得到BS1,BS2,以及SJW的值

开启CAN接收中断CAN RX0

接着设置串口一用于单片机在接收到数据后将数据发送到上位机,默认波特率是115200就可以

最后设置工程


3.编写程序
总体程序的流程图如下
我们这里对这些设备不做任何过滤,先对过滤器进行配置,放在CAN.C文件中

 void CANFilter_Config(void)
{CAN_FilterTypeDef  sFilterConfig;sFilterConfig.FilterBank = 0;                       //CAN过滤器编号,范围0-27sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;   //CAN过滤器模式,掩码模式或列表模式sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;  //CAN过滤器尺度,16位或32位sFilterConfig.FilterIdHigh = 0x000 << 5;            //32位下,存储要过滤ID的高16位sFilterConfig.FilterIdLow = 0x0000;                  //32位下,存储要过滤ID的低16位sFilterConfig.FilterMaskIdHigh = 0x0000;         //掩码模式下,存储的是掩码sFilterConfig.FilterMaskIdLow = 0x0000;sFilterConfig.FilterFIFOAssignment = 0;               //报文通过过滤器的匹配后,存储到哪个FIFOsFilterConfig.FilterActivation = ENABLE;         //激活过滤器sFilterConfig.SlaveStartFilterBank = 0;if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK) {Error_Handler();}}

然后在CAN.C文件中定义接收和发送消息变量:
static CAN_TxHeaderTypeDef TxMessage; //CAN发送的消息的消息头
static CAN_RxHeaderTypeDef RxMessage; //CAN接收的消息的消息头
在CAN.C最后编写CAN接收中断函数:

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{uint8_t  data[8];HAL_StatusTypeDef status;if (hcan == hcan) {    status = HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxMessage, data);if (HAL_OK == status){                                       printf("--->Data Receieve!\r\n");printf("RxMessage.StdId is %#x\r\n",  RxMessage.StdId);printf("data[0] is 0x%02x\r\n", data[0]);printf("data[1] is 0x%02x\r\n", data[1]);printf("data[2] is 0x%02x\r\n", data[2]);printf("data[3] is 0x%02x\r\n", data[3]);printf("<---\r\n");}}
}

编写CAN发送测试数据函数

void CAN1_Send_Test()
{uint32_t TxMailbox;uint8_t data[4] = {0x01, 0x02, 0x03, 0x04};TxMessage.IDE = CAN_ID_STD;     //设置ID类型TxMessage.StdId = 0x111;        //设置ID号TxMessage.RTR = CAN_RTR_DATA;   //设置传送数据帧TxMessage.DLC = 4;              //设置数据长度if (HAL_CAN_AddTxMessage(&hcan, &TxMessage, data, &TxMailbox) != HAL_OK){Error_Handler();}
}

编写开启CAN函数

void CAN_Start_Init()
{if (HAL_CAN_Start(&hcan) != HAL_OK) {Error_Handler();}/* 3. Enable CAN RX Interrupt */if (HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING) !=  HAL_OK) {Error_Handler();}
}

重置printf函数
在main.c中添加#include"stdio.h"

//使用printf
int fputc(int ch,FILE *f)
{uint8_t temp[1]={ch};HAL_UART_Transmit(&huart1,temp,1,2);
}

接着在main函数中将函数开启,

  MX_CAN_Init();//can初始化MX_USART1_UART_Init();CANFilter_Config();CAN_Start_Init();CAN1_Send_Test();

给第二块F103C8T6下载程序时,把Send发送函数中,将ID号进行修改,
这个工程中容易出现错误的地方就在发送函数中,HAL_CAN_AddTxMessage(&hcan, &TxMessage, data, &TxMailbox),第四个参数需要自己定义一个32位数,不然的话程序会陷入死循环,我们可以在这个函数的定义中看到关于这个属性的介绍,这个参数是CAN在发送完一帧数据后返回的值,因此需要自己定义一个变量来存放。

程序参考了Mculover666这位博主的文章STM32CubeMX | 36 - 使用CAN总线进行双板通信(TJA1050)并进行了修改,最终实现了双板通信以及三板和四板通信

STM32CubeMX 配置CAN总线进行双板通信(STM32F103C8T6)相关推荐

  1. 1:STM32CubeMX配置STM32F103C8T6驱动-下载软件配置RCC,CAN1,USART1

    1:下载软件 点击 这里立即下载,共454M. 2:通过STM32CubeMX配置USART1,CAN1 1:创建工程 创建文件夹存放工程 添加工程名称及路径: 为每个驱动单独创建.c和.h文件. 2 ...

  2. 2:STM32CubeMX配置STM32F103C8T6驱动-TIM1配置

    1:STM32CubeMX配置 1:确定时钟 2:设置1ms触发一次,72M/72/1000= 1000/s 定时器触发中断: 2:代码配置 在main.c中 /* USER CODE BEGIN 2 ...

  3. 用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)

    1.软件准备 (1)编程平台:Keil5 (2)CubeMX 2.硬件准备 (1)本此使用最小核心板STM32F103C8T6为例 (2)一个舵机:SG90或者MG996等均可 (3)ST-link ...

  4. STM32CUBEMX配置教程(八)STM32串口轮询发送中断接收+重定义+优化

    STM32CUBEMX配置教程(八)STM32串口轮询发送中断接收+重定义+优化 基于STM32H743VI 使用STM32CUBEMX两年了,始终觉得这个工具非常的方便,但因为不是经常使用,导致有些 ...

  5. 利用STM32CubeMX配置基于STMF32F407的FREERTOS操作系统控制直流电机速度和超声波测距实验

    前两周做基于STM32F407芯片的嵌入式系统设计的实验,主要完成利用超声波测距(电脑上用串口显示超声波所测距离,障碍物近于20cm时,使LED灯闪烁,并且可以通过串口更改报警距离)和利用编码器读取电 ...

  6. 配置Trunk实现相同Vlan通信

    路由交换技术,配置Trunk实现相同Vlan通信! 转载于:https://blog.51cto.com/yuanliujun/362657

  7. RS-485总线多机通信

    ;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK  RS-485总线多机通信  KKKKKKKKKKKKKKKKKKKK ;Rev:01.01 ;DA ...

  8. CAN总线多节点通信异常分析及解决

    CAN总线多节点通信异常分析及解决 一.CAN物理层特征 CAN收发器的作用是负责逻辑电平和信号电平之间的转换.即从CAN控制芯片输出逻辑电平到CAN收发器,然后经过CAN收发器内部转换将逻辑电平转换 ...

  9. 蓝牙的配置以及蓝牙间的通信

    蓝牙的配置以及蓝牙间的通信 目录 蓝牙间的配置以及蓝牙间的通信 HC-06的AT指令配置 HC-05的AT指令配置 HC-05与HC-06之间的通信 HC-06(从机): HC-05(主机): HC- ...

最新文章

  1. Apache Tuscany 宣布停止维护
  2. [HDOJ3998] Sequence(DP,最大流)
  3. Android USB 开发详解
  4. 【Linux】Linux简介以及 与UNIX区别
  5. 电商库存详解:三层(销售层、调度层、仓库层)来看库存设计
  6. python怎么调用接口失败_python 调用接口
  7. c++ 结构体初始化_C/C++编程笔记:C语言和C++语言的 struct 对比!区别在哪里?
  8. BZOJ 1677. [Usaco2005 Jan]Sumsets 求和
  9. numpy常用矩阵运算
  10. 基于Jersey框架创建web项目
  11. 苹果鼠标驱动_一款鼠标让工作更高效——咪鼠S2智能语音鼠标测评
  12. Vmware、Hyper-V、Virtual PC虚拟机运用usb server使用USB加密狗设备
  13. 3D Vision--生成空间任意圆柱及任意直线
  14. 计算机辅助设计实训报告范文,计算机辅助设计实习实习报告
  15. java基础——多态
  16. 数组——洛谷#P1427 小鱼的数字游戏(Python实现)
  17. ppt 里插入html,如何在PPT中插入html网页.ppt
  18. 测试20220202
  19. C语言项目设计——程序设计
  20. 进制转换器java程序_java编写简易的进制转换器

热门文章

  1. VNote v2.7.1 绿色版下载
  2. orical 数据库 搜索语句
  3. 大疆校招测评题--循环赛问题
  4. 基于AT89S51的单片机无线双显示抢答器简要说明
  5. 李炎恢讲师Xhtml全套课程
  6. 数论——dove的疑惑
  7. 拼多多打标,拼多多号搜索打标原理,拼多多打标源码,拼多多足迹接口,多多号打标,拼多多打标接口,拼多多号打标有什么影响,拼多多号打标是什么,魔搜拼多多版本,服务市场的打标接口
  8. HarmonyOS_BearPi-HM Nano学习笔记之环境搭建
  9. 关于高版本数据库导入到低版本数据库时间的一些注意事项
  10. 英语面试计算机岗位,计算机专业英语面试自我介绍.docx