STM32标准库之中断

 普通GPIO口中断配置
void MPU6050_EXTI_Init(void)
{
	EXTI_InitTypeDef EXTI_InitStructure;
	GPIO_InitTypeDef GPIO_InitStruct;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启时钟
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//上拉模式
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;//PB5配置为上拉输入
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStruct);	
	
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB , GPIO_PinSource5);//将GPIO口配置成外部中断 
	
	EXTI_InitStructure.EXTI_Line = EXTI_Line5;//将对应的GPIO口连接到中断线上
	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//中断事件类型,下降沿
	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//选择模式,中断型
	EXTI_InitStructure.EXTI_LineCmd = ENABLE;//使能该中断
	EXTI_Init(&EXTI_InitStructure);//将配置好的参数写入寄存器
	
	NVIC_InitTypeDef NVIC_InitStruct;
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitStruct.NVIC_IRQChannel=EXTI9_5_IRQn;//中断通道
	NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;//使能该通道中断
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0;//主优先级0,最高
	NVIC_InitStruct.NVIC_IRQChannelSubPriority=0;//子优先级,最高
	NVIC_Init(&NVIC_InitStruct);//初始化
}

void EXTI9_5_IRQHandler(void)//中断处理函数
{
	if(EXTI_GetITStatus(EXTI_Line5)!=0)
	{
        //在此处在加上相关引脚的判断
		EXTI_ClearITPendingBit(EXTI_Line5);	

        //此处添加一些操作
	}
}
高级定时器更新中断配置
//此段代码不仅仅实现了PWM的输出还配置定时器的更新中断并写了中断函数如果需要使用其中一部分功能直接删除相应部分即可实现

void Timer1_Init(uint16_t ARR,uint16_t PSC)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);			//开启TIM1的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//开启GPIOA的时钟
	
	GPIO_InitTypeDef GPIO_InitStructure;                            //初始化GPIO口相关的
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                 //复用为定时器相关功能
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;	                    //相关引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               //GPIO口引脚速度
	GPIO_Init(GPIOA, &GPIO_InitStructure);							//传入结构体参数
	
	TIM_InternalClockConfig(TIM1);	                                //打开定时器1内部时钟
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;	     		//时基单元配置
	TIM_TimeBaseStructInit(&TIM_TimeBaseInitStructure);     		//结构体初始化
	
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //一分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
	TIM_TimeBaseInitStructure.TIM_Period = ARR - 1;	                //分辨率ARR的值-自动重装载值			
	TIM_TimeBaseInitStructure.TIM_Prescaler = PSC - 1;              //预分频系数
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;            //自动重装
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);             //传入结构体参数
	
	/*输出比较初始化*/
	TIM_OCInitTypeDef TIM_OCInitStructure;//输出比较配置			
	TIM_OCStructInit(&TIM_OCInitStructure);	
				
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;		        //PWM1模式		
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;       //极性配置
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   //允许输出
	TIM_OCInitStructure.TIM_Pulse = 0;	                             //初始CCR值
	
	TIM_OC1Init(TIM1, &TIM_OCInitStructure);	//通道一初始化
	
	//配置定时器更新中断---CNT的值溢出时
	TIM_ClearFlag(TIM1, TIM_FLAG_Update);//清中断标志位
	TIM_ITConfig(TIM1 , TIM_IT_Update  | TIM_IT_Trigger, ENABLE);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;  	//高级定时器的更新中断通道还是与众不同的
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  	   //从优先级0级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	//使能定时器
	TIM_ARRPreloadConfig(TIM1 , ENABLE);    //预装载使能
	TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);
	TIM_Cmd(TIM1, ENABLE);                  //使能定时器一
	TIM_CtrlPWMOutputs(TIM1, ENABLE);       //高级定时器才要写的
}

void TIM1_UP_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM1 , TIM_IT_Update) != RESET)//检查指定的TIM中断发生与否:TIM 中断源
	{
	    //此处填写需要进行的操作
		TIM_ClearITPendingBit(TIM1, TIM_IT_Update);//清除TIMx的中断待处理位:TIM中断源
	}
}

posted @ 2024-03-31 11:54  Jiang-Tang  阅读(65)  评论(0)    收藏  举报  来源