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

systick做为系统时钟使用

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

基本能搜到的systick 都是作为延时使用的,因为设计需求我更多实用的是系统时间判断。2 E. T; k* s9 ^8 u
假如我有个LED,需要每10S闪一下,并且单片机还需要做其他的工作,用延时工作效率太低了,开个定时器又太浪费了。因此系统时钟就体现出了由为重要的应用场合。只需要检测到系统时间为10s 的倍数就可以做动作了,当然前提保证程序的大体循环能在1s 内完成,这个基本没问题如果一个大体循环1s 内完成不了 那这个程序要么就是大到无法形容,要么就是无止境的运行。' T9 c% ]4 `( l$ [+ m/ T! L  r

首先进入while(1) 大循环前初始化systick,进入主体程序就在计数了,计数分毫秒,秒,这样能在特点的时间进入指定的程序中运行。
, g. a8 p- e' I8 ]
初始化systick
& \9 A1 \/ B$ x) |4 |
void TimeCount_Init(void). T! l0 b0 Z6 t7 Y1 f4 p2 `
{: Q/ e. S5 c& e  t% q
     
7 }. v6 w2 v% v- L    SysTick->LOAD=72000000/1000;//系统频率为72MH
" ~- C! }+ g/ I* Y: F0 u. S- w- m0 A    SysTick->VAL=0x00;
, K0 H6 W8 c! L7 ?& C$ u) K! I$ C    SysTick->CTRL=0xFFFFFFFF;
1 q9 |2 t1 T% @5 x8 C    MilliS=0;2 O" j5 o# g/ x# o/ H
    Second=0;8 n) A$ B' ^9 J. z" I* z
    Min=0;" j/ ?6 ~: y, W' L! Z/ f. B
}+ f$ Q0 b2 m4 f0 U

5 H( V% c# [4 @1 {# P$ Q& l) g
当然如果用库函数也行的  K, @: h, s2 f* l6 z' L
void TimeCount_Init(void)6 I0 }2 }  h  F& q. i! n2 ]; T/ d
{
" P! s8 [: p( f& A- B5 g+ C: h     9 c3 K' ~# _2 A4 ]$ }: F
  if (SysTick_Config (SystemCoreClock / 1000)) - Y7 _/ @! ~8 A: g' V, \, j
  {  while (1); }/ ?/ u9 w9 t' t$ {# {
% Q2 ^' e, g; b( R" R
  MilliS=0;5 }9 z4 w: U8 p- [0 c0 e7 g
  Second=0;
) O( H. m- e* A* j% ^  Min=0;1 k1 e9 s- P# T5 [
}4 U8 w" Z9 a# E8 s% V
( b' Y/ a% t2 ^& D& f
中断函数8 `) c  a1 h) U9 ]' l$ @3 s
void SysTick_Handler(void)6 w1 ^4 Q# m& M5 |( @. K; z9 f
{                                                            ! ]; Y2 E; S  n* d8 d8 R8 z
  MilliS++;& b! l. U: y8 j5 t7 \
  if(MilliS>=10000) MilliS=0;//此处10000ms 主要方便延时函数使用! K( {+ z) Z2 V/ p9 u0 Z/ H$ I
  if(MilliS%1000==0) {Second++;}
% @* x: u+ g  {' |  if(Second>=60) {Second=0;min++;}
, u. W9 ?/ G3 _}
( ?2 a% Z+ T" ^# i9 A: A# k) ?, E- q+ _
5 @, r5 b( o/ Q! a$ ]! B
如果我们要想5秒去做一次计算某组数据只需要写入秒判断即可, h9 K* J3 b5 `3 Y, U/ T1 W
if(Second%5 == 0)6 k* \* R. f* G: B3 O* u. q' i
{  需要间隔运行的程序……    }4 I6 R3 B  k. v* G3 j0 `4 a1 r# p
毫秒也是可以的,换成MilliS 即可,甚至分钟都行。
   好了,那延时怎么办?是的特殊场合我们可能还是可能有需要延时函数的。当然这个也是可以做到的,不过相对运算多一点点。( t& r, c4 B& w  E
延时函数如下:
2 P2 z# A' ?' L7 y1 I( }

8 [2 t3 o/ r& ]* M) M4 p0 k& Ou8 delayms(u16 nCount)  d: P" }, D- G, v+ r
{
! {4 l, Y$ B5 ?) L2 Z, H  u16 CurTim=MilliS;
$ R( q( H5 Y. `( `' W  u16 i=0;# L/ |9 I4 @! l
  if(nCount<60000)
6 ~% Z, E% B- ]6 U0 b" m     {: l: j5 C0 [3 g9 j. T  }
        if(CurTim+nCount<10000)  + z. G$ p, @8 g3 Q. ]( [
          {( J# B7 C- l! P. ~
             while(MilliS-CurTim<nCount); return 1;8 z( K4 l9 ]5 S
          }
4 a+ ~# Q' }! x- i) D# |        i=nCount-(10000-CurTim);9 g0 J3 y  v6 d
        while(MilliS<9998);5 Z) W0 z' d' Q$ j
        while(MilliS>=9998||MilliS<i);   & v3 V# D) x9 V4 B/ N6 E" j
        return 1;
$ n% @# q' S7 ^; }: \# ]' N     }, Y  q1 ]1 Y' \6 G
  delayS(nCount/1000);
1 [7 k; Y7 a& F$ u  n! P) p  delayms(nCount%1000);
8 T6 p4 o" v& c# f8 h& \4 A9 ]  //while()" B1 v" ~0 A1 a  t2 c9 T
  return 1;
* H6 }3 L) [8 M5 r}
( E$ ^5 d  l8 H
, E$ V: ~$ U* C4 U$ o- @& G9 Xu8 delayS(u16 nCount)! _8 b6 [' h6 l
{7 S# f* R) m3 P2 N- ]
  u16 CurTim=Second;" F0 E' v. ]5 [# C9 W( H( s0 j% e
  u16 i=0;
$ q$ A6 y8 M/ s# n. I  if(nCount<6000)% i1 Q  K. R/ S$ A
     {- X& A/ g8 \# s1 X1 P$ Z8 t
        if(CurTim+nCount<60)$ ~, G3 \) y" q$ }6 \3 _& j4 R
          {  while(Second-CurTim<nCount);return 1;}
6 U! k6 e& g8 H3 f* [        i=nCount-(60-CurTim);- {+ r2 O* ~7 e" L
        while(Second<59);5 u1 D" W: b$ N3 z: t! ^) T1 q
        while(Second>=59||Second<i);( M( R+ G% m6 F6 [2 h1 a+ ~
        return 1;
4 t4 V! a; q. f     }/ J& y0 Q4 X* z: Q2 h) ^) ~( F+ W  w
  return 0;/ h, v3 D4 u1 E; L! O
}
- ^) d8 I) c2 T
) y. p( q7 x- _, z. R
这里我做的毫秒延时中实际最长的只能计算60000ms 即60s的延时 再长的延时就会先调用秒延时,运行完后再把剩下的毫秒延时运行掉。所以超出部分将计算越出计数器最大计算值多少来计算i=nCount-(10000-CurTim);而中断中定义的技术最大值10000 原因是一般我们使用延时都不会太长,最长一般也就数秒而已,更多的是毫秒级的,所以这里放宽至10S 的长度,直接等待值到了就推出,所以10S内的延时延时还是非常精确的,但如果大于就会有几个微秒的差距了,中间插入了好几条运算和指令,非精确定时就别用这个定时器了。

/ e' v/ @; Q$ U8 S; g' Y, T+ z
收藏 评论1 发布时间:2015-1-6 11:13

举报

1个回答
qianfan 回答时间:2015-1-6 13:14:34
这样是不是太麻烦了啊,直接让无符号的ms++就行,32位的无符号数溢出之后需要几十天呢

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版