小白最近在学习STM32F103RCT6,使用的是正点原子mini板。板子2018年买的,到现在都六年了,终于有时间倒腾这玩意了,现将最近整理的内容记录如下。基本上是阅读正点原子自带的《STM32不完全手册》的,大家也可以多多研究一下。未尽知识点或者描述有误之处,还请各位大佬多多批评指正!
Timer通用定时器
通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT)
构成,可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。
使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。
STM32 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能包括
【1】 16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。
【2】16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。
【3】4 个独立通道(TIMx_CH1~4),这些通道可以用来作为:
A.输入捕获
B.输出比较
C.PWM 生成(边缘或中间对齐模式)
D.单脉冲模式输出
【4】可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
【5】如下事件发生时产生中断/DMA:
A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
C.输入捕获
D.输出比较
E.支持针对定位的增量(正交)编码器和霍尔传感器电路
F.触发输入作为外部时钟或者按周期的电流管理
Timer通用定时器的常用寄存器
控制寄存器1 TIMx_CR1
常用的是TIMx_CR1 的最低位(计数器使能位),该位必须置 1,才能让定时器开始计数。
DMA/中断使能寄存器 TIMx_ DIER
常用的为最低位(更新中断允许位),若需要使用定时器的更新中断,则要设置该位为 1,用于允许由于更新事件所产生的中断。
预分频寄存器 TIMx_PSC
用于对时钟进行分频,然后提供给计数器,作为计数器的时钟。
定时器的时钟来源有 4 个,这些时钟,具体选择哪个可以通过 TIMx_SMCR 寄存器的相关位来设置:
- 内部时钟(CK_INT)。
其从 APB1 倍频的来的,STM32 中除非 APB1 的时钟分频数设置为 1,否则通用定时器 TIMx
的时钟是 APB1 时钟的 2 倍,当 APB1 的时钟不分频的时候,通用定时器 TIMx 的时钟就等于
APB1 的时钟。高级定时器的时钟不是来自 APB1,而是来自 APB2 的。 - 外部时钟模式 1:外部输入脚(TIx)
- 外部时钟模式 2:外部触发输入(ETR)
- 内部触发输入(ITRx):使用 A 定时器作为 B 定时器的预分频器(A 为 B 提供时钟)。
TIMx_CNT
其为定时器的计数器,该寄存器存储了当前定时器的计数值。
自动重装载寄存器(TIMx_ARR)
分为2个寄存器:
- 程序员可以直接操作的;
- 程序员看不到的(影子寄存器),它是真正起作用的。
根据 TIMx_CR1 寄存器中 APRE 位的设置:APRE=0 时,预装载寄存器的内容可以随时传送到影子寄存器,此时 2者是连通的;而 APRE=1 时,在每一次更新事件(UEV)时,才把预装在寄存器的内容传送到影子寄存器。