简单使用stm32内部定时器中断

STM32定时器中断配置详解
这篇博客介绍了如何在STM32单片机中简单使用内部定时器中断。通过开启RCC时钟、选择时基单元时钟源、配置时基单元、设置中断控制以及配置NVIC中断通道和优先级,详细讲解了STM32定时器中断的配置步骤。

2023.1.11 简单使用stm32内部定时器中断

STM32基本介绍

STM32F101xx、STM32F102xx和 STM32F103xx微控制器有以下定时器资源

高级控制定时器(TIM1和TIM8) APB2总线 通用TIMx (TIM2、TIM3、TIM4和TIM5)定时器 APB1总线 基本定时器(TIM6和TIM7) APB1总线 其中STM32F103C8T6 有TIM1、TIM2、TIM3、TIM4

定时器原理

时基单元包含:

预分频器寄存器 (TIMx_PSC) 计数器寄存器(TIMx_CNT) 自动装载寄存器 (TIMx_ARR) 这三个构成了基本的计时计数电路。

预分频器PSC将时钟源进行初步分频。以72M/Hz晶振为例,预分频器写0输出还是72M/Hz;预分频器写1输出则是72M/2=36M/Hz;预分频器写2输出则是72M/3=24M/Hz

计数器寄存器CNT将预分频器PSC的输出进行计数,每来一个上升沿加1。当达到最大值时自动清零重新计数。

但是我可以提前设定一个数,当计数器寄存器CNT达到目标值时就触发中断并清零。这就是自动装载寄存器 ARR的作用。

(计数器寄存器(TIMx_CNT) 预分频器寄存器 (TIMx_PSC) 自动装载寄存器 (TIMx_ARR)都是16位寄存器,所以最大值都是2^16=65535)

配置定时器程序讲解

接下来我将示范一下如何配置中断

第一步RCC开启时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//RCC开启时钟;APB1总线;选择TIM2通用定时器

第二步选择时基单元的时钟源

TIM_InternalClockConfig(TIM2);//选择内部时钟源】

第三步配置时基单元

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//配置时基单元

TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//时钟输入采样频率,与时基单元关系不大

TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数,从0自增计数到自动装载寄存器 (TIMx_ARR)设定的值;然后清零重新计数。

TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//预分频设为7199即可预先分频将72M/Hz降为10000Hz

TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//自动重装设为9999,满10000自动清零触发中断。

//因为是从0开始,有1偏差所以设定值需要减一;取值范围都是0~65535

TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//高级定时器的重复计数器

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);//将上面的参数设定到TIM2,时基单元配置完成。

第四步配置输出中断控制

TIM_ClearFlag(TIM2,TIM_FLAG_Update);

TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//开启中断到NVIC的通路

第五步配置NVIC,打开中断通道并分配中断的优先级

NVIC_InitTypeDef NVIC_InitStrucTure;

NVIC_InitStrucTure.NVIC_IRQChannel = TIM2_IRQn;

NVIC_InitStrucTure.NVIC_IRQChannelCmd = ENABLE;

NVIC_InitStrucTure.NVIC_IRQChannelPreemptionPriority = 2;

NVIC_InitStrucTure.NVIC_IRQChannelSubPriority = 1;

NVIC_Init(&NVIC_InitStrucTure);

例程


void Timer_Init(void)
{
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启时钟
    
    TIM_InternalClockConfig(TIM2);//选择时基单元
    
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//配置时基单元
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;
    TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
    
    TIM_ClearFlag(TIM2,TIM_FLAG_Update);
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//开启中断到NVIC的通路
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    
    NVIC_InitTypeDef NVIC_InitStrucTure;
    NVIC_InitStrucTure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStrucTure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStrucTure.NVIC_IRQChannelPreemptionPriority = 2; 
    NVIC_InitStrucTure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStrucTure);
    
    TIM_Cmd(TIM2,ENABLE);//启动定时器
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值