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

时驱函数了解一下

[复制链接]
GKoSon 发布时间:2018-7-20 18:03
自己整理了一个功能模块,名字叫twinkle4 t- A  t- B8 V! W6 X: z
/ q8 y, [' G7 M
时驱函数这个词语说不清楚  我在一份头大的代码里面看到一个中文注释。
8 P6 D* n, k0 C3 @: L" v  Q

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

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

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

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


  W1 p1 u  `0 r: H* y6 W4 ]
# Z: x0 ~8 V+ g, |. C% t- E: Y
  1. #ifndef _Twinkle_H_
    9 A' v0 g9 C/ Q0 N! A
  2. #define _Twinkle_H_
    9 t+ ^1 s& c9 o+ F& l9 K# F

  3.   I- B" c1 A& Q. |2 e
  4. #include "sys.h"1 L" l# n  i  z  a$ o

  5. " c* d, u' N0 q! K9 G
  6. typedef struct
    ) Y: Z  H" N0 a  _# ]
  7. {
    % k! K9 Q5 n# ?& l3 K! A
  8.     uint8_t         pin;% {" A0 i7 `% ^
  9.     uint32_t        timeCnt;* o) E$ P4 n$ F; J
  10.     uint8_t         mode;//, R9 v4 z: w2 l4 z) l0 g. ^8 |
  11.     uint8_t         openFlag;
    0 Z1 H! h! d) W8 l. Y0 [8 M6 Y
  12.     int                 cnt;
    ' _3 q* d6 p1 R* J# D
  13.     int                 flashCnt;
    ' n7 G; O. X0 c
  14.     uint32_t        delayTime;//+ k& }0 L' A( q. \* ^
  15.     uint32_t        openTime;//
    & R" g) L' c$ D* }3 P$ x/ v$ `
  16.     uint32_t        closeTime;//
    " o" C/ F8 H0 c& d7 i1 a( m
  17. }twinkleType;# J& N5 O/ b' N, R
  18. & L% G: s) ]0 X

  19. / M8 s5 e$ v  g, L

  20. 8 }' s! `; t+ B- r
  21. typedef enum
    9 {# q% P3 h( h, z
  22. {& R) u% Z( S5 l# \/ Z0 E7 d+ i
  23.     BLINK_OPEN_INIT,
    - L0 B4 p$ j2 p- T. S
  24.     BLINK_OPEN_DELAY,
    2 d. U7 c- K: Z6 O& O! Y7 H
  25.     BLINK_OPEN_NOW,
    . p- E9 Y8 J7 g, d( x
  26.     BLINK_OPEN_ALWAYS,( w- d+ {; C; F4 s% Z5 m( J8 m
  27. }TwinkleOpenType;
    7 J# g: f: X9 P/ M  m

  28. , t; ]7 H$ v, Q2 b- `3 A" r
  29. ) q% G/ ]1 M+ {" h
  30. void twinkle_timer_isr( twinkleType *p );
    ; y2 S" J+ V9 J" ]$ D% P% ^8 G
  31. + w4 t; Q1 S* G& u
  32. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime);+ A( [+ \' t8 h% Q' H; P7 p+ W8 U
  33. ; M; u  T9 P/ a1 o4 q3 n( c
  34. extern twinkleType    JustTesk;
    4 r9 [6 d1 Y6 U. e$ D2 d% D: ]+ H
  35. 2 G2 Q& ^/ |& Z! w( }7 N

  36. % [0 M- T) u' u5 G# t3 z
  37. #endif/ f4 N8 ]  A. Q% e

  38. 8 W6 I$ y6 Q/ o  L
复制代码
  1. #include "twinkle.h"7 P- |; t0 [: a4 G2 F( T$ V% a- M
  2. 3 G# V' t% j/ s6 J" e# y
  3. #include "Initialise.h"
    4 t' E5 n: p  b, c# u+ O+ s7 k
  4. ' Q3 u; ^+ r9 R- W, u* A3 b* G
  5. enum: y, X% p7 n& q: G& p: J( H1 y7 R
  6. {
    * `4 i! |8 @* E8 f& a' B
  7.         FALSE,5 W( C! ?$ s1 s: u' b1 Y6 K! d
  8.         TRUE
    0 s) L$ Y6 H6 G6 \
  9. };" j7 C$ v3 S7 \( l' W8 {
  10. # k7 Q; d6 d; H1 _' q5 S" E
  11. twinkleType    JustTesk;
    1 n7 ?9 x1 i; M1 I4 t, ~, @
  12. 7 h8 V# H9 b6 j0 C6 w7 C. a
  13. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)
    - T2 R# c2 ?1 R- \* \
  14. {
    / F! ~! R& E9 u2 n
  15.     p->timeCnt = 0;
    ' R3 p; t$ Q6 \8 `* x
  16.     p->mode = Mode;; j, i$ m6 D4 f
  17.     if( p->mode == BLINK_OPEN_DELAY)0 u0 t% h) b4 u7 _
  18.     {  ! }  Z+ R. x9 O3 S9 c
  19.         p->openFlag = FALSE;! j9 V% K! w/ M9 m$ ~8 c# n
  20.     }! ~7 k8 G8 F4 H7 ]0 K
  21.     else
    1 s( l# r6 C' J( w# Y: E
  22.     {
    / K1 h4 K) L$ |- V
  23.         p->openFlag = TRUE;
    + F! D0 a4 F2 u- ]( q( u* v9 @! j8 [
  24.     }
    % e- W/ ]0 N: R7 u, }
  25.     p->cnt = 0;: O9 H3 h) l3 @) y$ [8 O3 i$ U: x
  26.     p->flashCnt = OpenCnt;
    ( Y$ k* R9 X8 s% C* {0 P
  27.     p->delayTime = DelayTime;
    - Y7 C2 I" {. s& d8 [5 M
  28.     p->openTime = OpenTime;
    6 B/ X' s0 y4 R4 e' e
  29.     p->closeTime = CloseTime;4 Y$ h3 O' U8 S; j: ~
  30.       
    # [/ _0 `  U  W5 s0 q: O5 I4 t
  31. }
    7 a/ e5 R8 v- j  G
  32. ) x1 [  ^( b; b) G1 f
  33. void twinkle_timer_isr( twinkleType *p ). `( w- x2 @# q) \8 S6 D! M
  34. {
    5 R4 R9 Y$ p; P) y5 D8 y
  35.     if(p->mode == BLINK_OPEN_DELAY)+ f8 f" f( v( q. i5 e7 W/ E
  36.     {
    * b& m  z6 V5 f6 q9 r& l
  37.         if(p->timeCnt++ > p->delayTime)5 Y$ D0 w0 N, E1 z& l# m2 `
  38.         {
    ' y  P+ d6 @: q: @% }
  39.             p->timeCnt = 0;) ]( ^: k1 f8 Z# r" Q) w; G, y
  40.             p->openFlag = TRUE;$ D! v5 {/ v8 O
  41.             p->mode = BLINK_OPEN_INIT;6 x/ J- M, z% F3 _2 d8 K
  42.         }( k4 V, e. Z; F8 q- a
  43.     }
    . b( A; f! R9 m: D8 v" }
  44.         //上面的是扩展功能 主要是下面//        ( e1 G( h) R, B* g6 k# O
  45.     if(p->openFlag == TRUE)
    $ ]- ?2 Z! h5 `1 h: O7 ~7 n
  46.     {: L) D1 v$ N7 }4 A" \
  47.                         if( p->timeCnt ++ < p->openTime)
    6 R; z! N; U" K* H) {& J: A- m
  48.                         {
    ( S* b- V3 J5 N' Z! B' S
  49.                             //pin_ops.pin_write(p->pin , PIN_HIGH);3 d! s5 y6 a# N3 Y
  50.                                                         TS_LED1_ON() ;
    : G+ \" W& b6 Y1 y8 G
  51.                         }
    5 n4 c4 N" W" T- I  k2 v/ s
  52.                         else
    / ^8 Z$ U8 q' S0 c% C0 y/ v9 I9 G
  53.                         {0 [; i& {. e9 V/ P* r, r  J, o2 T
  54.                             //pin_ops.pin_write(p->pin , PIN_LOW);
    " x* |" [5 ~% ~0 G2 c
  55.                                                         TS_LED1_OFF();" w- ^# Z0 H. b4 U; P1 r/ b" x9 B
  56.                         }" X; Z) w" X, v' l5 J9 K
  57.                         if( p->timeCnt  >   p->openTime+p->closeTime  ): C" F2 m/ W+ v7 S* I
  58.                         {1 p% ^' ^& U, T
  59.                             p->timeCnt = 0;/ Z  f" b7 X$ X
  60.                             if( p->mode != BLINK_OPEN_ALWAYS)9 J% O4 C) n9 ~
  61.                             {
    8 K  k4 W6 a6 \: `5 k4 ]4 u
  62.                                 if( ++p->cnt >= p->flashCnt)! g) Y) `& U' C: i
  63.                                 {* ^( g: Q$ p4 j4 [
  64.                                     p->openFlag = FALSE;- J0 L, n3 }2 L% w- \8 h% @$ b
  65.                                 }% q" E5 F2 i, p4 M0 B
  66.                             }
    : K9 H3 ~: X; r0 n( p
  67.                         }' [, B% a" u+ l) p" H' P
  68.     }    1 G5 x1 a- _- T! L! X. Q9 y, r
  69. }4 x7 x; _0 F( e/ p- \: g7 E
复制代码
用起来还是挺方便的。+ a5 E9 i9 l" S$ g

2 v0 c+ m  i( t6 D3 w  o: v# K2 ^/ r2 L* k
  T0 H! y4 v! X2 n, o
上面的代码中为了求简单直接在OPEN时间做开灯 CLOSE时间做关灯 方便测试。& X8 e1 G! \0 k- y. g
最后是我自己画的图,理解蜜汁方便。; Y+ G: T. `5 L  P: N; [
QQ截图20180720180245.jpg 7 D7 V! r  j9 i7 y) y8 C3 h

评分

参与人数 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 手机版