使用STM32Cube MX为STM32 CAN总线快速配置上手教程_HAL库_CAN协议_STM32_附波特率计算工具
使用STM32Cube MX为STM32 CAN总线快速上手教程_HAL库_CAN协议_STM32
前言
博主也是刚接触CAN协议的新手,如有不对的地方欢迎交流
本文旨在使用STM32Cube MX快速上手STM32 CAN协议配置教程,目的在于 “会用” CAN总线,对CAN 协议原理并未深入讲解。
CAN协议基本特点
基本特点如下:
- 可多主控制: 当CAN总线空闲时,所有在总线上的终端都可以发送报文,根据标识符(CAN ID)决定优先级,当总线上有两个以上的终端发送消息时,对各消息CAN ID的每个位进行逐个仲裁比较。CAN ID值越低,报文优先级越高
- 速度快,距离远:CAN 协议最快可达1Mbps(距离小于40m),最远可达10KM(速率小于 5Kbps)
- CAN 帧种类:CAN 通信中包含五种帧种类,数据帧、遥控帧、错误帧、过载帧、间隔帧。其中最重要的是数据帧,用于通讯节点向外传送数据。数据帧中有数据段,用于承载数据的内容,一帧可发送0~8个字节的数据,MSB先行。
简单了解上述基本特点即可快速上手CAN总线的配置。
STM32Cube MX中的配置
CAN为了实现位同步,CAN协议把每一个数据位的时序分解成SS段,PTS段,PBS1段,PBS2段,这四段的长度加起来即为一个CAN数据位的长度。但在STM32中,将上述四个时序段整合成BS1和BS2两个时序段,对这两个时序段进行配置即可得到所需的通信波特率。
这里以F103C8T6为例,APB1时钟为36Mhz
计算波特率的方法:36M/分频系数/(BS1 + BS2 + 1)
如图设置,波特率是500Kbps,36M / 18 /(1 + 2 + 1) = 0.5M = 500K
配置选项说明:
Prescaler:分频系数
Time Quanta in Bit Segment 1:时间段1(BS1):定义采样点的位置。其值可以编程为1到16个时间单元,但也可以被自动延长,以补偿因为网络中不同节点的频率差异所造成的相位的正向漂移。
Time Quanta in Bit Segment 1::时间段2(BS2):定义发送点的位置。其值可以编程为1到8个时间单元,但也可以被自动缩短以补偿相位的负向漂移。
以上三个参数是决定CAN通信波特率的重要参数
Automatic Bus-Off Management:自动离线管理,节点检测到它发送错误或接收错误超过一定值时,会自动进入离线状态, 在离线状态中, CAN 不能接收或发送报文。
Automatic Retransmission:自动重发机制,当CAN总线发送失败时,会自动重发。
Operating Mode:CAN模式选择,有正常、回环、静默和静默回环四种模式可选,本篇文章只讲正常模式(双机通信)。
分享一个CAN波特率计算小工具:https://download.csdn.net/download/theLeMon/13138490
开启CAN接收中断,以便进行中断接收
配置好CubeMX后,点击GENERATE CODE 生成模板代码
CAN 收发配置
做完CAN的基本配置后,为了收发CAN数据,还需要进行CAN滤波器配置和发送消息句柄、接收消息句柄设置。
- CAN滤波器配置
CAN过滤器是用于处理CAN接收过滤问题的,
/*** @brief CAN过滤器配置 * @param[in] * @return */
void CAN_Filter_Config(void)
{CAN_FilterTypeDef sFilterConfig;/*配置CAN过滤器*/sFilterConfig.FilterBank = 0; sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;sFilterConfig.FilterIdHigh = 0x0000; sFilterConfig.FilterIdLow = 0x0000;sFilterConfig.FilterMaskIdHigh = 0x0000; sFilterConfig.FilterMaskIdLow = 0x0000;sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;sFilterConfig.FilterActivation = ENABLE; sFilterConfig.SlaveStartFilterBank = 14;//过滤器配置if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK){while(1){}}//启动CAN外围设备if (HAL_CAN_Start(&hcan) != HAL_OK){while(1){}}//激活可以RX通知if (HAL_CAN_ActivateNotification(&hcan, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK){while(1){}}
}
- CAN接收中断
/*** @brief CAN接收回调函数*/// can接收buffer,这里用全局变量保存,以便其他函数处理
uint8_t can_rec_dat[8]; void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{CAN_RxHeaderTypeDef can_rx_header; //接收if(hcan->Instance == CAN1){HAL_CAN_GetRxMessage(hcan,CAN_FILTER_FIFO0,&can_rx_header,can_rec_dat);}
}
3、CAN 发送
/*** @brief CAN发送一组数据 * @param[in] msg:待发送的数据(最大为8个字节)* @param[in] len:数据帧的长度(最大为8)* @param[in] std_id:CAN_ID* @return 0:发送成功 1:发送失败*/
uint8_t CAN_Send_Msg(uint8_t* msg, uint8_t len, uint8_t std_id)
{ CAN_TxHeaderTypeDef can_tx_header; uint32_t TxMailbox;can_tx_header.StdId = std_id; can_tx_header.IDE = CAN_ID_STD; can_tx_header.RTR = CAN_RTR_DATA; can_tx_header.TransmitGlobalTime = ENABLE;can_tx_header.DLC = len; //MailboxesFreeLevel = HAL_CAN_GetTxMailboxesFreeLevel(&hcan);while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan)==0);if(HAL_CAN_AddTxMessage(&hcan, &can_tx_header, msg, &TxMailbox) != HAL_OK)//发送{return 1;}return 0;
}
很早之前躺在草稿箱的文章了,一直忘记发出来,就记得那个时候想着回公司再翻笔记再继续写,然后就忘了…也想不起自己想写啥了…现在还是发出来吧…
使用STM32Cube MX为STM32 CAN总线快速配置上手教程_HAL库_CAN协议_STM32_附波特率计算工具相关推荐
- github 快速配置简易教程笔记
1.GitHub 注册 https://github.com/ 2.GIT工具Download:https://gitforwindows.org/ 3.Github新建项目new repositor ...
- 斐讯k3安装MySQL_PHICOMM斐讯K3无线路由器快速配置安装教程
▲完成网线连接后查看路由器显示屏 WAN 口 二,网络设置(前期可跳过此步骤,如进不了路由器的设置界面可配置界面前先检查电脑是否网络连接为自动获取,以免 IP 非同网段自动获取则直接来到第三部分设置) ...
- STM32 CAN总线通信学习笔记(一)
STM32 CAN总线通信学习笔记(一) 一.CAN总线简介 CAN 是控制器局域网络(Controller Area Network, CAN)的简称.CAN采用数据块编码的方式,数据块根据帧的类型 ...
- 经济型EtherCAT运动控制器(十):EtherCAT总线快速入门
本节主要介绍XPLC006E多轴经济型EtherCAT总线运动控制器控制EtherCAT总线驱动器的方法,分别介绍硬件接线方法,控制器与EtherCAT总线驱动器如何通讯,EtherCAT总线驱动器相 ...
- STM32 CAN总线冲突故障的分析和解决
现场的STM32 CAN总线设置一共有3个:A.B.C.其中A是发送命令者,C是执行命令者,B是分析命令者.A发送命令,C执行命令后输出信号,B通过分析命令的内容切换继电器通道.以上就是设计初衷. 实 ...
- STM32的总线AMBA、AHB、APB
一.总线的简单介绍: 处理器无疑是计算机中最重要的部件,但并不是唯一的部件.一台计算机也需要随机访问存储器(RAM)来存放机器码指令以便让处理器执行.计算机还必须有一些方法使这些指令进入RAM(输入设 ...
- STM32Cube MX“No section matches selector - no section to be FIRST/LAST”错误解决方案
最近在升级STM32Cube MX的时候遇到了下面的问题,生成的代码在编译的时候出现了如下错误: 我查阅了各种资料,最终误打误撞把这个问题解决了. 解决方法如下: 新建一个 New Group 然后给 ...
- CAN总线波特率计算及设置方法(STM32,SJA1000,LPC2292)
SJA1000 内部频率基准源F_BASE = Fclk/2,即外部晶振频率Fclk的2分频.注意任何应用中,当利用外部晶振作为基准源的时候,都是先经过2分频整形的. 1.1 位周期的组成 波特 ...
- Stm32 CubeMx安装和配置Cube.ai教程
目录 前言 下载ST CubeMx IDE 安装过程 配置Cube.AI Cube.AI背景知识 CubeMX配置Cube.AI 在项目中使用Cube.AI扩展库 验证AI 结尾小谈 前言 Stm32 ...
最新文章
- Matlab数据的可视化 -- 极坐标图及其与直角坐标图的转换
- 2019腾讯广告算法大赛-冠军之路
- android游戏加载,Android 游戏引擎libgdx 资源加载进度百分比显示案例分析
- MySQL无法存储中文问题
- linux awk命令使用示例
- 13.IDA-显示正确的函数名称(去掉c++后缀命名)
- react usecontext_Vue3原理实战运用,我用40行代码把他装进了React做状态管理
- 智慧屏鸿蒙系统的优势,荣耀智慧屏成热点 搭载的鸿蒙系统有何优势?
- 打开 mhtml 文件 显示不全_3dmax打开时显示缺少外部文件的解决方法与步骤
- bash 脚本_实用的 bash 自定义脚本,快速提效工作流程
- CCF201403-5 任务调度(100分题解链接)
- Windows核心编程_异型窗口
- 计算机蓝屏 代码0000a,win7 64位系统蓝屏代码0x0000000a的原因及解决方法
- protoc 命令 java_protoc 指令介绍
- solidworks2021安装教程,solidworks2021安装步骤
- 创建Allegro差分对
- 利用Python脚本计算基因组测序数据Nx0
- GET 请求能传图片吗?
- java webshell_都0202年了老嗨还在用的 - 各种姿势jsp webshell
- 按键精灵打怪学习-前台和内网发送后台验证码