网站seo关键词设置,网站功能设计方案,网站建设搜索,深圳网站关键词优化STM32F1的定时器非常多#xff0c;由两个基本定时器#xff08;TIM6#xff0c;TIM7#xff09;、4个通用定时器#xff08;TIM2-TIM5#xff09;和两个高级定时器#xff08;TIM#xff11;#xff0c;TIM#xff18;#xff09;组成。基本定时器的功能最为简单由两个基本定时器TIM6TIM7、4个通用定时器TIM2-TIM5和两个高级定时器TIMTIM组成。基本定时器的功能最为简单类似于51单片机内定时器。通用定时器是在基本定时器的基础上扩展而来增加了输入捕获与输出比较等功能。高级定时器又是在通用定时器基础上扩展而来增加了可编程死区互补输出、重复计数器、带刹车断路功能这些功能主要针对工业电机控制方面。但无论是哪个定时器它们的频率都为72M。
基本定时器只有向上计数方式且其挂载在APB1总线上只能由内部时钟供能。基本定时器比较简单就跟systic差不多。
这个是stm32的中文手册中的介绍。
图介绍其中自动重装载寄存器(ARR)跟systic中的load寄存器作用一样其作用主要有三部分 设置定时器周期 ARR 决定了基本定时器计数器在溢出从最大值返回0之前所需的计数值。换句话说ARR 值定义了定时器的定时周期。一旦计数器计数达到 ARR 的值定时器将自动重新加载为0并触发一个更新事件。 产生定时中断 当基本定时器的计数器达到 ARR 的值时会触发一个更新事件您可以配置定时器中断来捕获这个事件。这允许您在特定的时间间隔内执行代码以执行定时任务。 生成PWM信号 如果您使用基本定时器来生成PWM信号ARR 将决定PWM信号的周期即高电平和低电平的时间。
基本定时器通常是16位的所以 ARR 可以设置的最大值是 65535。预分频器也是16位的但是在预分频器中数值会自动加1也就是它的取值范围为1到65536因为这个预分频器是作为分母用的分母不能为0如给预分频值设为2-1那么该定时器的频率为32M。
自动重装载寄存器下面还有个影子寄存器这个寄存器是实际起作用的寄存器这个寄存器我们不能人为的去访问基本定时器中的控制寄存器TIMx_CR1有一位ARPE是用来设置自动重装载寄存器是否具有缓冲的stm32中文手册中的图如下 当ARPE位设置为0时该自动重装载寄存器不具备缓冲它会直接把数值传给影子寄存器
当ARPE位设置为1时该自动重装载寄存器具备缓冲它需要一个更新事件的产生才会把数值传给影子寄存器。 我们可以写一个基本定时器的简单代码
void TIM_MyConfig(u16 per,u16 psc)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;/*打开时钟*/RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);/*初始化定时器*/TIM_TimeBaseInitStruct.TIM_ClockDivision TIM_CKD_DIV1 ;TIM_TimeBaseInitStruct.TIM_CounterMode TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period per;//自动重装载值TIM_TimeBaseInitStruct.TIM_Prescaler psc; //分频系数TIM_TimeBaseInit(TIM6, TIM_TimeBaseInitStruct);TIM_Cmd(TIM6, ENABLE);
}1、第一步打开时钟因为TIM2-TIM都是挂载在APB1总线上的所以我们需要打开APB1时钟我们可以设置为TIM6。
2、初始化定时器这个要注意函数是TIM_TimeBaseInit();这个与其它如GPIO的初始化函数GPIO_Init不一样其中
TIM_ClockDivision是用来设置定时器的时钟分频因子的成员它用于控制定时器时钟的分频从而影响定时器的计数速度。
在STM32中TIM_ClockDivision 的设置有以下选项 TIM_CKD_DIV1: 不分频。定时器的时钟不经过分频以外部时钟源的速度进行计数。 TIM_CKD_DIV2: 分频为2。定时器的时钟被分为2即每2个外部时钟周期计数器增加1。 TIM_CKD_DIV4: 分频为4。定时器的时钟被分为4即每4个外部时钟周期计数器增加1。
但是我们基本定时器使用到的是内部时钟源所以用不到 TIM_ClockDivision可以设置为TIM_CKD_DIV1或者不配置这个成员这个我们只在通用定时器或者高级定时器才用得到
TIM_CounterMode是用来设置计数模式的成员基本定时器只有一种向上计数模式所以这一位设置为TIM_CounterMode_Up就可以了。
TIM_Period是用来设置自动重装载值的成员也就是设置计数次数也就是自动重装载寄存器中的值当计数器的计数值达到该值时会产生一个更新事件这个值我们可以通过传参来设置。
TIM_Prescaler 是用来设置分频系数的值也就是设置多久计数一次该值也可以通过传参来设置。
在main函数中我们可以这样写
void HardWare_Init(void)
{TIM_MyConfig(5000-1,7200-1);//0.5秒计数产生一次更新事件
}int main(void)
{u8 flag 0;HardWare_Init();while(1){if(TIM_GetFlagStatus(TIM6,TIM_FLAG_Update) SET){flag !flag;}if(flag){PAin(8) 0;}else{PAin(8) 1;}TIM_ClearFlag(TIM6,TIM_FLAG_Update);}
}可以通过设置基本定时器来让LED灯按时闪烁其中也用到了位带操作PAin8。因为我们需要判断的是定时器是否发生更新事件当定时器发生更新事件时说明完成了一个计数周期所以我们用到的函数是 TIM_GetFlagStatus(TIM6,TIM_FLAG_Update)。