STM32定时器介绍及初始化实例

本文详细介绍了STM32F103C8T6芯片中TIM2定时器的结构、时基单元配置、初始化过程,包括计数器、预分频器和自动重装寄存器的使用,以及中断服务函数。

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


一、定时器简介

定时器对输入时钟进行计数,并在计数值达到设定值时触发中断。主体部分是16位的计数器、预分频器和自动重装寄存器组成的时基单元。
本文以STM32F103C8T6为例,介绍通用定时器的结构以及TIM2的初始化流程,在最后编写了初始化函数。此芯片有3个通用定时器:TIM2、TIM3、TIM4。

二、定时器的结构

下图是通用定时器的结构,本文主要配置上半部分定时器的内部时钟输入和时基单元 (内部输入时钟频率为72MHz),不涉及下半部分的输出比较和输入捕获。
通用定时器框图
下图是B站江科大做的定时中断结构图,初始化时只需从左到右依次配置 内部时钟时基单元中断控制器 (NVIC) 、最后启动 运行控制 就完成了定时器TIM2的初始化 (如不需要使用中断可跳过第三步) 。
定时中断结构

三、时基单元

1. 时基单元包含:

  • 计数器寄存器(TIMx_CNT)
  • 预分频器寄存器 (TIMx_PSC)
  • 自动装载寄存器 (TIMx_ARR)

2. 寄存器值的计算:

  • 计数器计数频率:CK_CNT= CK_PSC / (PSC + 1)
  • 计数器溢出频率:CK_CNT_OV = CK_CNT / (ARR + 1)
      = CK_PSC / (PSC + 1) / (ARR + 1 )

例如:定时器每过1秒产生一次中断,则中断频率 (溢出频率)为1Hz。内部时钟为72MHz,可取 PSC = 7200 - 1 、ARR = 10000 - 1 (或PSC = 3600 - 1 、ARR = 20000 - 1) 。计算CK_CNT_OV = 72M / 7200 / 10000 = 1Hz

三、初始化实例程序

1. 初始化函数

 代码如下:

void Timer_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);	//时钟使能,TIM2挂载在APB1总线
	
	TIM_InternalClockConfig(TIM2);	//使用内部时钟(默认)72MHz
	
	//外部时钟配置: 使用外部时钟(计数器功能)
	//TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x00); 
	
	//配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;	//时钟分频,可用于外部信号滤波
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	//计数器模式:向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;	//ARR自动重装器的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;		//PSC预分频率的值
	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_PriorityGroupConfig(NVIC_PriorityGroup_2);		//NVIC优先级分组
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;		//IRQ通道
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;		//IRQ通道使能
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;			//响应优先级
	NVIC_Init(&NVIC_InitStructure);		//NVIC初始化
	
	TIM_Cmd(TIM2, ENABLE);		//启动定时器
}

2. 中断服务函数

 代码如下:

void TIM2_IRQHandler(void)	//TIM2_IRQHandler:中断向量地址,定义在汇编启动文件
{
	if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)	//判断中断标志位
	{
		;	//中断服务程序
		
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);	//清除中断标志位(不清除会一直重复执行中断函数)
	}
}

总结

本文介绍了通用定时器TIM2的初始化程序,如需初始化其他通用定时器,可将程序中TIM2修改为TIMx (x = 2~4) 。详细教程请参考B站江科大的STM32入门教程

### 关于 'cache-loader' 模块未找到的解决方案 当遇到 `Syntax Error: Error: Cannot find module 'cache-loader'` 错误时,通常是因为某些依赖项未能正确安装或存在版本兼容性问题。以下是针对该问题的具体分析和解决方法: #### 1. 删除现有依赖并重新安装 由于部分依赖可能未完全下载或配置失败,建议清理当前环境中的依赖文件,并重新执行安装操作。 - **删除旧依赖** 进入项目根目录,运行以下命令以移除现有的 `node_modules` 文件夹以及锁定文件: ```bash rm -rf node_modules package-lock.json ``` - **重新安装依赖** 使用以下命令重新拉取所有必要的模块: ```bash npm install ``` 此过程会依据 `package.json` 配置自动解析所需依赖关系[^3]。 #### 2. 处理高版本 Node.js 和 NPM 的兼容性问题 如果使用的 Node.js 或 NPM 版本较高,则可能会触发上游依赖冲突的情况。此时可以通过指定参数来忽略此类警告并强制完成安装流程。 - 执行带选项的安装指令: ```bash npm install --legacy-peer-deps ``` 上述命令能够有效规避因新策略引入而导致的部分历史遗留库无法匹配的问题[^4]。 #### 3. 明确目标加载器及其关联插件的状态 确认是否遗漏了其他间接影响到构建链路的关键组件(例如 `sass-loader`, `style-loader`)。对于特定场景下的样式表预处理工具缺失情况也需要同步关注[^1]。 通过上述措施基本可以消除由缓存机制引发的相关异常状况;当然,在实际开发过程中还应定期更新全局管理软件至最新稳定版次从而减少不必要的麻烦发生几率。 ```javascript // 示例代码片段展示如何验证已修复后的服务端渲染功能是否恢复正常工作状态。 const express = require('express'); const path = require('path'); let app = express(); app.use(express.static(path.join(__dirname, './dist'))); app.listen(8080,function(){ console.log("Server is running on port 8080..."); }); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值