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

时驱函数了解一下

[复制链接]
GKoSon 发布时间:2018-7-20 18:03
自己整理了一个功能模块,名字叫twinkle* t  q- p+ |6 Z+ }
/ g' v: S! E. g: K$ l
时驱函数这个词语说不清楚  我在一份头大的代码里面看到一个中文注释。6 [% A% {7 V  g

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

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

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

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

0 ^8 D6 @0 P; F" ]8 n. x

* U1 `4 u& K0 |' P' s% \! l
  1. #ifndef _Twinkle_H_9 Q% j/ [6 O3 X+ J+ o5 \
  2. #define _Twinkle_H_
    5 _8 J3 C( D% l, ~1 L& t2 w
  3. " h- A: u5 ~( P3 s6 I& L
  4. #include "sys.h"/ {+ z7 Q- F% @

  5. 7 x# i* D; Y: X2 L% V7 H
  6. typedef struct; Q) ^2 Y4 A) r! `4 x* Q
  7. {
    , ?0 K2 M7 |$ r3 Q& M4 z$ X
  8.     uint8_t         pin;' D. p& [* N( y
  9.     uint32_t        timeCnt;
    ' f) {  G, n7 K; n+ j8 g
  10.     uint8_t         mode;//
    + d: a( m% H/ R( F' D/ \
  11.     uint8_t         openFlag;
    . @3 Z6 m* Q+ o" v* i4 m
  12.     int                 cnt;9 f7 N6 U, @, A
  13.     int                 flashCnt;0 c2 i- [) R" g' D! Z7 B8 g# l
  14.     uint32_t        delayTime;//5 v0 V& Z0 F% C4 a/ G6 C
  15.     uint32_t        openTime;//
    ! @6 L" \0 @4 V7 `& D4 o' k
  16.     uint32_t        closeTime;//
    ' E) Z  l' ?1 n, o: a9 g; D! W- H8 p' j
  17. }twinkleType;5 n1 o3 D& n9 h( k+ p! p

  18. 7 f2 F% u" P$ {3 P% a' B$ L, s8 _
  19. * x* c7 |. K: ?, B6 g

  20. 6 a$ P+ R( J1 h; p; {0 _. @1 u
  21. typedef enum
    : `1 h9 f9 Z( Q. r
  22. {
    * t7 {" _- c& P  U" ]; A. b% F
  23.     BLINK_OPEN_INIT,
    - ?9 j; O, b, d" ~& u' Y
  24.     BLINK_OPEN_DELAY,) r2 l# c3 i  D& }8 B
  25.     BLINK_OPEN_NOW,
    6 X/ d% J) h, {* f# c
  26.     BLINK_OPEN_ALWAYS,+ G! X0 s& F! ~% s) g9 D
  27. }TwinkleOpenType;; y+ F" }9 S' ^+ X- T
  28. . y6 I  \" I8 I6 A
  29. 9 f0 G7 w+ m5 @& q% g
  30. void twinkle_timer_isr( twinkleType *p );
    , e8 \" @1 I' R/ E8 L2 `4 r& I
  31. 4 _2 Y- m+ i+ B1 \: {6 O! s( o3 {5 o
  32. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime);
    : ?. L& @2 E0 W0 I/ o
  33. " {. b) _! Z5 z* \. X6 L) W  |
  34. extern twinkleType    JustTesk;
    1 T& `6 e- v# ?2 k+ P
  35. 2 u. i/ Y' W9 z4 m7 B' z
  36. 4 M/ T1 ~) o6 o* `3 D
  37. #endif3 F9 S" O1 b; R% I1 ^

  38. / X- l! g6 V8 F" Y( [
复制代码
  1. #include "twinkle.h"
    5 T1 O" w+ e# D8 |* r+ M

  2. 6 d4 a" s! _2 h7 o: P7 G2 T  j
  3. #include "Initialise.h"
      B7 ~7 n- h9 w1 l7 d, c3 s7 G9 B
  4. 1 w; \& m( D5 J/ m+ h& j
  5. enum, ]5 Z; ~3 k" w  l1 t, J
  6. {& {- S( t' y9 v4 B2 b  `7 n
  7.         FALSE,
    ; S# m. _' |! @+ t; u5 ^& L
  8.         TRUE+ I5 P& T* l5 m4 e& v! `
  9. };
    6 W% ~4 q  s$ z% A" c  W
  10. " G8 Z) F% Y( u  C( W! W% w
  11. twinkleType    JustTesk;( |. z) q* ^1 e* _0 [) K
  12. 4 ~1 G3 O7 c4 K
  13. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)6 q$ z. d2 a. ?0 ]% p, |! `
  14. {' B" @/ o; e& ]7 f7 L6 a
  15.     p->timeCnt = 0;! s) a. r% F6 L# \8 [% t; O
  16.     p->mode = Mode;
    ! [. }2 j3 i& \$ d# T+ j
  17.     if( p->mode == BLINK_OPEN_DELAY)
    ; [, @. z1 c7 q. s4 s) T  g7 D
  18.     {  4 B( C0 X7 n$ m7 N% N- a! g7 B2 Q$ `9 Z
  19.         p->openFlag = FALSE;. n; v# ~, J9 f. V  [' s
  20.     }
    0 m8 g; s# _  l8 j9 w! ]+ Q1 `: R
  21.     else
    % F3 ]+ \; E& D2 Y" t( K
  22.     {% I; R2 E) L  p
  23.         p->openFlag = TRUE;
    : i' a/ q0 j; Y4 Z! }* |
  24.     }
    3 N4 f  K( r, w& P: l- v7 e2 f- G
  25.     p->cnt = 0;
    7 _/ C1 F# ?( ]8 D1 q
  26.     p->flashCnt = OpenCnt;' _, c' A$ `! E' u/ F. {- \6 q% |
  27.     p->delayTime = DelayTime;
    1 y! b0 b, S* g- p4 v6 R
  28.     p->openTime = OpenTime;
    2 I0 o* R/ n( ~) W2 C  X
  29.     p->closeTime = CloseTime;
    ' ?' c% K& O3 [, c% u/ K
  30.       
    - X% O0 o" e* n/ v! C0 a
  31. }
    # r2 @# E9 ?2 n  f7 B" P& a
  32. ; n$ \! T8 v: g' v
  33. void twinkle_timer_isr( twinkleType *p )
    # d& }/ R: P' d/ N1 w
  34. {+ C' L" }5 Q6 j2 J6 J
  35.     if(p->mode == BLINK_OPEN_DELAY)
    2 d) T! |7 N1 d1 d3 ?2 z, H
  36.     {
    # C9 V) u7 q; R/ @$ d
  37.         if(p->timeCnt++ > p->delayTime)+ n( N1 `4 Y2 Z. t* m2 @( p
  38.         {
    3 j6 U% W: Z* u8 S
  39.             p->timeCnt = 0;: C% }8 h& M1 n  J3 M& Z
  40.             p->openFlag = TRUE;
    ) o+ E0 s7 S) ?) ^
  41.             p->mode = BLINK_OPEN_INIT;
    7 n$ o' S! s0 d) }5 ], J  k  G
  42.         }/ p9 p2 `8 A$ d+ q
  43.     }
    0 v" |9 j  M" r  L6 G
  44.         //上面的是扩展功能 主要是下面//        - c0 O; J' {) c
  45.     if(p->openFlag == TRUE)( C, r" U1 j) ]$ p, _9 P
  46.     {
    9 P1 b0 a( a. n( ?1 E0 ?
  47.                         if( p->timeCnt ++ < p->openTime)
      a4 T2 G  [8 C8 c8 F7 `9 G" K
  48.                         {
    7 O( }5 _/ U. c% j- D
  49.                             //pin_ops.pin_write(p->pin , PIN_HIGH);4 |! N# I$ P# |+ y8 L2 q
  50.                                                         TS_LED1_ON() ;
    * }  A* f. ]$ ?
  51.                         }+ x% ~( E$ ?; v+ \- N2 u$ V
  52.                         else; m# z2 ~( [, a, t
  53.                         {
    . [) G% h! y+ V; }. g7 \
  54.                             //pin_ops.pin_write(p->pin , PIN_LOW);
    - p1 m$ z! D- ~: K
  55.                                                         TS_LED1_OFF();6 b. ^) T) M8 L* X, s, ]9 L
  56.                         }+ ?! n0 r# g% v. W7 W
  57.                         if( p->timeCnt  >   p->openTime+p->closeTime  )
    - U7 O4 L9 ]. j" |6 ?
  58.                         {# n  _. [% B3 Y& @5 P& ^% K- M
  59.                             p->timeCnt = 0;
    7 Z3 `2 K- T3 V* v8 P0 d. a
  60.                             if( p->mode != BLINK_OPEN_ALWAYS)/ u" i6 L  h* S$ c2 m
  61.                             {
    & _: a2 V" m. h9 {
  62.                                 if( ++p->cnt >= p->flashCnt)
    3 X6 o0 q2 B3 l# |' m: y
  63.                                 {
    ! O* i. W: ?* a- J
  64.                                     p->openFlag = FALSE;
    . y3 L9 u6 L- V) g# ~7 |
  65.                                 }8 k* v. W8 i+ D3 o8 A  o/ m
  66.                             }- |" y9 a( y' |1 ^* Z$ L" A/ P
  67.                         }6 P. A1 I' x& u
  68.     }    . a3 Z+ v8 a/ ]. Y; R) \
  69. }
    , k# x' c# z( D" ^1 K. \! H" Q
复制代码
用起来还是挺方便的。
  Z  }5 F4 e$ C
4 T- B$ W2 k! c5 J$ E. Q5 E- P. G0 h- ?+ Z6 Z8 L! P

' R4 I3 i* y6 [+ v上面的代码中为了求简单直接在OPEN时间做开灯 CLOSE时间做关灯 方便测试。
9 P6 n+ H" t5 S7 T7 A最后是我自己画的图,理解蜜汁方便。
" o, ~. V" j7 P  U QQ截图20180720180245.jpg 0 \8 y) T% E6 P+ 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版