蓝桥基础之硬件配置(四)——普通(通用)定时器的配置(①)

蓝桥基础之硬件配置(四)——普通(通用)定时器的配置(①)

~QQ:3020889729

~小蔡

简单说明一下:普通定时器部分将分为3个部分(①②③blog)——第一个部分(①blog)是通用初始化,仅仅是普通的定时中断;第二个部分(②blog)是PWM的一般输出配置;第三个部分(③blog)是输入捕获的配置。

普通定时器主要的功能(不用输出和输入时):就是一个普通的定时单元而已,一个周期计数完成又回到0开始计数——但是会涉及中断服务。

普通(通用)定时器初始化配置

第一步·普通定时器初始化结构体参数的了解:
(具体注释在代码中了)

定时器初始化参数结构体

	TIM_TimeBaseInitTypeDef——可用来创建定时器初始化结构体——使用定时器必须要有的部分

使能功能时钟的使能

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx, ENABLE);
    //使能相应的时钟才能使用定时器
    //同样的,在使用其它功能时也需要使能相应的时钟

下面是定时器的初始化参数

	TIM_TimeBaseInitStructure.TIM_Period=per;
	//TIM_Period——定时器计数周期——预装载值
	//定时器计数周期——一个周期花的时间:1000000/per
	//也就是:计数工作频率/per  得到一个频率,然后频率的倒数,就是周期了
	
	TIM_TimeBaseInitStructure.TIM_Prescaler=71;
	//TIM_Prescaler——定时器实际工作频率的分频系数——确定工作频率
	//计数工作频率是:当前时钟源频率/(71+1)
	
	TIM_TimeBaseInitStructure.TIM_ClockDivision=0;
	//TIM_ClockDivision——时钟分割因子,这里选择时钟不分割就好
	
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;
	//TIM_CounterMode——是指计数模式,这里是向上计数(比较常用,一般不用更改)

普通定时器就这么多初始化参数了——下来就是初始化定时器

	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
	//对定时器初始化的函数——初始化数据来自我们配置的初始化参数结构体

使能开启时钟

	TIM_Cmd(TIM3, ENABLE);
	//要想使用定时器,我们最后就必须使能开启定时器
	//绝大多数功能的正常使用,都有最后一步是将它使能开启

第二步·普通定时器初始化的配置
(具体配置如下:先创建一个初始化参数结构体,再使能定时器功能时钟,接着配置对电影定时器的初始化参数,最后使能打开对应定时器就好)

//默认分频为71——得到计数频率1000000hz
// per :就是入口参数——需要设定的计时周期
void Timer_Init(u32 per )
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定时器初始化参数结构体
	
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//相应功能时钟的使能
    		
	TIM_TimeBaseInitStructure.TIM_Period=per;//定时器计数周期——一个周期花的时间:1000000/per
	TIM_TimeBaseInitStructure.TIM_Prescaler=71;//1us计数一次
	TIM_TimeBaseInitStructure.TIM_ClockDivision=0;//时钟不分割
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化定时器
	
	TIM_Cmd(TIM3, ENABLE);//使能开启时钟
	
}

第三步·普通定时器中断的初使用
(这里使用中断,在中断服务函数中实现定时任务)

//我打算先将定时器配置说明一下,接着写中断服务函数,接着说明效果

#include "led.h"
//假设这个函数里有关于灯亮灭的一个函数,每使用一次就在亮灭间翻转
//LED_Toggle(void);

#include "timer.h"//定时器函数声明的地方

//默认分频为71——得到计数频率1000000hz
// per :就是入口参数——需要设定的计时周期
void Timer_Init(u32 per )
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//定时器初始化参数结构体
	NVIC_InitTypeDef NVIC_InitStructure;//中断初始化参数结构体
	
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//相应功能时钟的使能
    		
	TIM_TimeBaseInitStructure.TIM_Period=per;//定时器计数周期——一个周期花的时间:1000000/per
	TIM_TimeBaseInitStructure.TIM_Prescaler=71;//1us计数一次
	TIM_TimeBaseInitStructure.TIM_ClockDivision=0;//时钟不分割
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化定时器
	
	//中断配置
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//中断通道——中断源——定时器3中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//中断的抢占优先级配置
 	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//中断的子优先级配置
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//中断使能
    NVIC_Init(&NVIC_InitStructure);//中断初始化处理
	
	TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);//要使用中断,还要中断使能——这里使用更新中断
	//也就是一个周期结束更新一次,发生一次中断

	TIM_Cmd(TIM3, ENABLE);//使能开启时钟
	
}

void TIM3_IRQHandler(void)//中断服务函数一定要选对
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=Reset)//更新中断发生时进入
	{
		TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//中断产生要及时清除中断位——不然会卡死在中断的
		LED_Toggle();//进入中断就亮灭翻转一次
	}
}

现在只需要在主函数中输出化一下就可以实现中断周期控制灯的亮灭
(代码一般格式如下)

#include "stm32f10x.h"
#include "led.h"
#include "timer.h"

//Main Body
int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//分组2
	LED_Init();//LED初始化
	Timer_Init(50000);//周期为50000次,计时周期花的时间就是500ms
	while(1);
}
//以上就实现了定时器500ms亮灭闪烁
//定时器初始化之后会一直运行的,不需要放到While中就可以循环使用
//并且应该知道中断服务函数中不应该放多的函数或者语句,
//这样也会卡的——最好就一些简单的判断语句或者最普通的灯亮灭这样瞬时的功能

定时器中可能出现的问题

①最可能的就是定时器周期频率计算:

计时周期(T)=1/(72Mhz/((分频系数+1)*(预装载值+1)))——得到计时周期
计时频率(F)=(72Mhz/((分频系数+1)*(预装载值+1))——得到计时频率

②要使用定时器中断时,记得在初始化时将中断打开。

③定时器中断服务——记得及时清除中断标志位:
每次中断产生,进入服务函数确定发生中断后,及时清除标志位,避免卡死在中断中(代码如下)

void TIM3_IRQHandler(void)//中断服务函数一定要选对
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=Reset)//更新中断发生时进入
	{
		TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//中断产生要及时清除中断位——不然会卡死在中断的
		LED_Toggle();//进入中断就亮灭翻转一次
	}
}

结束

这就是简单的普通定时器初始化配置(①),希望对大家有所帮助——对于比赛之后,如果还是有很大的兴趣,在使用其他开
发板时,配置方法都是大同小异的——一般都是,先去查看原理图以及函数参数,再开始配置。
发布了6 篇原创文章 · 获赞 6 · 访问量 1609

猜你喜欢

转载自blog.csdn.net/weixin_44604887/article/details/104007579