STM32F1定时器中断

本文详细介绍了STM32F1系列微控制器中的通用定时器TIM2、TIM3、TIM4和TIM5的使用方法。主要内容包括定时器的主要寄存器、时钟配置、初始化步骤、中断设置及定时器的使能过程。通过实例讲解如何设置自动重装载值、预分频系数以及计数方式,从而实现精确的时间控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32F1的通用定时器包括:TIM2、TIM3、TIM4和TIM5。
掌握主要的通用定时器的寄存器:控制寄存器1(TIMx_CR1)、DMA/中断使能寄存器(TIMx_DIER)、预分频寄存器(TIMx_PSC)(它的作用是对时钟进行分频,然后提供给计数器,作为计数器的时钟)、TIMx_CNT寄存器(该寄存器是定时器的计数器,该寄存器存储了当前定时器的计数值)、自动重装载寄存器(TIMx_ARR)、状态寄存器(TIMx_SR)。
计数器的时钟频率CK_CNT等于fCK_PSC/(PSC[15:0]+1)。
CK_INT(内部时钟)是从APB1倍频来的,除非APB1的时钟分频数设置为1,否则通用定时器TIMx的时钟是APB1时钟的两倍,时钟分频由CFGR寄存器控制。另外高级定时器的时钟来自APB2。
初始化定时器的步骤:
(1)定时器时钟使能.例如拿TIM4来讲:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
(2)初始化定时器参数,设置自动重装载值,分频的系数,计数方式等;
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值(或者可以简单理解为计数次数)
TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频的值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //分频因子为1,表示72/1
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
//如果arr是5000-1,psc是7199的话那么得到的fDTS为10kHz,tDTS为0.1ms,那么5000个0.1ms等于500ms,每500ms溢出。
(3)设置TIMx_DIER允许更新中断
调用库函数里的TIM_ITConfig函数来实现
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM4中断,允许更新中断
(4)定时器中断优先级设置
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //TIM4中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级2级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
(5)使能定时器
TIM_Cmd(TIM4, ENABLE); //使能TIM4

最后就可以编写中断服务函数啦
void TIM4_IRQHandler(void) //TIM4中断
{
static unsigned char tt=0;
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != 0) //检查TIM4更新中断发生与否
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //清除TIMx更新中断标志
tt++;
if(tt==1)
{
tt=0;
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值