山西网站建设 哪家好,wordpress国产主题推荐,ppt模板免费下载网站 知乎,网站开发项目需求书STM32F4X 定时器中断 什么是定时器STM32F4X 定时器分类有关定时器的概念预分频(PSC)自动重装载值(ARR) STM32F4X定时器例程定时器相关函数定时器例程 什么是定时器
定时器(Timer)最基本的功能就是定时#xff0c;比如定时翻转LED灯#xff0c;定时向串口发送数据等。除此之外… STM32F4X 定时器中断 什么是定时器STM32F4X 定时器分类有关定时器的概念预分频(PSC)自动重装载值(ARR) STM32F4X定时器例程定时器相关函数定时器例程 什么是定时器
定时器(Timer)最基本的功能就是定时比如定时翻转LED灯定时向串口发送数据等。除此之外定时器还可以跟GPIO结合使用利用定时器产生PWM波形利用定时器捕捉电平信号等。本章先来讲解定时器的最基本的用法定时功能。
STM32F4X 定时器分类
STM32F4X将定时器分成3类分别是基本定时器通用定时器和高级定时器不同类型的定时器功能不同。下图是STM32F4X的定时器分类以及功能。本章会用基本定时器也就是TIM6或者TIM7来进行讲解。
有关定时器的概念
预分频(PSC)
定时器想要工作首先要用时钟时钟的作用是给定时器一个时基让定时器按照这个时基单元进行计数。在STM32F4中定时器是的时钟源是APB时钟。比如APB的时钟是84MHz,那么定时器的时钟就是84MHz。而预分频的作用是对定时器的时钟源进一步细分得到用户想要的时钟频率。比如用户觉得84MHz的时钟频率太高了想得到一个42MHz的频率就可以往定时器的预分频寄存器里面写1(注意:定时器的预分频寄存器会将预分频系数自动加1)就会得到42MHz的频率。 要注意的时定时器的时钟源会根据硬件自动选择具体如下图所示。 高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是APB2总线。 通用定时器timer2 ~ timer5通用定时器timer12 ~ timer14以及基本定时器timer6,timer7的时钟来源是APB1总线。 自动重装载值(ARR)
上面的预分频寄存器设置了定时器的计数频率那么用户要怎样才能得到想要的定时值呢这就需要自动重装载值寄存器了。自动重装载寄存器的作用是设置定时器的溢出值当定时器计数超过自动重装载值寄存器里面值的时候就会产生一个溢出中断。下面举个例子说明一下。 比如现在需要一个500ms的定时器APB时钟是84MHz我们可以这样设置。 预分频系数设置为8399即定时器的计数频率为84Mhz / 8400 10KHZ,定时器每隔10KHz计一次数也就是0.1ms记一次数想要得到500ms的定时时间只需要往自动重装载值寄存器里面写4999即可也就是0.1*5000 500ms。 定时器的计算公式如下 Tout (1 / (Tclk / (psc 1))) * (arr 1) Tout:定时器溢出值 Tclk:定时器时钟频率 psc:定时器预分频值 arr:自动重装载值
STM32F4X定时器例程
定时器相关函数
/*
定时器初始化函数
TIMx:定时器索引
TIM_TimeBaseInitStruct:定时器初始化结构体
*/
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)/*
定时器中断使能函数
TIMx:定时器索引
TIM_IT:定时器中断类型
NewState:定时使能
*/
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)/*
定时器获取中断状态函数
TIMx:定时器索引
TIM_IT:定时器中断类型
返回值:定时器中断状态
*/
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT)/*
定时器清除中断状态函数
TIMx:定时器索引
TIM_IT:定时器中断类型
*/
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT)定时器例程
该例程是使用定时器7产生一个500ms的中断
#include timer.hvoid bsp_timer_init(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;NVIC_InitTypeDef NVIC_InitStruct;RCC_ClocksTypeDef RCC_Clocks;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7,ENABLE); // 使能定时器7时钟TIM_TimeBaseInitStruct.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseInitStruct.TIM_CounterMode TIM_CounterMode_Up; // 向上计数模式TIM_TimeBaseInitStruct.TIM_Period 4999; // 重装值为5000 500ms中断一次TIM_TimeBaseInitStruct.TIM_Prescaler 8399; // 预分配值为8400 即84000000/8400 10KHZ 0.1ms计一次书TIM_TimeBaseInit(TIM7,TIM_TimeBaseInitStruct); // 初始化定时器7NVIC_InitStruct.NVIC_IRQChannel TIM7_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority 2;NVIC_InitStruct.NVIC_IRQChannelSubPriority 2;NVIC_Init(NVIC_InitStruct); // 配置定时器7 NVIC中断TIM_ITConfig(TIM7,TIM_IT_Update,ENABLE); // 使能更新中断TIM_Cmd(TIM7,ENABLE); // 使能定时器7}void TIM7_IRQHandler(void)
{if(TIM_GetFlagStatus(TIM7,TIM_IT_Update) SET) // 判断是否为定时器7更新中断{printf(%s\r\n,__func__);TIM_ClearITPendingBit(TIM7,TIM_IT_Update); // 清除定时器7更新中断}}
打开Xcom串口助手勾选时间戳功能可以看到串口每隔500ms就进入中断并打印信息。