STM32中断EXTI
STM32中断支持15个异常中断和240个外部中断,有256个中断优先级,其中I/O可配置为EXTI中断,捕捉外部信号,可配置为上升沿,下降沿,上升下降沿三种中断模式。
配置一个I/O中断可分为以下步骤:
EXTI配置
重点在EXTI,NVIC配置。
下面介绍一下STM32抢占优先级的问题:
Cortex-M3共使用8位来设置优先级,有优先级组设置,以及抢占和子优先级配置、
在STM32中,使用4位来设置优先级。
对于同一抢占优先级的中断来说,即便是子优先级高的也不能中断正在执行的中断,只有高抢占优先级的中断方可中断正在执行中的中断。还有一些疑问,有待进一步解决。
下边的五行我个人认为是stm32的关于嵌套中断的说法:
0位抢占优先级,4位子优先级:设置为16级子优先级,不使用抢占式优先级;
1位抢占优先级,3位子优先级:设置为8级子优先级,2级抢占式优先级;
2位抢占优先级,2位子优先级:设置为4级子优先级,4级抢占式优先级;
3位抢占优先级,1位子优先级:设置为2级子优先级,8级抢占式优先级;
4位抢占优先级,0位子优先级:设置为不使用子优先级,16级抢占式优先级;
在STM32/Cortex-M3中是通过改变CPU的当前优先级来允许或禁止中断。
PRIMASK位:只允许NMI和hard fault异常,其他中断/异常都被屏蔽(当前CPU优先级=0)。
AULTMASK位:只允许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
文章评论(0条评论)
登录后参与讨论