一、什么是定时器?定时器的作用是啥?
我将向大家介绍如何使用 STM32F1 的通用定时器,STM32F1 的定时器功能十 分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2~TIME5 等通用定时器,还有 TIME6 和 TIME7 等基本定时器。在《STM32 参考手册》里面,定时器的介绍占了 1/5 的篇幅,足见 其重要性。在本文中,我将利用 TIM3 的定时器中断来控制 LED灯 的翻转。 STM32F1 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器 (CNT)构成。STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产 生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长 度和波形周期可以在几个微秒到几个毫秒间调整。STM32 的每个通用定时器都是完全独立的, 没有互相共享的任何资源。(来自于正点原子的解释)
但是作业认为这样讲,令新手很迷惑,我们用通俗的话来讲,我们是一个老板(CPU),然后员工(定时器)会按照约定好的时间去通知老板干某件事情,而不用老板(CPU)自己去计时间。这是通俗的说发。
二、定时器的时间计算
1.时间计算公式
Tout= ((arr+1)(psc+1))/Tclk 我们的是定时器时钟是72Mhz,所以要定时500ms的话, Tout= ((4999+1)( 7199+1))/72=500000us=500ms
2.代码书写
#include "timer.h"
#include "led.h"
u8 state;
void TIM3_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_Cmd(TIM3, ENABLE);
}
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
state=~state;
if(state==0x00)
{
LED0_ON;
}
else if (state==0xff )
{
LED0_OFF;
}
TIM_ClearITPendingBit(TIM3, TIM_IT_Update );
}
}
main.c文件
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "timer.h"
int main(void)
{
LED_Init();
delay_init();
TIM3_Init(4999,7199);
while(1)
{
}
}
总结
其他的定时器的配置是一样的,就是有些定时器的挂载时钟不一样,所以我们要看结构图 看清自己想使用的定时器时钟,在具体配置自己相应的定时器。作者能力有限,不能把每一个定时器都讲一遍,原理基本上都是一样的。
|