STM32f103入门(5)定时器中断

STM32 TIM(定时器/计数器)模块的中断流程如下:

配置TIM寄存器:首先,通过配置TIM相关的寄存器来设置计时器的基本参数,例如预分频系数、计数模式、计数器周期等。

使能TIM中断:使用TIM_ITConfig函数或者直接操作TIM的相关寄存器,将所需的中断使能位置1。可以选择使能不同类型的中断,如更新中断、比较中断等。

配置NVIC中断:通过配置NVIC(Nested Vectored Interrupt Controller)的相关寄存器,设置中断优先级和中断向量。可以使用NVIC_Init函数或者直接操作NVIC相关寄存器来完成配置。

编写中断服务程序(ISR):在中断发生时,处理器会跳转到相应的中断服务程序。在中断服务程序中,根据需要进行相应的处理操作,例如读取标志位、清除中断标志、处理中断逻辑等。

中断结束与返回:在中断服务程序的最后,使用return指令退出中断服务程序,并将控制权返回到主程序。

接下来是时基单元的各个部分的作用:

预分频器(Prescaler):预分频器用于控制计数器的时钟频率。通过设置预分频系数,可以将外部时钟频率分频得到内部时钟频率供计数器使用。

计数器(Counter):计数器是TIM模块中的关键部分,用于记录计时或计数的值。根据不同的计数模式,计数器可以向上、向下或双向计数。

自动重载寄存器(Auto-reload Register):自动重载寄存器确定了计数器溢出的点,也即计数器的周期值。当计数器达到自动重载寄存器的值时,计数器会重新从0开始计数。

比较寄存器(Compare Register):比较寄存器用于与计数器的值进行比较。可以设置一个或多个比较值,并在计数器的值与某个比较值相等时触发中断或产生某个特定的事件。

控制寄存器(Control Register):控制寄存器用于配置和控制TIM模块的工作方式,如使能或禁止计时器、选择计时器的工作模式、使能或禁止中断等。

中断与事件(Interrupts and Events):TIM模块支持多种中断和事件,如更新中断(计数器溢出时触发)、比较中断(计数器与比较值相等时触发)等。可以根据需要选择使能或禁止相应的中断或事件,以实现特定的功能。

时基单元通过预分频器、计数器和自动重载寄存器的组合,实现了定时或计数的功能。通过与比较寄存器的结合,可以产生不同的中断或事件,实现更加灵活和高级的定时和计数功能。

函数解析

cpp 复制代码
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE)是一个函数调用,用于使能TIM2外设的时钟。它的作用是将控制寄存器中的时钟使能位设置为1,以启用TIM2外设的时钟。

TIM_InternalClockConfig(TIM2)是另一个函数调用,用于将TIM2的时钟源配置为内部时钟。这意味着TIM2将使用内部时钟作为其时钟源。

接下来是对TIM2进行基本时间基准的初始化:

首先创建一个名为TIM_TimeBaseInitStructure的结构体变量,用于配置TIM2的基本参数。

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_ClockDivision是时钟分频系数,这里设置为TIM_CKD_DIV1,表示不分频。
TIM_CounterMode是计数模式,这里设置为TIM_CounterMode_Up,表示向上计数。
TIM_Period是计数器的周期值,即计数器溢出前的总数。这里设置为10000-1,所以计数器将在10000个时钟周期后溢出。
TIM_Prescaler是预分频系数,用于控制计数器的时钟频率。这里设置为7200-1,所以计数器的时钟频率为72MHz / (7200-1+1) = 10kHz。
TIM_RepetitionCounter是重复计数器的值,用于产生重复计数器更新事件。这里设置为0,表示不使用重复计数器。
接下来是使能TIM2的更新中断:

TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
这个函数调用将TIM2的更新中断使能位置为1,允许产生更新中断。

然后是配置NVIC中断优先级分组:

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
这个函数调用将NVIC中断优先级分组设置为2,意味着优先级分为4位抢占优先级和0位子优先级。

接下来是对NVIC中断进行初始化配置:

首先创建一个名为NVIC_InitStructure的NVIC_InitTypeDef结构体变量,用于配置NVIC中断参数。

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);
NVIC_IRQChannel是指定要配置的中断通道,这里设置为TIM2_IRQn,表示要配置TIM2的中断。
NVIC_IRQChannelCmd是中断使能控制位,这里设置为ENABLE,表示使能TIM2的中断。
NVIC_IRQChannelPreemptionPriority是抢占优先级,这里设置为2。
NVIC_IRQChannelSubPriority是子优先级,这里设置为1。
最后是使能TIM2外设:

TIM_Cmd(TIM2, ENABLE);
这个函数调用将TIM2的使能位设置为1,以使TIM2外设开始工作。

中断函数

cpp 复制代码
void TIM2_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
	{
		Num ++;
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}
相关推荐
szxinmai主板定制专家8 小时前
X86 工控机 vs RK3588 异构主控:AMR 控制器 BOM、散热、长期运维对比
运维·stm32·单片机·嵌入式硬件·fpga开发·am62x
HQB202610 小时前
屹晶微电子 EG1130|2‑24V 输入 / 最高 28V 输出 内置 MOS 异步升压 DC‑DC|SOT23‑6|摄像头 / 车充 / 电池充电电源
嵌入式硬件·硬件工程
泛凡(Linyongui)12 小时前
基于 CW32L010 的智能厨卫调温旋钮方案--低成本 EC21 编码旋钮全解析
单片机·嵌入式硬件·c#
十年磨一剑~13 小时前
Linux 内核中断处理机制与软硬件协同流程
linux·嵌入式硬件
糖糖单片机设计13 小时前
基于单片机的热水器节能控制系统
单片机·嵌入式硬件
数字新视界14 小时前
数字孪生技术赋能智能化转型与创新实践
嵌入式硬件·物联网·系统架构·机房管理·动力与环境监控系统
HQB202615 小时前
屹晶微电子 EG1195|10‑120V/10A+ 外置 MOS 异步降压控制器|ESOP‑8|电动车转换器 / 快充 / 工业电源
嵌入式硬件·硬件工程
不悔哥16 小时前
开源LineageOS:旧手机刷上开源系统
嵌入式硬件·智能手机·开源
服务器硬件项目经理16 小时前
《超节点修仙录》· 第一卷·炼气期【第04话】 超节点 vs 普通服务器——不就是多插了几张卡吗?
运维·服务器·人工智能·嵌入式硬件·深度学习·机器学习
一次调频AGCAVC17 小时前
一次调频系统控制柜的组成及一次调频装置主机功能详述
人工智能·嵌入式硬件