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

1291

被折叠的 条评论
为什么被折叠?



