一、硬件定时器
1、定义
设置等待时间,到达后则执行指定的操作的硬件
2、STM32F407的定时器有以下特征
具有基本的定时功能,也有PWM输出(灯光的亮度控制、电机的转速)、脉冲捕获功能(红外捕捉)
2个高级定时器、10个通用定时器和2个基本定时器
高级定时器(TIM1 和 TIM8 ),挂载到APB2
具有16位定时器功能,也具有PWM输出高级控制功能
通用定时器(TIM2 到 TIM5),挂载到APB1
具有16位定时器功能,也具有PWM输出控制功能
通用定时器(TIM9 到 TIM14 ),挂载到APB1和APB2
具有16位定时器功能,也具有PWM输出控制功能
基本定时器:(TIM6 和 TIM7),挂载到APB1
具有16位定时器功能
a.所有的定时器都能实现最基本的定时功能
b.基本定时器是专门提供给音频的输出接口
c.计数器模式:向上,向下,向上下
d.DMA(直接存储器访问)请求:传输数据只需要通过DMA,不用经过CPU,减少CPU的占用
e.PWM是脉冲宽度调制,在工业应用领域用途非常广泛
f.16位可编程分频器,用于对计数器时钟频率进行分频(运行时修改),分频系数1~65536之间
注:
TIM是TIMER单词的缩写
通用定时器与高级定时器(CH表示输出通道)
3、计数模式
二、定时计算
《STM32F4XX中文参考手册.pdf》108页
STM32F405xx/07xx和STM32F415xx/17xx的定时器时钟频率由硬件自动设置。分为两种情况:
1、如果APB预分频器为1,定时器时钟频率等于APB域(APB1和APB2)的频率(一般预分频器不可能为1)
2、否则,等于APB域(APB1和APB2)的频率的两倍
关于APB1与APB2预分频值得说明在system_stm32f4xx.c文件的头部,详细描述如下
关于APB1和APB2预分频值设置在system_stm32f4xx.c文件,详细代码如下:
3、定时器硬件时钟
4.定时500ms
//计数值 84000000/8400 = 10000hz/2,决定定时时间1/2秒
TIM_TimeBaseStructure.TIM_Period = (10000/2)-1;
TIM_TimeBaseStructure.TIM_Prescaler = 8400-1; //预分频值 8400-1 + 1 = 8400
//向上计数的方法
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
8400
//向上计数的方法
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
三、库函数
使能定时器硬件时钟
定时器初始化
配置定时器
定时器使能
1.使能定时器硬件时钟
2.定时器的硬件配置
3.配置定时器分频值、计数值等
4.使能定时器更新定时器的中断触发
5.配置定时器中断nvic优先级
6.定时器中断服务函数
test
void tim3_init(void)
{
//使能TIM3的硬件时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
//TIM3的硬件配置
//配置定时器3分频值、技术值等等
TIM_TimeBaseStructure.TIM_Period = (10000/2)-1; //计数值 84000000/8400 = 10000hz/2,决定定时时间1/2秒
TIM_TimeBaseStructure.TIM_Prescaler = 8400-1; //预分频值 8400-1 + 1 = 8400
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数的方法
// TIM_TimeBaseStructure.TIM_ClockDivision = 0; //在F407是不支持
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
//配置定时器3中断的触发方式:时间更新
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
//开启TIM3的NVIC中断
NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn; //定时器3的请求通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02; //响应优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //使能该通道中断
NVIC_Init(&NVIC_InitStruct);
//使能定时器3工作
TIM_Cmd(TIM3, ENABLE);
}
//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
//判断TIM3是否有中断请求
if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
{
PFout(9) ^= 1;
//清空标志位,告诉CPU,已经完成当前中断处理,可以响应新的中断请求
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
}