STM32的CAN

2023-05-16

一、CAN控制器简介

STM32自带了基本扩展CAN外设,又称bxCAN,bxCAN的特点如下:

1、支持CAN协议2.0A和2.0B主动模式

2、波特率最高达1Mbps

3、支持时间触发通信

4、具有3个发送邮箱

5、具有3级深度的2个接收FIFO

6、可变的筛选器组(也称过滤器组,最多28个)

 CAN控制器简介-模式

工作模式

1)初始化模式(INRQ=1,SLEEP=0)

2)正常模式(INRQ=0,SLEEP=0)

3)睡眠模式(SLEEP=1)

通过CAN_MCR寄存器控制INRQ和SLEEP

测试模式

1)静默模式(LBKM=0,SILM=1)

(静默模式下bxCAN可以接收CANRX但是不会发送任何CANTX,可以监控总线上的数据)

2)环回模式(LBKM=1,SILM=0)

(环回模式下bxCAN可以发送CANTX但是不会接收任何CANRX。它发送的数据,发送与接收会形成一个环路,从而达到自发自收的作用,可以自己检测发送的数据是否发送出去)

3)环回静默模式(LBKM=1,SILM=1)

(不管总线上如何都不影响,自发自收,“闭关锁国”)

通过CAN_BTR寄存器控制LBKM和SILM

https://blog.csdn.net/weixin_62584795/article/details/126686162
————————————————



  STM32的CAN控制器可以对接收到的数据报文进行过滤。

只接收指定CAN ID的数据。
对于其他CAN ID发送过来的数据,则不再触发CAN中断。
  

根据芯片的不同,可以有不同数量的CAN控制器:

如果STM32只有一个CAN控制器,则可以配置14个过滤器组,对应的编号为0 ~ 13。
如果STM32拥有两个CAN控制器,则可以配置28个过滤器组:
对于CAN 1,对应的过滤器组编号为0 ~ 13。
对于CAN 2,对应的过滤器组编号为14 ~ 27。

CAN过滤有如下模式:

屏蔽位模式
标识符列表模式


相关寄存器
  和CAN过滤相关的寄存器为CAN_FxR1和CAN_FxR2:

在这里插入图片描述

  如果只想接收CAN ID为0x317的标准帧,则设置方法如下:

在这里插入图片描述

0110 0010 111:0x317对应的二进制位。
1111 1111 111:收到的数据帧中相应的ID位必须和设置的ID位一样。
00和11:只接收标准帧,不接收扩展帧。
  如果想接收CAN ID为0x310至0x317的标准帧,则设置方法如下:

在这里插入图片描述

代码实例
只过滤一个CAN ID
  如果需要让CAN 2只接收CAN ID为0x713的报文,则代码如下:

CAN_FilterInitTypeDef CAN_FilterInitStructure;

CAN_FilterInitStructure.CAN_FilterNumber = 14;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;  // 屏蔽位模式?
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;

CAN_FilterInitStructure.CAN_FilterIdHigh     = ( uint16_t ) ( ( 0x713 << 5 ) & 0xFFFF );
CAN_FilterInitStructure.CAN_FilterIdLow      = ( uint16_t ) ( 0x0000 | CAN_ID_STD );
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFF0;
CAN_FilterInitStructure.CAN_FilterMaskIdLow  = 0x0006;

CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit ( &CAN_FilterInitStructure );


过滤多个CAN ID
  如果需要让CAN 2只接收CAN ID为0x713、0x714的报文,则代码如下:

CAN_FilterInitTypeDef CAN_FilterInitStructure;

CAN_FilterInitStructure.CAN_FilterNumber = 14;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;

CAN_FilterInitStructure.CAN_FilterIdHigh     = ( uint16_t ) ( ( 0x713 << 5 ) & 0xFFFF );
CAN_FilterInitStructure.CAN_FilterIdLow      = ( uint16_t ) ( 0x0000 | CAN_ID_STD );
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFF0;
CAN_FilterInitStructure.CAN_FilterMaskIdLow  = 0x0006;

CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit ( &CAN_FilterInitStructure );
/*-----------------------------------------------------------------------------------*/
CAN_FilterInitStructure.CAN_FilterNumber = 15;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;

CAN_FilterInitStructure.CAN_FilterIdHigh     = ( uint16_t ) ( ( 0x714 << 5 ) & 0xFFFF );
CAN_FilterInitStructure.CAN_FilterIdLow      = ( uint16_t ) ( 0x0000 | CAN_ID_STD );
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFF0;
CAN_FilterInitStructure.CAN_FilterMaskIdLow  = 0x0006;

CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
CAN_FilterInit ( &CAN_FilterInitStructure );
————————————————
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32的CAN 的相关文章

  • 处理器指令周期执行时间

    我的猜测是 no operation 内在 ARM 指令应花费 1 168 MHz 来执行 前提是每个NOP在一个时钟周期内执行 我想通过文档验证这一点 有关处理器指令周期执行时间的信息是否有标准位置 我试图确定 STM32f407IGh6
  • 初始化 ST-Link 设备时出错 - 无法连接到设备

    我目前正在使用 ST Link 调试器对我的 STM32F3 Discovery 板进行编程 我使用的IDE是Atollic TrueStudio 5 5 2 现在我面临一个非常奇怪的问题 那就是我不断收到消息 初始化 ST Link 设备
  • 在 MCU 内部 FLASH 中从一个固件跳转到另一个固件

    我目前正在开发针对 STM32F030C8 的引导加载程序固件应用程序 我在分散文件中指定引导加载程序应用程序将占用主内存位置 0x08000000 到 0x08002FFF 扇区 0 到扇区 2 我还编写了一个主固件应用程序 存储在0x0
  • 如何让printf在STM32F103上工作?

    我是 STM32F103 世界的新手 我有一个STM32F103的演示代码 我正在使用arm none eabi来编译它 我尝试了在谷歌上可以找到的内容 但到目前为止没有任何效果 我已经花了三天时间来解决这个问题 任何人都可以给我一个运行良
  • STM32 F072上的软件如何跳转到bootloader(DFU模式)?

    STM32应用笔记2606对此进行了讨论 但没有简单的代码示例 该答案已使用 IAR EWARM 在 STM32F072 Nucleo 板上进行了测试 这个答案使用 STM32标准外设库 仅此而已 请注意 验证您是否成功进入引导加载程序模式
  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • 134-基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真+源程序...

    资料编号 134 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 ds1302时钟 DHT11温湿度 电机 蜂鸣器 制作一个基于stm32单片机矿井瓦斯天然气浓度温湿度检测自动通风系统Proteus仿真 2 通过DH
  • 137-基于stm32单片机智能保温杯控制装置Proteus仿真+源程序

    资料编号 137 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DS18B20传感器 电机 制作一个基于stm32单片机智能保温杯控制装置Proteus仿真 2 通过DS18b20传感器检测当前保温杯水的温度 并且
  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • 135-基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真+源程序

    资料编号 135 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 电机 超声波传感器 制作一个基于stm32单片机超声波非接触式感应水龙头控制系统Proteus仿真 2 通过DHT11传感器检测当前
  • rt-thread studio中新建5.02版本报错

    先吐槽一下 rt thread studio出现BUG真多 好多时间都是在找BUG 但里面用好多控件还是挺好用的 真是又爱又恨 所以一般使用功能不多的话还是用keil多一点 创建5 02版本工程之后直接进行编译 直接会报下面这个错误 资源
  • 在 Atollic TrueStudio、STM32CubeMX 中导入 C 库

    我目前正在开发 STM32F767ZI Nucleo 板和一个小安全芯片 microchip atecc508a 通过 i2c 连接进行连接 该芯片有一个可用的库加密验证库 https github com MicrochipTech cr
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • Arm:objcopy 如何知道 elf 中的哪些部分要包含在二进制或 ihex 中?

    我正在开发一个项目 其中涉及解析arm elf 文件并从中提取部分 显然 elf 文件中有很多部分没有加载到闪存中 但我想知道 objcopy 到底如何知道要在二进制文件中包含哪些部分以直接闪存到闪存中 以arm elf文件的以下reade
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • systick定时器

    systick定时器 文章目录 前言 一 前期疑惑 二 解答 1 关于systick是阻塞的吗 2 非阻塞 三 软件编写 总结 前言 这边记录systick相关知识点 一 前期疑惑 在学习systick志气啊 其实对于systick还是一脸
  • STM32 上的 ADC 单次转换

    我正在研究 STM32 F103x 上的 ADC 编程 并从最简单的情况 单次转换开始 测量内部温度传感器 连接到 ADC1 的值 并使用 USART 将其发送到 COM 端口 目标似乎很明确 但是当我尝试将源代码下载到闪存时 它不会向 C
  • STM32内部时钟

    我对 STM32F7 设备 意法半导体的 Cortex M7 微控制器 上的时钟系统感到困惑 参考手册没有充分阐明这些时钟之间的差异 SYSCLK HCLK FCLK 参考手册中阅读章节 gt RCC 为 Cortex 系统定时器 SysT

随机推荐

  • 什么是航位推算(Dead Reckoning )

    只有同时接收三到四个GPS GNSS卫星的信号才能实现精确的GPS GNSS定位 当仅依靠GPS GNSS定位时 xff0c 可能会出现位置精度降低或丢失的情况 例如 xff0c 当车辆在无法接收GPS GNSS信号的区域 xff08 隧道
  • STM32F103系列引脚定义-功能图

    器件功能和配置 xff08 STM32F103XX增强型 xff09 系统结构 管脚图
  • 如何用keil5打开keil4的工程

    参考网友的方法 xff1a 1 到http www2 keil com mdk5 legacy 官网下载keil4的支持包 2 正常流程安装所下载的安装包 xff1b 3 安装完成后 xff0c 用keil5打开工程 xff08 keil4
  • NMEA-0183 协议简介

    NMEA 0183 是美国国家海洋电子协会 xff08 National Marine Electronics Association xff09 为海用电子设备制定的标准格式 目前业已成了 GPS 北斗导航设备统一的 RTCM xff08
  • 串口通信校验方式(even,odd,space,mark)UART数据波形分析

    1 even 每个字节传送整个过程中bit为1的个数是偶数个 xff08 校验位调整个数 xff09 2 odd 每个字节穿送整个过程中bit为1的个数是奇数个 xff08 校验位调整个数 xff09 3 noparity没有校验位 4 s
  • Linex Ubuntu环境下 Intel Realsense D435I 驱动+ROS驱动安装配置

    任务背景 在ROS环境中使用d435i xff0c 订阅图像和imu数据 任务概述 实现在ros中使用d435i主要有两步骤 xff1a 1 安装d435i sdk xff0c 即librealsense xff1b 2 安装realsen
  • C++ 实现简单Http服务器

    实现一个简单的Http服务器 xff0c 基于windows 平台 总共五个文件 HttpServer hpp HttpServer cpp Utils hpp Utils cpp main cpp Utils hpp span class
  • libcurl API介绍及简单编程

    libcurl编程 xff0c 主要采用callback function 回调函数 的形式完成传输任务 xff0c 用户在启动传输前设置好各类参数 和回调函数 xff0c 当满足条件时 libcurl 将调用用户的回调函数实现特定功能 下
  • git patch

    git patch用于将所做的修改进行打包 xff0c 然后再别的分支或给别人可以直接应用该patch xff0c 达到修改复用的效果 diff命令 git diff gt xxxx patch git diff xx file gt xx
  • WIFI知识 - MCS简介

    WIFI知识 MCS简介 MCS简介 802 11n 射频速率的配置通过 MCS xff08 Modulation and Coding Scheme xff0c 调制与编码策略 xff09 索引值实现 MCS 调制编码表是 802 11n
  • 802.11 QoS

    到了空调西瓜WiFi的夏日时光了 xff0c 家里用网的人一多 xff0c 难免会抢占起宽带资源来 有没有什么办法 xff0c 让家里所有人都可以得到一个比较不错的网络体验呢 xff1f 那今天你可以试试打开你路由器的QoS功能了 xff0
  • Wireshark抓包分析WLAN连接过程

    一个完整的WLAN连接过程 xff1a 一 xff1a WLAN扫描 主动扫描 xff1a 两种方式 xff1a xff08 1 xff09 向各个信道发出Probe Request帧并制定某个SSID xff0c 只有能够提供指定SSID
  • 802.11X用户身份验证 EAPOL

    EAPOL是什么 sogou com 802 11X用户身份验证 走看看 zoukankan com EAPOl的由来是基于802 1x网络访问认证技术 xff1a 802 1x协议起源于802 11协议 xff0c 后者是IEEE的无线局
  • git reset

    git reset 三种模式分别为 mixed 默认 soft hard 直接看官方的解释 其中HEAD代表版本库 xff0c index代表暂存区 xff0c 另外还有一个我们改代码的工作区 mixed 回退版本库 xff0c 暂存区 m
  • git reset还是git revert?

    reset和revert都可以用来回滚代码 但他们是有区别的 xff0c 准确来说 xff0c reset是用来 34 回退 34 到某个提交 xff0c 而revert是用来 34 撤销 34 某次或者某几次提交 xff0c 撤销也会作为
  • PR and MR

    GitHub 的 Pull Request 是指什么意思 xff1f 作者 xff1a 知乎用户 链接 xff1a https www zhihu com question 21682976 answer 79489643 来源 xff1a
  • python--基础知识点--subprocess模块

    subprocess 模块的介绍与使用 一 介绍 subprocess模块可以生成新的进程 xff0c 连接到它们的input output error管道 xff0c 同时获取它们的返回码 二 基本操作方法 1 subprocess的ru
  • Homebus(HBS)通信协议学习

    HBS通信主控与从机连接示意图 两根HBS总线之间的电压差大约为15V xff0c 差分信号分别加载到HBS的这两根总线上 用示波器的探头测得 xff08 探头的地在任意一根HBS总线上 xff0c 探头的信号输入端在另一根HBS总线上 x
  • RSA参数及RSA用法

    RSA算法n e d三个参数的意义 n为q p乘机 e为加密质数数值 d为解密质数数值 其中 e d p 1 q 1 61 1余数为1 其中p和q为2个足够大的素数 RSA的算法涉及三个参数 xff0c n e1 e2 其中 xff0c n
  • STM32的CAN

    一 CAN控制器简介 STM32自带了基本扩展CAN外设 xff0c 又称bxCAN xff0c bxCAN的特点如下 xff1a 1 支持CAN协议2 0A和2 0B主动模式 2 波特率最高达1Mbps 3 支持时间触发通信 4 具有3个