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

时驱函数了解一下

[复制链接]
GKoSon 发布时间:2018-7-20 18:03
自己整理了一个功能模块,名字叫twinkle
  Q$ H. a9 D# w$ n; C  G
7 k8 o; B' z% ]/ R& M, u3 u0 W
时驱函数这个词语说不清楚  我在一份头大的代码里面看到一个中文注释。
& O5 |) m! T  C0 l5 P# V& j

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

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

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

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


! N7 }0 O2 b! \/ _
0 u- y  [# a8 y! h
  1. #ifndef _Twinkle_H_2 L: C$ n& U) }7 V9 a
  2. #define _Twinkle_H_8 N# R7 p1 w" x1 d% k2 \
  3. 7 i9 n- i. J2 b- B
  4. #include "sys.h") O! d- A3 S1 _
  5. & ~$ W. K1 x& u# c
  6. typedef struct( `- p2 X0 x' ?  g6 h# \4 D
  7. {9 E; m6 V, J: t% x! h5 z7 P! f
  8.     uint8_t         pin;/ B  E& Y5 `- p5 l: r8 z
  9.     uint32_t        timeCnt;4 T& `' H( m1 W4 A
  10.     uint8_t         mode;//
    , H' z+ S  n2 l7 z3 Z6 m. Q$ H
  11.     uint8_t         openFlag;
    2 I# w' k$ l, u0 B7 J: W8 }/ Y3 F& b2 r& C+ J
  12.     int                 cnt;
    & a+ d5 `2 M# Z5 m8 _: u
  13.     int                 flashCnt;
    & U  ~- t% w" y5 j' p
  14.     uint32_t        delayTime;//4 W, `; Y" V& H: L8 A4 V5 w
  15.     uint32_t        openTime;//
    ! k- w! L0 p: ~; |" t" w, X; i
  16.     uint32_t        closeTime;//! w2 @# S% v, f# L+ G/ a
  17. }twinkleType;
    " X* a6 d! Z1 l. \4 |) D; R3 o

  18. 3 |& a2 X2 _7 D* n* x+ H

  19. % z% _& x1 Q/ d- w

  20. 9 `" a8 O8 s: [( {- I! J
  21. typedef enum
    2 g! p2 P$ M2 |  h- g
  22. {1 B: Q2 k) u9 C" A7 k+ C
  23.     BLINK_OPEN_INIT,
    ( E: \& J/ G1 `3 K
  24.     BLINK_OPEN_DELAY,
    4 g, D1 C% S6 n# X. s9 Q* W* a
  25.     BLINK_OPEN_NOW,
    % l! Q7 z6 ]$ r6 [# L* B" E
  26.     BLINK_OPEN_ALWAYS,
    9 V* a9 ]  e/ P' s  h% g  ^3 N
  27. }TwinkleOpenType;
    . h0 K, a5 D- r$ W, @" a" h

  28. 5 ^5 `6 ^3 a" f" C% d, \3 z

  29. 0 W  |8 n+ L7 m, x. y
  30. void twinkle_timer_isr( twinkleType *p );; E  t1 ^' e' n# `
  31. , s/ u% U7 Y4 m+ Z" }- n
  32. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime);; n8 v8 w9 U% W/ d* l
  33. ' t+ Y: X6 g! P5 d5 W1 b
  34. extern twinkleType    JustTesk;8 r) E7 N; q3 T$ t/ }' p
  35. $ o4 _+ @$ E  q, Q+ H* v  g! V
  36. ! i/ I; E8 J* U1 ^+ g& B) i" U9 U, Y5 a
  37. #endif0 D/ A2 Q3 q0 i! _0 X# C! ?. o
  38. 4 M0 g- W- \" W2 o2 b/ x4 j
复制代码
  1. #include "twinkle.h"$ H# n5 ?! n: x9 @# K' q. D

  2. 3 A  k8 z9 F, M4 F
  3. #include "Initialise.h"
    8 `0 p+ Q" t! M% f& c! W# t

  4. ) ]; `4 ~& x# x1 h, ^* G
  5. enum
    & }; T+ G+ H- `1 q
  6. {/ [# J7 x2 U  M) u
  7.         FALSE,
    & M' _$ k4 M2 `+ V" Q6 S$ S
  8.         TRUE
    2 }4 ^, m, I  C2 n% n' _
  9. };, ?- q$ M; E1 `

  10. + ~1 i  {+ \  w1 z' I* B" n
  11. twinkleType    JustTesk;
    2 {1 X' w" r: |9 a1 c* G/ q/ C

  12. 1 v1 q5 H9 [7 y: |
  13. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)
    ; I8 x, P+ h. o  r- C1 r
  14. {3 {8 Y, Y( V! x+ k
  15.     p->timeCnt = 0;
    6 l2 R! ~3 @7 ?. J
  16.     p->mode = Mode;
    7 z0 I- m+ p) S$ H4 `4 T
  17.     if( p->mode == BLINK_OPEN_DELAY)8 r( O8 K: s0 I  U
  18.     {  
    - e, G/ b! f8 W6 ]/ H8 g
  19.         p->openFlag = FALSE;; S* e: u* e. L; R  ^, K* f
  20.     }
    # ^( r6 W9 D3 f
  21.     else
    ) Y( S' x9 k6 K/ F
  22.     {
    5 L" a. W+ L5 u$ a, t; Q
  23.         p->openFlag = TRUE;
    . A- [3 |# J  V6 c& X+ p6 l5 s
  24.     }
    * z; {; u/ I5 S
  25.     p->cnt = 0;
    9 W# A, V7 @( L- O. ~) v/ d
  26.     p->flashCnt = OpenCnt;/ V& h) h$ q: Z0 w
  27.     p->delayTime = DelayTime;- v. P( e" J0 w1 o$ O
  28.     p->openTime = OpenTime;
    5 G! d6 T' u  i/ x# W# J4 }
  29.     p->closeTime = CloseTime;
    3 t7 ~' S7 U$ l0 B2 e
  30.       ( ~7 ]7 J2 y/ F7 \$ I& }3 U( z( \% l8 n
  31. }  i- S6 g, a! p5 F+ f$ T
  32. 7 u* L( s7 z; F/ V) I$ g) r& q
  33. void twinkle_timer_isr( twinkleType *p )+ J+ x# \1 i( `) b* K: `
  34. {
    2 G. j% l6 U0 [, P9 X4 ^
  35.     if(p->mode == BLINK_OPEN_DELAY)3 v8 |. x/ C/ S! b& O  @3 E
  36.     {( B: B4 i% B0 t5 f# D3 M# a+ d: z
  37.         if(p->timeCnt++ > p->delayTime)
    ) R& b8 w+ B' k7 |4 T$ m
  38.         {5 }) N- A; F( E2 `& z
  39.             p->timeCnt = 0;
    3 ~5 F: h, o9 y3 E5 V) z
  40.             p->openFlag = TRUE;
    7 ]* V- H- i, ^- `
  41.             p->mode = BLINK_OPEN_INIT;
    7 f6 ]1 `  M3 I
  42.         }
    7 g& [# i# i# W
  43.     }; }& B% v! G5 p7 N% ^
  44.         //上面的是扩展功能 主要是下面//        9 J6 c4 a7 j7 a
  45.     if(p->openFlag == TRUE)
    & J4 J  t0 o' r
  46.     {& v* j6 P+ W9 U2 b6 M% v
  47.                         if( p->timeCnt ++ < p->openTime)
    1 p3 x2 g. u% s7 n- X
  48.                         {+ X, _) A& I$ ], n
  49.                             //pin_ops.pin_write(p->pin , PIN_HIGH);
    9 T5 [( N( Y; Q
  50.                                                         TS_LED1_ON() ;9 ?# Q/ T- }) S# @5 g  N
  51.                         }
    : e- V% O; L' p. F. n$ U
  52.                         else7 C, Y. A' L9 n* p! ]+ K# x! C
  53.                         {6 v) C2 R  [1 [7 T1 p
  54.                             //pin_ops.pin_write(p->pin , PIN_LOW);
    & Y( D( F& a3 c% M/ d; R0 q, q
  55.                                                         TS_LED1_OFF();/ l4 x' X7 J4 I# z( w! o# J+ d
  56.                         }
    % \- ^$ H; n* I- D
  57.                         if( p->timeCnt  >   p->openTime+p->closeTime  )6 i, H- v! [& r6 d; f8 ^
  58.                         {
    3 j& ~+ c1 i' z6 v- w
  59.                             p->timeCnt = 0;
    $ c0 e. ?1 {9 a* W8 i% Y7 Z/ \/ _" p
  60.                             if( p->mode != BLINK_OPEN_ALWAYS)1 K2 P- G3 P4 B! i" J+ {
  61.                             {$ y1 N2 }+ i- i7 G" u3 v7 U# P
  62.                                 if( ++p->cnt >= p->flashCnt)
    ! r, H  i% l& k5 c/ v
  63.                                 {
    0 ^0 ?! }" P. W0 G0 U' r% {9 t
  64.                                     p->openFlag = FALSE;
    7 g6 O9 L5 \4 r' F# P; d
  65.                                 }! a, {4 v: n0 L9 n- E, y( Z
  66.                             }  k/ w" q( u/ G" d7 H2 I2 b
  67.                         }
    - y# Y/ h( w: ]$ y' R7 F% l, o( F
  68.     }    1 ?$ ~" b" w4 f9 h, A
  69. }0 ?- t) {1 h# T+ ^1 O0 D
复制代码
用起来还是挺方便的。
* v2 v; M* [# c4 d& f0 F( W) I, w. ~' q3 J/ T

3 @; }8 a" s. |, P( r0 B
$ z. j" |- }3 _) A( r7 D9 {. R上面的代码中为了求简单直接在OPEN时间做开灯 CLOSE时间做关灯 方便测试。
( E% e6 h" R# H" P5 y. Q最后是我自己画的图,理解蜜汁方便。
4 U# R; P* [! R; n7 q QQ截图20180720180245.jpg
) a' I& L- h/ j7 w! U% [9 c

评分

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