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

时驱函数了解一下

[复制链接]
GKoSon 发布时间:2018-7-20 18:03
自己整理了一个功能模块,名字叫twinkle
, v* s, l6 }; \
3 M1 [/ L3 R  P) q4 h! {0 d
时驱函数这个词语说不清楚  我在一份头大的代码里面看到一个中文注释。( P$ e  g' b. {' `9 }

应用是 比如控制LED灯一闪一闪(好像没啥难的)包括闪动3次以后停止

比如控制蜂鸣器 需要拉高在拉低,就像LED闪烁一样,需要控制电平高低和总次数。

twinkle 本质是一个前后台程序,后台是时驱函数,前台程序是给后台丢配置参数。

时驱函数是需要放到定时器TIME的中断里面或者UCOS的任务里面周期性调用的所以叫时驱函数


' X3 b6 f" W$ d7 M; c2 @
) Y; @; r" s! W0 |, i7 c: j
  1. #ifndef _Twinkle_H_
    " ^, F- h4 R: N( z2 I. T, a
  2. #define _Twinkle_H_
    $ S. J" B6 I3 b; q
  3. 6 Y, n' y4 I1 \
  4. #include "sys.h"7 g. a: @& s1 M; `
  5. * [; D9 p  q7 m1 H7 G. X
  6. typedef struct% N9 T8 H6 H( M7 `* @9 p9 e
  7. {
    # \- X$ p+ u% z6 T% ^- P5 ^) b, K
  8.     uint8_t         pin;
    0 P9 K) ^- W5 V% k0 ]+ A; m
  9.     uint32_t        timeCnt;: B( Q" @' k; v  P% y( z, e9 u. m
  10.     uint8_t         mode;//* D5 m2 D! K$ _9 c' V" [) k' v8 _3 `
  11.     uint8_t         openFlag;
    8 `$ ?4 k( f9 O* g$ m
  12.     int                 cnt;
    8 M5 `5 t2 D" C2 ^* K# S6 g
  13.     int                 flashCnt;
    4 N% T  [& U1 g+ [% ^  i6 l5 y
  14.     uint32_t        delayTime;//
    # S9 l9 K& Z# m4 S2 O# D" \
  15.     uint32_t        openTime;//( c/ ^$ m- d! _. G& c- \
  16.     uint32_t        closeTime;//& q$ s, g% U3 G* g; R% d
  17. }twinkleType;1 \% W& {7 @, ?# Q) b$ d
  18.   p& U, a7 T" R

  19. 9 \+ @5 d. L. u9 k+ J# x* m0 @

  20. 2 _) K! j! M, c! x
  21. typedef enum
    " |' O9 r# J) N# s& N
  22. {2 V; z% a# P8 D6 H4 z* F
  23.     BLINK_OPEN_INIT,
    3 g/ X9 b! n' c: o3 F0 l8 z
  24.     BLINK_OPEN_DELAY,0 O! E7 t4 b$ Q0 S7 Y
  25.     BLINK_OPEN_NOW,& i! I# V, H; I& s
  26.     BLINK_OPEN_ALWAYS,
    : u: b7 P; O5 A# n
  27. }TwinkleOpenType;  r% d) H/ }: i2 L8 d
  28. % e& y. ]- y% Q' h# n
  29. - `2 h3 H/ N( E9 Y0 x: ^" p
  30. void twinkle_timer_isr( twinkleType *p );- f: P( F# i: K3 t; D$ f5 _

  31. 1 P- H, l: X' j( f
  32. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime);  o7 i+ b% R2 z3 g& p2 ]6 y

  33. + c" ^8 a; X1 l) c0 X5 \) z
  34. extern twinkleType    JustTesk;8 `8 h; y: @" ~0 S) g

  35. 9 t$ p1 C5 p, P4 f
  36. 0 B3 Z: T, c; e
  37. #endif+ s+ `  b8 M0 ?

  38. 7 o/ v7 _# ~' b
复制代码
  1. #include "twinkle.h"6 }7 U* ^3 p$ A* j7 T; ~- n! T
  2. # v5 r9 P9 Z2 P4 |/ S5 @
  3. #include "Initialise.h"
    1 u5 R( g) R/ f# |6 }% u. ^

  4. + O7 k. e- O: g0 G4 Q
  5. enum4 a, H) L7 |0 j4 h$ w: }
  6. {
    3 K# U4 _9 H0 o
  7.         FALSE,
    9 Z. u% O# W8 T* C+ x8 S
  8.         TRUE
    4 d8 V1 j0 D# W& q7 v* ~
  9. };
    1 E/ F  ?0 Q( G' m0 n  z

  10. % f0 d) S/ k8 d7 ?' i
  11. twinkleType    JustTesk;
    0 n9 |. z4 i6 w
  12. # q! T/ M1 d9 T* a2 a% c
  13. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)# K4 ?8 G5 p7 V7 Y& c* x
  14. {
    2 P5 S- o: Y( d3 o
  15.     p->timeCnt = 0;- m: w9 g) e! \+ K' h- r) ?
  16.     p->mode = Mode;' N$ A& H8 E1 N' ^) ^# o
  17.     if( p->mode == BLINK_OPEN_DELAY)
    . H( l9 J, w5 s; y) Y! f
  18.     {  % v9 I; z4 O" w4 j5 R' M
  19.         p->openFlag = FALSE;3 v/ M- i" [; ?4 }5 _
  20.     }, z0 l* ]/ l- H
  21.     else% ]8 w5 z' [+ \: r# u2 a0 q! Y' g
  22.     {7 B" X% p7 d2 E5 n, e5 [9 j* O
  23.         p->openFlag = TRUE;1 M5 Z  s& K# ]
  24.     }
    ; ~8 E; E& B0 P  g* r/ ^) t
  25.     p->cnt = 0;
    + R' C5 i! d2 l6 w; K2 f0 i
  26.     p->flashCnt = OpenCnt;. |: J* a4 N. y6 [4 g, {4 h
  27.     p->delayTime = DelayTime;1 w. O8 G) W- F9 l
  28.     p->openTime = OpenTime;
    1 ?8 C* G; D' I6 r3 k
  29.     p->closeTime = CloseTime;
    ; l6 G' d, P9 ^9 Q
  30.       
    5 j1 J/ n2 j, ?0 p
  31. }4 |7 b5 u6 `; D2 V5 r

  32. 4 t0 w5 O% ?1 f, _  \" S2 V; T
  33. void twinkle_timer_isr( twinkleType *p )
    . z, H7 B' `5 J3 X/ b
  34. {0 E# u" |, T9 A
  35.     if(p->mode == BLINK_OPEN_DELAY)1 w6 c( Y! B6 Z. Y% j2 e
  36.     {! _, w' H# F- _
  37.         if(p->timeCnt++ > p->delayTime)
    & c5 j/ R% x7 r; U! }; V1 m( o, ~
  38.         {
    ) T- s) A. i/ m. G9 |
  39.             p->timeCnt = 0;
    ; x) `; s2 |: I
  40.             p->openFlag = TRUE;
    ' `  B8 |1 k4 U: h5 O3 m
  41.             p->mode = BLINK_OPEN_INIT;
    # L- N& n  E* F" ]/ _% S# _
  42.         }6 r$ J/ D" h8 c6 H( L% ?7 e' n6 T
  43.     }0 R8 T8 G5 h9 S: p6 N2 u# T
  44.         //上面的是扩展功能 主要是下面//        5 h$ l6 X2 w$ i# Y; g3 z% v# {
  45.     if(p->openFlag == TRUE)
    3 _& B8 W$ b9 `# e; x4 [# s- n
  46.     {
    1 r+ C6 N) c7 i6 E0 o4 r
  47.                         if( p->timeCnt ++ < p->openTime)
    " E# C) ~; g; a# U8 z
  48.                         {
    6 K  R: g3 ]  S! {, t( u" ]5 U6 j
  49.                             //pin_ops.pin_write(p->pin , PIN_HIGH);7 P1 }% `7 P5 \/ w: h
  50.                                                         TS_LED1_ON() ;
    ' k  z' _  S* H* w( s
  51.                         }
    : M% c, l6 |7 O8 o4 v4 I( A# m. b; L& J
  52.                         else
    ( w+ J# e) J2 }# V5 s9 r' ~9 l% b
  53.                         {
    ; ^! K% |, h' Z( \* v
  54.                             //pin_ops.pin_write(p->pin , PIN_LOW);
    / I2 i' g+ U" F/ W  |# R
  55.                                                         TS_LED1_OFF();
    " s, ?/ j( d4 c$ \( u/ }
  56.                         }* m" Q' h8 E/ B# B8 |% v
  57.                         if( p->timeCnt  >   p->openTime+p->closeTime  )
    2 E& `# L8 s, r6 q1 a% [
  58.                         {( w1 g4 ^) G, P" j% H; G
  59.                             p->timeCnt = 0;
    % E2 d( Q' V% Z) Q( u, k" y: i
  60.                             if( p->mode != BLINK_OPEN_ALWAYS)
    ; }/ ~5 c; w" T8 s2 A& x
  61.                             {
    6 J+ r5 o* s' J7 n0 J
  62.                                 if( ++p->cnt >= p->flashCnt)
    6 }" q8 K+ u; s, m% y- |( J
  63.                                 {
    * q( f7 Z3 u! e+ z
  64.                                     p->openFlag = FALSE;& @! S" R- j6 \2 C
  65.                                 }- {2 T" ^) h: c6 ^4 V
  66.                             }& p/ B* P% s6 R3 c2 [6 n' Q
  67.                         }
    # n  x6 Z( A/ o# |. |; H3 l0 _
  68.     }   
    2 t. S4 b% e' w
  69. }& c. g) O) z4 r, h, G/ Z3 w/ O+ \
复制代码
用起来还是挺方便的。; t4 y* ~! `) z5 W* }

( i  s3 C) H& N
/ z( J+ x# }4 o  f6 s. n& z# V' T+ K
上面的代码中为了求简单直接在OPEN时间做开灯 CLOSE时间做关灯 方便测试。
7 F4 l0 A: ]* s; A最后是我自己画的图,理解蜜汁方便。
6 h5 a. F' k9 \ QQ截图20180720180245.jpg
/ b% w' ]8 |; j8 ~& Z' ?

评分

参与人数 1 ST金币 +10 收起 理由
creep + 10 赞一个!

查看全部评分

收藏 3 评论6 发布时间:2018-7-20 18:03

举报

6个回答
creep 回答时间:2018-7-20 19:19:22
感谢分享!
STM1024 回答时间:2018-7-21 16:12:29
你这笔记给力
西点钟灵毓秀 回答时间:2018-7-23 14:15:59
谢谢分享
xiaolingoei 回答时间:2018-7-23 15:01:50
居然有笔记,可以可以,学习一下
zwjchinayids 回答时间:2018-7-24 17:47:35
小伙子  字不错  
花落成尘眼泪 回答时间:2018-12-3 01:20:52
新手看了一个星期终于看懂了,感谢楼主

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版