未使用CMSIS之前的stm32标准库中SystemHandler的宏定义

背景:
在stm32的标准库还叫STM32F10xxx_FWLib_V2.0.3的那个年代
文件 STM32F10xFWLib_V2.0.3/FWLib/library/inc/stm32f10x_nvic.h 中有对System Handlers的定义。具体内容如下:

/* System Handlers -----------------------------------------------------------*/
#define SystemHandler_NMI            ((u32)0x00001F) /* NMI Handler */
#define SystemHandler_HardFault      ((u32)0x000000) /* Hard Fault Handler */
#define SystemHandler_MemoryManage   ((u32)0x043430) /* Memory Manage Handler */
#define SystemHandler_BusFault       ((u32)0x547931) /* Bus Fault Handler */
#define SystemHandler_UsageFault     ((u32)0x24C232) /* Usage Fault Handler */
#define SystemHandler_SVCall         ((u32)0x01FF40) /* SVCall Handler */
#define SystemHandler_DebugMonitor   ((u32)0x0A0080) /* Debug Monitor Handler */
#define SystemHandler_PSV            ((u32)0x02829C) /* PSV Handler */
#define SystemHandler_SysTick        ((u32)0x02C39A) /* SysTick Handler */

第一眼看到这些宏定义的值很奇怪,也没啥规律,既然叫Handler,是不是和地址有关,但是地址怎么给定义成固定值了,比较违反常理,应该不是。

再接着搜索引用它们的地方,发现主要有2种类型:
1)作为参数传给NVIC_xxxx()。
2) 这些宏定义会有不同的组合。

作为参数传给api时,如下:

/*******************************************************************************
* Function Name  : NVIC_SetSystemHandlerPendingBit
* Description    : Sets System Handler pending bit.
* Input          : - SystemHandler: specifies the system handler pending bit
*                    to be set.
*                    This parameter can be one of the following values:
*                       - SystemHandler_NMI
*                       - SystemHandler_PSV
*                       - SystemHandler_SysTick
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_SetSystemHandlerPendingBit(u32 SystemHandler)
{u32 tmp = 0x00;/* Check the parameters */assert_param(IS_SET_PENDING_SYSTEM_HANDLER(SystemHandler));/* Get the System Handler pending bit position */tmp = SystemHandler & (u32)0x1F;/* Set the corresponding System Handler pending bit */SCB->ICSR |= ((u32)0x01 << tmp);
}

这里面其实只用到了它的低5位,使用的掩码为0x1F,对应bit[4:0]。以SystemHandler_SysTick=0x02039A为例, 0x02039A & 0x1F = 0x1A,0x1A即为十进制的26。然后再看SCB->ICSR寄存器
在这里插入图片描述
在这里插入图片描述
第26位即为设置SysTick异常状态为Pending状态的控制位。
同理,当将SystemHandler_SysTick用在不同的NVIC_xxx()时,会使用他不同位域的值,也对应着不同的寄存器。
如下高亮的SystemHandler_SysTick被分配组合在不同的组中使用。自然就会组合出一个没啥规律的数值,看起来像是个随机数。其他的宏定义也是类似。
在这里插入图片描述

附:AN2953文档,描述如何将没有使用CMSIS的标准库移植到使用了CMSIS的标准库。
https://www.st.com/en/embedded-software/stsw-stm32023.html

Cortex-M核心来自ARM公司,st使用了Cortex-M作为核心,再添加一些诸如spi,i2c等这些外设做成了stm32fxxx这样的Soc芯片。
下面这些Exception是来自Cortex-M3的异常,这里称它们为Exception。

/******  Cortex-M3 Processor Exceptions Numbers ***************************************************/NonMaskableInt_IRQn         = -14,    /*!< 2 Non Maskable Interrupt                             */MemoryManagement_IRQn       = -12,    /*!< 4 Cortex-M3 Memory Management Interrupt              */BusFault_IRQn               = -11,    /*!< 5 Cortex-M3 Bus Fault Interrupt                      */UsageFault_IRQn             = -10,    /*!< 6 Cortex-M3 Usage Fault Interrupt                    */SVCall_IRQn                 = -5,     /*!< 11 Cortex-M3 SV Call Interrupt                       */DebugMonitor_IRQn           = -4,     /*!< 12 Cortex-M3 Debug Monitor Interrupt                 */PendSV_IRQn                 = -2,     /*!< 14 Cortex-M3 Pend SV Interrupt                       */SysTick_IRQn                = -1,     /*!< 15 Cortex-M3 System Tick Interrupt                   */

下面这些是来自Cortex-M之外的模块的中断,称之为Interrupt.

/******  STM32 specific Interrupt Numbers *********************************************************/WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                            */PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detection Interrupt            */TAMPER_IRQn                 = 2,      /*!< Tamper Interrupt                                     */RTC_IRQn                    = 3,      /*!< RTC global Interrupt                                 */FLASH_IRQn                  = 4,      /*!< FLASH global Interrupt                               */RCC_IRQn                    = 5,      /*!< RCC global Interrupt                                 */EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                 */EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                 */EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                 */EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                 */EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                 */DMA1_Channel1_IRQn          = 11,     /*!< DMA1 Channel 1 global Interrupt                      */DMA1_Channel2_IRQn          = 12,     /*!< DMA1 Channel 2 global Interrupt                      */DMA1_Channel3_IRQn          = 13,     /*!< DMA1 Channel 3 global Interrupt                      */DMA1_Channel4_IRQn          = 14,     /*!< DMA1 Channel 4 global Interrupt                      */DMA1_Channel5_IRQn          = 15,     /*!< DMA1 Channel 5 global Interrupt                      */DMA1_Channel6_IRQn          = 16,     /*!< DMA1 Channel 6 global Interrupt                      */DMA1_Channel7_IRQn          = 17,     /*!< DMA1 Channel 7 global Interrupt                      */ADC1_2_IRQn                 = 18,     /*!< ADC1 et ADC2 global Interrupt                        */USB_HP_CAN1_TX_IRQn         = 19,     /*!< USB High Priority or CAN1 TX Interrupts              */USB_LP_CAN1_RX0_IRQn        = 20,     /*!< USB Low Priority or CAN1 RX0 Interrupts              */CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                   */CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                   */EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */TIM1_BRK_IRQn               = 24,     /*!< TIM1 Break Interrupt                                 */TIM1_UP_IRQn                = 25,     /*!< TIM1 Update Interrupt                                */TIM1_TRG_COM_IRQn           = 26,     /*!< TIM1 Trigger and Commutation Interrupt               */TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */
#ifndef STM32F10X_LDTIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                */
#endif  I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */
#ifndef STM32F10X_LDI2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                 */I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                 */
#endif  SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                */USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */
#ifndef STM32F10X_LD  USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                              */
#endif  EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */RTCAlarm_IRQn               = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */USBWakeUp_IRQn              = 42,     /*!< USB WakeUp from suspend through EXTI Line Interrupt  */
#ifdef STM32F10X_HDTIM8_BRK_IRQn               = 43,     /*!< TIM8 Break Interrupt                                 */TIM8_UP_IRQn                = 44,     /*!< TIM8 Update Interrupt                                */TIM8_TRG_COM_IRQn           = 45,     /*!< TIM8 Trigger and Commutation Interrupt               */TIM8_CC_IRQn                = 46,     /*!< TIM8 Capture Compare Interrupt                       */ADC3_IRQn                   = 47,     /*!< ADC3 global Interrupt                                */FSMC_IRQn                   = 48,     /*!< FSMC global Interrupt                                */SDIO_IRQn                   = 49,     /*!< SDIO global Interrupt                                */TIM5_IRQn                   = 50,     /*!< TIM5 global Interrupt                                */SPI3_IRQn                   = 51,     /*!< SPI3 global Interrupt                                */UART4_IRQn                  = 52,     /*!< UART4 global Interrupt                               */UART5_IRQn                  = 53,     /*!< UART5 global Interrupt                               */TIM6_IRQn                   = 54,     /*!< TIM6 global Interrupt                                */TIM7_IRQn                   = 55,     /*!< TIM7 global Interrupt                                */DMA2_Channel1_IRQn          = 56,     /*!< DMA2 Channel 1 global Interrupt                      */DMA2_Channel2_IRQn          = 57,     /*!< DMA2 Channel 2 global Interrupt                      */DMA2_Channel3_IRQn          = 58,     /*!< DMA2 Channel 3 global Interrupt                      */DMA2_Channel4_5_IRQn        = 59      /*!< DMA2 Channel 4 and Channel 5 global Interrupt        */
#endif

在没有使用CMSIS之前,stm32的标准库里面是不怎么区分cortex-M之内和之外的nvic处理。
在使用CMSIS之后,标准库的目录结构分成2部分:
在这里插入图片描述
如名字所示,CMSIS中主要是处理跟cortex-m相关的,STM32F10x_StdPeriph_Driver里面存放的标准外设相关的。

此时在含有CMSIS的库中如果想设置SystemTick为Pending状态,根据examples中的使用方法就是直接操作寄存器:
在这里插入图片描述
如果觉得这样不够优雅,可以自己再给它封装一个类似NVIC_SetSystemHandlerPendingBit()的api就行了。

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

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

相关文章

【Altium Designer程序开发】生成XML多级数据库文件 V2.0

此工具用于生成多级多节点的XML数据库文件&#xff0c;主要功能用于测试XML文件的生成速度的&#xff0c;运行环境在Altium Designer中&#xff0c;可用于Altium Designer全系列的版本中。 程序界面如下图所示&#xff0c;每一级节点表示每个父Node的子Node的数量&#xff0c;节…

Java面试题:equals和==的区别与联系分别是什么?

1. 运算符 是一个运算符&#xff0c;其用于比较两个变量的内存地址是否相等&#xff1b;对于基本数据类型(int、char、Boolean等)&#xff0c;比较的是它们的值&#xff1b;而对于引用数据类型的话(String、Object、ArrayList等)&#xff0c;比较的是引用&#xff0c;也就是对…

【函数模板】函数模板的类型推导

一、类型的自动推导 当函数模板的返回值被指定或与传入的参数的类型一致&#xff0c;那么可以直接调用函数模板&#xff0c;而不需要显式的指定参数。 //函数推导 template<typename T, typename R> T Add(T a, R b) {return a b; }void Test1() {//自动推导int x 1;…

Linux下递归设置目标目录及其子目录和文件的权限

〇、背景 本文旨在简单介绍一个在Linux环境下批量修改目录及其子目录和文件的权限的方法。 一、实现 首先新建一个shell脚本文件&#xff0c;使用指令$ vi chmod.sh&#xff0c;然后在文件中输入下述代码。 #!/bin/bashOFFSET_INDEX" " DIR_MODE755 FILE_MODE664…

笔记整理—内核!启动!—uboot部分(1)

常规启动时&#xff0c;各镜像都在SD卡中的各种分区中&#xff0c;内核放在kernel分区&#xff0c;从SD卡到DDR的连接处&#xff08;内核不需要进行重定位&#xff0c;直接从链接处启动&#xff09;。uboot从sd卡分区读使用movi命令。 使用fastboot指令可以查看分区情况&#x…

Datawhale X 李宏毅苹果书 AI夏令营 Task2打卡

线性模型&#xff08;Linear model&#xff09; 通常模型的修改来自于对问题的理解&#xff0c;即领域知识 基本定义&#xff1a;把输入特征x乘上一个权重&#xff0c;再加上一个偏置就可以得到预测的结果。 优点&#xff1a;简单易理解&#xff0c;可理解性好&#xff08;权重…

C++(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例2

C(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例2 文章目录 C(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例21、概述2、实现效果3、主要代码4、源码地址 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;GIS开发 &#x1f448; 1、概述 支持多线程…

AWS-亚马逊网络服务(基础服务)-AWS 定价计算器-概述与动手部署:

让我们来概述并亲身实践如何使用 AWS 定价计算器来计算 概述&#xff1a; AWS 定价计算器是 Amazon Web Services (AWS) 提供的基于 Web 的工具&#xff0c;可帮助用户估算其特定用例的 AWS 服务成本。欢迎来到雲闪世界。 它允许客户建模他们的基础设施并根据他们打算使用的…

大数据智能风控核心:模型

概述 模型 线性判别分析方法&#xff0c;Sir Ronald Fisher最早提出模型评分的概念。 个人FICO模型信用分。 巴塞尔委员会发布巴塞尔Ⅱ协议&#xff0c;推出内部评级法&#xff08;Internal Rating Based Approach&#xff0c;IRB&#xff09;​。IRB综合考虑客户评级和债项…

【STM32】BKP备份寄存器与RTC实时时钟

本篇博客重点在于标准库函数的理解与使用&#xff0c;搭建一个框架便于快速开发 目录 BKP简介 BKP代码注解 读写备份寄存器 复位备份寄存器 BKP代码 RTC简介 RTC代码注解 RTCCLK时钟源选择 分频器配置 时钟同步 RTC代码 MyRTC.h MyRTC.c main.c BKP简介 BKP&…

手把手教你从开发进度划分测试

一.单元测试&#xff08;Unit Testing&#xff09; 单元测试&#xff1a;软件单元测试的对象是可独立编译或汇编的程序模块。测试的对象是软件测试中的最小单位&#xff1a;模块。 测试阶段&#xff1a;编码后或者编码前&#xff08;TDD&#xff1a;测试驱动开发&#xff09;…

【网络基础】探索 NAT 技术:IP 转换、NAPT、NAT穿越及代理服务器

文章目录 1. 前言2. IP 转换过程3. NAPT① 基本概念② 工作原理③ 优缺点④ 实际应用 4. 缺陷5. NAT 穿越① 概述② 示例 6. NAT 与 代理服务器① 代理服务器与NAT的区别&#xff1a;② 正向代理 / 反向代理 服务器 1. 前言 NAT&#xff08;网络地址转换&#xff09;是一种常见…

Python数据清洗基础

在Python中进行数据清洗和可视化是一个多步骤的过程&#xff0c;涉及到数据的读取、预处理、分析和图形表示。以下是一些关键步骤和代码示例&#xff0c;这些步骤可以帮助你从原始数据中提取有价值的信息&#xff0c;并以直观的方式展示。 数据清洗 读取数据&#xff1a; im…

【Python 千题 —— 基础篇】评论倾向分析

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目描述 在某个电商平台的评论系统中,用户可以提交商品评论。为了分析评论的情感倾向,我们需要编写一个程序来处理用户评论,并对评论内容进行简单的分析和处理。…

Mac/Linux系统matplotlib中文支持问题

背景 matplotlib是python中最常用的数据可视化分析工具&#xff0c;Mac和Linux系统无中文字体&#xff0c;不支持中文显示&#xff08;希望后续可以改进&#xff09;&#xff0c;需要进行字体的下载和设置才能解决。笔者经过实践&#xff0c;发现Mac系统和Linux系统解决方案略…

1.【R语言】R语言的下载和安装

R语言是一种开源编程语言&#xff0c;它提供了丰富的统计模型和图形绘制功能&#xff0c;广泛用于数据科学、统计分析、数据挖掘和机器学习。R有一个活跃的社区和大量的包&#xff0c;可以满足各种需求&#xff0c;如数据清洗、绘图和报告生成。其强大的数据处理能力和灵活的可…

Ant Design vue 多层for循环form表单自定义校验

数据结构如下&#xff1a;三维数组。 注意&#xff1a;<a-form-model>一定得写在for外面&#xff01;&#xff01;&#xff01;&#xff01; <!-- 弹出框 --> <a-modal:title"title":dialog-style"{ top: 20px }":visible"visible&quo…

Datawhale X 李宏毅苹果书 AI夏令营 入门 Task2-了解线性模型

目录 线性模型分段线性曲线模型变形 线性模型 输入的特征 x 乘上一个权重&#xff0c;再加上一个偏置就得到预测的结果&#xff0c;这样的模型称为线性模型。 分段线性曲线 线性模型有很大的限制&#xff0c;这一种来自于模型的限制称为模型的偏差&#xff0c;无法模拟真实的…

Bluetooth: att protocol

一篇搞懂 ATT 支持的东西都有什么。 READ_BY_GROUP_TYPE_REQ/RSP 如下是 Spec 内容&#xff1a; The attributes returned shall be the attributes with the lowest handles within the handle range. These are known as the requested attributes.If the attributes with th…

零知识证明-基础数学(二)

零知识证明(Zero—Knowledge Proof)&#xff0c;是指一种密码学工具&#xff0c;允许互不信任的通信双方之间证明某个命题的有效性&#xff0c;同时不泄露任何额外信息 导数、偏导数 ,互质数&#xff0c;费马小定理&#xff0c;欧拉定理 1 导数 导数是微积分学中的重要概念&am…