一、中断
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
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 }
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
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>© 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 }
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>© 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****/
4、例程下载:
http://download.csdn.net/detail/a1181803348/8740245