首页>>科技 >>内容

stm32定时器中断服务函数,剖析STM32-定时器2

发布时间:2023-10-15 21:58:05编辑:温柔的背包来源:

stm32定时器中断服务函数,剖析STM32-定时器2

很多朋友对stm32定时器中断服务函数,剖析STM32-定时器2不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

4、常用库函数定时器参数的初始化:

无效TIM_TimeBaseInit(TIM_TypeDef * TIMx,TIM_TimeBaseInitTypeDef * TIM_TimeBaseInitStruct);结构内部成员:

typedef 结构{ uint16_t TIM_Prescaler; uint16_t TIM_CounterMode; uint16_t TIM_Period; uint16_t TIM_ClockDivision; uint8_t TIM_RepetitionCounter;} TIM_TimeBaseInitTypeDef;申报方式(通用):

TIM_TimeBaseStructure.TIM_Period=4999; TIM_TimeBaseStructure.TIM_Prescaler=7199; TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure);定时器使能功能:

void TIM_Cmd(TIM_TypeDef* TIMx,FunctionalState NewState) 定时器中断使能函数

无效TIM_ITConfig(TIM_TypeDef * TIMx,uint16_t TIM_IT,FunctionalState NewState);状态标志位获取和清除

FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);void TIM_ClearITPendingBit(TI M_TypeDef* T IMx,uint16_t TIM_IT);5。定时器中断实现步骤

可设置定时时钟。

RCC_APB1PeriphClockCmd();初始化定时器并配置ARR和PSC。

TIM_TimeBaseInit();使能定时器中断并配置NVIC。

无效TIM_ITConfig(); NVIC_Init(); 启用定时器。

TIM_Cmd(); 编写中断服务函数。

TIMx_IRQHandler();6.应用实例

以下是使用定时器中断的代码。我们将其设置为每500ms 中断一次。中断服务函数控制LED反转LED状态。时间计算方法为:

Tout(溢出时间)=(ARR+1)(PSC+1)/Tclk

//timer.c源文件#include 'timer.h' #include 'led.h' //通用定时器3中断初始化//这里时钟选择是APB1的2倍,APB1为36M //arr:自动重置负载值。 //psc: 时钟预分频器//这里使用定时器3!void TIM3_Int_Init(u16 arr,u16 psc){ TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,启用); //时钟使能Able//定时设备TIM3初始化TIM_TimeBaseStructure.TIM_Period=arr; //设置在下一个更新事件中加载的活动自动重载寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler=psc; //设置预分频器值TIM_TimeBaseStructure用作TIMx时钟频率除数。 TIM_ClockDivision=TIM_CKD_DIV1; //设置时钟分频:TDTS=Tck_tim TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure); //根据指定参数初始化TIMx的时基单元TIM_ITConfig(TIM3, TIM_IT_Up date, ENABLE ); //使能指定的TIM3中断并允许更新中断//中断优先级NVIC设置NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //TIM3中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0; //抢占优先级0 NVIC_InitStructure.NVIC_IRQChannelSubPriority=3 ; //从优先级3开始NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //IRQ通道启用NVIC_Init(NVIC_InitStructure); //初始化NVIC寄存器TIM_Cmd(TIM3, ENABLE); //使能TIMx }//定时器3中断服务程序void TIM3_IRQHandler(void) //TIM3中断{ if (TIM_GetITStatus(TIM3, TIM_IT_Update) !=RESET) //检查TIM3更新中断是否发生{ TIM_ClearITPendingBit(TIM3, TIM_IT_Update ) ; //清除TIMx更新中断标志LED1=!LED1; }}//timer.h头文件#ifndef __TIMER_H#define __TIMER_H#include 'sys.h'void TIM3_Int_Init(u16 arr,u16 psc);#endif//main.c源文件#include 'led.h'#include 'delay.h'#include 'sys.h'#include 'timer.h' int main(void){delay_init(); //延迟函数初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断组2:2位抢占优先级,2位响应优先级uart_init(115200); //串口初始化为115200 LED_Init(); //LED端口初始化TIM3_Int_Init(4999,7199); //10Khz计数频率,计数到5000是500ms while(1) { LED0=!LED0;延迟毫秒(200); } }

以上知识分享希望能够帮助到大家!