STM32通用定时器的使用

##详细信息看开发攻略,下面只讲解如何配置

##配置步骤

(1)使能定时器时钟 本章定时器实验,我们使用的是通用定时器 TIM4,我们知道 TIM4 是挂接在 APB1 总线上的,所以可以使用 APB1 总线时钟使能函数来使能 TIM4

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能 TIM4 时钟

(2)初始化定时器参数,包含自动重装值,分频系数,计数方式等 要使用定时器功能,必须对定时器内相关参数初始化

. voidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseI nitStruct);

(3)设置定时器中断类型,并使能 对定时器中断类型和使能设置的函数如下:

.void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewSta te);

(4)设置定时器中断优先级,使能定时器中断通道 在上一步我们已经使能了定时器的更新中断,只要使用到中断,就必需对 NVIC 初始化,NVIC 初始化库函数是 NVIC_Init(),这个在前面讲解 STM32 中断 时就已经介绍过,不清楚的可以回过头看下。

(5)开启定时器 前面几个步骤已经将定时器配置好,但还不能正常使用,只有开启定时器了 才能让它正常工作,开启定时器的库函数如下: 1. void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);

(6)编写定时器中断服务函数 最后我们还需要编写一个定时器中断服务函数,通过中断函数处理定时器产 生的相关中断。定时器中断服务函数名在 STM32F1 启动文件内就有,TIM4 中断 函数名如下: TIM4_IRQHandler

##代码模块

time.h

#ifndef _time_H
#define _time_H
#include "system.h"

void TIM4_Init(u16 per, u16 psc);



#endif

time.c

#include "time.h"
#include "led.h"

void TIM4_Init(u16 per, u16 psc)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;//设置定时器中断优先级,使能定时器通道
	
	TIM_TimeBaseInitStructure.TIM_Period=per;//周期值(与预分频值决定计时时间)
	TIM_TimeBaseInitStructure.TIM_Prescaler=psc;//预分频值
	//72000k/预分频值+1=Nk,1k=0.5ms,Nk=1/N ms,再乘周期值等于计数值
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//时钟分频因子
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数模式
	
	NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占式优先级,按自己需求配置
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//响应式优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	
	NVIC_Init(&NVIC_InitStructure);
	
	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE );//设置定时器中断类型
	TIM_ClearITPendingBit(TIM4, TIM_IT_Update );//清除中断标志
  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseInitStructure);
	TIM_Cmd(TIM4, ENABLE);
}

void TIM4_IRQHandler()
{
	if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET)
	{
		LED2=!LED2;
	}
	TIM_ClearITPendingBit(TIM4, TIM_IT_Update );//清除中断标志,为下一次中断提供条件
}

main.c

#include "stm32f10x.h"
#include "led.h"
#include "system.h"
#include "SysTick.h"
#include "beep.h"
#include "key.h"
#include "exti.h"
#include "time.h"
int main()
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置优先级分组
	u8 i=0;
  SysTick_Init(72);
	LED_Init();
	TIM4_Init(1000, 36000-1);//0.5ms计数1000次,0.5s
	while(1)
	{
	
		i++;
		if(i%20==0)
			LED1=!LED1;//指示灯亮提示机器正在运行
		delay_ms(10);
		
	}
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值