2018 -0524 STM32计时器中断

用一个计时器计时1秒,使得LED灯间隔一秒闪烁。

主程序:

#include "stm32f10x.h"
#include "delay.h"
#include "LED1.h" 
#include  "time.h"
int main(void)
{

	delay_init(10);                                 //延时初始化
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断分组 这个要在设置中断优先级前面,一开始就要设置好的不能更改
	LED_Init1();
	Time3_Init(9999, 7199);                         //时间计算放在下面说明
	while (1)
	{
		GPIO_ResetBits(GPIOB,GPIO_Pin_12);      //让LED灯一直亮	
	}

}

头文件: 

1. LED1.h

#ifndef  __LED_H
#define __LED_H

void LED_Init1(void);
#endif

2.time.h

#ifndef __TIME__H
#define __TIME__H
#include "sys.h"

void Time3_Init(u16 arr, u16 psc);    //定时器3初始化函数
#endif

C文件

1. LED.c

#include "LED1.h"            //引用头文件
#include"stm32f10x.h"

void LED_Init1(void)
{

	GPIO_InitTypeDef	GPIO_InitStrucyure;           //结构变量
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);  //使能时钟GPLOB
	
	GPIO_InitStrucyure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStrucyure.GPIO_Pin=GPIO_Pin_12;
	GPIO_InitStrucyure.GPIO_Speed=GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOB,&GPIO_InitStrucyure);                 //初始化io口
	
	GPIO_SetBits(GPIOB,GPIO_Pin_12);                      // io口默认不点亮,先将io口设置为高电平

}

2.time.c

#include "time.h"
#include "delay.h"
#include "LED1.h"

void Time3_Init(u16 arr, u16 psc)
{
	NVIC_InitTypeDef NVIC_Initstruct;                              //结构变量
	TIM_TimeBaseInitTypeDef TIM_Timeinit;                          //结构变量
	
	TIM_Timeinit.TIM_ClockDivision = TIM_CKD_DIV1;                 //随意选取
	TIM_Timeinit.TIM_CounterMode =  TIM_CounterMode_Up;            //计数模式
	TIM_Timeinit.TIM_Period = arr;                                 // 需要根据要计时的长度来计算输入
	TIM_Timeinit.TIM_Prescaler = psc;                              //预分频系数 计算输入
	//TIM_Timeinit.TIM_RepetitionCounter =                         //这个不需要
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);            //使能定时器3时钟
	TIM_TimeBaseInit(TIM3,&TIM_Timeinit);                          //初始化定时器配置
	
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);                       //开启定时器中断 配置nvic
	////////配置NIIC   记住要在主函数main中 先设置好优先级分组
	
	NVIC_Initstruct.NVIC_IRQChannel=TIM3_IRQn 	;	       //通道在stm32的头文件中找,io10对应通道9 对应EXTI9_5_IRQn
	NVIC_Initstruct.NVIC_IRQChannelCmd= ENABLE;
	NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority=2;	       //抢占优先级, 在这个之前要中断分组好,所以要在主函数中分好组
	NVIC_Initstruct.NVIC_IRQChannelSubPriority= 2 ;                //子优先级
	NVIC_Init(&NVIC_Initstruct);
        //////////////////////

        TIM_Cmd(TIM3,ENABLE);                                          //使能定时器

        ///前面4个步骤已经完成现在完成中断服务函数
}

void TIM3_IRQHandler()
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update) == SET)                //获取状态定时器的状态 Upadate更新中断,是否更新了
	{
	
		GPIO_SetBits(GPIOB,GPIO_Pin_12);                      //定时器中断发生,将灯灭;
		delay_ms(500);
	
	        ///////别忘记了手动清除标志位!!!!!!!!!
		
		TIM_ClearITPendingBit(TIM3,TIM_IT_Update);           //清除中断标志
	
	} 
	
}


其中在主程序中有   Time3_Init(9999, 7199);  这里表示定时的时间是1s:

计算公式:

                                               T = (A+1)*(B+1)/TCLK;         A为前面的输入  ,B 为后面的那个输入

TCLK一般为72M      先计算(B+1)/TCLK    当B为7199时候,(B+1)/TCLK  =  0.1ms   所以要让T 为1,  只要将A设为9999。





猜你喜欢

转载自blog.csdn.net/qq_36324796/article/details/80441919