你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

systick做为系统时钟使用

[复制链接]
小贾-370388 发布时间:2015-1-6 11:13

基本能搜到的systick 都是作为延时使用的,因为设计需求我更多实用的是系统时间判断。1 `9 t; R3 y/ i1 R
假如我有个LED,需要每10S闪一下,并且单片机还需要做其他的工作,用延时工作效率太低了,开个定时器又太浪费了。因此系统时钟就体现出了由为重要的应用场合。只需要检测到系统时间为10s 的倍数就可以做动作了,当然前提保证程序的大体循环能在1s 内完成,这个基本没问题如果一个大体循环1s 内完成不了 那这个程序要么就是大到无法形容,要么就是无止境的运行。
  q# d! }# k4 l5 w8 C5 a$ G# T5 J

首先进入while(1) 大循环前初始化systick,进入主体程序就在计数了,计数分毫秒,秒,这样能在特点的时间进入指定的程序中运行。# e% H* ]9 i/ r6 [: S
初始化systick
0 v, ~0 U: h- {6 N  i; F: _
void TimeCount_Init(void)) t+ l+ G1 c. V/ B
{2 l$ T& [2 B# @3 }+ M, g
     % G4 d: F" O# `7 J
    SysTick->LOAD=72000000/1000;//系统频率为72MH
* i7 k+ L' f0 o2 |4 P* Z: t% Y$ T    SysTick->VAL=0x00;
+ F- Z1 t! p2 }- D    SysTick->CTRL=0xFFFFFFFF;7 G0 e2 d- \6 z* w& e, x4 @$ r
    MilliS=0;
+ f3 @9 L6 s8 F/ S" m# s    Second=0;0 V4 K: E# q. U1 }6 w# c
    Min=0;
+ Z0 ~6 h& {' h3 G8 x) e1 d) S}
0 B$ G$ ?! e5 o7 \7 H& }# W7 b$ S9 `9 L
当然如果用库函数也行的
  F) b7 {6 d3 q4 c. a
void TimeCount_Init(void)
' K0 ^" @( `: _8 C6 k% P1 y{
  o+ `* k/ U6 N0 o; I     
+ O8 R4 s; i3 _6 T  if (SysTick_Config (SystemCoreClock / 1000)) 1 ^( x2 l0 |3 @8 W; D
  {  while (1); }% j  T& L: l4 T( U
' y7 O: o5 N8 C$ f4 e: R. ], u! s
  MilliS=0;9 g* w$ f1 T+ a' n  A
  Second=0;
; G  T8 g, d7 z7 W# b/ H/ C  Min=0;" N- C  K4 s* r- K2 Q0 W9 Y; w
}7 ^( f  `6 a# u! O' _0 n

  T& l9 i5 @, a1 K. u
中断函数
" D5 L  |# H! a  {
void SysTick_Handler(void)- A: P6 u6 }- d* M6 E9 M+ \1 G, t
{                                                            ' W2 U; k: m/ z4 y
  MilliS++;0 E8 Z7 `6 H% {) F8 l; \  o
  if(MilliS>=10000) MilliS=0;//此处10000ms 主要方便延时函数使用( N+ G# V8 n8 i! Q
  if(MilliS%1000==0) {Second++;}
1 @. k7 Y% s$ T# [( m  if(Second>=60) {Second=0;min++;}4 t9 |' J6 F! j' D. Q' a0 x
}, z  p$ s1 \4 X

: |, ^0 }% j" T8 M& r+ Q1 `  \) q( h0 D
. G2 L: c" B9 o# F. N1 g' J2 r
如果我们要想5秒去做一次计算某组数据只需要写入秒判断即可
! H# n* H$ |& M' t! t9 [if(Second%5 == 0). f" z. U- ^. f$ l
{  需要间隔运行的程序……    }: c2 {  E4 p# k6 c- Q$ G0 B5 P
毫秒也是可以的,换成MilliS 即可,甚至分钟都行。
   好了,那延时怎么办?是的特殊场合我们可能还是可能有需要延时函数的。当然这个也是可以做到的,不过相对运算多一点点。% A9 t5 \0 y) k
延时函数如下:

) h, Q4 L" A0 {" V7 Z; q
- U& v$ c0 ^+ D: `3 H2 v* Q0 Iu8 delayms(u16 nCount)
! x: Z; t  Q7 O" D  s' e{
) p% K: _6 k% M7 |, S2 g/ @4 p3 _( O) ~% ~  u16 CurTim=MilliS;4 t1 o2 _/ O3 M! \' M; q/ U
  u16 i=0;
$ g9 O1 Z% Y) K5 t6 K  if(nCount<60000)
* R6 k. T) Q0 Z# U. b     {
5 Y3 ?; `8 Q% J. h. Z        if(CurTim+nCount<10000)  
, B2 {( e, S( |          {$ i) K; k# h$ [
             while(MilliS-CurTim<nCount); return 1;
0 \/ d4 k" }* |! S2 M          }' L, \5 L( ?8 L( k# h
        i=nCount-(10000-CurTim);
9 H/ f) x5 U. Z; R4 o* C0 v        while(MilliS<9998);
5 R0 U& F# y3 R/ P( [- Q        while(MilliS>=9998||MilliS<i);   
0 i) o$ f" B/ e) i6 W        return 1;
: d. U$ b7 o  q( J8 p$ P! o9 N     }
! h( }. p, d7 {5 h7 i# N  delayS(nCount/1000);, {5 o! ~6 r+ X
  delayms(nCount%1000);2 C5 ?* ~. n" {% o, O
  //while()
* }) V& d8 g$ s/ v# ~$ a8 T2 {  return 1;& P8 t& y/ ?: u& J
}) |7 I2 U* \2 Q- U2 d
  X! d3 Z: T' d/ U7 N# b) X/ M) d! V
u8 delayS(u16 nCount)- ^3 o) A7 B6 s' h
{
) }* E% C+ }/ b  u16 CurTim=Second;& E/ u. e  x1 X. E2 O! u, g& ], }
  u16 i=0;
  R0 H+ c) `+ W! w$ R  if(nCount<6000)) s# u6 \# o* ]8 q4 a8 a- `: J
     {! W; `: b  ~$ a& D: i
        if(CurTim+nCount<60)7 i; y! U( L' H! Y  f. k
          {  while(Second-CurTim<nCount);return 1;}
# ^9 U' K' N* h" z2 P        i=nCount-(60-CurTim);
) U$ q; ~! c- V6 N( o        while(Second<59);. S7 _( b$ U/ _3 ~+ S; l9 A4 K
        while(Second>=59||Second<i);- t; d" ^- C2 ~: k- U! b7 O- s
        return 1;0 g# O* k# h( `# `! |
     }
, a3 X% w: [! y  return 0;
- N1 i0 S+ U" a! z# v}; R9 R( N; Y; o2 A3 A

4 {; [% {9 t' D+ k- y; N: `1 Z7 s
这里我做的毫秒延时中实际最长的只能计算60000ms 即60s的延时 再长的延时就会先调用秒延时,运行完后再把剩下的毫秒延时运行掉。所以超出部分将计算越出计数器最大计算值多少来计算i=nCount-(10000-CurTim);而中断中定义的技术最大值10000 原因是一般我们使用延时都不会太长,最长一般也就数秒而已,更多的是毫秒级的,所以这里放宽至10S 的长度,直接等待值到了就推出,所以10S内的延时延时还是非常精确的,但如果大于就会有几个微秒的差距了,中间插入了好几条运算和指令,非精确定时就别用这个定时器了。
6 h8 ]+ r" s. S, |) y1 b
赞 收藏 评论1 发布时间:2015-1-6 11:13

举报

1个回答
qianfan 回答时间:2015-1-6 13:14:34
这样是不是太麻烦了啊,直接让无符号的ms++就行,32位的无符号数溢出之后需要几十天呢
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版