- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Systick 定时器
Systick 定时器
Systick定时器
Systick是一个定时器而已,只是它放在了NVIC 中,主要的目的是为了给操作系统提供一个硬件上的中断(号称滴答中断)。没有学过操作系统的同学, 可能会很郁闷,啥叫滴答中断?这里来简单地解释一下:操作系统进行运转的时候,也会有“心跳”。它会根据“心跳”的节拍来工作,把整个时间段分成很多小小的时间片,每个任务每次只能运行一个“时间片”的时间长度就得退出给别的任务运行,这样可以确保任何一个任务都不会霸占整个系统不放。这个心跳,可以通过定时器来周期性触发,而这个定时器就是systick。很明显,这个“心跳” 是不允许任何人来随意地访问和修改的。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。二、systick编程现在我们想通过Systick 定时器做一个精确的延迟函数,比如让LED 精确延迟1 秒钟闪亮一次。思路:利用systick 定时器为递减计数器,设定初值并使能它后,它会每个系统时钟周期计数器减1,计数到0 时,SysTick 计数器自动重装初值并继续计数,同时触发中断。??? 那么每次计数器减到0,时间经过了:系统时钟周期* 计数器初值。我们使用72M 作为系统时钟,那么每次计数器减1 所用的时间是1/72M,计数器的初值如果是72000,那么每次计数器减到0,时间经过(1/72M) * 72000 = 0.001m,即1ms。COUNTFLAG? R 0 从上次读取定时器开始,如果定时器计数到0,则返回1.读取时清零 2 CLKSOURCE? R/W 0 0=外部时钟源(STCLK)?
1=内核时钟(FCLK)? 1 TICKINT R/W 0 1=SysTick 倒数到 0 时会导致挂起Systick处理器
?0=数到 0 时不会导致挂起Systick处理器。软件可以使用?COUNTFLAG?来判断是否计数到0 0 ENABLE R/W 0 1=SysTick 计数器工作在连拍模式。即计数器装载重装值后接着开始往下计数。计数到0时将COUNTFLAG设为1,此时根据TICKINT的值可以选择是否挂起Systick处理器。接着又再次装载重装值,并重新开始计数。
0=失能计数器
(2)系统时钟节拍(SysTick)重装值寄存器(SysTick_LOAD)
在计数器到达 0 时,使用 SysTick 重装值寄存器来指定载入“当前值寄存器”的初始值。 初始值可以是 1 到 0x00FFFFFF 之间的任何值。
因此,作为一个连拍式(multi-shot)定时器,它每 N+1 个时钟脉冲就触发一次,周而复始,此处 N为 1 到 0x00FFFFFF 之间的任意值。所以,如果每 100 个时钟脉冲就请求一次 时钟中断(tick interrupt) ,那么必须向 RELOAD 载入 99。如果每次时钟中断后都写入一个新值, 那么可以看作单拍(single shot)模式,因而必须写入实际的倒计数值。例如,如果在 400 个时 钟脉冲后想请求一个时钟中断(tick) ,那么必须向 RELOAD 写入 400。
(3)SysTick当前数值寄存器(Systick_VAL)
只有当VAL 值为0 时,计数器自动重载RELOAD。 23:0? CURRENT R/Wc 0 读取时返回当前倒计数的值,写它则使之清零,同时还会清除在 SysTick 控制及状态寄存器中的COUNTFLAG标志? (4)SysTick校准数值寄存器(Systick_ CALIB)
使用系统时钟节拍(SysTick)校准值寄存器通过乘法和除法运算可以将寄存器调节成任意所需的时钟速率。
在ST公司官网上下载的STM32F10x_StdPeriph_Lib_V3.5.0标准库里面关于SysTick的库函数只有两个:
一个在msic.h中SysTick_CLKSource:systick的时钟源主要取值有两个:
SysTick_CLKSource_HCLK_Div8: AHB clock divided by 8
selected as SysTick clock source
SysTick_CLKSource_HCLK: AHB clock selected as SysTick
clock source
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
/* Check the parameters */
assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
if (SysTick_CLKSource == SysTic
文档评论(0)