STM32CubeMX 配置CAN总线进行双板通信(STM32F103C8T6)
本篇详细的记录了如何使用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:STM32CubeMX配置STM32F103C8T6驱动-下载软件配置RCC,CAN1,USART1
1:下载软件 点击 这里立即下载,共454M. 2:通过STM32CubeMX配置USART1,CAN1 1:创建工程 创建文件夹存放工程 添加工程名称及路径: 为每个驱动单独创建.c和.h文件. 2 ...
- 2:STM32CubeMX配置STM32F103C8T6驱动-TIM1配置
1:STM32CubeMX配置 1:确定时钟 2:设置1ms触发一次,72M/72/1000= 1000/s 定时器触发中断: 2:代码配置 在main.c中 /* USER CODE BEGIN 2 ...
- 用STM32CubeMX配置输出PWM信号控制多路舵机(HAL)
1.软件准备 (1)编程平台:Keil5 (2)CubeMX 2.硬件准备 (1)本此使用最小核心板STM32F103C8T6为例 (2)一个舵机:SG90或者MG996等均可 (3)ST-link ...
- STM32CUBEMX配置教程(八)STM32串口轮询发送中断接收+重定义+优化
STM32CUBEMX配置教程(八)STM32串口轮询发送中断接收+重定义+优化 基于STM32H743VI 使用STM32CUBEMX两年了,始终觉得这个工具非常的方便,但因为不是经常使用,导致有些 ...
- 利用STM32CubeMX配置基于STMF32F407的FREERTOS操作系统控制直流电机速度和超声波测距实验
前两周做基于STM32F407芯片的嵌入式系统设计的实验,主要完成利用超声波测距(电脑上用串口显示超声波所测距离,障碍物近于20cm时,使LED灯闪烁,并且可以通过串口更改报警距离)和利用编码器读取电 ...
- 配置Trunk实现相同Vlan通信
路由交换技术,配置Trunk实现相同Vlan通信! 转载于:https://blog.51cto.com/yuanliujun/362657
- RS-485总线多机通信
;KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK RS-485总线多机通信 KKKKKKKKKKKKKKKKKKKK ;Rev:01.01 ;DA ...
- CAN总线多节点通信异常分析及解决
CAN总线多节点通信异常分析及解决 一.CAN物理层特征 CAN收发器的作用是负责逻辑电平和信号电平之间的转换.即从CAN控制芯片输出逻辑电平到CAN收发器,然后经过CAN收发器内部转换将逻辑电平转换 ...
- 蓝牙的配置以及蓝牙间的通信
蓝牙的配置以及蓝牙间的通信 目录 蓝牙间的配置以及蓝牙间的通信 HC-06的AT指令配置 HC-05的AT指令配置 HC-05与HC-06之间的通信 HC-06(从机): HC-05(主机): HC- ...
最新文章
- Apache Tuscany 宣布停止维护
- [HDOJ3998] Sequence(DP,最大流)
- Android USB 开发详解
- 【Linux】Linux简介以及 与UNIX区别
- 电商库存详解:三层(销售层、调度层、仓库层)来看库存设计
- python怎么调用接口失败_python 调用接口
- c++ 结构体初始化_C/C++编程笔记:C语言和C++语言的 struct 对比!区别在哪里?
- BZOJ 1677. [Usaco2005 Jan]Sumsets 求和
- numpy常用矩阵运算
- 基于Jersey框架创建web项目
- 苹果鼠标驱动_一款鼠标让工作更高效——咪鼠S2智能语音鼠标测评
- Vmware、Hyper-V、Virtual PC虚拟机运用usb server使用USB加密狗设备
- 3D Vision--生成空间任意圆柱及任意直线
- 计算机辅助设计实训报告范文,计算机辅助设计实习实习报告
- java基础——多态
- 数组——洛谷#P1427 小鱼的数字游戏(Python实现)
- ppt 里插入html,如何在PPT中插入html网页.ppt
- 测试20220202
- C语言项目设计——程序设计
- 进制转换器java程序_java编写简易的进制转换器
热门文章
- VNote v2.7.1 绿色版下载
- orical 数据库 搜索语句
- 大疆校招测评题--循环赛问题
- 基于AT89S51的单片机无线双显示抢答器简要说明
- 李炎恢讲师Xhtml全套课程
- 数论——dove的疑惑
- 拼多多打标,拼多多号搜索打标原理,拼多多打标源码,拼多多足迹接口,多多号打标,拼多多打标接口,拼多多号打标有什么影响,拼多多号打标是什么,魔搜拼多多版本,服务市场的打标接口
- HarmonyOS_BearPi-HM Nano学习笔记之环境搭建
- 关于高版本数据库导入到低版本数据库时间的一些注意事项
- 英语面试计算机岗位,计算机专业英语面试自我介绍.docx