STM32F103定时器配置
一、定时器
定时器,顾名思义,就是用于定时或计数,它其实就是一个加1计数器。
1.1 定时器类型
STM32f103
有三类定时器:
类型 | 编号 | 总线 | 功能 |
---|---|---|---|
高级定时器 | TIM1、TIME8 | APB2 | 拥有通用定时器全部功能,并额外具有重复计数器、死区生成、互补输出、刹车输入等功能 |
通用定时器 | TIM2、TIM3、TIM4、TIM5 | APB1 | 拥有基本定时器全部功能,并额外具有内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等功能 |
基本定时器 | TIM6、TIM7 | APB1 | 拥有定时中断、主模式触发DAC的功能 |
每个通用定时器TIMx
功能:
- 位于低速的
APB1
总线上; 16
位向上、向下、向上/向下自动装载计数器(TIMx_CNT
);- 16位可编程预分频器(
TIMx_PSC
),计数器的时钟频率的分频系数为1~65535
之间的任意数值; - 4个独立通道(
TIMx_CH1~4
),这些通道可以用来作为:- 输入捕获;
- 输出比较;
PWM
生成;- 单脉冲模式输出;
- 可使用外部信号(
TIMx_ETR
)控制定时器和定时器互联的同步电路; - 如下事件发生时产生中断/
DMA
(6个独立的IRQ/DMA
请求生成器):- 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或内部外部触发);
- 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数);
- 输入捕获;
- 输出比较;
- 支持针对定位的增量(正交)编码器和霍尔传感器电路;
- 触发输入作为外部时钟或者按周期的电流管理;
STM32
的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM
)等。
使用定时器预分频器和RCC
时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32
的每个通用定时器都是完全独立的,没有互相共享的任何资源。
1.1.1 高级定时器框图

1.1.2 通用定时器框图

1.1.3 基本定时器框图

1.2 计数器模式
通用定时器可以向上计数、向下计数、向上向下双向计数模式。
- 向上计数模式:计数器从
0
计数到自动加载值(TIMx_ARR
),然后重新从0
开始计数并且产生一个计数器溢出事件; - 向下计数模式:计数器从自动装入的值(
TIMx_ARR
)开始向下计数到0
,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件; - 中央对齐模式(向上/向下计数):计数器从
0
开始计数到自动装入的值-1
,产生一个计数器溢出事件,然后向下计数到1
并且产生一个计数器溢出事件;然后再从0
开始重新计数。
具体如下图所示:

1.3 功能介绍
1.3.1 定时器中断

1.3.2 输出比较
输出比较可以通过比较CNT
与CCRx
寄存器值的关系,来对输出电平进行置1
、置0
或翻转的操作,用于输出一定频率和占空比的PWM
波形。
输出比较模式:
模式 | 描述 |
---|---|
冻结 | CNT=CCR时,REF保持为原状态 |
匹配时置有效电平 | CNT=CCR时,REF置有效电平 |
匹配时置无效电平 | CNT=CCR时,REF置无效电平 |
匹配时置电平翻转 | CNT=CCR时,REF电平翻转 |
强制为无效电平 | CNT与CCR无效,REF强制为无效电平 |
强制为有效电平 | CNT与CCR无效,REF强制为有效电平 |
PWM模式1 | 向上计数:CNT<CCR时,REF置有效电平,CNT≥CCR时,REF置无效电平 向下计数:CNT>CCR时,REF置无效电平,CNT≤CRR时,REF置有效电平 |
PWM模式2 | 向上计数:CNT<CCR时,REF置无效电平,CNT≥CCR时,REF置有效电平 向下计数:CNT>CCR时,REF置有效电平,CNT≤CRR时,REF置无效电平 |
1.3.3 PWM
基本结构

PWM
频率 :;
PWM
占空比:;
PWM
分辨率:。
二、定时器相关寄存器
2.1 控制寄存器(TIMx_CR1
)
想要使用定时器功能,首先要使能定时器。使能定时器主要用到控制寄存器1
(TIMx_CR1
),此处重点关注第一位,这一位是计数器使能位,给此位设1,使能计数器;


此外我们也需要关注位7
ARPE
、位4
DIR
。
2.2 DMA
/中断使能寄存器(TIMx_DIER
)
定时器的使用,很多情况下都伴随着中断,因此下面要重点关注的是DMA
/中断使能寄存器(TIMx_DIER
)。同样的,只用关注第一位。该位为更新中断允许位,当该位设置为1时,将允许由于更新事件所产生的中断;


2.3 预分频寄存器(TIMx_PSC
)
接下来就要确定定时器的时间,定时器的定时是通过频率计算出来的。这里要用到预分频寄存器(TIMx_PSC
)。该寄存器用于设置对时钟进行分频,然后提供给计数器,作为计数器的时钟;

2.3.1 计数器计数频率
定时器的时钟频率是,TIMx_PSC
即为PSC
的值。时钟频率被分频了PSC+1
,那么定时器的时钟频率:
故可知定时器计数值加1
所需的时间为:。
2.3.2 计数器溢出频率
自动重装载值ARR
,即TIM_ARR
。定时器从0
计数到ARR
时清零。由第一步已经计算出了被分频了PSC+1
的最终定时器的时钟频率为,这是计数一次的频率,故计数器溢出频率 (或者说定时器溢出频率):
2.3.3 计数器溢出时间
计数器溢出时间(或者说定时器溢出时间):
其中
- 为定时器的输入时钟频率(单位
Mhz
),通常为系统时钟频率或者定时器外部时钟频率; ARR
(TIM_ARR
):自动重装载值,是定时器溢出前的计数值;PSC
(TIMx_PSC
):预分频值,是用来降低定时器时钟频率的参数;- T_{out}:定时器溢出时间(单位
us
),一定要注意这个单位是us
。
2.4 从模式控制寄存器(TIMx_SMCR
)
从框图中可以看到统通用定时器时钟来源有以下几个:
- 内部时钟(
CK_INT
)默认; - 外部时钟模式
1
:外部输入脚(TIx
); - 外部时钟模式
2
:外部触发输入(ETR
); - 内部触发输入(
ITRx
):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1
而作为另一个定时器Timer2
的预分频器。
时钟源的选择,可以通过从模式寄存器(TIMx_SMCR
)的第3位来选择;


2.5 自动重装载寄存器(TIMx_ARR
)
下面是自动重载寄存器。自动装载寄存器(TIMx_ARR
)是预先装载的,写或读自动重装载寄存器将访问预装载寄存器;

2.6 状态寄存器(TIMx_SR
)
如果发生了更新中断,UIF
位会被置1
;


三、定时中断源码
3.1 定时中断初始化步骤
定时中断配置流程如下:
(1) TIMx
时钟使能:通过配置RCC_APB1ENR/RCC_APB2ENR
寄存器使能TIMx
时钟;
(2) 配置TIMx
时基单元;
-
配置
TIMx_ARR
寄存器自动重装载的值; -
配置
TIMx_PSC
频寄存器预分频系数;
(3) 配置TIMx_DIER
寄存器允许更新中断(UIE=1
);
(4) 设置NVIC
;
- 参考《
STM32F103
嵌套向量中断控制器》:设置中断优先级分组、设置响应优先级和抢断优先级、使能相应中断位;
(5) 中断处理函数;
- 设置中断服务函数(包括清除中断标志,清
SR
寄存器状态标志位(UIF=0
))。
亲爱的读者和支持者们,自动博客加入了打赏功能,陆陆续续收到了各位老铁的打赏。在此,我想由衷地感谢每一位对我们博客的支持和打赏。你们的慷慨与支持,是我们前行的动力与源泉。
日期 | 姓名 | 金额 |
---|---|---|
2023-09-06 | *源 | 19 |
2023-09-11 | *朝科 | 88 |
2023-09-21 | *号 | 5 |
2023-09-16 | *真 | 60 |
2023-10-26 | *通 | 9.9 |
2023-11-04 | *慎 | 0.66 |
2023-11-24 | *恩 | 0.01 |
2023-12-30 | I*B | 1 |
2024-01-28 | *兴 | 20 |
2024-02-01 | QYing | 20 |
2024-02-11 | *督 | 6 |
2024-02-18 | 一*x | 1 |
2024-02-20 | c*l | 18.88 |
2024-01-01 | *I | 5 |
2024-04-08 | *程 | 150 |
2024-04-18 | *超 | 20 |
2024-04-26 | .*V | 30 |
2024-05-08 | D*W | 5 |
2024-05-29 | *辉 | 20 |
2024-05-30 | *雄 | 10 |
2024-06-08 | *: | 10 |
2024-06-23 | 小狮子 | 666 |
2024-06-28 | *s | 6.66 |
2024-06-29 | *炼 | 1 |
2024-06-30 | *! | 1 |
2024-07-08 | *方 | 20 |
2024-07-18 | A*1 | 6.66 |
2024-07-31 | *北 | 12 |
2024-08-13 | *基 | 1 |
2024-08-23 | n*s | 2 |
2024-09-02 | *源 | 50 |
2024-09-04 | *J | 2 |
2024-09-06 | *强 | 8.8 |
2024-09-09 | *波 | 1 |
2024-09-10 | *口 | 1 |
2024-09-10 | *波 | 1 |
2024-09-12 | *波 | 10 |
2024-09-18 | *明 | 1.68 |
2024-09-26 | B*h | 10 |
2024-09-30 | 岁 | 10 |
2024-10-02 | M*i | 1 |
2024-10-14 | *朋 | 10 |
2024-10-22 | *海 | 10 |
2024-10-23 | *南 | 10 |
2024-10-26 | *节 | 6.66 |
2024-10-27 | *o | 5 |
2024-10-28 | W*F | 6.66 |
2024-10-29 | R*n | 6.66 |
2024-11-02 | *球 | 6 |
2024-11-021 | *鑫 | 6.66 |
2024-11-25 | *沙 | 5 |
2024-11-29 | C*n | 2.88 |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2023-12-04 Rockchip RK3588 - NanoPC-T6开发板介绍
2021-12-04 Mini2440裸机开发之DM9000