一、什么是定时器
有计时和定时功能的仪器组件——对于芯片来说,定时器含有计时和定时功能,片内模块——TIM
二、STM32F4xx系列定时器分类
片内外设定时器(14个)
- 高级定时器:TIM1、TIM8
- 通用定时器:TIM2——TIM5 TIM9——TIM14
- 基本定时器:TIM6、TIM7(基本的计时和定时功能)
内核定时器(1个)
- 系统定时器(SysTisk 滴答定时器)
三、芯片内定时器的基本结构
四、基本定时器只有基本时基单元功能
1、时基单元
- 计数器寄存器(TIMx_CNT):16位(0~65535)
- 预分频寄存器(TIMx_PSC)
- 自动重载寄存器(TIMx_ARR)
你想定时多久,全靠设置这个ARR
你设置ARR的值是脉冲的个数单位
怎么设置ARR要自己算:
如:根据已知提供CNT的脉冲频率f
已知你要定时多久t
ARR=t/(1/f)
2、例子
实现定时器6 TIM6,使其定时0.5s,让LED0翻转
①先使能TIM6时钟
RCC->APB1ENR
RCC_APB1PeriphClockCmd()
②先配置定时器TIM6模块
相关主要寄存器如下:
代码:
定时器6初始化
void TIM6_Init(void)
{
TIM_TimeBaseInitTypeDef TIMInitStruct;
NVIC_InitTypeDef NVIC_InitStructure;//用来初始化NVIC指定中断的结构体
//1-使能时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
//2-初始化TIM6时基单元 ARR PSC
TIMInitStruct.TIM_Prescaler = 840-1;// 84Mhz/840 = 100Khz 10us/脉冲
TIMInitStruct.TIM_Period = 50000-1;//0.5s = 500ms = 500000us
TIM_TimeBaseInit(TIM6,&TIMInitStruct);
//3-开启定时器TIm6 更新中断
TIM6->DIER |= 0x01;
//TIM_ITConfig()
//4-将TIM6更新中断注册进NVIC
NVIC_InitStructure.NVIC_IRQChannel = TIM6_DAC_IRQn;//54号和 DAC共用
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//5-开启定时器6计数器
TIM6->CR1 |= 0x01;
//TIM_Cmd()
}
中断服务函数
void TIM6_DAC_IRQHandler(void)
{
//因为这个TIM6中断号和中断函数和DAC共用
//为了区分是谁触发中断进来的,可以在中断函数判断标志位
//if(TIM_GetITStatus(TIM6,TIM_IT_Update);) == 1)
if(TIM6->SR & 0x01)
{
//如果能进来 表示上面SR第0位 更新中断标志位置位了
GPIO_ToggleBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);
TIM6->SR &= ~0x01;//写0清零中断标志位
//TIM_ClearITPendingBit(TIM6,TIM_IT_Update);
}
}