STM32–中断程序总结(库函数)

一.常用函数
1.开启时钟函数

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
/*打开APB2外设RCC的时钟*/

2.向GPIO口置0置1

GPIO_SetBits(GPIOA,GPIO_Pin_1);  
/*向PA1口置1	*/	

GPIO_ResetBits(GPIOA,GPIO_Pin_1);
/*向PA1口置0  */

3.读取GPIO电平

GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0); 
/*读取PA0的电平状态  */

二.配置中断优先级函数

void EXTI_NVIC_Config(void)	
{		
NVIC_InitTypeDef NVIC_InitStruct; 		
/*初始化NVIC结构体  */	

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);		
/*设置优先级分组为组一,组的区别具体在教材P133 */		
		
NVIC_InitStruct.NVIC_IRQChannel =  EXTI0_IRQn;
/*选择中断源为EXTI0(EXTI Line0的中断源)  */		



/*注意:*/		
/*EXTI0  EXTI1  EXTI2  EXTI3  EXTI4 对应中断源分别为 EXTI0_IRQn EXTI1_IRQn EXTI2_IRQn EXTI3_IRQn EXTI4_IRQn	*/	
/*EXTI5  EXTI6  EXTI7  EXTI8  EXTI9 对应中断源分别为 EXTI9_5_IRQn	*/	
/*EXTI10 EXTI11 EXTI12 EXTI13 EXTI14 EXTI15 对应中断源分别为 EXTI15_10_IRQn	*/	

 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;		
 /* 主优先级(抢占优先级)设置为1  (优先级数字越小,优先级越高) */	

NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;	
/* 子优先级(响应优先级)设置成1	*/	
		
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
/*使能NVIC总中断	*/	
	
NVIC_Init(&NVIC_InitStruct);	
}

三.GPIO初始化函数(需要包含stm32f10x_gpio.h头文件)
1.GPIO初始化函数程序

void GPIO_Configuration(void)	
{		

GPIO_InitTypeDef GPIO_InitStructure;		
/*初始化GPIO结构体	*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx,ENABLE);	
 /*打开APB2外设GPIOx端口的时钟  */		

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_标号|GPIO_Pin_标号;		
/*管脚位置定义,标号可以是NONE、ALL、  0至15   */			

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
/*最高输出速度为50MHz */		

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;    
 /*推挽输出*/			

GPIO_Init(GPIOx,&GPIO_InitStructure); /*GPIOx初始化	*/

/*注:以上四行代码为一组,每组GPIO属性必须相同,默认的GPIO参数为:ALL,2MHz,FLATING。如果其中任意一行与前一组相应设置相同,那么那一行可以省略,由此推论如果前面已经将此行参数设定为默认参数(包括使用GPIO_InitTypeDefGPIO_InitStructure代码),本组应用也是默认参数的话,那么也可以省略。以下重复这个过程直到所有应用的管脚全部被定义完毕。*/	
}	

2.GPIO_Mode的四种输入、四种输出模式:

(1)输入(GPIO调成输入后不用设置速度)

GPIO_Mode_IPU          /*上拉输入      */
GPIO_Mode_IPD         /*下拉输入  	*/	     
GPIO_Mode_AIN         /*模拟输入     */	 
GPIO_Mode_IN_FLOATING /*浮空输入(GPIO的 默认电平由外部决定) */		

(2)输出

GPIO_Mode_Out_PP       /*普通推挽输出  */		           
GPIO_Mode_Out_OD       /*普通开漏输出  */		 
GPIO_Mode_AF_PP        /*复用推挽输出  */		
GPIO_Mode_AF_OD        /*复用开漏输出  */

四.EXTI初始化函数(需要包含stm32f10x_exti.h头文件)

void EXTI_Configuration(void)	
{		
EXTI_InitTypeDef EXTI_InitStruct;
/*初始化EXTI结构体*/
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
/*打开APB2外设AFIO的时钟*/				

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);   
/*配置中断事件(输入线选择PA0作为中断标志位)*/		

EXTI_InitStruct.EXTI_Line = EXTI_Line0;
/*输入线选择EXTI_Line0(EXTI_Linex,当x属于0-15时,代表GPIOx_(0~15))*/		

EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt; 
/*配置模式为中断模式*/		
/*模式有两种:*/		
/*中断模式      EXTI_Mode_Interrupt	*/	
/*事件模式      EXTI_Mode_Event	*/			

EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Rising;   
/*选择是上升沿还是下降沿触发中断*/		
/*触发方式有三种:*/		
/*上升沿           EXTI_Trigger_Rising	*/	
/*下降沿           EXTI_Trigger_Falling */		
/*上升沿和下降沿     EXTI_Trigger_Rising_Falling*/				

EXTI_InitStruct.EXTI_LineCmd = ENABLE;     
/*使能中断屏蔽事件寄存器*/				

EXTI_Init(&EXTI_InitStruct);	
}

五.编写中断服务函数

void EXTI0_IRQHandler(void)      
/*起名规律:因为使用的是EXTI0的中断,所以起名为EXTI0的中断服务函数*/
{		
       if(EXTI_GetITStatus(EXTI_Line0) == 1)		
       {			
       GPIOB->ODR ^= GPIO_Pin_0;		
       }		
       /*判断中断标志位有没有置位,如果产生中断(即条件为真),令PB0翻转*/			
      EXTI_ClearITPendingBit(EXTI_Line0);   
      /*清除中断标志位,防止一直在中断里面*/	 
}

六.主函数

int main(void)	
      {		
      EXTI_NVIC_Config();    /*配置中断优先级*/		          
      GPIO_Configuration();  /*初始化GPIO*/	
      EXTI_Configuration();  /初始化EXTI*/		
      EXTI0_IRQHandler();   /*编写中断服务函数*/	
      }	

注意!!
中断服务函数
void EXTI0_IRQHandler(void)
的函数名不能更改

猜你喜欢

转载自blog.csdn.net/qq_51577927/article/details/109357070