当前位置:首页 > 单片机 > 单片机
[导读]Systick :系统心跳定时器,提供系统节拍 裸机程序中可作为独立的延时定时器用途:1.产生操作系统的时钟节拍2.便于不同处理器之间程序移植SysTick定时器被捆绑在NVIC中,异常号153.作为一个闹铃测量时间用于测量时

Systick :系统心跳定时器,提供系统节拍

裸机程序中可作为独立的延时定时器

用途:
1.产生操作系统的时钟节拍
2.便于不同处理器之间程序移植
SysTick定时器被捆绑在NVIC中,异常号15
3.作为一个闹铃测量时间用于测量时间,
但当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作

它有四个寄存器
STK_CSR, 0xE000E010 -- 控制寄存器
STK_LOAD, 0xE000E014 -- 重载寄存器
STK_VAL, 0xE000E018 -- 当前值寄存器
STK_CALRB, 0xE000E01C -- 校准值寄存器

stm32的时钟源
选择外部时钟源时,则Systick时钟为HCLK /8
选择内核时钟源时,则Systick时钟为HCLK

延时编程原理
systick定时器是24位的递减计数器,设定初值并使能它后,它会每个系统时钟周期计数器减1,
计数到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息.

延时编程步骤
1.计算出产生1us 需要多少个时钟周期 fac_us;
2.计算出RELOAD寄存器的值
也就是产生相应延时所需要的时钟周期数
RELOAD=fac_us * nus
3.开启计数
4.循环检测计数到0的标志位;
5.清空计数器,关闭定时器

=======================================
SysTick异常配置步骤
1对CTRL//LOAD/VAL三个寄存器进行了配置,
2初始化SysTick使用的时钟,
3清除系统当前值,装入重装值,
4使能SysTick,使SysTick能响应中断


=======================

当SysTick定时器计到0时,将把COUNTFLAG位置位;而下述方法可以对其清零:
1.读取SysTick 控制及状态寄存器(STCSR)
2.往SysTick 当前值寄存器(STCVR)中写任何数据
只有当VAL 值为0 时,计数器自动重载RELOAD

======================
库函数
使用ST的函数库使用systick的方法,严格按照以下顺序:

1、调用SysTick_CounterCmd() -- 失能SysTick计数器
2、调用SysTick_ITConfig () -- 失能SysTick中断
3、调用SysTick_CLKSourceConfig() -- 设置SysTick时钟源。
4、调用SysTick_SetReload() -- 设置SysTick重装载值。
5、调用SysTick_ITConfig () -- 使能SysTick中断
6、调用SysTick_CounterCmd() -- 开启SysTick计数器

Systick中断服务函数
void SysTick_Handler(void);


==========================
寄存器版代码注解
使用外部8M时钟,锁相环里出来的频率是72M,AHB预分频后是72M,
systick固定HCLK时钟的1/8,即9M,那么延时1us是9个时钟

C代码

voiddelay_init(u8SYSCLK)//系统时钟是72MHz,SYSCLK=72

{

SysTick->CTRL&=0xfffffffb;//bit2清0,也就是配置选择外部时钟

fac_us=SYSCLK/8;//硬件8分频,fac_us得出的值是要给下面的时钟函数用的

fac_ms=(u16)fac_us*1000;

}

voiddelay_us(u32nus)//nus假如为10us

{

u32temp;

SysTick->LOAD=nus*fac_us;//延时10us的话就是10*9=90,装到load寄存器中

SysTick->VAL=0x00;//计数器清0,因为currrent字段被手动清零时,load将自动重装到VAL中

SysTick->CTRL=0x01;//配置使异常生效,也就是计数器倒数到0时将发出异常通知

do

{

temp=SysTick->CTRL;//时间到了之后,该位将被硬件置1,但被查询后自动清0

}

while(temp&0x01&&!(tmep&(1<<16)));//查询

SysTick->CTRL=0x00;//关闭计数器

SysTick->VAL=0x00;//清空val

}



//这个while循环,判断如果Systick还在Enable的状态,并且计数器还没数到0,
就不停的循环把当前的SysTick->CTRL寄存器值写入变量temp,继续下一次判断。
当Systick被Disable或者计数器数到0了,就停止循环

还有一个注意点:
LOAD寄存器是24位的 最大值0xffffff
那么延时最大值计算公式为
nms<=0xffffff*8*1000/SYSCLK (SYSCLK单位Hz)
则nms的最大值为1864.135ms ,即1864毫秒


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭