stm32学习之定时器中断时间设置与计算

您所在的位置:网站首页 psc计算 stm32学习之定时器中断时间设置与计算

stm32学习之定时器中断时间设置与计算

2024-01-29 18:31| 来源: 网络整理| 查看: 265

嗯~~~ 在stm32中经常使用定时器,但是一直没有学会怎样计算定时器的时间,近期简单学习了一下做一下总结记录

首先我们会在主函数里边定义时钟的最高频率为72Mhz(使用SysTick_Init(72);定义)如下方代码所示

int main() { u8 i; SysTick_Init(72); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组 LED_Init(); TIM4_Init(1000,36000-1); //定时500ms while(1) { i++; if(i%20==0) { led1=!led1; } delay_ms(10); } }

在定义了时钟的最高频率 ,我们就要去设置定时器的震荡频率,然后计算出每秒多少HZ,进而计算出每一HZ 所需要花费的时间,最后根据自动重装载的次数计算定时器的时间

如计算  500ms的定时器

TIM4_Init(1000-1,36000-1);  //定时500ms

最大频率72Mhz   分频系数 36000-1  自动重装载数 1000

计算1秒多少HZ 就是最大频率除以分频系数

72000000/(36000-1+1)=2000hz        (3600-1+1)   计数是从零开始所以需要加一

1/2000=0.0005秒/HZ=0.5毫秒/HZ

自动重装载数 为(1000-1+1)               (1000-1+1)计数是从零开始所以需要加一

定时器时间就是  0.5*1000=500毫秒  因此 就计算出了我们设置的定时器时间就是500ms进入一次定时器中断。

/******************************************************************************* * 函 数 名 : TIM4_Init * 函数功能 : TIM4初始化函数 * 输 入 : per:重装载值 psc:分频系数 * 输 出 : 无 *******************************************************************************/ void TIM4_Init(u16 per,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟 TIM_TimeBaseInitStructure.TIM_Period=per; //自动装载值 1hz所需要的时间乘以per 就是定时器设置的时间 TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数 计算赫兹=系统最大频率分频之后 72000000/psc 的倒数 为时间单位为秒 TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式 TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure); TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //开启定时器中断 TIM_ClearITPendingBit(TIM4,TIM_IT_Update); NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;//定时器中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能 NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM4,ENABLE); //使能定时器 } /******************************************************************************* * 函 数 名 : TIM4_IRQHandler * 函数功能 : TIM4中断函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void TIM4_IRQHandler(void) { if(TIM_GetITStatus(TIM4,TIM_IT_Update)) { led2=!led2; } TIM_ClearITPendingBit(TIM4,TIM_IT_Update); }

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3