【前言】 STM32是意法半导体(STMicroelectronics)推出的一款32位单片机系列,具有丰富的外设资源和强大的性能,广泛应用于工业控制、通信、医疗等领域。定时器(Timer)和中断(Interrupt)是STM32中常用的功能模块,本文将详细介绍STM32的定时器和中断的使用方法,并通过多个代码案例进行演示。
【目录】 一、定时器简介 1.1 STM32定时器分类 1.2 定时器的基本原理 1.3 定时器相关寄存器介绍
二、定时器的使用方法 2.1 定时器的初始化配置 2.2 定时器的启动和停止 2.3 定时器的计数值获取 2.4 定时器的中断配置
三、定时器中断的使用方法 3.1 中断优先级配置 3.2 中断服务函数编写 3.3 中断的使能和禁用
四、案例演示 案例一:使用定时器实现LED闪烁 案例二:使用定时器测量外部脉冲信号的频率 案例三:定时器中断处理PWM波形的输出
五、总结与展望
【正文】
一、定时器简介 1.1 STM32定时器分类 STM32的定时器包括通用定时器(General Purpose Timer)和高级定时器(Advanced Timer),其中通用定时器又分为基本定时器(Basic Timer)和通用定时器(General Purpose Timer)。基本定时器只能用于简单的定时和计数,而通用定时器则具有更多的功能和灵活性。 基本定时器和通用定时器的主要区别在于:
- 基本定时器只有一个计数器,而通用定时器有多个计数器。
- 基本定时器的计数值范围有限(根据具体型号而定),而通用定时器的计数值范围更广泛。
- 通用定时器具有更多的输入捕获、输出比较、PWM等功能。
1.2 定时器的基本原理 定时器的基本原理是通过一个时钟源来驱动定时器的计数器,当计数器的值达到设定的目标值后,产生中断或触发其他相关事件。定时器的时钟源可以是内部时钟(如内部RC振荡器)或外部时钟(如外部晶振或外部信号)。
1.3 定时器相关寄存器介绍 STM32的定时器模块有多个相关寄存器,常用的有以下几个:
- TIMx_CR1:定时器控制寄存器1,用于配置定时器的工作模式、计数模式、时钟源等。
- TIMx_PSC:预分频器寄存器,用于设置定时器的时钟预分频系数。
- TIMx_ARR:自动重装载寄存器,用于设置定时器的计数器自动重新加载的值。
- TIMx_CCRx:比较寄存器,用于设置比较通道的比较值。
- TIMx_CNT:计数器寄存器,用于读取或写入当前计数值。
- TIMx_SR:状态寄存器,用于判断定时器中断标志等。
- TIMx_DIER:中断使能寄存器,用于使能或禁用定时器中断。
二、定时器的使用方法 2.1 定时器的初始化配置 定时器的初始化配置主要包括以下几个方面:
- 选择定时器模式(例如定时器模式、输入捕获模式、输出比较模式等)。
- 配置定时器的工作模式(例如单脉冲模式、连续计数模式等)。
- 配置定时器的计数方向(例如向上计数、向下计数等)。
- 配置定时器的时钟源和时钟预分频系数。
- 配置定时器的自动重装载值。
以下是一个通用定时器的初始化配置代码示例:
/* 选择定时器模式为定时器模式 */
TIMx->CR1 &= ~(TIM_CR1_CMS_Msk | TIM_CR1_DIR_Msk);
TIMx->CR1 |= TIM_CR1_CMS_0; // 选择定时器模式
/* 配置定时器的工作模式为连续计数模式 */
TIMx->CR1 &= ~TIM_CR1_OPM_Msk;
/* 配置定时器的计数方向为向上计数 */
TIMx->CR1 &= ~TIM_CR1_DIR_Msk;
/* 配置定时器的时钟源和时钟预分频系数 */
TIMx->PSC = (uint16_t) (prescaler - 1);
/* 配置定时器的自动重装载值 */
TIMx->ARR = (uint16_t) (arr - 1);
/* 使能定时器 */
TIMx->CR1 |= TIM_CR1_CEN;
2.2 定时器的启动和停止 定时器的启动和停止可以使用控制寄存器(CR)中的相关位实现。启动定时器时,需要将相关位设置为1;停止定时器时,需要将相关位设置为0。
以下是一个通用定时器的启动和停止代码示例:
/* 启动定时器 */
TIMx->CR1 |= TIM_CR1_CEN;
/* 停止定时器 */
TIMx->CR1 &= ~TIM_CR1_CEN;
2.3 定时器的计数值获取 定时器的计数值可以通过计数器寄存器(CNT)进行读取或写入操作。
以下是一个通用定时器的计数值获取代码示例:
uint16_t count = TIMx->CNT; // 读取计数值
TIMx->CNT = count; // 写入计数值
2.4 定时器的中断配置 定时器的中断配置主要包括以下几个方面:
- 配置中断使能寄存器(DIER)中相应的中断使能位,用于使能或禁用定时器中断。
- 配置定时器中断优先级。
- 编写中断服务函数(ISR)。
以下是一个通用定时器的中断配置代码示例:
/* 使能定时器中断 */
TIMx->DIER |= TIM_DIER_UIE;
/* 设置定时器中断优先级 */
NVIC_SetPriority(TIMx_IRQn, priority);
NVIC_EnableIRQ(TIMx_IRQn);
/* 定时器中断服务函数 */
void TIMx_IRQHandler(void)
{
if (TIMx->SR & TIM_SR_UIF)
{
/* 处理定时器中断事件 */
// 清除定时器中断标志
TIMx->SR &= ~TIM_SR_UIF;
}
}
三、定时器中断的使用方法 3.1 中断优先级配置 在使用定时器中断时,需要对中断优先级进行配置,以确保正确的中断处理顺序。中断优先级的配置可以通过中断控制器模块(NVIC)进行设置。常用的函数有NVIC_SetPriority()和NVIC_EnableIRQ()。
以下是一个配置中断优先级的代码示例:
/* 设置定时器中断优先级为最高优先级 */
NVIC_SetPriority(TIMx_IRQn, 0);
/* 使能定时器中断 */
NVIC_EnableIRQ(TIMx_IRQn);
3.2 中断服务函数编写 中断