[应用相关] STM32的SYSTICK详解

[复制链接]
 楼主| Mozarts 发表于 2016-11-9 20:23 | 显示全部楼层 |阅读模式
什么是SYSTICK:
这是一个24位的系统节拍定时器system tick timer,SysTick,具有自动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都可以由这个定时器获得一定的时间间隔。
作用:
在单任务引用程序中,因为其架构就决定了它执行任务的串行性,这就引出一个问题:当某个任务出现问题时,就会牵连到后续的任务,进而导致整个系统崩溃。要解决这个问题,可以使用实时操作系统(RTOS).
因为RTOS以并行的架构处理任务,单一任务的崩溃并不会牵连到整个系统。这样用户出于可靠性的考虑可能就会基于RTOS来设计自己的应用程序。这样SYSTICK存在的意义就是提供必要的时钟节拍,为RTOS的任务调度提供一个有节奏的“心跳”。
微控制器的定时器资源一般比较丰富,比如STM32存在8个定时器,为啥还要再提供一个SYSTICK?原因就是所有基于ARM Cortex_M3内核的控制器都带有SysTick定时器,这样就方便了程序在不同的器件之间的移植。而使用RTOS的第一项工作往往就是将其移植到开发人员的硬件平台上,由于SYSTICK的存在无疑降低了移植的难度。

  SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。
要注意的是,当处理器在调试期间被喊停(halt)时,则SysTick定时器亦将暂停运作。

时钟的选择:
用户可以在位于Cortex_M3处理器系统控制单元中的系统节拍定时器控制和状态寄存器(SysTick control and status register ,SCSR)选择systick 时钟源。如将SCSR中的CLKSOURCE位置位,SysTick会在CPU频率下运行;而将CLKSOUCE位清除则SysTick会以CPU主频的1/8频率运行。
3.5版本的库函数与以往的有所区别
不存在stm32f10x_systick.c文件,故原来的一些函数也不存在,比如SysTick_SetReload(u32 reload);SysTick_ITConfig(FunctionalState NewState);等

在3.5版本的库函数中与systick相关的函数只有两个
第一个,SysTick_Config(uint32_t ticks),在core_cm3.h头文件中进行定义的。
第二个,void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource),在misc.c文件中定义的。

SysTick_Config(uint32_t ticks),在core_cm3.h
Listate 发表于 2016-11-9 20:24 | 显示全部楼层
SysTick_Config(uint32_t ticks),在core_cm3.h
主要的作用有:
1、初始化systick
2、打开systick
feiqi1 发表于 2016-11-9 20:31 | 显示全部楼层
SysTick_Config(uint32_t ticks),在core_cm3.h应该还可以打开systick的中断并设置优先级
androidbus 发表于 2016-11-9 20:31 | 显示全部楼层
返回一个0代表成功或1代表失败
litengg 发表于 2016-11-9 20:37 | 显示全部楼层
注意:Uint32_t ticks  即为重装值,这个函数默认使用的时钟源是AHB
qiangweii 发表于 2016-11-9 20:37 | 显示全部楼层
确实,它不分频,默认使用AHB的时钟源。
shashaa 发表于 2016-11-9 20:45 | 显示全部楼层
要想分频,调用void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)呗
 楼主| Mozarts 发表于 2016-11-9 20:46 | 显示全部楼层
Listate 发表于 2016-11-9 20:24
SysTick_Config(uint32_t ticks),在core_cm3.h
主要的作用有:
1、初始化systick

SysTick_Config(uint32_t ticks)的作用还是蛮多的
 楼主| Mozarts 发表于 2016-11-9 20:46 | 显示全部楼层
feiqi1 发表于 2016-11-9 20:31
SysTick_Config(uint32_t ticks),在core_cm3.h应该还可以打开systick的中断并设置优先级 ...

恩 好像是的 在core_cm3.h应该还可以打开systick的中断并设置优先级
 楼主| Mozarts 发表于 2016-11-9 20:47 | 显示全部楼层
androidbus 发表于 2016-11-9 20:31
返回一个0代表成功或1代表失败

这个也是SysTick_Config(uint32_t ticks)在core_cm3.h的作用
 楼主| Mozarts 发表于 2016-11-9 20:48 | 显示全部楼层
litengg 发表于 2016-11-9 20:37
注意:Uint32_t ticks  即为重装值,这个函数默认使用的时钟源是AHB

是的 这个确实容易忽视 值得注意。
 楼主| Mozarts 发表于 2016-11-9 20:48 | 显示全部楼层
shashaa 发表于 2016-11-9 20:45
要想分频,调用void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)呗

但是要注意函数调用的次序吧,先SysTick_Config(uint32_t ticks),
后SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
bbapple 发表于 2016-11-9 20:55 | 显示全部楼层
什么是SYSTICK?学习了
handleMessage 发表于 2016-11-9 20:59 | 显示全部楼层
十分感谢!!正要用到STM32的SYSTICK!!!不胜感激!!!
zhouhuanの 发表于 2016-11-9 21:02 | 显示全部楼层
与systick相关的函数往往我容易出错,多谢分享总结
icecut 发表于 2016-11-9 21:04 | 显示全部楼层
计数时间最长的计数器.用于生成系统调度中断
yu515301489 发表于 2016-11-10 08:14 | 显示全部楼层
赞一个!
secowo 发表于 2016-11-10 09:11 | 显示全部楼层
不错,赞一个
soulmist 发表于 2016-11-10 10:05 | 显示全部楼层
到处都能找的到 就不用详解了
zhuomuniao110 发表于 2016-11-10 10:37 | 显示全部楼层

SysTick时钟,俗称“嘀嗒定时器”,这家伙能按固定的时间产生一次中断,通常是多长时间产生一次中断呢?官方给出的一个时间是1ms

那么,它是怎么准确的产生1ms的呢..

您需要登录后才可以回帖 登录 | 注册

本版积分规则

70

主题

1320

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部