零基础入门stm32选择最多的stm32f103中断学习总结
2025-01-14 来源:cnblogs
一、NVIC 介绍
NVIC 英文全称是 Nested Vectored Interrupt Controller,中文意思就是嵌套向量中断控制器,它属于 M3
内核的一个外设,控制着芯片的中断相关功能。由于 ARM 给 NVIC 预留了非常多的功能,但对于使用 M3
内核设计芯片的公司可能就不需要这么多功能,于是就需要在 NVIC 上裁剪。ST 公司的 STM32F103 芯片内部中断数量就是 NVIC
裁剪后的结果。上面说到 NVIC 控制着芯片的中断相关功能,那么肯定有很多对应的寄存器,在固件库 core_cm3.h 文件内定义了一个 NVIC
结构体,里面定义了相关寄存器,
如下:
1 typedef struct
2 {
3 __IO uint32_t ISER[8]; /*!< Offset: 0x000 Interrupt Set Enable
Register */
4 uint32_t RESERVED0[24];
5 __IO uint32_t ICER[8]; /*!< Offset: 0x080 Interrupt Clear Enable
Register */
6 uint32_t RSERVED1[24];
7 __IO uint32_t ISPR[8]; /*!< Offset: 0x100 Interrupt Set Pending
Register */
8 uint32_t RESERVED2[24];
9 __IO uint32_t ICPR[8]; /*!< Offset: 0x180 Interrupt Clear Pending
Register */
10 uint32_t RESERVED3[24];
11 __IO uint32_t IABR[8]; /*!< Offset: 0x200 Interrupt Active bit
Register */
12 uint32_t RESERVED4[56];
13 __IO uint8_t IP[240]; /*!< Offset: 0x300 Interrupt Priority Register
(8Bit wide) */
14 uint32_t RESERVED5[644];
15 __O uint32_t STIR; /*!< Offset: 0xE00 Software Trigger Interrupt
Register */
16 } NVIC_Type;
在配置中断时,我们通常使用的只有 ISER、 ICER 和 IP 这三个寄存器,ISER 是中断使能寄存器,ICER 是中断清除寄存器,IP
是中断优先级寄存器。
返回目录
二、中断配置
要使用中断我们就需要先配置它,通常都需经过这几步:
(1)使能外设某个中断,这个具体是由外设相关中断使能位来控制,比如定时器有溢出中断,这个可由定时器的控制寄存器中相应中断使能位来控制。
(2)设置中断优先级分组,初始化 NVIC_InitTypeDef 结构体,设置抢占优先级和响应优先级,使能中断请求。
(3)编写中断服务函数
配置好中断后如果有触发,即会进入中断服务函数,那么中断服务函数也有固定的函数名,可以在 startup_stm32f10x_hd.s
启动文件查看,启动文件提供的只是一个中断服务函数名,具体实现什么功能还需要我们自己编写,可以将中断服务函数放在 stm32f10x_it.c
文件内,也可以放在自己的应用程序中。通常我们把中断函数放在应用程序中。这里提醒一下大家,不要任意修改中断服务函数名,因为启动文件内中断服务函数名已经固定,如果要修改,你还必须在启动文件内把原中断函数修改。
这里对第二步进行解释:
NVIC_InitTypeDef 结构体如下:
1 typedef struct
2 {
3 uint8_t NVIC_IRQChannel;
4 uint8_t NVIC_IRQChannelPreemptionPriority;
5 uint8_t NVIC_IRQChannelSubPriority;
6 FunctionalState NVIC_IRQChannelCmd;
7 } NVIC_InitTypeDef;
下面我们对 NVIC_InitTypeDef 结构体成员进行一下简单介绍。
1.NVIC_IRQChannel:中断源的设置,不同的外设中断,中断源不一样,自然名字也不一样,所以名字不能写错,否则不会进入中断。中断源放在stm32f10x.h
文件的 IRQn_Type 结构体内,由于内容太多,这里就不复制所有中断源,只截取一部分,如下:
1 typedef enum IRQn
2 {
3 //Cortex-M3 处理器异常编号
4 NonMaskableInt_IRQn = -14,
5 MemoryManagement_IRQn = -12,
6 BusFault_IRQn = -11,
7 UsageFault_IRQn = -10,
8 SVCall_IRQn = -5,
9 DebugMonitor_IRQn = -4,
10 PendSV_IRQn = -2
11 。。。。。
12 }IRQn_Type;
2.NVIC_IRQChannelPreemptionPriority:抢占优先级,具体的值要根据优先级分组来确定,可以参考前面中断优先级分组内容。
3.NVIC_IRQChannelSubPriority:响应优先级,具体的值要根据优先级分组来确定,可以参考前面中断优先级分组内容。
4.NVIC_IRQChannelCmd:中断使能/失能设置,使能配置为 ENABLE,失能配置为 DISABLE。
- 意法半导体中国本地造STM32微控制器启动规模量产
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 基于机智云与STM32的智能拐杖安全监测系统在养老物联网中的应用
- 内置全栈安全,一站式满足CRA法案与IEC 62443标准——米尔STM32MP257核心板
- 如何用 STM32 FLASH 实现等效 100 万次擦写的 EEPROM 功能?
- 实战解析:通过一个小项目掌握STM32所有外设
- STM32学了两年半,却还是不会做项目
- 意法半导体推出最新STM32MP21微处理器,兼具高性价比、低功耗、高灵活性
- 基于STM32的矿井作业环境监测系统设计与实现
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 蓝牙信道探测技术原理与开发套件实践
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析




