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

时驱函数了解一下

[复制链接]
GKoSon 发布时间:2018-7-20 18:03
自己整理了一个功能模块,名字叫twinkle
8 r& R+ J4 k8 u: v0 B' Y7 O. E, U( m

$ [* a5 x! b2 z% Q& k* g时驱函数这个词语说不清楚  我在一份头大的代码里面看到一个中文注释。
3 t( U5 q# l6 z  Q* Z* e, i

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

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

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

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

9 ]4 G6 z8 g& q3 n  a$ V
' O9 G  ~+ P  Z$ f
  1. #ifndef _Twinkle_H_
    % u+ r# m: R, l# U* E0 }6 {0 ^) |
  2. #define _Twinkle_H_! V" M4 t0 H3 z) J. Y  I; f

  3. 2 V- a( I( a9 e
  4. #include "sys.h"% a+ Q$ N7 g- C* W. Y3 Z
  5. 8 D: i6 a* _( a" p6 M& P
  6. typedef struct
    . Z6 F' h& j0 e, T. J# e; S  }" T- S1 y
  7. {
    , \0 c: n# l6 t
  8.     uint8_t         pin;
    4 S, U3 T' i" u4 `" n* _3 U. D
  9.     uint32_t        timeCnt;' e: L" d0 p  T" I/ k9 l5 k) `
  10.     uint8_t         mode;//
    & |' ]4 x/ O  l7 j' e
  11.     uint8_t         openFlag;1 @' X: C3 k. d* M7 J% N, U
  12.     int                 cnt;
    ! i& y2 ?. }! N% \' {, P
  13.     int                 flashCnt;
    - j" |" ~; Q& ?6 ]' b6 z7 E
  14.     uint32_t        delayTime;//* u9 N' v' m2 H$ Q
  15.     uint32_t        openTime;//
    % P$ z& b6 i5 c2 N
  16.     uint32_t        closeTime;//6 G. r5 j, z" e" o2 O' b( g8 T" s4 M
  17. }twinkleType;) s5 c% e1 s' M2 ~0 p

  18. % t* N; H4 K, O$ W, W
  19. 8 a* Q7 `% a) A' K
  20. , E2 K. P% e) {7 f+ k$ Y7 ?
  21. typedef enum2 _8 E9 K$ k, ^- B; c( c
  22. {& K- z: P" k" h& I  o9 U0 r: J) ]
  23.     BLINK_OPEN_INIT,
    5 H8 o. i; Q1 j, w" }% ~- `
  24.     BLINK_OPEN_DELAY,
    5 X+ C# m( P, g, L, _
  25.     BLINK_OPEN_NOW,
    0 Q4 [3 I+ v4 X+ q0 t
  26.     BLINK_OPEN_ALWAYS,! p# a3 A' m4 p# R( L
  27. }TwinkleOpenType;& b5 z7 J9 \0 ~/ N/ F0 V3 E

  28. % _$ Q; J& C3 E' f" t. `; X

  29. % m& i- Q( }, X' O3 Y
  30. void twinkle_timer_isr( twinkleType *p );7 B/ t+ P: Z$ P, T% p: r

  31. - U# T  h1 Z. G) A2 ?
  32. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime);
    5 I0 ]7 x* [) V5 N0 I8 X$ \

  33. ( G! r; o& f9 z7 s" @
  34. extern twinkleType    JustTesk;* x: ?% e2 W: F  b
  35. 2 f% @8 v5 k" x5 r  ?# {  g

  36. 2 R* `0 F7 n* d  Y5 w, v) e
  37. #endif0 m- ~4 v$ {$ O; p$ W! I
  38. % \3 u+ Y4 j* y4 [
复制代码
  1. #include "twinkle.h"& _6 W. n5 }: k
  2. ' h8 q- h4 R: E  |
  3. #include "Initialise.h"- L) M' H9 W  l. o

  4. # O* j( u# t0 D! E1 S
  5. enum! n3 Q: G$ \2 X4 y6 p
  6. {( a0 ]$ T8 s  J6 W' M) h
  7.         FALSE,$ {6 ?- U2 C. x
  8.         TRUE; Z- A6 Y% a, x1 K! `8 c+ ?1 E
  9. };; Q, y  Y' _' ]. w" b3 X2 ^

  10. 4 j0 d- ]: M. A* N" g
  11. twinkleType    JustTesk;5 Z6 W3 @! y$ u2 `

  12. 4 R8 l4 j" b7 s/ a
  13. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)
    / z! X1 j9 v' f$ ~
  14. {
    2 g8 {0 S7 Z6 e. u! `
  15.     p->timeCnt = 0;
    : J" w" }0 b2 s4 }! n5 E
  16.     p->mode = Mode;
    ) R8 [# C! A8 w9 q; g
  17.     if( p->mode == BLINK_OPEN_DELAY)' o, E5 ^8 O$ V1 ?
  18.     {  
    ( _0 X3 N' ^. ]9 Y! Q8 A
  19.         p->openFlag = FALSE;6 z& q! H' P+ d( d
  20.     }
    6 A; g! Z6 _# [/ N$ Q0 M1 D! F
  21.     else( g8 _/ c. p: _( w
  22.     {
    4 J& l7 ~$ N  g& c
  23.         p->openFlag = TRUE;6 v! R. j2 B+ g) u8 e1 i* w8 Q$ N
  24.     }* B# M; d: c+ P( l0 Y; z4 n
  25.     p->cnt = 0;
    7 _* m. h5 `# O. E" g  e
  26.     p->flashCnt = OpenCnt;
    . P" O$ p# y' K7 @( f# Z! Y
  27.     p->delayTime = DelayTime;
    ; e% q7 R# T0 q
  28.     p->openTime = OpenTime;
    $ ^. `5 J: u( N/ h- r. C4 T
  29.     p->closeTime = CloseTime;
    1 ~+ u' j* e0 V2 T
  30.       
    4 j! j, d0 ?2 Q, k0 n
  31. }, i4 ~7 K/ Y; R: q7 y! G+ ~

  32. ! g$ O2 i- o. i4 i# n& R8 ^/ y
  33. void twinkle_timer_isr( twinkleType *p )
    0 p" f! _+ u& W/ Z% Y$ v
  34. {) {' p, z7 q) B' }
  35.     if(p->mode == BLINK_OPEN_DELAY)
    ) [7 c1 J0 l$ P$ q. ^
  36.     {
    6 |) o3 ^. x3 e; J
  37.         if(p->timeCnt++ > p->delayTime)/ |4 j0 K" C# z9 U. O5 J
  38.         {
    : e  `  n4 }, z
  39.             p->timeCnt = 0;2 b8 l" T/ R2 x! H# [  D+ h
  40.             p->openFlag = TRUE;5 @( u" x1 o$ I4 m9 T- e9 q
  41.             p->mode = BLINK_OPEN_INIT;
    5 `. h4 V; S$ H8 M- Y% L# n
  42.         }
    4 ~2 o" _! H* r2 g
  43.     }4 Z3 A3 d" J- Y
  44.         //上面的是扩展功能 主要是下面//          D5 r1 l0 O4 E; x
  45.     if(p->openFlag == TRUE)+ \1 c* C  c' l
  46.     {
    + y$ ?- o/ r; f: G% E- o* Q# C; ~
  47.                         if( p->timeCnt ++ < p->openTime)0 J+ n' n/ [4 N& ]
  48.                         {0 g! G2 w; }$ m! @. w
  49.                             //pin_ops.pin_write(p->pin , PIN_HIGH);
    3 N/ |2 @$ f5 K5 D7 a2 w: p$ @
  50.                                                         TS_LED1_ON() ;
    3 x& l2 }' x, a! f& a7 R
  51.                         }
    4 ?/ Q* ]2 Q1 z; ~# E7 @; {
  52.                         else
    1 t$ j* r/ i8 a
  53.                         {
    9 h+ ^3 R7 s1 L& }) {3 Z
  54.                             //pin_ops.pin_write(p->pin , PIN_LOW);
    2 g3 g2 V: T" G* r
  55.                                                         TS_LED1_OFF();
    - z  W, z' |+ @% Q( u
  56.                         }3 x8 `2 `6 m. K! I: b2 P4 l1 f4 X
  57.                         if( p->timeCnt  >   p->openTime+p->closeTime  )0 C* |$ R5 v1 E% N# V8 X
  58.                         {5 L0 h0 f" \/ s
  59.                             p->timeCnt = 0;5 }. ^( K& Y9 l7 S& g) M' d& E3 A; n
  60.                             if( p->mode != BLINK_OPEN_ALWAYS)
    9 l" p7 [! W" E  A
  61.                             {0 r  H5 f3 |; V- f$ W, V% K4 q
  62.                                 if( ++p->cnt >= p->flashCnt)
    , S# N8 M- |- k$ v4 g
  63.                                 {
    2 t! G: H' G' u) s3 c
  64.                                     p->openFlag = FALSE;
    ( _0 l' T  C. U8 [) O0 t
  65.                                 }+ f% E% N3 C$ f
  66.                             }  s7 |- ^  v& ^9 P6 D
  67.                         }& T% _/ M3 y6 y( u% |# Z" o
  68.     }      A  v, O+ ?3 F
  69. }% ]9 J1 D) C  q( V+ E
复制代码
用起来还是挺方便的。. F! k$ d+ h& k) N* X. I

9 x! C4 }0 ~6 M" g- f; q1 K: u9 x3 {+ X: [1 }

8 W3 L1 D  e* w7 s上面的代码中为了求简单直接在OPEN时间做开灯 CLOSE时间做关灯 方便测试。3 ^/ r  Q& [, J# E2 l8 s
最后是我自己画的图,理解蜜汁方便。' L7 n* a4 R- w
QQ截图20180720180245.jpg
' p$ V; f. ]7 I5 B

评分

参与人数 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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版