//定时器分类:
内核定时器(系统滴答定时器):
延时、定时中断、给操作系统提供时基
基本定时器:
延时、定时中断、时间片
通用定时器:
延时、定时中断、输出比较(PWM)、输入捕获(捕获高/低电平时间、红外信号解码(解NEC)、按键时长、超声波测距、逻辑分析仪(IIC SPI)、示波器
高级定时器
延时、定时中断、输出比较、输入捕获、电机死区 刹车
其他定时器:
看门狗 --- 产生复位
RTC --- 1s定时期 ---- 实时时钟(RTC显示时间)
//系统滴答定时器(SysTick):
属于内核部分,是NVIC的一部分;作用:为系统提供时基,作为定时器使用延时和定时中断。
//延时与定时中断的区别:
通过while();这种语法延时会阻塞主程序的运行。而定时中断具有实时性,时间没到的时候,CPU继续进行主程序,时间到进入中断
//STM32的时钟树:
中文参考手册 RCC章节
//STM32的时钟源:
LSI:低速内部时钟 看门狗、RTC
LSE:低速外部时钟 RTC
HSI:高速内部时钟 系统、PLL锁相环
HSE:高速外部时钟 25Mhz -->168Mhz
//系统滴答定时器的相关寄存器
1.SysTick->CTRL(控制及状态寄存器)
位16:标志位: 进入中断标志位置一,需手动清零,可以通过向里面写任意值清零
位2:选择时钟源: 0:选用参考时钟源 1:选用内核时钟源
位1:使能定时中断: 1:使能
位0:滴答定时器使能 1:使能
2.SysTick->LOAD(重装载寄存器)
向其中写入值,数数到0时,将值填入当前值寄存器
3.SysTick->VAL(当前值寄存器)
重装填的值倒数到0(递减的过程)
4.SysTick->CALIB(校准寄存器)
//系统滴答定时器框图:
//使用系统滴答定时器延时
延时时间的确定:
时间T = ARR(重装载值)/ Fck(时钟源频率)
//以参考时钟源为例,编写一个以毫秒为单位延时函数:
Void systick_delay_ms(u16 nms)
{
//选择时钟源
SysTick->CTRL &=~ (1 << 2);
SysTick->LOAD = nms * 21000 - 1 ; // 必须减一,因为当前值寄存器数到0;
//通过向当前值寄存器写入值,将重装载寄存器值写入当前值寄存器
SysTick->VAL = 0;
//使能系统滴答定时器,开始递减计数
SysTick->CTRL |= 1 << 0;
//等待系统标志位置一,关闭定时器使能
while(!(SysTick->CTRL & 1 << 16));
SysTick->CTRL &=~ (1 << 0);
}
//滴答定时器的定时中断
//定时器初始化思路:
1.选择时钟源;
2.使能系统滴答定时器;
3.配置重装载寄存器;
4.向当前值寄存器写入一个值,将重装载寄存器的值加载到当前值寄存器
5.使能系统滴答定时器(开始递减)
//中断服务函数的名字:
ctrl + f 搜索SysTick
初始化例程:
/*
函数功能:系统滴答定时中断
返回值:void
形参:u16 nms
函数功能:nms定时中断
*/
void SysTick_Interrupt(u16 nms)
{
//选择时钟源
SysTick->CTRL &=~ (1 << 0);
//使能滴答定时器中断
SysTick->CTRL |= 1 << 1;
//重装载值
SysTick->LOAD = nms * 21000 - 1;
//通过向当前值寄存器写入值,将重装载寄存器值写入当前值寄存器
SysTick->VAL = 0;
//使能系统滴答定时器,开始递减计数
SysTick->CTRL |= 1 << 0;
}
//后面加上对应的中断服务函数(无返回值,无形参)
//注意:在服务函数中加入清标志位,以便结束中断