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

时驱函数了解一下

[复制链接]
GKoSon 发布时间:2018-7-20 18:03
自己整理了一个功能模块,名字叫twinkle$ k$ {: W1 I* s' z/ ^; ~2 G, h1 r( ^
/ B8 Z6 B2 ?) x4 c: B
时驱函数这个词语说不清楚  我在一份头大的代码里面看到一个中文注释。7 j+ q" l3 [/ M" v. ]" c

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

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

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

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

6 i; J4 b0 V) R; Z$ ~5 H

) h1 b+ Y: M9 {2 _. a) ~
  1. #ifndef _Twinkle_H_9 [* G# P: _& c" S; c
  2. #define _Twinkle_H_* P- V3 y4 {1 ?* g0 f; |0 [
  3. : i4 }, C. W& e8 r% Z' V3 L& y
  4. #include "sys.h"* M8 h. F7 l8 R5 V! n

  5. - _- t. W* \' u' M, V0 E
  6. typedef struct
    ( l( F4 v( S9 ?& Z) e
  7. {
    & q/ L) ~# c9 x" @8 X) n. g% ]
  8.     uint8_t         pin;. _% k+ ]5 x5 e0 k, X5 Y. ~! i
  9.     uint32_t        timeCnt;
    4 V. x. \% B& |& `
  10.     uint8_t         mode;//
    - k% e. l; D4 a" f( q
  11.     uint8_t         openFlag;) p, |# f8 T; n
  12.     int                 cnt;
    5 j6 Y( D1 j4 Q( B% o. t% ~# G6 f
  13.     int                 flashCnt;7 z: F' n4 ]) P
  14.     uint32_t        delayTime;/// y8 N, {8 w6 q- e. d% h8 k
  15.     uint32_t        openTime;//' {4 t5 _, N0 |5 i
  16.     uint32_t        closeTime;//
    9 h3 ?% @; l+ P
  17. }twinkleType;
    5 |. O0 p+ X- t( Y7 C) i
  18. 0 H& Z" ~. o, y: f
  19. - l$ Q' ]! H. W: ~5 ~6 G
  20. 4 B. L5 d6 N3 g
  21. typedef enum
    3 ^4 H# f& G% w$ p4 [, i
  22. {( ^+ g$ m3 I# U
  23.     BLINK_OPEN_INIT,
    . l4 N- t8 Q5 P5 A& ^$ ~- {* c/ w
  24.     BLINK_OPEN_DELAY,
    , K# a7 |$ {+ P
  25.     BLINK_OPEN_NOW,/ L6 O' ]8 {6 S/ f1 o$ U
  26.     BLINK_OPEN_ALWAYS,( W6 W! \" a9 j4 J
  27. }TwinkleOpenType;$ w- I* l- Q# O" B
  28. : `: U- w/ R. F4 k$ i% F$ w

  29.   L' b. Y8 {: s. M' N* l
  30. void twinkle_timer_isr( twinkleType *p );) K( e7 d% j) `+ T

  31. : c' P/ [) q( K# }3 |
  32. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime);
    9 p5 L4 }4 m! ~0 S) V$ h

  33. / C6 n. o1 r: Z7 G( w/ W9 N
  34. extern twinkleType    JustTesk;
    3 z$ r: ~1 f5 O( e; i+ z- j
  35. ; Y% W& y9 t: t, ^( z8 ?4 o

  36.   x9 Y3 B2 m1 ]! _4 A1 F$ I
  37. #endif7 T+ t3 O- d, O- R" T

  38. , m, ^, Y: m0 o3 F# n
复制代码
  1. #include "twinkle.h"& ]0 i+ u% c* A" q  k' U7 C
  2. - a: r$ a6 G. x+ K6 j$ W+ }
  3. #include "Initialise.h"
    . W1 j1 z* q8 W8 X: N

  4. 3 R* g8 T0 X7 u0 j' Y
  5. enum
    0 f+ ]; T6 |( p
  6. {! _% s0 Y8 B0 p7 [8 U7 P' ?
  7.         FALSE,
    $ }) I+ Z) ]* j6 F+ }9 x
  8.         TRUE( b1 `9 ^. X) n2 Z% L0 L
  9. };
    4 V% G) c9 l& {8 J

  10. 3 \. ]3 Y5 B; g- _$ Q8 d0 h2 H
  11. twinkleType    JustTesk;
    3 M( z0 f. I9 Z$ k% {4 ?2 m' P3 x0 G

  12. 3 G3 P5 s0 o2 c: M% B, d5 t9 h
  13. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)
    ; _& H" s2 \) u
  14. {
    & i) v) R. X- Z* ^( c
  15.     p->timeCnt = 0;* ]. {- P+ Q" _2 e3 d8 s; }4 C
  16.     p->mode = Mode;4 C2 Q8 T- y, f% @6 t
  17.     if( p->mode == BLINK_OPEN_DELAY)- D' U0 ?; S% l# x8 P
  18.     {  
    & G3 j! J( e% n/ T9 I$ ~
  19.         p->openFlag = FALSE;
    6 d3 x. M0 ]$ k+ T) j
  20.     }! n2 X/ w- Q1 H
  21.     else
    6 F; ]- m0 |7 @/ p5 l
  22.     {
    0 H) o6 u5 P6 \% @" H+ u
  23.         p->openFlag = TRUE;
    4 W, _5 U; T2 W1 Y5 |; G8 N
  24.     }
    " u/ J5 H& @  l! r/ d: |" w
  25.     p->cnt = 0;! b% f+ T5 F+ y
  26.     p->flashCnt = OpenCnt;
    ' Q! _7 f, {! _( S/ ]. o
  27.     p->delayTime = DelayTime;/ A2 ~& @8 }6 v; U9 v
  28.     p->openTime = OpenTime;( b$ G; Q8 e. Z
  29.     p->closeTime = CloseTime;
    ! f" k, \' _. h6 O4 H8 K
  30.         X+ K) _8 h% [: s2 T/ H
  31. }2 t' ]! C7 Y) S+ e

  32. / w+ O& ^6 Q# h7 I' H  q
  33. void twinkle_timer_isr( twinkleType *p )) q; }0 T0 S3 A$ V8 Y7 ^1 b
  34. {
    : K, W$ D1 k$ o% A9 N2 [" w5 d
  35.     if(p->mode == BLINK_OPEN_DELAY)
    ! n8 S/ Q/ }9 t' }$ ~* g
  36.     {' o& A6 K* E8 J+ f' X& }+ F3 `/ D
  37.         if(p->timeCnt++ > p->delayTime)
    / V- u* u: d* G5 m
  38.         {
    * S8 K9 _: E. g: ?7 q* D! x
  39.             p->timeCnt = 0;" W8 s# Y/ O- V( V+ @
  40.             p->openFlag = TRUE;
    & q. K& D5 z* V5 P$ u* [; h
  41.             p->mode = BLINK_OPEN_INIT;9 J) j/ L( \) n7 V0 o
  42.         }, Y4 q- R: @! Q7 a$ K
  43.     }
    2 B' P- f6 e4 X1 ~+ h
  44.         //上面的是扩展功能 主要是下面//        1 U, j3 T" F' F- T, \
  45.     if(p->openFlag == TRUE)
    + o8 o- d0 N3 F. q' j
  46.     {
    2 S, u$ z$ I' Y# [6 {2 }! M
  47.                         if( p->timeCnt ++ < p->openTime)
    , E* w5 {. y( H" _! v3 {
  48.                         {( Z2 h7 ]& G: ~7 x& p' p( n; [
  49.                             //pin_ops.pin_write(p->pin , PIN_HIGH);
    6 D' {  [& ?! l! b# _2 a' z: a
  50.                                                         TS_LED1_ON() ;
    $ x+ ^" N" Q5 }  W; _
  51.                         }! z, \' B/ U; V- U
  52.                         else* g3 V6 H3 D3 D2 h5 W6 |2 Y& I6 d
  53.                         {# W; J3 H7 A8 P, ]
  54.                             //pin_ops.pin_write(p->pin , PIN_LOW);
    4 l6 b& v6 G; J6 }; R2 s7 C# }
  55.                                                         TS_LED1_OFF();1 K) S# G, A0 X* f
  56.                         }
    7 K6 ^4 x* B0 a8 H/ D
  57.                         if( p->timeCnt  >   p->openTime+p->closeTime  )
    5 k) M3 c' b7 d( O7 P
  58.                         {+ D* `2 `4 f6 K& ~6 \
  59.                             p->timeCnt = 0;
    2 \8 w. T  Q! M$ X$ P/ H" G
  60.                             if( p->mode != BLINK_OPEN_ALWAYS)$ T+ s% A; U) S7 I9 @( \2 I. Q
  61.                             {2 u; R4 v7 n1 K  G+ k' k7 r
  62.                                 if( ++p->cnt >= p->flashCnt)
    ( a7 b" K  C' X& [/ ], C
  63.                                 {/ o! L; _& q! F
  64.                                     p->openFlag = FALSE;! l) u" A, F9 t: |. C; b
  65.                                 }
    ; j; r( N2 d- b/ Q4 I
  66.                             }
    : \* a- R- l% I4 K( d7 a$ Y5 F
  67.                         }
    " A0 J9 t8 r4 r* w) q- F$ p4 M! J% C
  68.     }   
    ' F6 x) D7 `' S; i2 g0 _" R+ Y( j
  69. }" ^: l) u3 q' a5 {! i
复制代码
用起来还是挺方便的。" f; c1 {- L+ l; s( s# J  M7 m, p
) Z, W( b+ a- S
* ~6 i# T* F  m/ }8 \4 B6 @

) c9 B5 C; Y! O% K8 j上面的代码中为了求简单直接在OPEN时间做开灯 CLOSE时间做关灯 方便测试。
/ @( n$ d5 s  A3 e: u最后是我自己画的图,理解蜜汁方便。
# x) Y& H$ Q! m0 T2 o. f# Y* V3 h QQ截图20180720180245.jpg
& D" u$ V/ \# D, a  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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版