请选择 进入手机版 | 继续访问电脑版

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

时驱函数了解一下

[复制链接]
GKoSon 发布时间:2018-7-20 18:03
自己整理了一个功能模块,名字叫twinkle
, ]3 Q& P( j. ?8 R% c

3 j5 M8 l' L0 j5 q! j& t时驱函数这个词语说不清楚  我在一份头大的代码里面看到一个中文注释。0 y6 w; Z6 e2 Y: K9 Q

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

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

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

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

$ }# z1 F# _  |% D' _

. `5 V# r7 _9 D3 `  r- b0 e
  1. #ifndef _Twinkle_H_
    0 ]! ]: F9 m; ]9 }
  2. #define _Twinkle_H_- C& c; X) h. Y2 o. a: Q

  3. - O( d# o1 X  p9 A+ G/ {6 Q5 o
  4. #include "sys.h"* A7 _1 X0 C% i3 d/ R# o: t0 u% U
  5. : C* K5 j9 f6 r9 K5 f8 ]) ]; a
  6. typedef struct
    ; w; H( h4 W7 r
  7. {& j, X0 m" C9 Y/ @
  8.     uint8_t         pin;
    " w5 s/ [* H4 |' b8 d
  9.     uint32_t        timeCnt;: s5 z1 z$ u" j( D5 R  f
  10.     uint8_t         mode;//6 D  F, T; w9 c5 M
  11.     uint8_t         openFlag;
    8 F0 f$ g3 a! ^0 `; f
  12.     int                 cnt;6 q0 ]8 h$ Q% L0 b
  13.     int                 flashCnt;. g" g, i$ x9 S
  14.     uint32_t        delayTime;//
    9 m! B+ _; |. M4 _- H2 q: \+ l
  15.     uint32_t        openTime;//
    / O1 c/ s7 _1 r
  16.     uint32_t        closeTime;//8 W  [$ }# l! @7 l( W
  17. }twinkleType;
    , X9 _2 I& a1 X2 P7 x6 ^) U+ E
  18. 6 u1 c2 g, r" N. f, ?9 ~( l
  19. ; W; w4 u# z3 b7 t$ m6 b* B

  20. * J6 S8 o7 h7 Y- S/ B
  21. typedef enum
    # g& n. x4 C; Z9 v* c3 _
  22. {
    0 c# p! U0 n2 @1 h7 @; [
  23.     BLINK_OPEN_INIT,+ N  A% r" Y- N$ E2 b& i6 V
  24.     BLINK_OPEN_DELAY,
    ) G+ ^) }! g& Y7 R8 ~# r& ?3 z' h
  25.     BLINK_OPEN_NOW,
    * Q* w1 |) R8 E; }: j: m
  26.     BLINK_OPEN_ALWAYS,
    & a! E$ [$ p2 J3 k. K3 H# l2 J: {6 p2 o
  27. }TwinkleOpenType;( Q9 j6 }5 D* U# a. m. D7 q

  28. 8 \! k5 ~" V1 d( w% M" `

  29. / h: o6 [( m9 R. }
  30. void twinkle_timer_isr( twinkleType *p );
    + j; J# O' W2 D5 n0 _* a( n* P( t
  31. + A" H+ H6 V5 [7 j8 X3 ?; P, V! [
  32. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime);
    7 P) M1 I  D; W2 m! L4 H
  33. ) U$ i. i' _) B/ I5 D
  34. extern twinkleType    JustTesk;% a3 Z7 g: F  ]0 E( I9 S& B  D! C! u

  35. 0 b& X* T- R3 ]
  36. 3 @9 b2 M! T+ s4 k
  37. #endif
    / \: P# k$ h2 m6 J, w- X

  38. & J7 v, i+ j3 ^) A2 h
复制代码
  1. #include "twinkle.h"* D* u  |, n( x  n4 f9 I) W. Q- X6 l
  2. ' R/ l+ t4 h/ M7 w
  3. #include "Initialise.h"
    & [/ }* _- J3 J3 k1 N

  4. % @: z$ [: ]: w* I  O4 H" K% F
  5. enum
    8 W" ^5 S- C- O/ c. l
  6. {
    . ^( T, B- V% U/ a! }
  7.         FALSE,& n$ F* K  K: S6 R4 u
  8.         TRUE
    1 q* C6 }& R: c0 L
  9. };& h4 E  h7 X; j1 y2 m7 Q% p4 S

  10. 2 B+ ]2 M& u& z' t2 ?  e
  11. twinkleType    JustTesk;& j: V. [* ]- E5 [/ y

  12. # |4 n) ~& l' u+ t3 t2 g
  13. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)
    % v' J/ w. g: p/ ^+ _
  14. {7 C  ]  ^- U+ o
  15.     p->timeCnt = 0;
    2 ~/ K! v& V6 P, v7 a
  16.     p->mode = Mode;
    , n& K! k1 D# W( x
  17.     if( p->mode == BLINK_OPEN_DELAY)! J: Q/ P% r( ]
  18.     {  4 D4 V8 `3 t* A( p* ^% C. o; ^4 R
  19.         p->openFlag = FALSE;
    0 J) Z! B; F6 o' U
  20.     }
    6 S* E& g. a3 z* L& r
  21.     else
    . F0 p5 f2 _0 q6 V
  22.     {
    6 f) E, m, x2 B% z: G! J0 L
  23.         p->openFlag = TRUE;* t. M) P+ {: J: a: }, l
  24.     }4 A. W5 v" q9 q. `2 k+ x
  25.     p->cnt = 0;9 |5 b0 q4 ?, C5 F
  26.     p->flashCnt = OpenCnt;
    7 Y. A0 v8 S8 |$ T/ M3 `% D  g; P. o% ^
  27.     p->delayTime = DelayTime;5 \5 ]: I* R: u
  28.     p->openTime = OpenTime;6 `2 [% t" U  U
  29.     p->closeTime = CloseTime;$ x5 y8 q& J, J- Q% d' _
  30.       
    ! M8 i' m- c; l9 p/ q/ I# Z, j
  31. }0 p# s% ?" f2 U) y
  32. 8 N* `  [: |9 d4 m% s3 y4 O& X
  33. void twinkle_timer_isr( twinkleType *p )) `1 t8 z  Q0 q7 C- j
  34. {7 {& k+ }- J7 ^0 ?8 v# S  m2 v
  35.     if(p->mode == BLINK_OPEN_DELAY)3 d6 [6 m' ~  ?# Q. s
  36.     {
    ! g5 S" \; d% m( v
  37.         if(p->timeCnt++ > p->delayTime). C" `0 [2 T1 E% A9 v+ a
  38.         {; {# t- W8 F- W6 g+ h: N6 E
  39.             p->timeCnt = 0;
    / r( e9 F. ~2 J+ }7 _
  40.             p->openFlag = TRUE;
    8 A, F  z2 P' z$ c" v2 f( [3 m
  41.             p->mode = BLINK_OPEN_INIT;  c1 T; }4 ]3 @8 R
  42.         }# s2 L$ T, T% d2 h+ p# N
  43.     }
    - ~: b0 z6 h- t. C' }1 s
  44.         //上面的是扩展功能 主要是下面//        ( _7 f. w* t4 c2 d& T
  45.     if(p->openFlag == TRUE)
    5 ^1 X; u; ]/ d% n: o! i2 p) T
  46.     {
    7 w: }; j! M7 p* K
  47.                         if( p->timeCnt ++ < p->openTime)5 S" j; h$ G! @) x& i
  48.                         {
    6 \; P2 W1 c3 v5 S; h. }$ u
  49.                             //pin_ops.pin_write(p->pin , PIN_HIGH);
    ; O+ ?. W' O; E  |
  50.                                                         TS_LED1_ON() ;0 d- D5 W! t9 C! b4 t
  51.                         }0 z, F, t8 M3 p$ P  [$ }- M
  52.                         else
    6 p( s* ~5 O6 z
  53.                         {  {, ?8 ~1 A, S' ?6 I! k4 R, f
  54.                             //pin_ops.pin_write(p->pin , PIN_LOW);- e5 j# W- V- j5 ^# q- E
  55.                                                         TS_LED1_OFF();
    9 \4 y" ^1 `: `, F$ ]$ n
  56.                         }+ [3 _2 M; i: e
  57.                         if( p->timeCnt  >   p->openTime+p->closeTime  )9 f! N& a, h/ z5 L& Y: O8 B; j  `1 ~9 J. Y
  58.                         {( ?5 i1 ^$ ?. l9 \
  59.                             p->timeCnt = 0;
    & K* e* V* Q) {9 X* o  t1 d  o
  60.                             if( p->mode != BLINK_OPEN_ALWAYS)
    ( c% \. C9 I) S+ y  a$ y6 u5 G/ w
  61.                             {
    $ Q! d' A, C) Y
  62.                                 if( ++p->cnt >= p->flashCnt)
    / O6 C; p: q6 |$ y
  63.                                 {
    ; q# f# B& i, [+ r1 w
  64.                                     p->openFlag = FALSE;
    8 r# W0 c! U' o) {
  65.                                 }
    0 g7 [  r% \' o4 ]( |) b
  66.                             }
    6 O5 b9 ^. b3 H# T+ t; @
  67.                         }8 }6 I/ u% U7 |+ G* D' c
  68.     }    1 [/ W+ A* c3 F) x
  69. }5 z6 n: A, ]- M$ {, _4 F
复制代码
用起来还是挺方便的。/ B. G7 C' V2 B* n

5 P% D, D# j& n% u5 q4 b
& [" J# A6 g. N
# q. \5 w/ |' ?. k/ D9 E" {8 ^上面的代码中为了求简单直接在OPEN时间做开灯 CLOSE时间做关灯 方便测试。- e" T/ H& x# y4 R
最后是我自己画的图,理解蜜汁方便。
5 c# l( T  m# X QQ截图20180720180245.jpg 7 v$ }/ T8 X6 F

评分

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