简要说明一下stm32 systick 中断的中断和异常有什么不同

stm32中断抢占优先级和响应优先级有什么区别_百度知道
stm32中断抢占优先级和响应优先级有什么区别
提问者采纳
其中前者是对抢占优先级的级别划分,那么A的中断可以在B里面触发。比如、B的响应优先级决定谁先响应,忽略响应优先级:中断A抢占优先级比B高抢占优先级和响应优先级,其实是一个中断所包含的两个优先级,则A;A和B抢占优先级相同,后者是相同抢占优先级的优先级别的划分
相关专业回答
STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。
1. 何为占先式优先级(pre-emption priority)
高占先式优先级的中断事件会打断当前的主程序/中断程序运行—抢断式优先响应,俗称中断嵌套。
2. 何为副优先级(subpriority)
在占先式优先...
其他类似问题
为您推荐:
stm32的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁1530人阅读
STM32(13)
STM32中断向量嵌套NVIC理解
一,中断优先级:
STM32(Cortex-M3)中的优先级概念
STM32(Cortex-M3)中有两个优先级的概念——抢占式优先级和响应优先级,有人把响应优先级称作'亚优先级'或'副优先级',每个中断源都需要被指定这两种优先级。
具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。
当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
既然每个中断源都需要被指定这两种优先级,就需要有相应的寄存器位记录每个中断的优先级;在Cortex-M3中定义了8个比特位用于设置中断源的优先级,这8个比特位可以有8种分配方式,如下:
所有8位用于指定响应优先级
最高1位用于指定抢占式优先级,最低7位用于指定响应优先级
最高2位用于指定抢占式优先级,最低6位用于指定响应优先级
最高3位用于指定抢占式优先级,最低5位用于指定响应优先级
最高4位用于指定抢占式优先级,最低4位用于指定响应优先级
最高5位用于指定抢占式优先级,最低3位用于指定响应优先级
最高6位用于指定抢占式优先级,最低2位用于指定响应优先级
最高7位用于指定抢占式优先级,最低1位用于指定响应优先级
这就是优先级分组的概念。
--------------------------------------------------------------------------------
Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此STM32把指定中断优先级的寄存器位减少到4位,这4个寄存器位的分组方式如下:
第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级
可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:
NVIC_PriorityGroup_0 =& 选择第0组
NVIC_PriorityGroup_1 =& 选择第1组
NVIC_PriorityGroup_2 =& 选择第2组
NVIC_PriorityGroup_3 =& 选择第3组
NVIC_PriorityGroup_4 =& 选择第4组
接下来就是指定中断源的优先级,下面以一个简单的例子说明如何指定中断源的抢占式优先级和响应优先级:
// 选择使用优先级分组第1组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
&中断设置:时能中断-&优先级分组方式(对应的每个中断都有)-&设定抢占式优先级别-&设定响应优先级别-&调用NVIC_Init(&xx)
// 使能EXTI0中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQC
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; // 指定抢占式优先级别1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 指定响应优先级别0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 使能EXTI9_5中断
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQC
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 指定抢占式优先级别0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; // 指定响应优先级别1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
要注意的几点是:
1)如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;
2)抢占式优先级别相同的中断源之间没有嵌套关系;
3)如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。
二,开关总中断:
在STM32/Cortex-M3中是通过改变CPU的当前优先级来允许或禁止中断。
PRIMASK位:只允许NMI和hard fault异常,其他中断/异常都被屏蔽(当前CPU优先级=0)。
FAULTMASK位:只允许NMI,其他所有中断/异常都被屏蔽(当前CPU优先级=-1)。
在STM32固件库中(stm32f10x_nvic.c和stm32f10x_nvic.h) 定义了四个函数操作PRIMASK位和FAULTMASK位,改变CPU的当前优先级,从而达到控制所有中断的目的。
下面两个函数等效于关闭总中断:
void NVIC_SETPRIMASK(void);
void NVIC_SETFAULTMASK(void);
下面两个函数等效于开放总中断:
void NVIC_RESETPRIMASK(void);
void NVIC_RESETFAULTMASK(void);
上面两组函数要成对使用,不能交叉使用。
第一种方法:
NVIC_SETPRIMASK();&& //关闭总中断
NVIC_RESETPRIMASK();//开放总中断
第二种方法:
NVIC_SETFAULTMASK();&& //关闭总中断
NVIC_RESETFAULTMASK();//开放总中断
NVIC_SETPRIMASK();&&&&&&&&&&&&&&&&&&& // Disable Interrupts
NVIC_RESETPRIMASK();&&&&&&&&&&&&&&&&& // Enable Interrupts
&STM32中断流程处理
作为我的一个习惯,学习某一个平台的东西,总是先要摸清楚中断的处理流程,当然是从文件代码级的流程分析了。
下面就说下stm32的中断流程。我们知道,stm32的库中写好了很多的驱动程序,可以说包括了所有的。同时也提供很多数据处理方式,例如串口的读写,用户可以选择轮询、中断、DMA等3中方式来处理。
关于中断,stm32的库中做好了框架,用户只要填写好几个函数的实现就ok了,就像网上说的,这就是傻瓜式开发。
了解中断,首先要知道stm32f10x_it.c这个文件,一般情况下是和main文件在同一个目录下的。打开这个文件,我们可以看到xyz_IRQHandler函数的实现,虽然说是实现,但是几乎都是空的。对了,这些函数就是要用户填写的中断处理函数,如果你用到了哪个中断来做相应的处理,你就要填写相应的中断处理函数,需要根据各外设的实际情况来填写,但是一般都会有关闭和开启中断。在这个文件中还有很多系统相关的中断处理函数,例如系统时钟SysTickHandler。具体的实现可以参考stm32\fwlib\FWLib\examples下的各例子。
到这里,我们也只不过看了中断的处理函数,而这些处理函数是如何被硬件中断调用的呢?嗯,说到这里就不得不提一下stm32f10x_vector.c这个文件了。内容如下:
typedef void( *intfunc )( void );
typedef union { intfunc __ void * __ } intvec_
/**************************************************************
__sfe是IAR的“段操作符”segment operator。表示取某个段的后一个字节的地址。
比如&CSTACK&定义为0xx20001fff。那__sfe( &CSTACK& ) 就得到0x这个值,刚好用来初始化msp堆栈指针。
注意使用segment operator前,需要先定义段名如下: #pragma segment=&CSTACK&
RSTACK 程序返回用的,保存的是程序调用函数的返回地址& , 你填写的数值 X 2才是占用的字节数
CSTACK 函数局部变量用的区域,所有的功能函数使用的局部变量都是从这个堆栈申请使用的,用完了再还回去。子函数里面用到的局部变量都是在这里面取来用的.
*****************************************************************/
//IAR对所用语言(这里是C)做的一些扩展,也就是说这里可以用扩展的功能
#pragma language=extended#pragma segment=&CSTACK&
void __iar_program_start( void );
/*****************************************************************
把中断向量表放到中断向量表该放的地方。 如果没有次句,中断向量被当作普通常变量处理,被放置的位置由编译器连接后确定。
在.icf文件中有place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
******************************************************************/
#pragma location = &.intvec&
/* STM32F10x Vector Table entries */
const intvec_elem __vector_table[] =
& { .__ptr = __sfe( &CSTACK& ) },
& &__iar_program_start,
& NMIException,
& HardFaultException,
& MemManageException,
& BusFaultException,
& UsageFaultException,
& 0, 0, 0, 0,&&&&&&&&&&& /* Reserved */
& vPortSVCHandler,
& DebugMonitor,
& 0,&&&&&&&&&&&&&&&&&&&&& /* Reserved */
& xPortPendSVHandler,
& xPortSysTickHandler,
& WWDG_IRQHandler,
& PVD_IRQHandler,
& TAMPER_IRQHandler,
& RTC_IRQHandler,
& FLASH_IRQHandler,
& RCC_IRQHandler,
& EXTI0_IRQHandler,
& EXTI1_IRQHandler,
& EXTI2_IRQHandler,
& EXTI3_IRQHandler,
& EXTI4_IRQHandler,
& DMAChannel1_IRQHandler,
& DMAChannel2_IRQHandler,
& DMAChannel3_IRQHandler,
& DMAChannel4_IRQHandler,
& DMAChannel5_IRQHandler,
& DMAChannel6_IRQHandler,
& DMAChannel7_IRQHandler,
& ADC_IRQHandler,
& USB_HP_CAN_TX_IRQHandler,
& USB_LP_CAN_RX0_IRQHandler,
& CAN_RX1_IRQHandler,
& CAN_SCE_IRQHandler,
& EXTI9_5_IRQHandler,
& TIM1_BRK_IRQHandler,
& TIM1_UP_IRQHandler,
& TIM1_TRG_COM_IRQHandler,
& TIM1_CC_IRQHandler,
& vTimer2IntHandler,
& TIM3_IRQHandler,
& TIM4_IRQHandler,
& I2C1_EV_IRQHandler,
& I2C1_ER_IRQHandler,
& I2C2_EV_IRQHandler,
& I2C2_ER_IRQHandler,
& SPI1_IRQHandler,
& SPI2_IRQHandler,
& vUARTInterruptHandler,
& USART2_IRQHandler,
& USART3_IRQHandler,
& EXTI15_10_IRQHandler,
& RTCAlarm_IRQHandler,
& USBWakeUp_IRQHandler,
现在我们清楚了,这儿就是中断向量表,每一个item对应一个中断或异常处理,这里item的填写要和stm32spec中的Interrupt and exception vectors一节中的列表中的顺序一致。
说道这里,又有一个问题,这个向量表是放在何处的呢?上面对.intvec的解释可以看出是被链接器放到了一个地址上(这里是0x,NVIC_VectTab_FLASH)。但是stm32是怎么知道这个地址的呢,也许有个默认值,或者是就这一个固定值?)。我们在stm32f10x_nvic.c文件中发现下面这样的一个函数
void NVIC_SetVectorTable(u32 NVIC_VectTab, u32 Offset)
& /* Check the parameters */
& assert(IS_NVIC_VECTTAB(NVIC_VectTab));
& assert(IS_NVIC_OFFSET(Offset));&
& SCB-&ExceptionTableOffset = (((u32)Offset && 0x07) & (u32)0x1FFFFF80);
& SCB-&ExceptionTableOffset |= NVIC_VectT
同时在example目录下有vectortable_relocation这样的一个例子:This example describes how to use the NVIC firmware library to set the CortexM3 vector table in a specific address other than default.
在这个例子里面就是直接调用了上面的那个函数,似乎意思很明显了。但是SCB-&ExceptionTableOffset是如何起作用的呢?
着重解释这个问题,先看一组定义:【stm32f10x_map.b】
/* System Control Space memory map */
#define SCS_BASE&&&&&&&&&&&&& ((u32)0xE000E000)
#define SysTick_BASE&&&&&&&&& (SCS_BASE + 0x0010)
#define NVIC_BASE&&&&&&&&&&&& (SCS_BASE + 0x0100)
#define SCB_BASE&&&&&&&&&&&&& (SCS_BASE + 0x0D00)
#ifdef _SCB
#define SCB&&&&&&&&&&&&&&&&&& ((SCB_TypeDef *) SCB_BASE)
typedef struct
& vu32 CPUID;
& vu32 IRQControlS
& vu32 ExceptionTableO
& vu32 AIRC;
& vu32 SysC
& vu32 ConfigC
& vu32 SystemPriority[3];
& vu32 SysHandlerC
& vu32 ConfigFaultS
& vu32 HardFaultS
& vu32 DebugFaultS
& vu32 MemoryManageFaultA
& vu32 BusFaultA
} SCB_TypeD
其实这里主要就是要弄清楚这个SCB是什么意思,因为这个结构是映射到一个物理地址上的。像别的控制寄存器都是这么个玩法,莫非这也是个某类控制器。google一下,果然对于系统控制寄存器组【上篇文章有提到】STM32的固件库中有如下定义:
typedef struct
& vuc32 CPUID;
& vu32 ICSR;
& vu32 VTOR;
& vu32 AIRCR;
& vu32 SCR;
& vu32 CCR;
& vu32 SHPR[3];
& vu32 SHCSR;
& vu32 CFSR;
& vu32 HFSR;
& vu32 DFSR;
& vu32 MMFAR;
& vu32 BFAR;
& vu32 AFSR;
} SCB_TypeD /* System Control Block Structure */
它们对应ARM手册中的名称为
CPUID = CPUID Base Register
ICSR = Interrupt Control State Register
VTOR = Vector Table Offset Register
AIRCR = Application Interrupt/Reset Control Register
SCR = System Control Register
CCR = Configuration Control Register
SHPR = System Handlers Priority Register
SHCSR = System Handler Control and State Register
CFSR = Configurable Fault Status Registers
HFSR = Hard Fault Status Register
DFSR = Debug Fault Status Register
MMFAR = Mem Manage Address Register
BFAR = Bus Fault Address Register
AFSR = Auxiliary Fault Status Register
至此,我们终于清楚了,这个中断向量表的地址,最终是要写到某个控制器中去。那这么说来,上述的0x可以是个别的值了,只要保证这一处的地址不能被别的程序访问就行了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:75249次
排名:千里之外
转载:73篇
(1)(1)(2)(6)(2)(1)(1)(2)(1)(6)(49)(1)STM32中中断屏蔽寄存器与中断使能寄存器有什么区别???_百度知道
STM32中中断屏蔽寄存器与中断使能寄存器有什么区别???
自己感觉没区别啊
我有更好的答案
一旦屏蔽了某一个中断位,无论你是否使能这位中断,它都无效中断屏蔽寄存器相当于你家的电总闸,中断使能寄存器就相当于你家电灯开关
其他类似问题
为您推荐:
您可能关注的推广
中断屏蔽的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁STM32的TIM_ClearFlag TIM_ClearITPendingBit 区别_百度知道
STM32的TIM_ClearFlag TIM_ClearITPendingBit 区别
但是定时器不是就是用中断吗?TIM_ClearITPendingBit(清除TIMx 的中断待处理位)。,复制也复制点有用点的信息,一个不是中断的。,TIM_ClearFlag(清除TIMx 的待处理标志位)我知道一个是中断的?还有其他方式,谢谢?请详细解释一下STM32这两个函数有什么区别呢
* Check the parameters */02604
assert_param(IS_TIM_CLEAR_FLAG(TIM_FLAG));SR = (uint16_t)~TIM_FLAG参考了一下源代码****************************************************************************************02600 void TIM_ClearFlag(TIM_TypeDef* TIMx;* Clear the IT pending Bit */02603
assert_param(IS_TIM_ALL_PERIPH(TIMx));****************************************************************************************02676 void TIM_ClearITPendingBit(TIM_TypeDef* TIMx。大概是为了适应不同的编程风格写成了两个函数吧;02683 }****************************************************************************************都是对同一个寄存器进行相同操作;* Clear the flags *&#47。两个函数实现的功能是一样的;02679
assert_param(IS_TIM_ALL_PERIPH(TIMx))。;02605
&#47, uint16_t TIM_FLAG)02601 {
/SR = (uint16_t)~TIM_IT。完全一样的……就是说;02680
assert_param(IS_TIM_IT(TIM_IT));02682
TIMx-&gt。;* Check the parameters *&#47, uint16_t TIM_IT)02677 {02678
TIMx-&gt。。
其他类似问题
为您推荐:
其他2条回答
TIM_Period = 0xFFFFTIM_TimeBaseStructure.TIM_今天才开始学习STM32 请高手指教下 定时初值应该怎么算呀; TIM_TimeBaseStructure
hicZZ说的没错,一模一样的两个函数,本质上无任何区别。
stm32的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁STM32 3.5库文件中文说明_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
STM32 3.5库文件中文说明
上传于||文档简介
&&S​T​M2​ .最​新​库​文​件​中​文​说​明
阅读已结束,如果下载本文需要使用2下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩11页未读,继续阅读
你可能喜欢}

我要回帖

更多关于 stm32 中断 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信