5、中断

一、中断

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

 

 

 

 

三、定时器中断

1、STM32中一共有11个定时器,其中2个高级控制定时器,4个通用定时器和2个基本定时器,   

     以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick。

 

 

2、通用定时器TIM2、TIM3、TIM4和TIM5   

   (1)通用TIMx (TIM2、TIM3、TIM4和TIM5)定时器功能包括:        

           16位向上、向下、向上/ 向下自动装载计数器               

           16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值               

           4个独立通道:输入捕获 ,输出比较 ,PWM生成(边缘或中间对齐模式) ,单脉冲模式输出   

   (2)使用外部信号控制定时器和定时器互连的同步电路   

   (3)如下事件发生时产生中断/DMA :        

           a. 更新:计数器向上溢出/ 向下溢出,计数器初始化(通过软件或者内部/外部触发)        

           b. 触发事件(计数器启动、停止、初始化或者由内部/外部 触发计数)        

           c. 输入捕获        

           d. 输出比较   

    (4)支持针对定位的增量(正交)编码器和霍尔传感器电路   

    (5)触发输入作为外部时钟或者按周期的电流管理

 

3、时钟来源:   

   (1)内部时钟(CK_INT)

   (2)外部时钟模式1:外部输入脚(TIx)

   (3)外部时钟模式2:外部触发输入(ETR)   

   (4)内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器, 如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。

 

 

4、TIM2-TIM5计数器模式:TIM2-TIM5可以由向上计数、向下计数、向上向下双向计数。  

   (1)向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器内容),然后重新从0开始计数并且产生一个计数器溢出事件。  

   (2)在向下模式中,计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。  

   (3)而中央对齐模式(向上/向下计数)是计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。

 

5、定时器初始化配置函数TIM_TimeBaseInit
    

 

6、代码例程: 

  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 NVIC_Configuration(void);//中断优先级配置声明
 19 void TIM3_Configuration(void);//中断配置函数声明
 20 
 21 
 22 /********************************************************************************
 23 *
 24 *  函数名称:main(void)
 25 *  函数功能:主函数
 26 *  函数说明:不能用void定义主函数
 27 *
 28 ********************************************************************************/
 29 int main(void)//void不能void定义主函数
 30 {
 31     
 32     RCC_Configuration();    //系统时钟初始化
 33     
 34     GPIO_Configuration();//端口初始化
 35     
 36     TIM3_Configuration();//中断配置
 37     NVIC_Configuration();//中断优先级配置
 38     
 39   while(1);//主函数不做任何处理,等待进入中断函数
 40     
 41 }
 42     
 43     
 44 
 45 
 46 /********************************************************************************
 47 *
 48 *  函数名称:RCC_Configuration(void)
 49 *  函数功能:系统时钟高初始化函数
 50 *
 51 ********************************************************************************/
 52     void RCC_Configuration(void)//系统时钟高初始化函数
 53   {
 54         
 55     SystemInit();//系统初始化
 56     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//对应GPIO时钟使能
 57         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//对应定时器T3时钟使能
 58     }
 59     
 60     
 61 
 62 /*******************************************************************************
 63 *
 64 * 函数名称:GPIO_Configuration(void)
 65 * 函数功能:GPIO初始化函数
 66 *
 67 ********************************************************************************/    
 68     
 69     void GPIO_Configuration(void)//GPIO初始化函数
 70   {
 71     GPIO_InitTypeDef GPIO_InitStructure;//定义一个GPIO设置的结构体变量 
 72 
 73 /*对LED引脚初始化*/        
 74         /*结构体变量赋值*/
 75       GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;////引脚配置
 76       GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//配置频率
 77       GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
 78          /*对应的GPIO初始化*/
 79       GPIO_Init(GPIOB,&GPIO_InitStructure);    
 80         
 81   }
 82     
 83 
 84 /*********************************************************************************
 85 *
 86 *  中断相关子函数部分
 87 *
 88 *********************************************************************************/
 89 
 90     
 91 /**********************************************
 92 *
 93 *  函数名称:TIM3_Configuration(void)
 94 *  函数功能:配置定时器
 95 *
 96 ***********************************************/
 97 void TIM3_Configuration(void)
 98 {
 99     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定义一个结构体配置变量
100     
101     TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//使用前清空标志位
102     
103     
104   TIM_TimeBaseStructure.TIM_Period = 2000;//初值:72MHZ,预分频设为36000,分频后频率2000hz,一秒计数2000次,初始值设为2000,所以一秒计时
105   TIM_TimeBaseStructure.TIM_Prescaler = 36000-1;//预分频,分频数-1;
106   TIM_TimeBaseStructure.TIM_ClockDivision = 0;//时钟
107   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式
108     
109   TIM_TimeBaseInit(TIM3, & TIM_TimeBaseStructure);//初始化配置
110     
111     TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//打开中断(中断方式)
112     
113     TIM_Cmd(TIM3,ENABLE);//打开定时器
114 }
115     
116     
117 
118     
119 /**********************************************
120 *
121 *  函数名称:NVIC_Configuration(void)
122 *  函数功能:配置中断优先级
123 *
124 ***********************************************/
125     
126 void NVIC_Configuration(void)
127 {
128     NVIC_InitTypeDef NVIC_InitStructure; //定义一个优先级配置结构体变量
129     
130   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//分组
131 
132   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
133   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢断优先级
134   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
135   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能
136     
137   NVIC_Init(&NVIC_InitStructure);//初始化
138     
139 }    
140     
141     
142     
143     
144     
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 #include "stm32f10x_tim.h"
16 
17 
18 
19 /********************************************************************
20 *
21 *  自定义全局变量声明
22 *
23 ********************************************************************/
24 extern u8 dt;
25 
26 
27 
28 
29 
30 /********************************************************************
31 *
32 *  自定义全函数声明
33 *
34 ********************************************************************/
35 void delay(u32 nCount);
36 void delay_us(u32 nus);
37 void delay_ms(u16 nms);
38 
39 
40 
41 
42 #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 "stm32f10x_tim.h"
 28 #include "misc.h"
 29 #include "pbdata.h"
 30 
 31 void NMI_Handler(void)
 32 {
 33 }
 34 
 35 void USART1_IRQHandler(void){
 36    while(1);
 37 }
 38 
 39 
 40 /**
 41   * @brief  This function handles Hard Fault exception.
 42   * @param  None
 43   * @retval : None
 44   */
 45 void HardFault_Handler(void)
 46 {
 47   /* Go to infinite loop when Hard Fault exception occurs */
 48   while (1)
 49   {
 50   }
 51 }
 52 
 53 /**
 54   * @brief  This function handles Memory Manage exception.
 55   * @param  None
 56   * @retval : None
 57   */
 58 void MemManage_Handler(void)
 59 {
 60   /* Go to infinite loop when Memory Manage exception occurs */
 61   while (1)
 62   {
 63   }
 64 }
 65 
 66 /**
 67   * @brief  This function handles Bus Fault exception.
 68   * @param  None
 69   * @retval : None
 70   */
 71 void BusFault_Handler(void)
 72 {
 73   /* Go to infinite loop when Bus Fault exception occurs */
 74   while (1)
 75   {
 76   }
 77 }
 78 
 79 /**
 80   * @brief  This function handles Usage Fault exception.
 81   * @param  None
 82   * @retval : None
 83   */
 84 void UsageFault_Handler(void)
 85 {
 86   /* Go to infinite loop when Usage Fault exception occurs */
 87   while (1)
 88   {
 89   }
 90 }
 91 
 92 /**
 93   * @brief  This function handles SVCall exception.
 94   * @param  None
 95   * @retval : None
 96   */
 97 void SVC_Handler(void)
 98 {
 99 }
100 
101 /**
102   * @brief  This function handles Debug Monitor exception.
103   * @param  None
104   * @retval : None
105   */
106 void DebugMon_Handler(void)
107 {
108 }
109 
110 /**
111   * @brief  This function handles PendSV_Handler exception.
112   * @param  None
113   * @retval : None
114   */
115 void PendSV_Handler(void)
116 {
117 }
118 
119 /**
120   * @brief  This function handles SysTick Handler.
121   * @param  None
122   * @retval : None
123   */
124 void SysTick_Handler(void)
125 {
126 }
127 
128 
129 
130 /****************************************************************************
131 *
132 * 函数名称:void TIM3_IRQHandler(void)
133 * 外部中断处理函数
134 *
135 ****************************************************************************/
136 
137 
138 void TIM3_IRQHandler(void)
139 {
140     TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
141 
142     if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==Bit_RESET)
143     {
144         if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)==Bit_RESET)
145         {
146             //LED 熄灭
147            GPIO_SetBits(GPIOB,GPIO_Pin_5);    
148         }
149         else
150         {
151            //LED 发光
152            GPIO_ResetBits(GPIOB,GPIO_Pin_5);
153         }
154     }
155 
156 }
157 
158 
159 
160 
161 /****************************************************************************
162 *
163 * 函数名称:void EXTI9_5_IRQHandler(void)
164 * 外部中断处理函数
165 *
166 ****************************************************************************/
167 void EXTI9_5_IRQHandler(void)
168 {
169   if(EXTI_GetITStatus(EXTI_Line5)==SET)  //判断是否产生了中断
170   {
171        EXTI_ClearITPendingBit(EXTI_Line5);//中断清除
172 
173       delay_ms(10);//延时消抖
174 
175       if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5)==Bit_RESET) //再次判断,消抖
176       {
177           if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)==Bit_RESET)//如果LED是亮
178           {
179            GPIO_SetBits(GPIOB,GPIO_Pin_5);    //则熄灭
180           }
181           else
182           {
183               GPIO_ResetBits(GPIOB,GPIO_Pin_5);//如果是熄灭的,就亮
184           }
185       }
186   }    
187 }
188 
189 
190 
191 
192 
193 
194 
195 
196 
197 /****************************************************************************
198 * Ļ    Ԇúvoid EXTI1_IRQHandler(void)
199 * ٦    ŜúEXTI2א׏ԦmԌѲ
200 * ɫࠚӎ˽úϞ
201 * Զࠚӎ˽úϞ
202 * ˵    ķú
203 * ַԃ׽רúϞ 
204 ****************************************************************************/
205 void EXTI1_IRQHandler(void)
206 {
207     
208 }
209 
210 /****************************************************************************
211 * Ļ    Ԇúvoid EXTI2_IRQHandler(void)
212 * ٦    ŜúEXTI2א׏ԦmԌѲ
213 * ɫࠚӎ˽úϞ
214 * Զࠚӎ˽úϞ
215 * ˵    ķú
216 * ַԃ׽רúϞ 
217 ****************************************************************************/
218 void EXTI2_IRQHandler(void)
219 {
220     
221 }
222 
223 /****************************************************************************
224 *
225 * 函数名称:void EXTI3_IRQHandler(void)
226 * 函数功能:外部中断XTI3中断处理函数
227 * 
228 ****************************************************************************/
229 void EXTI3_IRQHandler(void)
230 {
231 
232      
233 }
View Code

 

7、例程下载地址:

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

 

posted @ 2015-05-26 12:59  如风轻逸  阅读(411)  评论(0编辑  收藏  举报