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

时驱函数了解一下

[复制链接]
GKoSon 发布时间:2018-7-20 18:03
自己整理了一个功能模块,名字叫twinkle. `! e5 u  F3 w' [* }

* P5 V0 c1 o0 d' Z3 v  x/ i+ n时驱函数这个词语说不清楚  我在一份头大的代码里面看到一个中文注释。; v6 ~7 i! ?$ H) U  |

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

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

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

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


& t, ~: J2 v: a9 P$ g; b
3 V3 Q& O3 ?2 p) c6 t1 Z
  1. #ifndef _Twinkle_H_% _9 Z8 [) |: s5 h$ |& [- z: d
  2. #define _Twinkle_H_: U$ }* I5 S6 M. Q; v4 u7 P  f) g

  3. 5 W( M5 L2 Q) N' R0 h( q- T
  4. #include "sys.h"
    # s! o8 V) R6 T! c7 N+ o+ V
  5. 7 q% {* E2 S2 e, e* X; x/ y
  6. typedef struct! I# M/ `+ R7 b( o* r' i3 \
  7. {2 o  f$ O: h: C5 |$ `( p8 P  M
  8.     uint8_t         pin;
    # g4 {6 l1 w8 I6 c+ m$ A* U- |
  9.     uint32_t        timeCnt;
    8 s$ ?0 m1 T4 u. m
  10.     uint8_t         mode;//
    ) l' k# W& ?( a' ?! s3 \  h. {
  11.     uint8_t         openFlag;
    5 x7 \9 z% i7 a. a4 s: k
  12.     int                 cnt;
    1 m, Z0 A8 F# s( n* d  c$ J
  13.     int                 flashCnt;. T9 g& R0 @8 L1 c
  14.     uint32_t        delayTime;//
    + L' S/ L, E6 l
  15.     uint32_t        openTime;//
    9 u/ k: x7 L+ y+ ^0 O' M8 \& Z- m
  16.     uint32_t        closeTime;//
    ' K2 a) X" Q4 t) K! N
  17. }twinkleType;
    6 |1 [/ G5 M  u# y* k5 u" k$ ~
  18. * Y' ^; g, }; Z6 Y* h8 K1 t4 ^
  19. + U$ `7 y5 G" x+ `+ o( d
  20. 0 @& i/ h$ K" x" j
  21. typedef enum( A/ s* Y( ?4 I! E2 B3 k) ~9 `
  22. {! ^( w6 N6 X0 y  U
  23.     BLINK_OPEN_INIT,
      l. h$ X5 S# v6 V3 z! v  V+ _9 y  _
  24.     BLINK_OPEN_DELAY,% V$ I7 F6 B/ S' q( `
  25.     BLINK_OPEN_NOW,2 |2 c1 T, j9 L
  26.     BLINK_OPEN_ALWAYS,! H' h& E) g7 I* c+ B9 R7 o
  27. }TwinkleOpenType;
    0 ^2 N. e' i( p9 }* [: r

  28. 0 z0 A* w' c) k3 w( Z
  29.   i0 Q" ~' X' Y2 E% w0 E/ A
  30. void twinkle_timer_isr( twinkleType *p );
    7 u$ Y; e* J% u% b

  31. & u3 G$ z" e3 b- T* t
  32. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime);
    3 g5 K' O% B5 J' M+ g' J

  33. ) t3 F) W  b# x7 o
  34. extern twinkleType    JustTesk;8 ~% M7 V' x* v1 }- {
  35. . t- v& v" @# w, @8 w
  36. 8 w7 i1 a: }0 S0 s3 _
  37. #endif6 W' u( Y& O$ |0 L; Q+ }
  38. ' y8 o( C% [. |. o+ I8 {3 n5 j3 l
复制代码
  1. #include "twinkle.h"$ Q- w) y3 x0 K$ k
  2. - h" j) H* S) o  k& k* ]
  3. #include "Initialise.h"
    / r$ h) X! u, B4 T. y  {. C/ i
  4. / Y6 c7 S% g& M0 {( J( f: [
  5. enum
    3 D; d+ k0 [" i4 k1 t7 ?1 i
  6. {
    / ^& U, L+ X) i* c( A/ n' N
  7.         FALSE,' L  a* U3 k# `8 j  U: x1 m
  8.         TRUE
    ' T4 ^2 E  A( G: M
  9. };7 x; A9 r) ^7 N/ I( }1 C5 n4 b

  10. 6 s$ ?9 i! C- @( X
  11. twinkleType    JustTesk;
    5 [) L' z: D) r; p9 d
  12. 1 D' n5 \; n9 X6 I1 Z0 G: g
  13. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)
    9 @4 X( }% d+ A8 ]2 v6 C2 ]
  14. {  C; s0 s* w2 ^( u- m5 k
  15.     p->timeCnt = 0;# [. ~: W: G" \) |- d: R
  16.     p->mode = Mode;% s4 k2 Z: P% T
  17.     if( p->mode == BLINK_OPEN_DELAY)
    9 s" p/ p" a1 N! t5 d5 H* ]2 C3 e
  18.     {  
    : m2 J! e8 h% P0 x. x- g
  19.         p->openFlag = FALSE;
    : J! j3 }" |. \. H
  20.     }/ c  S5 N2 m# E/ E
  21.     else
    ' ~+ |1 T5 {! w( @3 }6 [, ]9 ?& L
  22.     {
    4 a  K; [. ~; x7 X0 K/ i, h
  23.         p->openFlag = TRUE;
    # G7 F/ l( Q( B$ Y4 {
  24.     }
    # F- k. X' {0 @' m9 o
  25.     p->cnt = 0;% c  s3 L, k4 s+ ~" y' W
  26.     p->flashCnt = OpenCnt;
    , O9 ^4 F! V5 e6 \' C) y
  27.     p->delayTime = DelayTime;
    ( K" a! ^% |; ?8 W. L, M
  28.     p->openTime = OpenTime;' \1 h; X* `$ u
  29.     p->closeTime = CloseTime;  C5 j$ q. a  M  \8 N6 x& o2 `
  30.       " U& v* d4 _8 g$ L) }1 b+ v
  31. }
    . k" n) D4 A  U, Q" u+ \: j
  32. 7 f, G) @( g4 C1 g- U: P
  33. void twinkle_timer_isr( twinkleType *p )* G, E- T8 j* Z/ T) o
  34. {, n4 }* x  N6 F7 ]$ ?6 g! Q
  35.     if(p->mode == BLINK_OPEN_DELAY)) r" z- M6 T8 s
  36.     {
    9 s: B0 z; w* E9 h5 h
  37.         if(p->timeCnt++ > p->delayTime)
    4 m5 l% e& I7 c) i. s. F
  38.         {! }2 o5 x4 T9 J7 T2 Y+ X7 b* c
  39.             p->timeCnt = 0;
    : ~, S  y6 E# s
  40.             p->openFlag = TRUE;
    : J: {5 U, c' M  ]7 ^! A; `3 l
  41.             p->mode = BLINK_OPEN_INIT;% W! o$ M6 o" j+ b5 h
  42.         }
    / p6 y3 u( Y- L0 m5 D
  43.     }5 L* k$ ]0 e& _1 {+ K2 z; }' T
  44.         //上面的是扩展功能 主要是下面//        & _# e/ F, F& m4 v  p
  45.     if(p->openFlag == TRUE)
    3 q* p/ Z0 M& X
  46.     {; \6 c: F  n4 ~
  47.                         if( p->timeCnt ++ < p->openTime): F+ b) L6 x" d9 e0 _" r
  48.                         {
    # B" D- L$ j% V* u9 K- {
  49.                             //pin_ops.pin_write(p->pin , PIN_HIGH);
    $ m, `0 ^7 f& n: p$ r
  50.                                                         TS_LED1_ON() ;
    4 K( Z( x6 y; ]  b7 O" q2 Z0 W
  51.                         }/ A# T/ T4 I0 }8 Y; |: ?5 m
  52.                         else
    - g, {* \& v  Q1 D5 D
  53.                         {
    ! _/ i6 ]/ A" _3 l* X
  54.                             //pin_ops.pin_write(p->pin , PIN_LOW);
    . Q- R9 E/ h6 s9 P) a  r1 A* h5 N
  55.                                                         TS_LED1_OFF();1 d8 n* r: A. q( ~) N+ \5 B
  56.                         }. g8 d& i& }0 F% ^3 w: s( L! {
  57.                         if( p->timeCnt  >   p->openTime+p->closeTime  )
    5 R* E+ z+ N' d/ y
  58.                         {" z& v, b1 d- L& W/ r8 m# J9 ?8 @# s+ \: M
  59.                             p->timeCnt = 0;
    + M5 R6 i# a4 a
  60.                             if( p->mode != BLINK_OPEN_ALWAYS)
    1 ?% }) z* r+ i4 K$ n9 v) q
  61.                             {
    + }5 y* u8 ~: N( i/ n' z4 I
  62.                                 if( ++p->cnt >= p->flashCnt)
    " d' t- Q; P( \6 L
  63.                                 {1 y7 O) W5 y, G3 }6 s. a
  64.                                     p->openFlag = FALSE;
    ' H" D% c" ~$ v* [
  65.                                 }, m- v& a: b/ Z4 o
  66.                             }
    ! n( E' z2 l$ T9 H! s
  67.                         }
    . z; `- {, n( j6 W4 M, O9 D- T
  68.     }   
    ) X( V" V3 _3 y% s0 [) T/ @
  69. }. x6 c- J# u) O" L! B; I
复制代码
用起来还是挺方便的。
) R( V0 r3 n* [" c" Y5 s$ ~0 T, _3 I' ?# U) E/ r) \

' l% r# A, `; k4 G& a( q& y6 L$ ^3 \, e3 R
上面的代码中为了求简单直接在OPEN时间做开灯 CLOSE时间做关灯 方便测试。
* r) K5 n6 P! m" f0 L6 U" ^最后是我自己画的图,理解蜜汁方便。
  x: K4 j; f3 K$ e3 q QQ截图20180720180245.jpg 7 Y! R2 r8 M# I1 {

评分

参与人数 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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版