Cortex-M3/M4内核NVIC及HAL库函数详解(3):HAL库中断应用层函数实现

0 工具准备

Keil uVision5
Cortex M3权威指南(中文)
Cortex M3与M4权威指南
stm32f407的HAL库工程
STM32F4xx中文参考手册

1 HAL库中断应用层函数实现

在完成了HAL库中断底层函数后,应用层的封装可以做得千变万化。打开Librarier->STM32F4xx_HAL_Driver->Inc->stm32f4xx_hal_cortex.h,可以看到有关中断的应用层函数:

void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority);
void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);
void HAL_NVIC_DisableIRQ(IRQn_Type IRQn);
void HAL_NVIC_SystemReset(void);
uint32_t HAL_NVIC_GetPriorityGrouping(void);
void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t* pPreemptPriority, uint32_t* pSubPriority);
uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn);
void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn);
void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn);
uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn);

1.1 HAL_NVIC_SetPriorityGrouping设置中断优先级分组函数

void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup)
{/* Check the parameters */assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup));/* Set the PRIGROUP[10:8] bits according to the PriorityGroup parameter value */NVIC_SetPriorityGrouping(PriorityGroup);
}

这个函数实际上就是调用NVIC_SetPriorityGrouping这个函数,设置SCB->AIRCR中的bit10-8(优先级分组),可设置的值如下:

#define NVIC_PRIORITYGROUP_0         0x00000007U /*!< 0 bits for pre-emption priority4 bits for subpriority */
#define NVIC_PRIORITYGROUP_1         0x00000006U /*!< 1 bits for pre-emption priority3 bits for subpriority */
#define NVIC_PRIORITYGROUP_2         0x00000005U /*!< 2 bits for pre-emption priority2 bits for subpriority */
#define NVIC_PRIORITYGROUP_3         0x00000004U /*!< 3 bits for pre-emption priority1 bits for subpriority */
#define NVIC_PRIORITYGROUP_4         0x00000003U /*!< 4 bits for pre-emption priority0 bits for subpriority */

1.2 HAL_NVIC_SetPriority设置中断请求优先级函数

void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority, uint32_t SubPriority)
{ uint32_t prioritygroup = 0x00U;/* Check the parameters */assert_param(IS_NVIC_SUB_PRIORITY(SubPriority));assert_param(IS_NVIC_PREEMPTION_PRIORITY(PreemptPriority));prioritygroup = NVIC_GetPriorityGrouping();NVIC_SetPriority(IRQn, NVIC_EncodePriority(prioritygroup, PreemptPriority, SubPriority));
}

这个函数实际上就是调用NVIC_SetPriority函数,根据传入的中断编号分别设置外部中断或系统异常优先级寄存器。

1.3 HAL_NVIC_EnableIRQ使能中断请求函数

void HAL_NVIC_EnableIRQ(IRQn_Type IRQn)
{/* Check the parameters */assert_param(IS_NVIC_DEVICE_IRQ(IRQn));/* Enable interrupt */NVIC_EnableIRQ(IRQn);
}

这个函数实际上就是调用NVIC_EnableIRQ函数,使能对应的中断。

1.4 HAL_NVIC_DisableIRQ使能中断请求函数

void HAL_NVIC_DisableIRQ(IRQn_Type IRQn)
{/* Check the parameters */assert_param(IS_NVIC_DEVICE_IRQ(IRQn));/* Disable interrupt */NVIC_DisableIRQ(IRQn);
}

这个函数实际上就是调用NVIC_DisableIRQ函数,失能对应的中断。

1.5 HAL_NVIC_SystemReset系统复位函数

void HAL_NVIC_SystemReset(void)
{/* System Reset */NVIC_SystemReset();
}

这个函数实际上就是调用NVIC_SystemReset函数,让MCU复位。

1.6 HAL_NVIC_GetPriorityGrouping获取中断优先级分组函数

uint32_t HAL_NVIC_GetPriorityGrouping(void)
{/* Get the PRIGROUP[10:8] field value */return NVIC_GetPriorityGrouping();
}

这个函数实际上就是调用NVIC_GetPriorityGrouping函数,获取中断优先级分组设置值。

1.7 HAL_NVIC_GetPriority获取中断优先级函数

void HAL_NVIC_GetPriority(IRQn_Type IRQn, uint32_t PriorityGroup, uint32_t *pPreemptPriority, uint32_t *pSubPriority)
{/* Check the parameters */assert_param(IS_NVIC_PRIORITY_GROUP(PriorityGroup));/* Get priority for Cortex-M system or device specific interrupts */NVIC_DecodePriority(NVIC_GetPriority(IRQn), PriorityGroup, pPreemptPriority, pSubPriority);
}

这个函数就是根据传入的中断请求编号、中断优先级分组、主优先级返回地址、子优先级返回地址获取中断请求的主、子优先级。

1.8 HAL_NVIC_GetPendingIRQ获取中断请求挂起状态

uint32_t HAL_NVIC_GetPendingIRQ(IRQn_Type IRQn)
{/* Check the parameters */assert_param(IS_NVIC_DEVICE_IRQ(IRQn));/* Return 1 if pending else 0 */return NVIC_GetPendingIRQ(IRQn);
}

这个函数实际上就是调用NVIC_GetPendingIRQ函数,获取中断请求的挂起状态。

1.9 HAL_NVIC_SetPendingIRQ设置中断请求挂起函数

void HAL_NVIC_SetPendingIRQ(IRQn_Type IRQn)
{/* Check the parameters */assert_param(IS_NVIC_DEVICE_IRQ(IRQn));/* Set interrupt pending */NVIC_SetPendingIRQ(IRQn);
}

这个函数实际上就是调用NVIC_SetPendingIRQ函数,设置中断请求挂起。

1.10 HAL_NVIC_ClearPendingIRQ中断请求解挂函数

void HAL_NVIC_ClearPendingIRQ(IRQn_Type IRQn)
{/* Check the parameters */assert_param(IS_NVIC_DEVICE_IRQ(IRQn));/* Clear pending interrupt */NVIC_ClearPendingIRQ(IRQn);
}

这个函数实际上就是调用NVIC_ClearPendingIRQ函数,将中断请求解挂。

1.11 HAL_NVIC_GetActiveIRQ获取中断请求激活状态

uint32_t HAL_NVIC_GetActive(IRQn_Type IRQn)
{/* Check the parameters */assert_param(IS_NVIC_DEVICE_IRQ(IRQn));/* Return 1 if active else 0 */return NVIC_GetActive(IRQn);
}

这个函数实际上就是调用NVIC_GetActive函数,获取中断请求激活状态。

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

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

相关文章

在k8s上部署ClickHouse

概述 clickhouse的容器化部署&#xff0c;已经有非常成熟的生态了。在一些互联网大厂也已经得到了大规模的应用。 clickhouse作为一款数据库&#xff0c;其容器化的主要难点在于它是有状态的服务&#xff0c;因此&#xff0c;我们需要配置PVC。 目前业界比较流行的部署方式有…

SaaS多租户篇

文章目录 1. 多租户是什么2. 技术组件2.1 如何实现多租户的DB封装2.2 如何实现多租户的redis封装2.3 如何实现多租户的Web和Security封装 1. 多租户是什么 2. 技术组件 2.1 如何实现多租户的DB封装 2.2 如何实现多租户的redis封装 2.3 如何实现多租户的Web和Security封装

数组、数组的删除添加、函数、返回值、匿名函数、回调函数

一、数组 概念&#xff1a;将多个元素按一定顺序排列放在一个集合中 创建数组&#xff08;两种&#xff09;&#xff1a; 字面量创建 构造函数创建 数组的长度&#xff08;length&#xff09;、类型 空数组 长度为0数组是object 引用类型 如何获取数组中单个元素 索引&…

react中数据不可变

先看官网 一、不可变数据的概念 不可变数据意味着数据一旦创建&#xff0c;就不能被更改。在React中&#xff0c;每次对数据的修改都会返回一个新的数据副本&#xff0c;而不会改变原始数据。这种方式确保了数据的稳定性和一致性。 二、Props中的不可变数据 在React中&#xf…

MeterSphere本地化部署实践

项目结构 搭建本地环境 安装JDK11&#xff0c;配置好JDK环境&#xff0c;系统同时支持JDK8和JDK11安装IEAD&#xff0c;配置JDK环境配置maven环境,IDEA配置(解压可以直接使用)无限重置IDEA试用期配置redis环境(解压可以直接使用) 配置kafka环境 安装mysql-5.7环境&#xff…

VBA自学日志

文章目录 前言一、For each 循环二、offset 偏移三、Resize 属性四、Exit 语句五、DO...LOOP语句六、一些错误代码总结七、GOTO语句八、do while 和 do until九、如何在VBA内使用Excel工作表函数十、VBA使用随机数十一、排序总结 前言 VBA自学成柴的第三周 一、For each 循环 …

1、中级机器学习课程简介

文章目录 1、课程简介2、先决条件 本课程所需数据集夸克网盘下载链接&#xff1a;https://pan.quark.cn/s/9b4e9a1246b2 提取码&#xff1a;uDzP 1、课程简介 欢迎来到机器学习中级课程&#xff01; 如果你对机器学习有一些基础&#xff0c;并且希望学习如何快速提高模型质量…

集成SpringCloudAlibaba短信服务 短信验证码

1.1 SpringCloudAlibaba短信服务简介 短信服务&#xff08;Short Message Service&#xff09;是阿里云为用户提供的一种通信服务的能力。 产品优势&#xff1a;覆盖全面、高并发处理、消息堆积处理、开发管理简单、智能监控调度 产品功能&#xff1a;短信通知、短信验证码、…

Android中webview学习

1、什么是webview WebView是Android中的原生UI控件&#xff0c;主要用于在app应用中方便地访问远程网页或本地html资源。同时&#xff0c;WebView也在Android中充当Java代码和JS代码之间交互的桥梁。实际上&#xff0c;也可以将WebView看做一个功能最小化的浏览器。WebView这个…

基于Yolov5+Deepsort+SlowFast算法实现视频目标识别、追踪与行为实时检测

前言 前段时间打算做一个目标行为检测的项目&#xff0c;翻阅了大量资料&#xff0c;也借鉴了不少项目&#xff0c;最终感觉Yolov5DeepsortSlowfast实现实时动作检测这个项目不错&#xff0c;因此进行了实现。 一、核心功能设计 总的来说&#xff0c;我们需要能够实现实时检测视…

ELK 日志分析系统

目录 一、日志管理方案 二、完整日志系统基本特征 三、ELK 简介 ELK组件&#xff1a; 1、ElasticSearch 2、Logstash 3、Kibana 可以添加的其它组件&#xff1a; 1、Filebeat 2、缓存/消息队列&#xff08;redis、kafka、RabbitMQ等&#xff09; 3、Fluentd 三、ELK …

github经常登不上去怎么办?

问题 想少些代码&#xff0c;多学习&#xff0c;少不了使用github&#xff0c;但是在国内经常上不去&#xff0c;很耽误事&#xff0c;这里提供一个简单方法&#xff0c;供参考。 github GitHub是一个面向开源及私有软件项目的托管平台&#xff0c;可以让开发者共同协作开发软…

C++总结笔记

1. 简介 1、面向对象程序设计 面向对象的四大特性 1&#xff09;封装 2&#xff09;继承 3&#xff09;多态 4&#xff09;抽象 2、标准库 标准C由三个部分组成 1&#xff09;核心语言&#xff1a;提供了所有的构件块 2&#xff09;C标准库&#xff1a;提供了大量的函…

手写一个简单的RPC框架

文章目录 1、初识Dubbo2、RPC是什么3、多模块设计3.1、服务提供者3.2、注册中心实现3.3、HTTP协议内嵌tomcat启动 3.4、服务消费者测试优化 1、初识Dubbo Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架&#xff0c;使得应用可通过高性能的 RPC 实现服务的输出和输入功能…

MySQL经典50题

目录 一、数据表介绍 二、练习题 1. 查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数 2. 查询同时存在" 01 "课程和" 02 "课程的情况 3. 查询存在" 01 "课程但可能不存在" 02 "课程的情况…

大寒---每年的最后一个节气

# 大寒节气 # 大寒&#xff0c;是二十四节气中的最后一个节气。斗指丑&#xff1b;太阳黄经达300&#xff1b;于每年公历1月20日左右交节。大寒同小寒一样&#xff0c;都是表示天气寒冷程度的节气&#xff0c;大寒是天气寒冷到极致的意思。大寒节气处在三九、四九时段&#xf…

书生·浦语大模型实战营第四次课堂笔记

先来看看参考作业 哈哈到这才想起来写笔记 倒回去看发现要求将不要葱姜蒜换成自己的名字和昵称&#xff01; 好好好我就是不配玩&#xff08;换成管理员也不行&#xff01;&#xff09; 诶怎么能进这个环境&#xff1f;要进双系统ubuntu&#xff1f; 现在看视频发现原来是…

【 使用路由建立多视图单页应用详细介绍】

使用路由建立多视图单页应用详细介绍 1. 多视图1.1 引入依赖库1.2 创建自定义组件 2. React&#xff08;使用React Router&#xff09;3. Angular&#xff08;使用Angular Router&#xff09;4. Vue&#xff08;使用Vue Router&#xff09; 1. 多视图 构建多视图的单页应用程序…

数据结构学习之顺序表(各种操作合集)

顺序表&#xff08;各种操作合集&#xff09; 顺序表的两种创建方式&#xff1a; 方式1&#xff1a;根据函数的返回值创建 通过返回值返回所申请的内存空间的首地址&#xff1b;示例代码&#xff1a; list_t *create_seq_list_1(){list_t *p (list_t *)malloc(sizeof(list…

009 Linux_文件系统 | 软硬链接

前言 本文将会向你介绍文件系统与软硬链接 文章重点 本文将会先向你介绍文件是如何在磁盘上进行管理的&#xff0c;关于文件的管理将会从管理属性和管理内容两方面来谈&#xff0c;最后会向你介绍软硬链接的概念 文件在磁盘中的管理 首先&#xff0c;假设一个磁盘200GB&#…