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

时驱函数了解一下

[复制链接]
GKoSon 发布时间:2018-7-20 18:03
自己整理了一个功能模块,名字叫twinkle
: r/ K3 m0 p) M. _: W, E
3 B% a4 G0 L4 E0 t8 m0 D
时驱函数这个词语说不清楚  我在一份头大的代码里面看到一个中文注释。
. c/ L7 p, [1 x3 [1 C- n' `

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

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

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

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

% V( ^1 b2 K% F* r

$ \( G( S$ m. D0 |
  1. #ifndef _Twinkle_H_- b0 j5 t" z+ E
  2. #define _Twinkle_H_3 u5 i' S5 L8 j' `) B: ^: N& e

  3. + k9 U  d- S. V4 }( i
  4. #include "sys.h"8 }% ~0 ]  @4 E8 V7 i" W  {6 e
  5. $ t+ e9 T$ u- K" s- T0 R' |. Z
  6. typedef struct
    * ~) G4 t3 R) S  _3 N5 a  L9 g
  7. {
      t" b2 o: ?0 U" @5 {8 j
  8.     uint8_t         pin;3 z" O$ }; l0 T" i; b
  9.     uint32_t        timeCnt;5 W6 s$ A# `% K6 |  b3 b
  10.     uint8_t         mode;//+ r9 c8 X  {* W/ v% O" Z! V
  11.     uint8_t         openFlag;
    : _, k+ [& f5 z7 y" V) t6 T" G
  12.     int                 cnt;
    6 |2 o2 r; r. Q" h, S" R! A' i
  13.     int                 flashCnt;
    4 e  U6 N8 k1 ^8 N. D
  14.     uint32_t        delayTime;//
    / I% H9 E. a) T6 i/ X. W
  15.     uint32_t        openTime;//
    - _- a( Q6 N0 P* q" z
  16.     uint32_t        closeTime;//
    * W& X' h/ H4 d) Q) C
  17. }twinkleType;
    0 _0 N' _5 r/ _7 [9 A; ~! I
  18. . s3 {7 f, M4 y( m# {

  19. $ i' z+ C9 |8 n& z" v* P
  20. 3 k' t" f3 m, r. ]8 v7 i
  21. typedef enum5 `7 h' T7 T# k+ d5 N# i4 Z% u, m
  22. {3 S0 g& Y. R! w6 a* n8 d
  23.     BLINK_OPEN_INIT,
    9 o0 q5 p; L( h' _2 d' `
  24.     BLINK_OPEN_DELAY,
    # Z/ _: m" b: r2 N
  25.     BLINK_OPEN_NOW,
    1 Q" Z+ P8 x1 o8 b
  26.     BLINK_OPEN_ALWAYS,) M6 J9 N" G7 E1 k7 z; q
  27. }TwinkleOpenType;' F( i8 y- ?5 h3 B7 e
  28. : G1 J% X! |" l6 o0 F3 [7 E! @* Q

  29. , `. Y) \% w6 X/ q; ^* i0 f
  30. void twinkle_timer_isr( twinkleType *p );% r( E; E: v9 d% ~+ W! z

  31. 8 E: g2 U, _& [9 O! A9 j, z
  32. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime);2 ~0 z8 T# m) d: N. r$ ^" i) d
  33. " F3 S& f- A* c9 B! z5 L. ^- |  ^8 t
  34. extern twinkleType    JustTesk;$ c, E8 W4 ?7 Y, \
  35. 4 n% w8 r  C& Y( y3 N+ t
  36. / d3 _/ r: W% W3 [* q' ]! [
  37. #endif
    6 Q& y" A8 h2 j& D0 ^
  38. ; m8 z* O0 s7 S% S" Q) [. j/ b5 w2 O% A
复制代码
  1. #include "twinkle.h"  e$ X! v1 a; e# I

  2. ' g% E3 O: u1 t
  3. #include "Initialise.h"
    & P9 ]9 r' O' b/ V  ~" J

  4. * _1 E3 L$ @/ {! Q7 U. \
  5. enum
    * n& D0 E2 i  O
  6. {2 d; R3 O- K" G3 M, I" V7 W
  7.         FALSE,
    ( f8 i! K% [9 B0 V
  8.         TRUE5 a$ ~! J  i) Z
  9. };
    2 c- p. K' L# ^3 i6 o- Q/ F
  10. 7 b8 u6 P; W- ^& k
  11. twinkleType    JustTesk;, \" y' [# M. W/ k! n
  12. ( t# i+ e6 m5 h% S
  13. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)! @9 E! _3 G2 F( h5 F
  14. {
    ) L: I6 G) E8 g' M3 \3 K
  15.     p->timeCnt = 0;
    + B' T5 B* F3 @9 i
  16.     p->mode = Mode;
    1 ?3 w% \( k( ~! M7 P
  17.     if( p->mode == BLINK_OPEN_DELAY)& l2 {( `9 K' v- Y* b% M
  18.     {  
    , F# P( A( y/ ?, P7 h! v$ g* P
  19.         p->openFlag = FALSE;, Y- a( F" f/ l3 v: E
  20.     }- K/ L! \3 ~8 _; C6 M& K/ N
  21.     else9 J0 j3 i! \$ X1 R
  22.     {! f4 @, o0 h! `+ H
  23.         p->openFlag = TRUE;
    ! g! u1 _) r) U9 C4 Z7 g
  24.     }
    & Y# ]: G: k- a  ?3 F  f) ?/ ^- N
  25.     p->cnt = 0;- s, X+ {3 J0 K3 o# T* T
  26.     p->flashCnt = OpenCnt;% f# r% _, G" x1 c0 |! U
  27.     p->delayTime = DelayTime;
    5 [" L1 @5 a+ L8 L( [- m( n
  28.     p->openTime = OpenTime;, w9 O, o1 [/ m1 h, A
  29.     p->closeTime = CloseTime;+ c' L- |) V' D7 `4 d; K
  30.       
    6 t1 g5 u) K* D4 i
  31. }
    + @/ S* y4 s4 X2 z  r5 V' {

  32. * Z, e& J( |' Q# a( E+ t
  33. void twinkle_timer_isr( twinkleType *p )
    $ s+ T& h2 C! X
  34. {
    ; l) [$ ~) s' D. O% z
  35.     if(p->mode == BLINK_OPEN_DELAY)4 \" @' U, A( y$ ~# X
  36.     {
    $ s/ e5 H' H$ l2 e: y# N, l
  37.         if(p->timeCnt++ > p->delayTime)# A0 K% G! [/ L
  38.         {
    ; u* A0 c! I" L  n
  39.             p->timeCnt = 0;/ `; t3 V1 {$ Z  G" q! N
  40.             p->openFlag = TRUE;9 o, n* \6 F# @& W. S
  41.             p->mode = BLINK_OPEN_INIT;
    7 Y; f$ |- ?2 U& }2 }7 b
  42.         }
    ) I8 G' q; v* u3 G
  43.     }) O6 w* m" C3 m9 q8 X( l
  44.         //上面的是扩展功能 主要是下面//       
    / V# U4 `" B/ p. @. K2 A
  45.     if(p->openFlag == TRUE)# @4 X$ n- q  ~$ a, [/ f
  46.     {1 M9 b- s. T* m& w# E
  47.                         if( p->timeCnt ++ < p->openTime)! M, t4 u' y9 n- @2 V# c' n, g
  48.                         {
      m1 v: `: E: M6 n! E% [/ a
  49.                             //pin_ops.pin_write(p->pin , PIN_HIGH);
    4 A, E! x6 M' J; \
  50.                                                         TS_LED1_ON() ;" l& |9 j& {& `
  51.                         }
    ! Q5 P* p5 Q+ y5 W( N1 K* u
  52.                         else
    * n5 F6 ]% T0 q/ k7 Z% l1 z9 U1 }# S
  53.                         {
      p. G- ]. A. B9 |* ^+ h
  54.                             //pin_ops.pin_write(p->pin , PIN_LOW);5 Z0 d8 q1 e; |1 V8 P( h
  55.                                                         TS_LED1_OFF();
    4 f4 h1 r  S3 C2 j4 c5 O2 c4 e
  56.                         }
    : X5 v/ e  f' g+ M7 g
  57.                         if( p->timeCnt  >   p->openTime+p->closeTime  )
    . X+ M) E: i% k$ z; y: s- b
  58.                         {
    8 G, ]3 F9 j! l; C0 J
  59.                             p->timeCnt = 0;, p, E2 M" j. t
  60.                             if( p->mode != BLINK_OPEN_ALWAYS)
    + Z# x( o& _- P; f9 r
  61.                             {- v$ V5 u8 T2 {6 ]" I
  62.                                 if( ++p->cnt >= p->flashCnt)
    8 F! J  ^3 c2 I, c1 t7 r
  63.                                 {2 j9 i+ ?  z  t! ^' g
  64.                                     p->openFlag = FALSE;
    6 U8 P, o3 _0 u
  65.                                 }8 s( Q) ]4 g; z/ S0 ]
  66.                             }9 O$ f" G4 O$ Z+ \3 e
  67.                         }
    5 E  B; j2 Q- O( j6 j( l
  68.     }   
    0 K0 L( D) ]% K  p) B  A. o) i6 w
  69. }
    : t3 V& K# |2 R, M0 W9 h
复制代码
用起来还是挺方便的。) @0 N: W! H2 h/ b7 Y

: V5 B, C% t+ c, r: z
7 z( D6 Y# l3 W0 Q2 o1 G
- d4 ]# L. U  f$ u% O8 p8 t1 U- w上面的代码中为了求简单直接在OPEN时间做开灯 CLOSE时间做关灯 方便测试。
" \% c2 A0 ]& I/ W# l最后是我自己画的图,理解蜜汁方便。
3 O9 L- y1 \' d QQ截图20180720180245.jpg ) B9 ^' ]% m1 j; U" K9 O

评分

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