码迷,mamicode.com
首页 > 其他好文 > 详细

5、中断

时间:2015-05-26 14:10:09      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:

一、中断

1、ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。   

     STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级 的设置,仅使用中断优先级设置8bit中的高4位。

 

 

2、STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节(8位,但是STM32中只使用4位,高4位有效),   

    每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。68个通道的优先级控制字至少构成17个32位的优先级寄存器。

 

 

3、中断优先级    STM32(Cortex-M3)中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作“亚优先级”或“副优先级”, 每个中断源都需要被指定这两种优先级。

   (1)抢占式优先级(pre-emption priority)

        高抢占式优先级的中断事件会打断当前的主程序/中断程序运行,俗称中断嵌套。   

   (2) 响应优先级(subpriority)

        在抢占式优先级相同的情况下,高响应优先级的中断优先被响应;

        在抢占式优先级相同的情况下,如果有低响应优先级中断正在执行,高响应优先级的中断要等待已被响应的低响应优先级中断执行结束后才能得到响应—(不能嵌套)。

 

 

4、判断中断是否会被响应的依据    

    首先是抢占式优先级,其次是响应优先级;

    抢占式优先级决定是否会有中断嵌套;

 

 

5、优先级冲突的处理   

   (1)具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断的嵌套, 或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。   

   (2)当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,

          如果正在处理另一个中断, 这个后到来的中断就要等到前一个中断处理完之后才能被处理。

          如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;        

          如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

 

 

6、STM32中对中断优先级的定义

    STM32中指定中断优先级的寄存器位有4位,这4个寄存器位的分组方式如下:   

    第0组:所有4位用于指定响应优先级   

    第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级   

    第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级   

    第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级   

    第4组:所有4位用于指定抢占式优先级

技术分享

 

 

 

 

 

二、外部中断

1、外部中断初始化函数函数 EXTI_Init
技术分享

技术分享

技术分享

 

 

2、优先级初始化函数NVIC_InitTypeDef

技术分享

技术分享

技术分享

技术分享

技术分享

 

 

3、外部中断处理示例:

技术分享
  1 /*************************************************************************************************************************************
  2 *  
  3 *  文件名称:main.c
  4 *  文件功能:主函数文件
  5 *
  6 ***************************************************************************************************************************************/
  7 
  8 #include"pbdata.h"//调用自定义公共函数库
  9 
 10 
 11 /*********************************************************************************
 12 *
 13 * 初始化操作
 14 *
 15 *********************************************************************************/
 16 void RCC_Configuration(void);//系统时钟初始化函数声明
 17 void GPIO_Configuration(void);//GPIO初始化函数声明
 18 void  EXTI_Configuration(void);//中断初始化配置声明
 19 void NVIC_Configuration(void);//中断优先级配置声明
 20 
 21 
 22 
 23 /********************************************************************************
 24 *
 25 *  函数名称:main(void)
 26 *  函数功能:主函数
 27 *  函数说明:不能用void定义主函数
 28 *
 29 ********************************************************************************/
 30 int main(void)//void不能void定义主函数
 31 {
 32     
 33     RCC_Configuration();    //系统时钟初始化
 34     
 35     GPIO_Configuration();//端口初始化
 36     
 37     EXTI_Configuration();//中断配置
 38     NVIC_Configuration();//中断优先级配置
 39     
 40   while(1);//主函数不做任何处理,等待进入中断函数
 41     
 42 }
 43     
 44     
 45 
 46 
 47 /********************************************************************************
 48 *
 49 *  函数名称:RCC_Configuration(void)
 50 *  函数功能:系统时钟高初始化函数
 51 *
 52 ********************************************************************************/
 53     void RCC_Configuration(void)//系统时钟高初始化函数
 54   {
 55         
 56     SystemInit();//系统初始化
 57     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//对应GPIO时钟使能
 58         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//对应GPIO时钟使能
 59         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//对应GPIO外部中断时钟使能
 60     }
 61     
 62     
 63 
 64 /*******************************************************************************
 65 *
 66 * 函数名称:GPIO_Configuration(void)
 67 * 函数功能:GPIO初始化函数
 68 *
 69 ********************************************************************************/    
 70     
 71     void GPIO_Configuration(void)//GPIO初始化函数
 72   {
 73     GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO设置的结构体变量 
 74 
 75 /*对LED引脚初始化*/        
 76         /*结构体变量赋值*/
 77       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;////引脚配置
 78       GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置频率
 79       GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
 80          /*对应的GPIO初始化*/
 81       GPIO_Init(GPIOB,&GPIO_InitStructure);
 82         
 83 /*对key的引脚初始化*/
 84         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;////引脚配置
 85       GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
 86          /*对应的GPIO初始化*/
 87       GPIO_Init(GPIOC,&GPIO_InitStructure);
 88         
 89   }
 90     
 91 
 92 /*********************************************************************************
 93 *
 94 *  外部中断相关子函数部分
 95 *
 96 *********************************************************************************/
 97 
 98     
 99 /**********************************************
100 *
101 *  函数名称:EXTI_Configuration(void)
102 *  函数功能:外部中断配置
103 *
104 **********************************************/
105 
106 void  EXTI_Configuration(void)
107 {
108      EXTI_InitTypeDef  EXTI_InitStructure;//定义一个中断配置的结构体变量
109     
110      EXTI_ClearITPendingBit(EXTI_Line5);//使用前清除中断
111     
112      GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource5);//选择GPIO管脚作为外部中断线路
113      
114     
115      EXTI_InitStructure.EXTI_Line = EXTI_Line5;
116    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式
117    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//触发方式
118      EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断使能
119     
120     
121      EXTI_Init(&EXTI_InitStructure);//初始化进行配置
122 }
123 
124     
125 /**********************************************
126 *
127 *  函数名称:NVIC_Configuration(void)
128 *  函数功能:配置中断优先级
129 *
130 ***********************************************/
131     
132 void NVIC_Configuration(void)
133 {
134     NVIC_InitTypeDef NVIC_InitStructure; //定义一个优先级配置结构体变量
135     
136   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//分组
137 
138   NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
139   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢断优先级
140   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//响应优先级
141   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能
142     
143   NVIC_Init(&NVIC_InitStructure);//初始化
144     
145 }    
146     
147     
148     
149     
150     
View Code
技术分享
 1 /****************************************************************************************************************
 2 *
 3 * 文件名称:pbdata.c
 4 * 文件功能:自定义函数或者全局变量的初始化
 5 *
 6 ****************************************************************************************************************/
 7 
 8 /*头文件声明*/
 9 #include"pbdata.h"
10 
11 
12 
13 
14 /********************************************************************************************
15 *
16 * 自定义全局变量
17 *
18 ********************************************************************************************/
19 u8 dt=0;
20 
21 
22 
23 
24 
25 /******************************************************************************************
26 *
27 * 自定义函数
28 *
29 ******************************************************************************************/
30 
31 
32 
33 /**************************************************
34 *
35 *  函数名称:delay_us(u32 nus)
36 *  函数功能:微秒延时函数
37 *  输入参数:输入值为延时us
38 *
39 ***************************************************/
40 void delay_us(u32 nus)
41 {
42     u32 temp;
43     SysTick->LOAD = 9*nus;//载入初值,72M/8=9M,也就是1/9us,9*1/9us,所以是执行9次
44     SysTick->VAL=0X00;//清空计数器,清空后,就自动设置自己设定的计数器的值
45     SysTick->CTRL=0X01;//使能,减到零动作(不发生中断),采用外部时钟
46     
47     do
48     {
49           temp=SysTick->CTRL;//标志位,等到一直减到0
50          }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
51     
52     SysTick->CTRL=0x00; //关闭计数器
53     SysTick->VAL =0X00; //清空计数器
54 }
55 
56 
57 
58 
59 
60 
61 
62 /***************************************************
63 *
64 * 函数名称:delay_ms(u16 nms)
65 * 函数功能:毫秒级延时
66 * 输入参数:输入值位延时ms
67 *
68 ****************************************************/
69 void delay_ms(u16 nms)
70 {
71     u32 temp;
72     SysTick->LOAD = 9000*nms;//载入初值,72M/8=9M,也就是1/9us,9*1/9us,所以是执行9000次
73     SysTick->VAL=0X00;//清空计数器,清空后,就自动设置自己设定的计数器的值
74     SysTick->CTRL=0X01;//使能,减到零动作(不发生中断),采用外部时钟
75     
76     do
77     {
78           temp=SysTick->CTRL;//标志位,等到一直减到0
79          }while((temp&0x01)&&(!(temp&(1<<16))));//等待时间到达
80     
81     SysTick->CTRL=0x00; //关闭计数器
82     SysTick->VAL =0X00; //清空计数器
83 }
View Code
技术分享
 1 /*pbdata.h*/
 2 /***************************************************************************************************
 3 *
 4 * 文件名称:pbdata.h
 5 * 文件功能:自定义的函数和全局变量的声明头文件
 6 *
 7 ***************************************************************************************************/
 8 
 9 #ifndef _pbdata_H
10 #define _pbdata_H
11 
12 #include"stm32f10x.h"
13 #include"misc.h"
14 #include"stm32f10x_exti.h"
15 
16 
17 
18 /********************************************************************
19 *
20 *  自定义全局变量声明
21 *
22 ********************************************************************/
23 extern u8 dt;
24 
25 
26 
27 
28 
29 /********************************************************************
30 *
31 *  自定义全函数声明
32 *
33 ********************************************************************/
34 void delay(u32 nCount);
35 void delay_us(u32 nus);
36 void delay_ms(u16 nms);
37 
38 
39 
40 
41 #endif
View Code
技术分享
  1 /**
  2   ******************************************************************************
  3   * @file GPIO/IOToggle/stm32f10x_it.c 
  4   * @author  MCD Application Team
  5   * @version  V3.0.0
  6   * @date  04/06/2009
  7   * @brief  Main Interrupt Service Routines.
  8   *         This file provides template for all exceptions handler and 
  9   *         peripherals interrupt service routine.
 10   ******************************************************************************
 11   * @copy
 12   *
 13   * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
 14   * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
 15   * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
 16   * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
 17   * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
 18   * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
 19   *
 20   * <h2><center>&copy; COPYRIGHT 2009 STMicroelectronics</center></h2>
 21   */
 22 
 23 /* Includes ------------------------------------------------------------------*/
 24 #include "stm32f10x_it.h"     
 25 #include "stm32f10x_exti.h"
 26 #include "stm32f10x_rcc.h"
 27 #include "misc.h"
 28 #include "pbdata.h"
 29 
 30 void NMI_Handler(void)
 31 {
 32 }
 33 
 34 void USART1_IRQHandler(void){
 35    while(1);
 36 }
 37 
 38 
 39 /**
 40   * @brief  This function handles Hard Fault exception.
 41   * @param  None
 42   * @retval : None
 43   */
 44 void HardFault_Handler(void)
 45 {
 46   /* Go to infinite loop when Hard Fault exception occurs */
 47   while (1)
 48   {
 49   }
 50 }
 51 
 52 /**
 53   * @brief  This function handles Memory Manage exception.
 54   * @param  None
 55   * @retval : None
 56   */
 57 void MemManage_Handler(void)
 58 {
 59   /* Go to infinite loop when Memory Manage exception occurs */
 60   while (1)
 61   {
 62   }
 63 }
 64 
 65 /**
 66   * @brief  This function handles Bus Fault exception.
 67   * @param  None
 68   * @retval : None
 69   */
 70 void BusFault_Handler(void)
 71 {
 72   /* Go to infinite loop when Bus Fault exception occurs */
 73   while (1)
 74   {
 75   }
 76 }
 77 
 78 /**
 79   * @brief  This function handles Usage Fault exception.
 80   * @param  None
 81   * @retval : None
 82   */
 83 void UsageFault_Handler(void)
 84 {
 85   /* Go to infinite loop when Usage Fault exception occurs */
 86   while (1)
 87   {
 88   }
 89 }
 90 
 91 /**
 92   * @brief  This function handles SVCall exception.
 93   * @param  None
 94   * @retval : None
 95   */
 96 void SVC_Handler(void)
 97 {
 98 }
 99 
100 /**
101   * @brief  This function handles Debug Monitor exception.
102   * @param  None
103   * @retval : None
104   */
105 void DebugMon_Handler(void)
106 {
107 }
108 
109 /**
110   * @brief  This function handles PendSV_Handler exception.
111   * @param  None
112   * @retval : None
113   */
114 void PendSV_Handler(void)
115 {
116 }
117 
118 /**
119   * @brief  This function handles SysTick Handler.
120   * @param  None
121   * @retval : None
122   */
123 void SysTick_Handler(void)
124 {
125 }
126 
127 
128 
129 
130 
131 /****************************************************************************
132 *
133 * 函数名称:void EXTI9_5_IRQHandler(void)
134 * 外部中断处理函数
135 *
136 ****************************************************************************/
137 void EXTI9_5_IRQHandler(void)
138 {
139   if(EXTI_GetITStatus(EXTI_Line5)==SET)  //判断是否产生了中断
140   {
141        EXTI_ClearITPendingBit(EXTI_Line5);//中断清除
142 
143       delay_ms(10);//延时消抖
144 
145       if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==Bit_RESET) //再次判断,消抖
146       {
147           if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)==Bit_RESET)//如果LED是亮
148           {
149            GPIO_SetBits(GPIOB,GPIO_Pin_5);    //则熄灭
150           }
151           else
152           {
153               GPIO_ResetBits(GPIOB,GPIO_Pin_5);//如果是熄灭的,就亮
154           }
155       }
156   }    
157 }
158 
159 
160 
161 
162 
163 
164 
165 
166 
167 /****************************************************************************
168 * ?    ?úvoid EXTI1_IRQHandler(void)
169 * ?    ?úEXTI2???m??
170 * ????ú?
171 * ????ú?
172 * ?    ?ú
173 * ????ú? 
174 ****************************************************************************/
175 void EXTI1_IRQHandler(void)
176 {
177     
178 }
179 
180 /****************************************************************************
181 * ?    ?úvoid EXTI2_IRQHandler(void)
182 * ?    ?úEXTI2???m??
183 * ????ú?
184 * ????ú?
185 * ?    ?ú
186 * ????ú? 
187 ****************************************************************************/
188 void EXTI2_IRQHandler(void)
189 {
190     
191 }
192 
193 /****************************************************************************
194 * ?    ?úvoid EXTI3_IRQHandler(void)
195 * ?    ?úEXTI3???m??
196 * ????ú?
197 * ????ú?
198 * ?    ?ú
199 * ????ú? 
200 ****************************************************************************/
201 void EXTI3_IRQHandler(void)
202 {
203    
204 }
View Code
技术分享
  1 /**
  2   ******************************************************************************
  3   * @file GPIO/IOToggle/stm32f10x_it.h 
  4   * @author  MCD Application Team
  5   * @version  V3.0.0
  6   * @date  04/06/2009
  7   * @brief  This file contains the headers of the interrupt handlers.
  8   ******************************************************************************
  9   * @copy
 10   *
 11   * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
 12   * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
 13   * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
 14   * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
 15   * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
 16   * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
 17   *
 18   * <h2><center>&copy; COPYRIGHT 2009 STMicroelectronics</center></h2>
 19   */
 20 
 21 /* Define to prevent recursive inclusion -------------------------------------*/
 22 #ifndef __STM32F10x_IT_H
 23 #define __STM32F10x_IT_H
 24 
 25 /* Includes ------------------------------------------------------------------*/
 26 #include "stm32f10x.h"
 27 //#include "stm32f10x_nvic.h"
 28 //#include "stm32f10x_lib.h"
 29 /* Exported types ------------------------------------------------------------*/
 30 /* Exported constants --------------------------------------------------------*/
 31 /* Exported macro ------------------------------------------------------------*/
 32 /* Exported functions ------------------------------------------------------- */
 33 
 34 void NMIException(void);
 35 void HardFaultException(void);
 36 void MemManageException(void);
 37 void BusFaultException(void);
 38 void UsageFaultException(void);
 39 void DebugMonitor(void);
 40 void SVCHandler(void);
 41 void PendSVC(void);
 42 void SysTickHandler(void);
 43 void WWDG_IRQHandler(void);
 44 void PVD_IRQHandler(void);
 45 void TAMPER_IRQHandler(void);
 46 void RTC_IRQHandler(void);
 47 void FLASH_IRQHandler(void);
 48 void RCC_IRQHandler(void);
 49 void EXTI0_IRQHandler(void);
 50 void EXTI1_IRQHandler(void);
 51 void EXTI2_IRQHandler(void);
 52 void EXTI3_IRQHandler(void);
 53 void EXTI4_IRQHandler(void);
 54 void DMA1_Channel1_IRQHandler(void);
 55 void DMA1_Channel2_IRQHandler(void);
 56 void DMA1_Channel3_IRQHandler(void);
 57 void DMA1_Channel4_IRQHandler(void);
 58 void DMA1_Channel5_IRQHandler(void);
 59 void DMA1_Channel6_IRQHandler(void);
 60 void DMA1_Channel7_IRQHandler(void);
 61 void ADC1_2_IRQHandler(void);
 62 void USB_HP_CAN_TX_IRQHandler(void);
 63 void USB_LP_CAN_RX0_IRQHandler(void);
 64 void CAN_RX1_IRQHandler(void);
 65 void CAN_SCE_IRQHandler(void);
 66 void EXTI9_5_IRQHandler(void);
 67 void TIM1_BRK_IRQHandler(void);
 68 void TIM1_UP_IRQHandler(void);
 69 void TIM1_TRG_COM_IRQHandler(void);
 70 void TIM1_CC_IRQHandler(void);
 71 void TIM2_IRQHandler(void);
 72 void TIM3_IRQHandler(void);
 73 void TIM4_IRQHandler(void);
 74 void I2C1_EV_IRQHandler(void);
 75 void I2C1_ER_IRQHandler(void);
 76 void I2C2_EV_IRQHandler(void);
 77 void I2C2_ER_IRQHandler(void);
 78 void SPI1_IRQHandler(void);
 79 void SPI2_IRQHandler(void);
 80 void USART1_IRQHandler(void);
 81 void USART2_IRQHandler(void);
 82 void USART3_IRQHandler(void);
 83 void EXTI15_10_IRQHandler(void);
 84 void RTCAlarm_IRQHandler(void);
 85 void USBWakeUp_IRQHandler(void);
 86 void TIM8_BRK_IRQHandler(void);
 87 void TIM8_UP_IRQHandler(void);
 88 void TIM8_TRG_COM_IRQHandler(void);
 89 void TIM8_CC_IRQHandler(void);
 90 void ADC3_IRQHandler(void);
 91 void FSMC_IRQHandler(void);
 92 void SDIO_IRQHandler(void);
 93 void TIM5_IRQHandler(void);
 94 void SPI3_IRQHandler(void);
 95 void UART4_IRQHandler(void);
 96 void UART5_IRQHandler(void);
 97 void TIM6_IRQHandler(void);
 98 void TIM7_IRQHandler(void);
 99 void DMA2_Channel1_IRQHandler(void);
100 void DMA2_Channel2_IRQHandler(void);
101 void DMA2_Channel3_IRQHandler(void);
102 void DMA2_Channel4_5_IRQHandler(void);
103 #endif /* __STM32F10x_IT_H */
104 
105 /******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/
View Code

 

4、例程下载:

http://download.csdn.net/detail/a1181803348/8740245

 

5、中断

标签:

原文地址:http://www.cnblogs.com/STM32bo/p/4530361.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!