原创 【博客大赛】STM32中断小结

2013-7-30 20:44 1880 22 22 分类: MCU/ 嵌入式

 

STM32中断EXTI

STM32中断支持15个异常中断和240个外部中断,有256个中断优先级,其中I/O可配置为EXTI中断,捕捉外部信号,可配置为上升沿,下降沿,上升下降沿三种中断模式。

配置一个I/O中断可分为以下步骤:

  1. 配置系统时钟
  2. 配置中断I/O,其他I/O状态,GPIO_Configuration

EXTI配置

  1. NVIC配置
  2. 中断子函数  

重点在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位:只允许NMIhard fault异常,其他中断/异常都被屏蔽(当前CPU优先级=0) 
        AULTMASK
位:只允许NMI,其他所有中断/异常都被屏蔽(当前CPU优先级=-1)

STM32固件库中(stm32f10x_nvic.cstm32f10x_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条评论)

登录后参与讨论
我要评论
0
22
关闭 站长推荐上一条 /2 下一条