一、SysTick—系统定时器
1.1 SysTick简介
SysTick—系统定时器是属于CM3内核中的一个外设,内嵌在NVIC中。系统定时器是一个24bit的向下递减的计数器,计数器每计数一次的时间为1/SYSCLK,一般我们设置系统时钟SYSCLK等于72M。
1.2 SysTick寄存器介绍
SysTick—系统定时器有4个寄存器,在使用SysTick产生定时的时候,只需要配置前三个寄存器,最后一个校准寄存器不需要使用。
寄存器名称 | 寄存器描述 |
---|---|
CTRL | SysTick控制及状态寄存器 |
LOAD | SysTick重装载数值寄存器(从某值开始倒数) |
VAL | SysTick当前数值寄存器(当前计数值) |
CALIB | SysTick校准数值寄存器 |
位段 | 名称 | 类型 | 复位值 | 描述 |
---|---|---|---|---|
16 | COUNTFLAG | R/W | 0 | 如果在上次读取本寄存器后, SysTick 已经计到 了 0,则该位为 1。 |
2 | CLKSOURCE | R/W | 0 | 时钟源选择位,0=AHB/8,1=处理器时钟AHB |
1 | TICKINT | R/W | 0 | 1=SysTick倒数计数到 0时产生 SysTick异常请 求,0=数到 0 时无动作。也可以通过读取COUNTFLAG标志位来确定计数器是否递减到0 |
0 | ENABLE | R/W | 0 | SysTick 定时器的使能位 |
1.3 Delay函数实现
void Delay_us(uint32_t xus)
{
SysTick->LOAD = 72 * xus; //设置定时器重装值,72代表的是系统时钟72M
SysTick->VAL = 0x00; //清空当前计数值
SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器,即位0和位2置1
while(!(SysTick->CTRL & 0x00010000)); //等待计数到0
SysTick->CTRL = 0x00000004; //关闭定时器,SysTick定时器使能位置0
}
二、TIM—基本定时器
2.1 定时器分类
定时器分为基本定时器,通用定时 器和高级定时器。
不同的芯片拥有的定时器数量不同,具体看对应的数据手册。
2.2 基本定时器
时钟源:定时器时钟 TIMxCLK,即内部时钟 CK_INT,经 APB1 预分频器后分频提供,如果 APB1 预分频系数等于 1,则频率不变,否则频率乘以 2,库函数中 APB1 预分频的系数是2,即 PCLK1=36M,所以定时器时钟 TIMxCLK=36*2=72M。
自动重装载寄存器 :自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数 值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。
定时时间:计数一次的时间为:1/CK_CNT,总的计数时间为(1/CK_CNT) * (ARR+1)。
2.3 通用定时器
2.4 高级定时器
2.4.1 时钟源
高级控制定时器有四个时钟源可选:
- 内部时钟源CK_INT
- 外部时钟模式1:外部输入引脚TIx(即TIMx_CHx)(x=1,2,3,4)
- 外部时钟模式2:外部触发输入ETR
- 内部触发输入(ITRx)
2.4.1.1 外部时钟模式1
2.4.1.2 外部时钟模式2
2.4.2 控制器
高级控制定时器控制器部分包括触发控制器、从模式控制器以及编码器接口。
2.4.3 时基单元
该部分即为基本控制器部分
2.4.4 输入捕获
输入捕获可以对输入的信号的上升沿,下降沿或者双边沿进行捕获,常用的有测量输
入信号的脉宽和测量PWM输入信号的频率和占空比这两种。
输入捕获的大概的原理就是,当捕获到信号的跳变沿的时候,把计数器CNT的值锁存到捕获寄存器 CCR中,把前后两次捕获到的 CCR寄存器中的值相减,就可以算出脉宽或者频率。如果捕获的脉宽的时间长度超过你的捕获定时器的周期,就会发生溢出,这个我们需要做额外的处理。
2.4.5 输出比较
输出比较就是通过定时器的外部引脚对外输出控制信号,有冻结、将通道 X(x=1,2,3,4)设置为匹配时输出有效电平、将通道 X 设置为匹配时输出无效电平、翻转、强制变为无效电平、强制变为有效电平、PWM1和PWM2这八种模式,具体使用哪种模式由寄存器 CCMRx的位 OCxM[2:0]配置。
2.4.6 断路功能
断路功能就是电机控制的刹车功能,使能断路功能时,根据相关控制位状态修改输出信号电平。在任何情况下,OCx和 OCxN输出都不能同时为有效电平,这关系到电机控制常用的H桥电路结构原因。
断路源可以是时钟故障事件,由内部复位时钟控制器中的时钟安全系统(CSS)生成,也可以是外部断路输入IO,两者是或运算关系。
系统复位启动都默认关闭断路功能,将断路和死区寄存器(TIMx_BDTR)的BKE为置1,
使能断路功能。可通过TIMx_BDTR 寄存器的BKP位设置设置断路输入引脚的有效电平,设置为1时输入BRK为高电平有效,否则低电平有效。
2.5 定时中断基本结构
2.6 定时器初始化结构体
时基结构体 TIM_TimeBaseInitTypeDef(用于定时器基础参数设置)
typedef struct {
uint16_t TIM_Prescaler; //预分频器
uint16_t TIM_CounterMode; //计数模式,可设置为向上计数、向下计数以及中心对齐
uint32_t TIM_Period; //定时器周期,实际就是设定自动重载寄存器ARR的值
uint16_t TIM_ClockDivision; //时钟分频,设置定时器时钟CK_INT频率与死区发生器以及数字滤波器采样时钟频率分频比
uint8_t TIM_RepetitionCounter; //重复计数器,只存在于高级定时器
} TIM_TimeBaseInitTypeDef;
输出比较结构体TIM_OCInitTypeDef(用于输出比较模式)
typedef struct{
uint16_t TIM_OCMode; //比较输出模式,比较输出模式选择,总共有八种,常用的为PWM1/PWM2
uint16_t TIM_OutputState; //比较输出使能,决定最终的输出比较信号OCx是否通过外部引脚输出
uint16_t TIM_OutputNState; //比较互补输出使能,决定OCx的互补信号OCxN是否通过外部引脚输出
uint16_t TIM_Pulse; //脉冲宽度
uint16_t TIM_OCPolarity; //输出极性
uint16_t TIM_OCNPolarity; //互补输出极性
uint16_t TIM_OCIdleState