STM32 CAN波特率计算

news2025/1/31 11:04:02

STM32 CAN波特率计算

  • 简介
  • CAN总线收发,中断方式接收配置
  • 代码部分
  • reference

简介

CAN通信帧共分为数据帧、远程帧、错误帧、过载帧和帧间隔,本文这里以数据帧为例。
显性电平对应逻辑0,CAN_H和CAN_L之差为2.5V左右。而隐性电平对应逻辑1,CAN_H和CAN_L之差为0V.
数据帧有标准帧和扩张帧两种格式,一个11位,一个29位.

标准帧和扩张帧两种格式区别:

  • 1.扩展帧的仲裁域有29位,可以出现2^29中报文,且在数据链路上是有间隙的(对操作者透明),帧ID的范围是0000 0000-1FFF FFFF。(PS:目的就是构造29位的CAN ID,可以实现更加庞大的ID群)
  • 2.标准帧的仲裁域是连续的11位,可以出现2^11种报文,也就是帧ID的范围是000-7FF;
  • 3.标准帧和扩张帧的控制帧中的DLC(数据长度)完全相同,但保留位不同,标准帧为IDE、R0,扩展帧为R1、R0,必须以显性电平发送(由数据链路层操作)

注意:这里的帧ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级(帧ID值越小,优先级越高,最小是0x00000000)

CAN协议特点:
1、多主控制。
2、系统柔软性。
3、通讯速度快,通讯距离远。
4、具有错误检测、错误通知、错误恢复功能。
5、故障封闭功能。
6、连接节点多

CAN总线具有自动仲裁功能,这样就提高了总线的利用率。

CAN总线没有被发送出去的隐性信号,会由CAN控制器后续发送出去。这里牵涉到CAN总线优先级的问题,后续进一步讲述。
当然,CAN相比485具有明显优势,主要原因还是在于CAN控制器。

CAN直接通过TX连接对方的RX引脚,单向传输可以,双向传输就不行,因为CAN控制器会实时监测发送出去的信号是否正确。也就是说TX要与RX信号一致才行,否则CAN控制器认为你发送失败。

CAN总线收发,中断方式接收配置

平台:STM32F407VEt6
STM32CUBEMX V5.3

配置CAN
CAN的波特率最大为1Mbps。

波特率计算方法:时钟主频 / 分频 / (tq1 + tq2 + swj)

以500K的波特率配置为例:
stm32f407的CAN的时钟主频是42M,分24频就是1.75M,在除以(3 + 3 + 1)得到250K的波特率。
注意:stm32cubemx生成的CAN代码是不带过滤器的,需要自己手动添加。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

CAN之数据帧格式
在这里插入图片描述

代码部分

CAN初始化

/* CAN1 init function */
void MX_CAN1_Init(void)
{
  //hz = 42 / 24 / (3+3+1)
  hcan1.Instance = CAN1;
  hcan1.Init.Prescaler = 24;
  hcan1.Init.Mode = CAN_MODE_NORMAL;
  hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ;
  hcan1.Init.TimeSeg1 = CAN_BS1_3TQ;
  hcan1.Init.TimeSeg2 = CAN_BS2_3TQ;
  hcan1.Init.TimeTriggeredMode = DISABLE;
  hcan1.Init.AutoBusOff = DISABLE;
  hcan1.Init.AutoWakeUp = DISABLE;
  hcan1.Init.AutoRetransmission = DISABLE;
  hcan1.Init.ReceiveFifoLocked = DISABLE;
  hcan1.Init.TransmitFifoPriority = DISABLE;
  if (HAL_CAN_Init(&hcan1) != HAL_OK)
  {
    Error_Handler();
  }
}

覆写接收中断回调函数
(注意:上面的配置我们使用的式FIFO0,所以要覆写FIFO0的中断回调函数):

//CANÖжϽÓÊջص÷º¯Êý£¬½ÓÊÕµ½µÄÖ¡Í·´æRxMessage£¬Êý¾Ý´ædataÊý×é
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
		uint8_t data[8];
		HAL_StatusTypeDef status;
		if (hcan == &hcan1) {
		status = HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxMessage, data);
		if (HAL_OK == status)
		{
			CAN_ID=RxMessage.StdId;//±ê×¼Ö¡ID¸´ÖÆ
			//memcpy(SendBuff,data,8);//½ÓÊÕµ½µÄÊý¾Ý¿½±´µ½·¢ËÍÊý×é
		}
		
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);
	}
}

CA发送函数:

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
//CAN ·¢Ëͺ¯Êý
void CAN_SendMsg(uint16_t msgID, uint8_t *Data)
{
  CAN_TxHeaderTypeDef   TxHeader;
	TxHeader.StdId = msgID;			//stdID
	TxHeader.RTR = CAN_RTR_DATA;		//Êý¾ÝÖ¡,CAN_RTR_DATA
	TxHeader.IDE = CAN_ID_STD;		//±ê×¼¸ñʽ
	TxHeader.DLC = 8;   				//Êý¾Ý³¤¶È
	TxHeader.TransmitGlobalTime = DISABLE;
	uint8_t  TxData[8];		//×î¶à8¸ö×Ö½Ú
	TxData[7] = *(Data+0);
	TxData[6] = *(Data+1);
	TxData[5] = *(Data+2);
	TxData[4] = *(Data+3);    
	TxData[3] = *(Data+4);
	TxData[2] = *(Data+5);
	TxData[1] = *(Data+6);
	TxData[0] = *(Data+7);
	while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan1) < 1) {
	} //µÈ´ýÓпÉÓõķ¢ËÍÓÊÏä
	uint32_t TxMailbox;		//ÁÙʱ±äÁ¿, ÓÃÓÚ·µ»ØʹÓõÄÓÊÏä±àºÅ
	/*  ·¢Ë͵½ÓÊÏ䣬ÓÉCANÄ£¿é¸ºÔð·¢Ë͵½CAN×ÜÏß   */
	if(HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox) != HAL_OK)
    {
        
    }
}

reference

  • STM32 CAN通讯配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/363204.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

元宇宙对营销方式的影响

营销方式的变化通常伴随着技术的发展。我们已经看到营销方式从印刷媒体、电视、广播到互联网的转变。而现在&#xff0c;我们又处在下一个营销方式大跃进的风口浪尖上。 关于元宇宙及其潜在的变革性影响&#xff0c;人们已经讨论了很多。虽然与元宇宙相关的大多数东西在很大程…

使用 husky 进行基础代码审查

在日常提交 PR 的过程中&#xff0c;我们提交的文件不应该有例如 console、debugger、test.only 等调试语句&#xff0c;这会影响到线上代码。那每次提交之前都检查似乎又像是一个繁琐的工作&#xff0c;如果有个工作能代替我们检查我们提交的代码&#xff0c;让不能提交到线上…

Linux 文件相关操作

文件相关操作 编辑文件 命令&#xff1a; vi 文件名 然后输入i进入编辑模式 编辑完成后输入esc退出编辑 输入:wq保存即便目录下没有这个文件&#xff0c;也可以想使用vi 文件名进行编辑&#xff0c;保存退出后会创建这个文件 查看文件内容 命令&#xff1a; cat 文件名复…

UDP报文详解

目录 &#x1f433;今日良言:走好选择的路&#xff0c;别选择好走的路&#xff0c;你才能拥有真正的自己。 &#x1f43c;一、UDP协议特点 &#x1f43c;二、UDP协议段格式详解 &#x1f433;今日良言:走好选择的路&#xff0c;别选择好走的路&#xff0c;你才能拥有真正的自…

PointNet++训练自己的数据集(附源码)

本文针对PointNet强大的三维点云分类功能&#xff0c;详细讲解怎么训练自己的数据集&#xff0c;在此之前&#xff0c;需要确保已经能够跑通源码的训练和测试&#xff0c;如果没有&#xff0c;请参考PointNet的源码运行。数据放置1.1. 在mytensor_shape_names.txt中配置自己的分…

LeetCode-40.组合总和II

目录题目思路回溯法题目来源 40.组合总和II 题目思路 这道题目和39.组合总和如下区别&#xff1a; 本题candidates 中的每个数字在每个组合中只能使用一次。本题数组candidates的元素是有重复的&#xff0c;而39.组合总和是无重复元素的数组candidates 为了理解去重我们来举…

keepalived+LVS配置详解

keepalivedLVS配置详解keepalived简介keepalived的应用场景keepalived工作原理VRRP协议核心组件分层工作工作状态LVS简介LVS三种模式NAT模式(网络地址映射)IPTUN模式(IP隧道)DR模式(直接路由)三种模式对比keepalivedLVS配置1.master配置2. keepalived配置文件3 修改keepalived配…

做主管如何规范测试团队

当你来到一个项目不规范的技术团队&#xff0c;你会怎么处理呢? 问题 Testing 流程不规范 没有需求评审和设计评审&#xff0c;需求经常是业务或者项目经理直接跟开发提&#xff0c;有时候开发自己都不明白需求&#xff0c;糊里糊涂地就要开发&#xff0c;也没有设计评审&…

插画师培训怎么选,5大插画师培训班排名

插画师培训哪里好&#xff0c;给大家推荐5大插画师培训班排名&#xff0c;各有优势和特色&#xff0c;提供大家选择&#xff01; 一&#xff1a;5大插画师培训班排名 1、轻微课&#xff08;五颗星&#xff09; 主打课程有日系插画、游戏原画、古风插画、动漫漫画&#xff0c;以…

UI自动化测试、接口测试等自动化测试策略

今天跟大家介绍UI测试、接口测试、单元测试主要内容&#xff0c;以及每种测试花费时间讨论。 UI测试【Selenium】 UI测试是最接近软件真实用户使用行为的测试类型。通常是模拟真实用户使用软件的行为&#xff0c;即模拟用户在软件界面上的各种操作&#xff0c;并验证这些操作对…

江苏专转本如何事半功倍的备考

专转本如何事半功倍的备考 一个人学习成绩的优劣取决于他的学习能力&#xff0c;学习能力包括三个要素&#xff1a;规范的学习行为&#xff1b;良好的学习习惯&#xff1b;有效的学习方法。有了规范的学习行为才能培养出良好的学习习惯&#xff0c;形成了良好的学习习惯就会形成…

Android - 代码生成远程依赖库(阿里云)

一、注册 没有注册过阿里云且没有实名认证的点这里&#xff1a;阿里云官网 二、查看库 阿里云制品仓库Packages &#xff08;注&#xff1a;如果没有创建企业或个人使用&#xff0c;按照提示&#xff0c;选个人使用&#xff09; 三、选择类型 选择其中一个&#xff08;两…

问题解决篇 | Win11网络连接上了但是无法上网(修改DNS弹出框框“出现问题”,如何通过网络检测确定并修复网络问题)

目录 问题 网络诊断 Win i 打开设置 搜索“查找并修复网络问题”并点击 "远程计算机或设备将不接受连接" 解决办法&#xff1a; Win R&#xff0c;输入 inetcpl.cpl &#xff0c;点击确定&#xff0c;打开Internet选项 选择“连接” 点击“局域网设置” 三个…

vscode下使用arduino插件开发ESP32 Heltec WiFi_Kit_32_V3

下载vsCode 添加 arduino 插件 在Arduino IDE 中添加开发板&#xff0c;注意只能用右侧的开发板管理器添加&#xff0c;自己下载之后复制进去的IDE认&#xff0c;但是vsCode不认&#xff0c;搜索ESP32 第一个库里面只有到V2的&#xff0c;没有V3&#xff0c;要安装下面那个 H…

CDH 6.3.2启用HDFS高可用

启用原因 CDH 6.3.2平台即将用于生产&#xff0c;生产平台几乎需要高可用平台&#xff0c;故需要升级CDH中的HDFS为HA。 启用准备 CDH已经成功安装并正常使用CMS的管理员账号正常登陆 HDFS启用HA 登陆CMS系统->选择HDFS服务->点击进入到HDFS服务详情页面&#xff0c…

CRC冗余校验的原理和FPGA实现思路

CRC校验码&#xff0c;顾名思义是用于校验的。它可以用于检测数据传输过程中是否出现错误&#xff08;某些位&#xff0c;或某几位&#xff0c;或者某块区域位错误&#xff09;&#xff0c;反正 可以知道数据出错了&#xff0c;但是不能纠错。 CRC校验&#xff0c;本质上是模2…

VIIRS-NPP夜间灯光遥感数据下载和预处理

VIIRS-NPP夜间灯光遥感数据下载和预处理 月和年合成产品下载网站 日数据下载网站 一、下载shp掩膜文件 下载好月合成产品后&#xff0c;在这个网站上下载矢量地图&#xff0c; 点击复制按钮&#xff0c;来到这个网站&#xff0c;ctrl v粘贴 点击右上角Export&#xff0c;…

【阿旭机器学习实战】【31】股票价格预测案例--线性回归

【阿旭机器学习实战】系列文章主要介绍机器学习的各种算法模型及其实战案例&#xff0c;欢迎点赞&#xff0c;关注共同学习交流。 注:本文模型结果不好&#xff0c;仅做学习参考使用&#xff0c;提供思路。了解数据处理思路,训练模型和预测数值的过程。 目录1. 读取数据K线图绘…

解决一打开IE浏览器就自动跳转到Edge浏览器的问题

问题说明&#xff1a; 打开Internet Explorer浏览器后会自动跳转到Microsoft Edge浏览器。 解决方法&#xff1a; 打开控制面板&#xff0c;选择“Internet选项”&#xff0c;选择【高级】选项卡&#xff0c;取消勾选“启用第三方浏览器扩展*”即可。

Java之前缀和算法

一.前缀和 1.前缀和介绍 前缀和,顾名思义,就是前n项相加之和,和我们高中时候学习的数列中的一个含义 例如一个等差数组n,那他的前n项和 也可知道- 2.编程中的前缀和 对于一个数组nums,也可以很容易求出它的前缀和数组 public int[] prefix(int[] nums) {int[] prefix …