STM32F4之定时器

STM32F407有14个定时器,其中有12个16位的定时器,2个32位的定时器

这几种定时器的区别

 

STM32F4之定时器_第1张图片

定时器的溢出时间计算:

Tout(溢出时间)=ARR+1)(PSC+1)/Tclk

ARR:自动重装载寄存器,用于装载计数器

PSC:PSC预分频器(分频范围1~65535)

Tclk:外设时钟周期,可以在STM32F407的芯片手册中找到时钟框图

(备注:ARR是代表计数值,而外设时钟经过分频之后,为ARR提供计数时钟,【即每个时钟来,ARR就加1】)

用定时器3,做一个实验:

目标使用定时器进行500ms的led闪烁

    //声明一个GPIO结构体变量
	GPIO_InitTypeDef GPIO_InitStructure;
	//声明一个定时器结构体变量
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructrue;
	//声明一个中断优先分组的结构体变量
	NVIC_InitTypeDef NVIC_InitStructure;
	//使能GPIO外设时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
	//定义一个GPIO结构体变量
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9 |GPIO_Pin_10;//对应引脚分别接到Led0,led1
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;         //GPIO为输出模式
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;    //100MHZ
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;	    //推挽输出
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;		    //上拉­
	GPIO_Init(GPIOF,&GPIO_InitStructure);
	
	//¶设置定时器中断的优先分组
	NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;   //抢占优先级为1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03;		     //响应优先级为3
	TIM_TimeBaseInitStructrue.TIM_Period=4999;     //Tout=(ARR+1)(PSC+1)/Tclk   (4999+1)(8399+1)/(1/84M)
	TIM_TimeBaseInitStructrue.TIM_Prescaler=8399;
	TIM_TimeBaseInitStructrue.TIM_CounterMode=TIM_CounterMode_Up;
	TIM_TimeBaseInitStructrue.TIM_ClockDivision=TIM_CKD_DIV1;
	//使能定时器3的外设时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	
	//初始化定时器3
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructrue);

	//设置优先级分组  为组2
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	//初始化优先级分组
	NVIC_Init(&NVIC_InitStructure);
    //配置定时器的中断的中断源
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
	//使能定时器3
	TIM_Cmd(TIM3,ENABLE);
	while(1)
    {
       //无限循环等待中断
    }
	
}
//定时器3的中断函数
void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
	{
		LED0=!LED0;
    LED1=!LED1;
		TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
	}
}

此时就可以进行led每隔500ms翻转

你可能感兴趣的:(STM32)