6 定时器
- 1、基本概念
- 2、使用库函数实现
1、基本概念
定时器的基本工作框架
-
STM32F103共支持8个定时器
-
假如分频器PSC的值=0,则PSC分频系数=1,表示输入1个时钟信号,CNT计数器加1,1S加1,当CNT计数器的值=3,跟ARR自动重载寄存器的值2+1相等时,就会产生一个定时器中断信号也就是3s就会产生一次定时器中断信号,并且CNT计数器清0重新计数
-
假如分频器PSC的值=1,则PSC分频系数=2,表示输入2个时钟信号,CNT计数器加1,2S加1,当CNT计数器的值=3,跟ARR自动重载寄存器的值2+1=3相等时,就会产生一个定时器中断信号,也就是6s就会产生一次定时器中断信号,并且CNT计数器清0重新计数
-
当 1Hz PSC=0 ARR=2 CNT=0 问 : 多长时间后触发中断呢?
PSC分频系数为1 ARR+1为3 CNT=0 则需要3秒 -
中断的周期=(PSC+1)*(ARR+1)/f
-
中断的频率=f/(PSC+1)*(ARR+1)
2、使用库函数实现
在system目录下,新建TIMER4目录,打开keil工程,添加stm32f10x_tim.c,新建timer4.c和timer4.h文件
编辑timer4.h
#ifndef __TIMER4_H_
#define __TIMER4_H_
#include "stm32f10x.h"
// ARR = 4999 PSC = 7199
// 周期 = 5000 * 7200 / 72000000 = 0.5
#define ARR 4999
#define PSC 7100
void TIMER4_Init(void); // 初始化函数
void TIMER4_Start(void);// 启动定时器
void TIMER4_Stop(void); // 关闭定时器
#endif
编辑timer4.c
#include "timer4.h"
#include "stdio.h"
void TIMER4_Init(void){// 初始化函数
// 1. 打开定时器4时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
// 2. 配置定时器4工作参数
TIM_TimeBaseInitTypeDef TIMER4_Config;
TIMER4_Config.TIM_Prescaler = PSC; // 预分频值
TIMER4_Config.TIM_Period = ARR; // 重装载寄存器的值
TIMER4_Config.TIM_ClockDivision = TIM_CKD_DIV1;// 不分频 72MHz
TIMER4_Config.TIM_CounterMode = TIM_CounterMode_Up;// 向上计数
TIM_TimeBaseInit(TIM4,&TIMER4_Config);
// 3. 配置TIME4的溢出中断
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
// 4. 配置NVIC支持TIME4的中断
NVIC_InitTypeDef NVIC_Config;
NVIC_Config.NVIC_IRQChannel = TIM4_IRQn;
NVIC_Config.NVIC_IRQChannelCmd =ENABLE;
NVIC_Config.NVIC_IRQChannelPreemptionPriority=0;
NVIC_Config.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_Config);
}
void TIMER4_Start(void){// 启动定时器
TIM_Cmd(TIM4,ENABLE);
}
void TIMER4_Stop(void){// 关闭定时器
TIM_Cmd(TIM4,DISABLE);
}
书写中断函数
void TIM4_IRQHandler(void){
// 判断是否是TIM4的update中断
if(TIM_GetITStatus(TIM4,TIM_IT_Update)){
// 清除中断到来位
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
LED2 = !LED2;
}
}