【HAL库】STM32F407----CAN通信----中断详解

news2024/11/26 2:34:34

CAN通信----基本原理
CAN通信----电路图

一、CAN通信----中断简介

STM32F407的CAN通信一共有四个专用中断,分别是:

  1. 发送中断
  2. FIFO0 接收中断
  3. FIFO1 接收中断
  4. 错误中断

具体如下图所示:

在这里插入图片描述

二、CAN通信----中断寄存器

CAN中断使能寄存器(CAN_IER)

偏移地址:0x14
复位值:0x000000000

在这里插入图片描述

寄存器位说明
位31:18保留位,必须保持复位值
位17SLKIE: 睡眠中断使能
0: 当SLAKI位被置1时,没有中断产生;
1: 当SLAKI位被置1时,产生中断。
位16WKUIE: 睡眠唤醒中断使能
0: 当WKUI位被置1时,没有中断产生;
1: 当WKUI位被置1时,产生中断。
位15ERRIE: 错误中断使能
0: 当CAN_ESR寄存器有错误挂号时,没有中断产生;
1: 当CAN_ESR寄存器有错误挂号时,产生中断。
位14:12保留位,硬件强制为0。
位11LECIE: 上次错误号中断使能
0: 当检测到错误从而硬件对LEC[2:0]写入非0值时,不会对ERRI位置1;
1: 当检测到错误从而硬件对LEC[2:0]写入非0值时,对ERRI位置1。
位10BOFIE: 离线中断使能
0: 当BOFF位被置1时,不会对ERRI位置1;
1: 当BOFF位被置1时,对ERRI位置1。
位9EOVIE:错误被动中断使能
0: 当EPVF位被置1时,不会对ERRI位置1;
1: 当EPVF位被置1时,对ERRI位置1。
位8EWGIE: 错误警告中断使能
0: 当EWGF位被置1时,不会对ERRI位置1;
1: 当EWGF位被置1时,对ERRI位置1。
位7保留位,硬件强制为0
位6FOVIE1: FIFO1溢出中断使能
0: 当FIFO1的FOVR位被置1时,没有中断产生;
1: 当FIFO1的FOVR位被置1时,产生中断。
位5FFIE1: FIFO1满中断使能
0: 当FIFO1的FULL位被置1时,没有中断产生;
1: 当FIFO1的FULL位被置1时,产生中断。
位4FMPIE1: FIFO1消息挂起中断使能
0: 当FIFO1的FMP[1:0]位被写入非0值时,没有中断产生;
1: 当FIFO1的FMP[1:0]位被写入非0值时,产生中断。
位3FOVIE0: FIFO0溢出中断使能
0: 当FIFO0的FOVR位被置1时,没有中断产生;
1: 当FIFO0的FOVR位被置1时,产生中断。
位2FFIE0: FIFO0满中断使能
0: 当FIFO0的FULL位被置1时,没有中断产生;
1: 当FIFO0的FULL位被置1时,产生中断。
位1FMPIE0: FIFO0消息挂起中断使能
0: 当FIFO0的FMP[1:0]位被写入非0值时,没有中断产生;
1: 当FIFO0的FMP[1:0]位被写入非0值时,产生中断。
位0TMEIE: 发送邮箱空中断使能
0: 当RQCPx位被置1时,没有中断产生;
1: 当RQCPx位被置1时,产生中断。

三、CAN通信----中断配置

1. 在STM32CubeMX上,勾选中断

在这里插入图片描述

生成程序后,代码如下:

在这里插入图片描述

STM32CubeMX上,关于CAN通信配置的具体操作步骤,请看这篇文章:
【HAL库】STM32CubeMX开发----STM32F407----CAN通信实验

2. 启动中断

需要用中断启动函数启动中断,启动函数如下:

//启动CAN中断函数
HAL_StatusTypeDef HAL_CAN_ActivateNotification(CAN_HandleTypeDef *hcan, uint32_t ActiveITs);

//禁用CAN中断函数
HAL_StatusTypeDef HAL_CAN_DeactivateNotification(CAN_HandleTypeDef *hcan, uint32_t InactiveITs);

启动中断具体如下:

//启动CAN发送中断
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_TX_MAILBOX_EMPTY);

//启动CAN接收中断-FIFO0接收新消息
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
//启动CAN发送中断-FIFO0接收满
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_FULL);
//启动CAN发送中断-FIFO0接收上溢
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_OVERRUN);
//启动CAN接收中断-FIFO1接收新消息
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO1_MSG_PENDING);
//启动CAN发送中断-FIFO1接收满
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO1_FULL);
//启动CAN发送中断-FIFO1接收上溢
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO1_OVERRUN);

//启动CAN-唤醒中断
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_WAKEUP);
//启动CAN-睡眠中断
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_SLEEP_ACK);
//启动CAN-错误告警中断
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_ERROR_WARNING);
//启动CAN-错误被动中断
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_ERROR_PASSIVE);
//启动CAN-总线关闭中断
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_BUSOFF);
//启动CAN-上一个错误代码中断
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_LAST_ERROR_CODE);
//启动CAN-错误中断
HAL_CAN_ActivateNotification(&hcan1, CAN_IT_ERROR);

3. 中断回调函数

当产生对应的中断,就会调用对应的中断回调函数。

//CAN通信-发送完成回调函数
void HAL_CAN_TxMailbox0CompleteCallback(CAN_HandleTypeDef *hcan);
void HAL_CAN_TxMailbox1CompleteCallback(CAN_HandleTypeDef *hcan);
void HAL_CAN_TxMailbox2CompleteCallback(CAN_HandleTypeDef *hcan);
//CAN通信-发送取消回调函数
void HAL_CAN_TxMailbox0AbortCallback(CAN_HandleTypeDef *hcan);
void HAL_CAN_TxMailbox1AbortCallback(CAN_HandleTypeDef *hcan);
void HAL_CAN_TxMailbox2AbortCallback(CAN_HandleTypeDef *hcan);

//CAN通信-FIFO0接收新消息回调函数
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan);
//CAN通信-FIFO0接收满回调函数
void HAL_CAN_RxFifo0FullCallback(CAN_HandleTypeDef *hcan);
//CAN通信-FIFO1接收新消息回调函数
void HAL_CAN_RxFifo1MsgPendingCallback(CAN_HandleTypeDef *hcan);
//CAN通信-FIFO1接收满回调函数
void HAL_CAN_RxFifo1FullCallback(CAN_HandleTypeDef *hcan);

//CAN通信-休眠回调函数
void HAL_CAN_SleepCallback(CAN_HandleTypeDef *hcan);
//CAN通信-唤醒回调函数
void HAL_CAN_WakeUpFromRxMsgCallback(CAN_HandleTypeDef *hcan);
//CAN通信-错误回调函数
void HAL_CAN_ErrorCallback(CAN_HandleTypeDef *hcan);

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

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

相关文章

颠覆Android开发行业未来,让Kotlin成为您的新宠

会Java还要学习kotlin吗? 看看这位老哥的回答: kotlin语言有前景吗? 看看在职高级开发怎么说的: Kotlin是什么? Kotlin是一种基于Java虚拟机(JVM)的静态类型编程语言,可以与Java代…

天,地,人,伤寒六经概述

天,地,人,伤寒六经概述 人天地天地气机伤寒六经三阳:三阴:太阳,少阳,阳明,太阴,少阴,厥阴 人 人之所以是一个活着的人,就在于人能够不断地与外界进行物质交换&#xff0…

CSDN周赛第48期

不知不觉又过去两期周赛,相应地,题解也落下了。而当我再回去想下载考试报告时。。。 现在更新的速度有这么快了么? 可惜题目还是考过的旧题,尤其对我们这种老油子来说,最大的好处是省去了阅读理解的烦恼。 平心而论&…

【论文阅读】CubeSLAM: Monocular 3D Object SLAM

一、基于单目图像的3d目标检测 这一部分是论文中最难理解的一章,作者的主要想法,是利用2d图像来生成3d的目标包围框(bounding box),一方面这个思路本身就不是很好懂,另一方面,作者写这一章还是…

【linux】虚拟机安装部署

找了很多教程,有的不成功,记录一下成功的参考,感谢大佬们! 1.虚拟机VMware安装 安装教程:https://blog.csdn.net/qq_45793637/article/details/128159966 2.安装centos7 Linux镜像下载地址:centos-7-is…

使用多模态数据映射大脑网络

前言 人脑由解剖和功能性的网络组织而成,这些网络涉及大规模分布但相互作用的脑区。不同脑区之间的同步性已在手指敲击或视觉刺激等实验任务活动中观察到,但更重要的是,也在无任务条件下(即静息态)测量的内源性活动中被观察到。即使在休息时…

密歇根大学Python 系列之三:Python 数据科学应用项目

Python在数据科学领域的应用已经成为了趋势,同时也在不断地发展和演化。对于从事数据科学相关工作的从业者来说,熟练掌握Python已经成为了必备技能之一。而对于其他从业者来说,了解Python在数据科学领域的应用也可以帮助他们更好地理解数据科…

linux系统中的用户态和内核态

linux系统中的用户态和内核态 文章目录 linux系统中的用户态和内核态[TOC](文章目录) 定义一、Linux系统简介Linux内核结构 二、总结 定义 在Linux系统中,用户态和内核态是两种不同的运行模式,它们主要区别在于程序所处的权限和访问硬件资源的方式。 用…

NVIDIA-SMI has failed because it couldn‘t communicate with the NVIDIA driver.解决

利用ubuntu自带的“软件与更新”安装完nvidia显卡驱动之后出现了如下提示。 NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.重启系统,在进行ubuntu启动引导的…

智能学习 | MATLAB实现PSO-SVM多输入单输出回归预测(粒子群算法优化支持向量机)

智能学习 | MATLAB实现PSO-SVM多输入单输出回归预测(粒子群算法优化支持向量机) 目录 智能学习 | MATLAB实现PSO-SVM多输入单输出回归预测(粒子群算法优化支持向量机)预测效果基本介绍模型原理程序设计参考资料预测效果 基本介绍 MATLAB实现PSO-SVM多输入单输出回归预测(粒…

adk部署win10

adksetup.exe安装 百度搜索adk 在这里插入图片描述 https://docs.microsoft.com/en-us/windows-hardware/get-started/adk-install下载adk 注意:要和操作系统版本对应上,我这里是1903版本的win10。

分布式事务处理方案及分布式锁相关

​ 本文偏理论 一、事务处理 1、事务处理的四个特性ACID Atomicity 原子性: 对于数据库的修改,全部执行or全部不执行 Consistency 一致性: Isolation 隔离性 : 亦称为串行化,防止事务间操作混淆,需要串行化或者序列化请求,使…

Java迭代

迭代(iterate)&#xff1a;简单来说&#xff0c; 它就是一个循环。 集合框架中的Iterator接口定义了迭代器的功能&#xff0c; 迭代器的用途是遍历集合&#xff08;容器&#xff09; 中的所有元素。 1. Iterator接口 public interface Iterator<E> {boolean hasNext();…

Zynq-7000、FMQL45T900的GPIO控制(一)-----SDK配置GPIO普通输入输出模式,以及GPIO编号

Zynq-7000系列GPIO排布如下图所示&#xff0c;著名手册ug585第14章&#xff0c;第一个图&#xff0c;这图很清晰的表明&#xff0c;一共54个MIO&#xff0c;64个EMIO&#xff0c;所有这些IO共分为4个bank&#xff0c;其中 Bank0 32bit —>> MIO[0:31] Bank1 22bit —…

Java版本电子招标采购系统源代码—企业战略布局下的采购寻源

智慧寻源 多策略、多场景寻源&#xff0c;多种看板让寻源过程全程可监控&#xff0c;根据不同采购场景&#xff0c;采取不同寻源策略&#xff0c; 实现采购寻源线上化管控&#xff1b;同时支持公域和私域寻源。 询价比价 全程线上询比价&#xff0c;信息公开透明&#xff0c;可…

Ubuntu 安装和配置 Samba服务开启共享文件夹

1、 客户端&#xff1a;windows10 服务端&#xff1a;ubuntu18.04 目的&#xff1a;从ubuntu上共享一个文件夹给windows访问 2、安装Sanba sudo apt install samba 3、查看版本号验证安装是否成功 smbd --version 4、创建一个文件夹&#xff0c;用来共享 sudo mkdir /…

拼多多商品数据如何通过api接口获取

要从拼多多获取商品数据&#xff0c;可以使用拼多多提供的API接口。首先需要注册一个拼多多开放平台的开发者账号&#xff0c;然后创建一个应用程序&#xff0c;获取应用程序的app_id和app_secret&#xff0c;以在API请求中进行身份验证。 以下是一些获取拼多多商品数据的常用…

Java集合——Map接口学习总结

一、HashMap实现类 1.常用方法 增加&#xff1a;put(K key, V value)删除&#xff1a;clear() remove(Object key)修改&#xff1a;查看&#xff1a;entrySet() get(Object key) keySet() size() values()判断&#xff1a;containsKey(Object key) containsValue(Object value…

DateFormat使用时需要注意:多线程下需要特殊处理

前言 工作或学习过程中难免会接触到时间&#xff08;Date&#xff09;相关的内容&#xff0c;比如String类型转为Date类型&#xff0c;或者Date类型转为String类型&#xff0c;jdk为我们提供了一套完善的日期格式化工具&#xff0c;DateFormat类&#xff0c;使用者可以使用该接…

MECE原则

MECE原则 MECE原则|是麦肯锡咨询顾问芭芭拉•明托在《金字塔原理》中提出的一个思考工具。 原则介绍 它是Mutually Exclusive CollectivelyExhaustive的缩写&#xff0c;意思是 “相互独立&#xff0c;完全穷尽〞&#xff0c;也常被称为〞不重叠&#xff0c;不遗漏”。应用MEC…