stm32学习之定时器中断时间设置与计算
嗯~~~ 在stm32中经常使用定时器,但是一直没有学会怎样计算定时器的时间,近期简单学习了一下做一下总结记录首先我们会在主函数里边定义时钟的最高频率为72Mhz(使用SysTick_Init(72);定义)如下方代码所示int main(){u8 i;SysTick_Init(72);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断优先级分组
嗯~~~ 在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);
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)