STM32F103C8T6定时器3中断

#include "Timer.h"                 
#include "LED.h"                

/*
  *@breif 定时器3_中断_初始化函数
  1、使能定时器时钟:APB1
  2、初始化定时器,配置ARR,PSC
  3、开启定时器中断,配置NVIC(嵌套中断向量控制器)
  4、使能定时器
  5、编写中断服务函数
  *@param ARR:自动装载值;PSC:分频系数
  计算公式:t(延迟时间) = (ARR+1)(PSC+1)/TCLK    其中TCKL为72MHz
  *@retval 无
*/
void TIM3_Int_Init(uint16_t ARR,uint16_t PSC)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  				//使能定时器3
	TIM_TimeBaseInitStructure.TIM_Period = ARR;          				//自动装载值
	TIM_TimeBaseInitStructure.TIM_Prescaler = PSC;       				//预分频系数
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;  	//向上计数模式
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;    		//"没有太大关系,随便选?"
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);  				 //初始化定时器3
	
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);  //使能定时器的更新中断(更新中断属于中断种类的一种)
	
	//中断优先级NVIC设置
	NVIC_InitTypeDef  NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;       	 			//TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;			//主优先级为0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; 					//从优先级为3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;     				//使能IRQ通道 				
	NVIC_Init(&NVIC_InitStructure);     			//初始化NVIC寄存器
	
	TIM_Cmd(TIM3,ENABLE);   //设置完所有后,使能定时器
}

//中断服务函数,与51不同,不需要写在main中,也不需要中断号,需要去启动文件中寻找
void TIM3_IRQHandler(void)    //定时器3中断服务函数,在这里面执行if语句
{
	//首先判断该中断是否为先前所使能的中断,也就使判断是否为更新中断
	if(TIM_GetITStatus(TIM3,TIM_IT_Update) == SET) //TIM_GetITStatus()函数,获取中断状态,SET表示发生,RESET表示不发生
	{//也可以写为:if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
		LED_Turn();
		TIM_ClearITPendingBit(TIM3,TIM_IT_Update);   //使用完之后,还要清除更新中断位
	}
	
}

注意:中断函数中的LED_Turn()函数为自己撰写的翻转IO口函数

你可能感兴趣的:(stm32,单片机,arm)