STM32 NVIC嵌套向量中断控制器函数分析

发布者:朱颜素韵最新更新时间:2015-06-23 来源: 51hei关键字:STM32  NVIC  向量  中断  控制器  函数分析 手机看文章 扫描二维码
随时随地手机看文章
中断管理函数
CM3内核支持256个中断,其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有76个中断,包括16个内核中断和60个可屏蔽中断,具有16级可编程的中断优先级。而我们常用的就是这60个可屏蔽中断,所以我们就只针对这60个可屏蔽中断进行介绍。
 
在MDK内,与NVIC相关的寄存器,MDK为其定义了如下的结构体:
typedef struct
{
vu32 ISER[2];
u32 RESERVED0[30];
vu32 ICER[2];
u32 RSERVED1[30];
vu32 ISPR[2];
u32 RESERVED2[30];
vu32 ICPR[2];
u32 RESERVED3[30];
vu32 IABR[2];
u32 RESERVED4[62];
vu32 IPR[15];
} NVIC_TypeDef;

ISER[2]:Interrupt set enable registers 中断使能寄存器组
ICER[2]:interrupt clear enable registers 中断除能寄存器组
ISPR[2]:interrupt set pending registers 中断挂起寄存器组
ICPR[2]: interrupt clear pending registers 中断解挂寄存器组
IABR[2]:interrupt active bit registers 中断激活标志寄存器组

主要分析
IPR[15]:interrupt priority registers   中断优先级控制寄存器组




使用函数实现中断分组:  可选分组0--4

MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)
{
 u32 temp,temp1;                                              //设置中转变量
temp1=(~NVIC_Group)&0x07;                          //取后3位
temp1<<=8;                                                     //左移8位
temp=SCB->AIRCR;                                        //读取先前设置 
temp&=0x0000F8FF;                                       //清空先前设置
temp|=0x05FA0000;                                         //插入密钥
temp|=temp1;                                                     //分组设置赋值进
SCB->AIRCB=temp;                                           //设置完的值赋值给中断分组寄存器
}
语句解读:

             temp1=(~NVIC_Group)&0x07;      由于
 所以组号取反与111 即得到分组所需寄存器值
              temp|=0x05FA0000;     
密钥


 使用函数实现中断优先级设置:
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
{
 u32 temp;
u8 IPRADDR=NVIC_Channel/4;           //每组只能存4个得到组地址
u8 IPROFFSET=NVIC_Channel%4;     //得到组内偏移地址 
IPROFFSET=IPROFFSET*8+4;             //得到确切地址
MY_NVIC_PriorityGroupConfig(NVIC_Group);        //设置分组
temp=NVIC_Preemptionpriority<<(4-NVIC_Group);  //  设置抢占优先级
temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);      //设置响应优先级
temp&=0xf;                                                                //取低4位
if(NVIC_Channel<32)  NVIC->ISER[0]|=1< else
                                   NVIC->ISER[1]|=1<<(NVIC_Channel-32);
NVIC->IPR[IPRADDR]|=temp<

语句解读:

               u8 IPRADDR=NVIC_Channel/4;                //ISER[2]组可以设置60个中断优先级,每组15个寄存器,每个寄存器32位  每个可中 断8位,每个寄存器可以设置4个中断,           组地址=channel/4;      //选择中断号组(0--3)(4--7),,,(56---59)
               u8 IPROFFSET=NVIC_Channel%4;          组内偏移地址      //选择第几个中断号
               IPROFFSET=IPROFFSET*8+4;                 //由于每个中断8位,只用了前4位,所以偏移4



             


              temp=NVIC_Preemptionpriority<<(4-NVIC_Group);      //抢占优先级在左边,根据抢占位多少进行左移
               temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);          //响应优先级在右边,根据响应位多少进行右移
               temp&=0xf;                                                                 //得到分组值

外部中断配置函数:

STM32的EXTI控制器支持19个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32的19个外部中断为:
线0~15:对应外部IO口的输入中断。 
线16:连接到PVD输出。  
            PVD(Programmable Voltage Detector),即可编程电压监测器。应用于STM32ARM芯片中,作用是监视供电电压,在供电电压下降到给定的阀值以下时,产生一个中断,通知软件做紧急处理。当供电电压又恢复到给定的阀值以上时,也会产生一个中断,通知软件供电恢复。
 
线17:连接到RTC闹钟事件。                   RTC是多种名词的缩写,如:实时时钟(Real-Time Clock)
线18:连接到USB唤醒事件。
对于外部中断EXTI控制MDK定义了如下结构体:
typedef struct
{
vu32 IMR;
vu32 EMR;
vu32 RTSR;
vu32 FTSR;
vu32 SWIER;
vu32 PR;
} EXTI_TypeDef;

[page]
IMR:中断屏蔽寄存器Interrupt Mask Register         32位寄存器前19位有效
EMR: 事件屏蔽寄存器 Event mask register               32位寄存器前19位有效
RTST: 上升沿触发选择寄存器 Rising edge trigger select register
FTSR:下降沿触发选择寄存器 Falling edge trigger select register
SWIER:软件中断事件寄存器 Software interrupt event register
PR:   挂起寄存器 Pending Register

I/O口复用里的配置寄存器EXTICR     每个I/O口可以配置成中断输入


STM32 任何一个IO口都可以配置成中断输入口,但是IO口的数目远大于中断线数(16个)。于是STM32就这样设计,GPIOA~GPIOG的[15:0]分别对应中断线15~0。这样每个中断线对应了最多7个IO口,以线0为例:它对应了GPIOA.0、PIOB.0、GPIOC.0、GPIOD.0、 GPIOE.0、GPIOF.0、GPIOG.0。而中断线每次只能连接到1个IO口上,这样就需要EXTICR来决定对应的中断线配置到哪个GPIO上了。



 











EXTICR在AFIO的结构体中定义如下

typedef struct
{
vu32 EVCR;
vu32 MAPR;
vu32 EXTICR[4];
} AFIO_TypeDef;

EXTIRC寄存器总共4个,因为编译器的寄存器都是从0号开始的,所以EXTICR[0]---EXTICR[3]对应
<>中的EXTICR1---EXTICR4 每个EXTICR用了其中低16位.

外部中断配置函数:
void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)
{
 u8 EXTADDR;                                
 u8 EXTOFFSET;
 EXTADDR=BITx/4;                //得到中断寄存器组编号
 EXTOFFSET=(BITx%4)*4;          //得到偏移量            具体哪个I/O口进行设置                       
RCC->APB2ENR|=0x01;              //使能复用I/O口
AFIO->EXTICR[EXTADDR]|=GPIOx< EXTI->IMR|=1< EXTI->EMR|=1< if(TRIM&0x01)  EXIT->FTSR|=1< if(TRIM&0x02) EXIT->RTSR|=1< }

注:
      TRIM为触发方式选择变量; 0x01下降沿触发   0x02 上升沿触发 0x03任意电平触发.

关键字:STM32  NVIC  向量  中断  控制器  函数分析 引用地址:STM32 NVIC嵌套向量中断控制器函数分析

上一篇:STM32串口通信和I/O口简单代码
下一篇:STM32单片机简易定时器PWM输出

推荐阅读最新更新时间:2024-03-16 14:04

英特尔/联发科/义隆控制全球触摸屏控制器半壁江山
    北京时间05月24日消息,据业内人士透露,英特尔,联发科,义隆电子(Elan)已经控制全球触摸屏控制器市场半壁江山,合并市占率达到60%以上。     消息人士指出,全球触摸屏控制器芯片市场规模不断扩大,复合年增长率超过20%,近年来,吸引了至少50家芯片组供应商进入,其中包括超过20家台湾厂商。联发科和其联营公司晨星半导体和Goodix技术公司,合并月产量有1000万颗触摸屏控制器芯片。     英特尔一直在通过其投资的IC设计公司,增加其在触摸屏控制器芯片市场份额。这些英特尔控制的IC公司,包括FocalTech和Egalaxy EMPIA等FocalTech,目是中国大陆智能手机触摸屏控制器芯片最大供应商。    
[手机便携]
ST发布STSAFE-A100评估套件,扩大STM32 Nucleo生态系统
意法半导体发布了STSAFE-A100评估套件,将进一步扩大STM32 Nucleo生态系统的丰富资源,加快安全单元的集成设计,利用可复用源代码以简化安全物联网设备、医疗探针等高价耗材、IT配件和消费产品的开发设计流程。 该评估套件包括集成STSAFE-A100安全单元的X-NUCLEO-STSA100扩展板和STSW-STSA100软件包。软件包括设备驱动程序、STM32微控制器源代码和STSAFE-A100的用例源代码,包括品牌和生态系统保护、设备注册和安全云连接等用例。 STSAFE-A100是一款便于使用的8引脚安全单元,可为主机系统提供稳健的不可变的硬件身份验证和安全数据管理服务,具有极强的网络攻击防御能力
[单片机]
ST发布STSAFE-A100评估套件,扩大<font color='red'>STM32</font> Nucleo生态系统
基于ATmega16单片机的干式变压器智能温度控制器设计
1工作原理   温控仪由温度监测、信号处理、输出控制三部分组成。系统框图如图1所示,它通过预埋在 变压器三相绕组中的三只铂电阻 传感器 获取绕组温度值,经信号调理电路处理后直接送入控制器的A/D转换输入端。微控制器根据信号数据及设定的各种控制参数,按照嵌入的软件控 制规律执行计算与处理,自动显示变压器绕组的温度值、输出相应的控制信号、控制风机的启停,并根据当前状态输出正常、报警和跳闸信号等,同时将各种数据通过RS-485传到上位机实现集中监控。   温控仪控制核心采用ATmegal6单片机,它是一款基于AVR RISC的低功耗CMOS 8位单片机,在 一个时钟周期内执行一条指令,可以取得1MIPS/MHz的性能,因此具有实
[单片机]
基于ATmega16单片机的干式变压器智能温度<font color='red'>控制器</font>设计
STC89C52单片机外部中断0实验
///////////////////////////////////////////////////////////////////////// 实现功能: 设置外部中断0,然后通过点亮与单片机P1口第一个引脚相连的D1来 显示系统进入了外部中断0 实验板型号:BS-XYD-C52 实验名称: 外部中断0测试 编写人: 谢应东 编写日期: 2012-4-27 ///////////////////////////////////////////////////////////////////////// #include reg52.h #include intrins
[单片机]
51单片机学习笔记———10.中断机制
中断 单片机的中断系统是最基础也是最重要的部分,博主在学习这个的时候踩到了很多的坑,于是写下这篇笔记来整理一下自己的思路。 中断涉及的内容: 中断源: C51单片机有5个中断源,C52单片机有6个中断源: 由于多出来的那个中断源不常用,所以我们在这里只介绍C51单片机的中断系统: 8051有3个内部中断源T0,T1,串行口,2个外部中断源INT0,INT1 中断整体结构: 与中断有关的寄存器:
[单片机]
51单片机学习笔记———10.<font color='red'>中断</font>机制
STM32的便携式手机蓝牙考勤机系统设计
摘要:在研究各种考勤系统的基础上,提出了一种手机蓝牙实现考勤的方法。该系统采用STM32F103RBT6微处理器作为核心,利用蓝牙模块搜索手机蓝牙设备与本地数据库进行匹配,通过语音播报和液晶显示两种方式给出考勤结果。该设计可以改变传统的被动式考勤方式,且成本低、操作简便。 引言 目前,大部分考勤系统还是磁卡考勤系统,这类系统不仅签到速度慢,而且终端设备和磁卡也造成一定成本和浪费;指纹考勤、人脸识别考勤、视网膜考勤等新一代考勤技术虽然大大地提高了考勤效率和准确率,但是这类考勤机的费用较高、操作比较麻烦。以上几种都是采用被动式的考勤机制,科技的发展和生活节奏的加快为被动式考勤方式带来了新的挑战,手机蓝牙考勤机就是针对以上考勤机的缺
[单片机]
<font color='red'>STM32</font>的便携式手机蓝牙考勤机系统设计
Vivace多标准处理器支持实时视频转码
   中国北京 2008年4月8日 —Vivace Semiconductor(华视奇半导体有限公司)日前宣布其VSP100™ 媒体处理芯片系列的第一款样片已研制成功,并向市场提供样片。   VSP100具低功耗和高性价比的特点,专门针对系统产品的需求,优化实现在手机、MP3/MP4、移动电视和大屏幕播放设备中的多标准和高质量视频播放功能。芯片支持实时解码和多种视频格式的处理,开辟了通向D1高画质视频的直接途径。   样片采用0.13微米工艺,256 管脚,BGA封装,符合RoHS 标准。芯片批量销售的单价将低于7美元。 7-VSP100多媒体处理器开发板    VSP100应用Vivace的ViViD™ 媒体处理引
[家用电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved