完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、NVIC 介绍
NVIC 英文全称是 Nested Vectored Interrupt Controller,中文意思就是嵌套向量中断控制器,它属于 M3 内核的一个外设,控制着芯片的中断相关功能。由于 ARM 给 NVIC 预留了非常多的功能,但对于使用 M3 内核设计芯片的公司可能就不需要这么多功能,于是就需要在 NVIC 上裁剪。 (STM32中断系统学习资料) http://www.makeru.com.cn/live/1392_1124.html?s=45051 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。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1792 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1626 浏览 1 评论
1094 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
732 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1682 浏览 2 评论
1943浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
743浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
578浏览 3评论
601浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
563浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-26 17:38 , Processed in 0.779698 second(s), Total 45, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号