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

时驱函数了解一下

[复制链接]
GKoSon 发布时间:2018-7-20 18:03
自己整理了一个功能模块,名字叫twinkle
8 y& b/ g! @! D
8 B" k) d) b, c
时驱函数这个词语说不清楚  我在一份头大的代码里面看到一个中文注释。
0 a% R0 \/ M8 l0 e9 M5 L

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

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

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

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

& s3 N. q( n7 L7 B! C) D+ s

; n2 N. Q9 w, G: j7 Y5 \( n2 F0 T
  1. #ifndef _Twinkle_H_
    0 g5 w' j" ^2 U6 S, x
  2. #define _Twinkle_H_0 ?% _) |2 b5 e7 e
  3. 9 E% l% a+ W# |
  4. #include "sys.h"
    5 g% j8 v/ T4 P  S/ K7 _

  5. # S, Z# D& W" U! L# o9 K1 n
  6. typedef struct
    $ q1 y# a, W7 L$ |
  7. {
    8 r: a# v6 u2 w# O3 D7 A% W
  8.     uint8_t         pin;: p/ _: y& I) l
  9.     uint32_t        timeCnt;
    $ Z' u( ?+ {; M* ?+ w
  10.     uint8_t         mode;//4 I' Q( Y- X% J( c* ]2 V0 f* t/ v1 S
  11.     uint8_t         openFlag;
    " l& c9 V( s( q
  12.     int                 cnt;& i' x. V. T0 [. H
  13.     int                 flashCnt;
    " a: ^8 O' s- V/ L  Z) O9 T
  14.     uint32_t        delayTime;//) G, Y, }' m! j) `& ^4 A+ j
  15.     uint32_t        openTime;//# L( W- V; q  a  I
  16.     uint32_t        closeTime;//" t2 ?6 L3 T5 a' R* ~0 G
  17. }twinkleType;5 d8 J% q' H6 l5 G. m) o. R6 a6 H

  18. 4 Z6 W8 P% v* F* D
  19. ( {3 O. \+ [! h% M! f% h

  20. " ^  A5 B9 A1 K, x0 N
  21. typedef enum( s8 r1 s7 r$ V! H/ ]
  22. {
      Q& \4 F8 ?' Z4 l; y, I* B) M5 R
  23.     BLINK_OPEN_INIT,
    , ?! F8 ?7 ?5 s; q
  24.     BLINK_OPEN_DELAY,% R# b0 T' g. S, z/ x
  25.     BLINK_OPEN_NOW,
    6 i% S) j" q1 h4 `, {: n0 v  V
  26.     BLINK_OPEN_ALWAYS,
    ( c1 F. {" i- c% N/ s; e
  27. }TwinkleOpenType;% ?# D( u0 x  u' g
  28. ! y3 n7 P7 ?& w; v, j+ A

  29. + g) H& _4 z8 p
  30. void twinkle_timer_isr( twinkleType *p );6 ^+ y' @( @4 U
  31. 8 ^$ d9 j2 o; n5 U  f$ l
  32. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime);
    ' K8 [8 I, n  ~# [
  33. 8 K1 Q- o. c. C& h9 {4 Q
  34. extern twinkleType    JustTesk;
    : P! [* u( P% x) |

  35. " u' R+ {7 L. j8 S9 q' G' L
  36. 2 x# E" l; J$ S( \
  37. #endif
    2 T1 M  c+ U4 H4 i) _" D2 z9 {
  38. 2 W, R* y1 \7 E/ N) @) Q
复制代码
  1. #include "twinkle.h"& h/ A4 ?6 ~& `+ R: e1 C

  2. 1 c  @& o( [% p6 F$ r
  3. #include "Initialise.h"
    ' v6 S6 B: x! R- q
  4. * j# F  I& _& J9 a
  5. enum
      l  v( [! P) h- i2 l% T
  6. {1 R/ n/ e6 s+ H8 X/ F8 E, w1 O/ T
  7.         FALSE,
    . q; ?: e5 i1 z4 K8 o8 p
  8.         TRUE
    6 E4 a& f+ l2 ?# `1 L. a
  9. };
    - O; ]  Z7 [* q
  10. # ?0 A3 r5 N  f
  11. twinkleType    JustTesk;& l- C2 w! a/ r! u2 @
  12. 6 ^6 a6 J0 m$ c7 x
  13. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)
    * [2 Y0 k5 q5 n( c
  14. {
    6 O4 T& M. j( W( M
  15.     p->timeCnt = 0;3 @7 T3 ]5 [% @, B$ L+ F; ?
  16.     p->mode = Mode;
    7 y2 x  G4 F0 f, b  N5 Z
  17.     if( p->mode == BLINK_OPEN_DELAY)
    1 O7 ]# L. b2 j- e' p. }
  18.     {  : s1 l4 v8 Z, n: I
  19.         p->openFlag = FALSE;
    0 }' K* ~% A4 `# H
  20.     }
    , p. H4 i" l& M* }0 [! T7 u
  21.     else
    3 y9 p- ~+ [/ W- |8 A5 r& W
  22.     {
    3 o/ U1 K" [: t: ?) e9 S! P
  23.         p->openFlag = TRUE;- r/ s. H; ]+ U. O0 k) n5 G
  24.     }
    , Y6 _: y) e4 X! {1 g. i
  25.     p->cnt = 0;
    . A8 k; ~, M" l6 X8 U; q
  26.     p->flashCnt = OpenCnt;
    0 Z9 o  |+ E' |, h1 l7 b: I; L; E
  27.     p->delayTime = DelayTime;6 ?5 t, P( g% Q6 O$ n
  28.     p->openTime = OpenTime;
    : D4 s7 w0 O  ]+ V0 ]
  29.     p->closeTime = CloseTime;0 ~; Q  ]3 W* _0 i% G1 t
  30.       1 X# Q- @% {/ _7 I& W0 _4 O
  31. }
    . u' S: }# ?& q* b# f; H1 _: V
  32. 1 I9 |+ H; B  a$ o% Y
  33. void twinkle_timer_isr( twinkleType *p )3 _# u- J9 Y3 ]% h0 t; x" [# x' I" Q
  34. {, D, R( P0 k; L4 b' Z& A
  35.     if(p->mode == BLINK_OPEN_DELAY)8 K- X4 i2 ]5 H0 I2 J) E7 [
  36.     {
    $ d! ?7 X8 o  N7 T' O, y
  37.         if(p->timeCnt++ > p->delayTime)
    1 c# K4 ?2 M( C- r' v# m
  38.         {1 n( w, f2 j6 U) ^
  39.             p->timeCnt = 0;/ s2 q2 Q. T- Z% H$ C) ~
  40.             p->openFlag = TRUE;
    5 o- p' i. @) L& c) R
  41.             p->mode = BLINK_OPEN_INIT;. v6 k+ |: t( V$ W& P# D7 D# g- ?
  42.         }
    8 C2 b; R4 z$ c+ h& d$ z( D7 `
  43.     }( e7 S; x6 j0 i$ x
  44.         //上面的是扩展功能 主要是下面//       
    9 c! R# B1 Z8 o# Q
  45.     if(p->openFlag == TRUE)
    " I( r' o$ [( Q3 ]% r7 S& S) u
  46.     {+ q4 x' [) ?% G' ~( e0 q$ }
  47.                         if( p->timeCnt ++ < p->openTime)3 V. G; O1 @8 H. h
  48.                         {* n# E. F7 y8 Z
  49.                             //pin_ops.pin_write(p->pin , PIN_HIGH);$ z8 {3 k# W6 _  s% ?, A
  50.                                                         TS_LED1_ON() ;9 Q; j) q7 J% t4 T& X8 z
  51.                         }3 {9 W9 y7 {, J+ h! l
  52.                         else$ t0 q* i* g* E
  53.                         {2 S/ B5 P: h' u
  54.                             //pin_ops.pin_write(p->pin , PIN_LOW);
    " l6 ^) i. K) u* S; U% e' ?: O
  55.                                                         TS_LED1_OFF();3 n) @- P$ Z4 S* l3 o4 p. g0 \9 w. P
  56.                         }
    : {# ?8 {0 b( B9 s+ F3 B, b
  57.                         if( p->timeCnt  >   p->openTime+p->closeTime  )" g) U/ \8 i7 @. V) P% S) }! x
  58.                         {1 D# |/ a% z5 P  Z  c
  59.                             p->timeCnt = 0;
    * W( ~' q5 \9 w
  60.                             if( p->mode != BLINK_OPEN_ALWAYS)- s0 b* [0 x+ D* v' t$ L
  61.                             {9 L4 O, K  p/ m' E2 w
  62.                                 if( ++p->cnt >= p->flashCnt)8 G8 D8 I7 G8 {: x
  63.                                 {" n# @1 g0 B+ P7 E3 I7 B" r. |6 N
  64.                                     p->openFlag = FALSE;
    $ f1 b- |8 ^0 u
  65.                                 }4 L  ^* b% e4 B* [. i$ b
  66.                             }
    6 h' f0 u, x. v
  67.                         }* @  [+ c4 i* ~9 u9 y; r
  68.     }   
    * Z  C8 a( ^" |8 @+ z& R$ ^+ ^
  69. }
    % z$ E, i+ J, j
复制代码
用起来还是挺方便的。
: {# \, s( D3 d" v* f# r  o. g' b  k' _4 y! D

& x9 {  B2 p) f% L  i6 c9 N
  t$ p/ ~- m, h上面的代码中为了求简单直接在OPEN时间做开灯 CLOSE时间做关灯 方便测试。  @! b$ [8 z7 a( ~
最后是我自己画的图,理解蜜汁方便。9 n# k: L' G, k$ F/ d; v  }
QQ截图20180720180245.jpg
. V+ B. J" |& w: H. e

评分

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