学习目标:
stm32实现Systick的毫秒级延时和微妙级延时
学习内容:
1、Systick 工作原理
Systick(系统定时器)是ARM Cortex M3/M4 内核的一个外设,因为所有的CM3/M4内核的单片机都带有这个定时器,这使得软件在CM3/M4单片机中可以很容被移植。系统定时器一般用于单片机操作系统产生时间,维持os的心跳和实现任务分时调度等,Systick 定时器是如此的重要,以至于CM3/M4为它专门开出一个异常类型,并且在向量表中有它的一席之地。
Systick是一个24位的向下递的计数器,每当Systick 从时钟源到来一个时钟,其值就会减1,而一般我们将Systick 的时钟源设置为系统时钟 HCLK(72MHz),这样也就意味着每过1/72M秒Systick里的计数器将会减1,当重装载数值寄存器里的值递减为 0 的时候,系统定时器就会产生一次中断,这样就有时间了。之后CPU自动重新装载计数器值并逐渐递减循环往复。
2、毫秒级延时的实现
Systick上电初始化(外部晶振还没开始工作,此时系统默认使用内部 HSI提供时钟源)
外部配置好后重新初始化 Systick
SysTick_Config(SystemCoreClock / (1000u / uwTickFreq)= SysTick_Config ( 72 000 000 / 1000U / HAL_TICK_FREQ_1KH )= SysTick_Config (72 000 )==>SysTick->LOAD = 72000;
SysTick的时钟源为 72MHz,即1秒钟要来72M次时钟脉冲;而此时重装载数值寄存器(LOAD)的值设置为72000,即每来 72K个脉冲就产生一次中断;那每次中断的时间间隔就是:72K/72M=1/1000秒=1ms。
这样我们就能够通过Systick定时器的中断实现毫秒级的延时了。
3、微秒级延时的实现
例如:STM32L433除了通用的Systick定时器以外,另外还有6个定时器:TIM1、TIM2、TIM6、TIM7、TIM15、TIM16。TIM6、TIM7是两个16位的自装载基本定时器,它们只能作定时使用,而TIM1、TIM2、TIM15、TIM16则是通用高级定时器,除了定时功能以外还能作 PWM输出。
接下来我们将选择基本定时TIM6来实现us级的定时功能。
然后我们需要看的是:datasheet
在datasheet中,TIM2,6,7连到APB1总线上,而TIM1,15,16则连到了APB2总线上。
配置预分频:
TIM6的输入时钟为APB1时钟 80MHz,这个速率对定时器来说实在太快,
这时需要对它做个预分频: CK_CNT = TIMxCLK/(PSC+1)=80MHz/(80-1+1)=1MHz;
微秒延时配置:
通过修改TIM6定时器的ARR(自动重装载寄存)的值,就可以配置定时
器的超时时间:ARR=1/1MHz = 1us
保存
由于我们的TIM6定时器为16位计数器即:2^16=65536
设置最大数值6000,中断可以打断,但是计数器人会运行,所以设置6000.
学习产出:
学会了系统定时的方法。