q:什么是systick定时器?
systick 是一个24 位的倒计数定时器,当计到0 时,将从reload 寄存器中自动重装载定时初值。只要不把它在systick 控制及状态寄存器中的使能位清除,就永不停息。
q:为什么要设置systick定时器?
(1)产生操作系统的时钟节拍
systick定时器被捆绑在nvic中,用于产生systick异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。
(2)便于不同处理器之间程序移植。
cortex‐m3处理器内部包含了一个简单的定时器。因为所有的cm3芯片都带有这个定时器,软件在不同 cm3器件间的移植工作得以化简。该定时器的时钟源可以是内部时钟(fclk,cm3上的自由运行时钟),或者是外部时钟( cm3处理器上的stclk信号)。
不过,stclk的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要检视芯片的器件手册来决定选择什么作为时钟源。systick定时器能产生中断,cm3为它专门开出一个异常类型,并且在向量表中有它的一席之地。它使操作系统和其它系统软件在cm3器件间的移植变得简单多了,因为在所有cm3产品间对其处理都是相同的
(3)作为一个闹铃测量时间。
systick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。要注意的是,当处理器在调试期间被喊停(halt)时,则systick定时器亦将暂停运作。
q:systick如何运行?
首先设置计数器时钟源,ctrl-》clksource(控制寄存器)。设置重载值(reload寄存器),清空计数寄存器val(就是下图的current)。置ctrl-》enable位 开始计时。
如果是中断则允许systick中断,在中断例程中处理。如采用查询模式则不断读取控制寄存器的countflag标志位,判断是否计时至零。或者采取下列一种方法
当systick 定时器从1 计到0 时,它将把countflag 位置位;而下述方法可以清零之:
1. 读取systick 控制及状态寄存器(stcsr)
2. 往systick 当前值寄存器(stcvr)中写任何数据
只有当val值为0时,计数器自动重载reload。
q:如何使用systicks作为系统时钟?
systick 的最大使命,就是定期地产生异常请求,作为系统的时基。os 都需要这种“滴答”来推动任务和时间的管理。如欲使能systick 异常,则把stcsr.tickint 置位。另外,如果向量表被重定位到sram 中,还需要为systick 异常建立向量,提供其服务例程的入口地址。
q:如何使用systick完成一段延时?
中断方式 参考:
初始化函数systick_configuration(void)放在while()循环外,执行一次:
voidsystick_configuration(void)
{
/*selectahbclock(hclk)assystickclocksource设置ahb时钟为systick时钟*/
systick_clksourceconfig(systick_clksource_hclk);
/*setsystickpriorityto3设置systicks中断抢占优先级3,从优先级0*/
nvic_systemhandlerpriorityconfig(systemhandler_systick,3,0);
/*systickinterrupteach1mswithhclkequalto72mhz每1ms发生一次systick中断*/
systick_setreload(72000);
/*enablethesystickinterrupt*/
systick_itconfig(enable);
}
延时函数,需要延时处调用:
voiddelay(u32ntime)
{
/*enablethesystickcounter允许systick计数器*/
systick_countercmd(systick_counter_enable);
timingdelay=ntime;
while(timingdelay!=0)
;//等待计数至0
/*disablethesystickcounter禁止systick计数器*/
systick_countercmd(systick_counter_disable);
/*clearthesystickcounter清零systick计数器*/
systick_countercmd(systick_counter_clear);
}
中断函数,定时器减至零时调用,放在stm32f10x_it.c文件中
[cpp]view plaincopyprint?
voidsystickhandler(void)
{
timingdelay--;
}
2020年Q4全球PC市场出货量达9160万台
苹果今年iPad Pro和Mac将采用Mini LED
Aruba助您打造最强酒店WiFi体验及wifi对人们的重要性
如何提高存储器子系统效率,有哪些有效方法
浅谈无线测温系统在工业电缆接头的应用
STM32单片机的SYSTick定时器的设置
UWB还有哪些技术发展方向?三星UWB专利公布
我国首次用「机器手」在外星“挖土”
苹果紧急发布的ios10.3.1修复了啥?ios10.3.1太耗电?ios10.3.2的新功能都能解决这些问题?
国家基金不投初创公司的三大原因
传感器外壳防护等级(IP)代码
增强富锂反钙钛矿的水分稳定性实现可持续的全固态锂电池
激光传感器的优缺点_激光传感器主要功能
Google的Digital Wellbeing功能非常有趣
Clearview面部识别系统已被600多家执法机构使用
差动放大器的主要性能指标都有那些?差动放大器都有那些优点?差
u-blox推出新一代GPS评估软件u-center 2
配电箱智能远程控制
PCB电路板铺铜的意义是什么
苹果自研M1芯片推升Macbook电脑销量 预计2021年出货量达到1710万台