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

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

时驱函数了解一下

[复制链接]
GKoSon 发布时间:2018-7-20 18:03
自己整理了一个功能模块,名字叫twinkle( X( N$ T+ s: o( U* q

7 z! @" c7 o% L+ r& `( W时驱函数这个词语说不清楚  我在一份头大的代码里面看到一个中文注释。
' }. n+ D  E8 t' J

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

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

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

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


3 U6 k1 n; Q' U1 [1 W
3 m3 y, t) o% G! {' C
  1. #ifndef _Twinkle_H_( G/ D4 @$ U9 l3 P1 n& [
  2. #define _Twinkle_H_8 Q' t- |9 ~( `- V

  3. 1 {! L4 Y: t; E0 n0 O
  4. #include "sys.h"
      y4 b! b  A3 l& `- L- S

  5. $ ~# x% ~+ K0 ^
  6. typedef struct
    & y8 B3 L4 |' P8 g* o3 A. [/ D1 q
  7. {* Z( ~4 B) K. m
  8.     uint8_t         pin;
    ; a" ?% g: `( r0 M
  9.     uint32_t        timeCnt;$ i" R6 }' g7 W1 k
  10.     uint8_t         mode;//
    8 ~5 f  E; T2 k9 N  Y* w/ r
  11.     uint8_t         openFlag;9 v; r7 v0 E4 O9 i
  12.     int                 cnt;
    ' N6 O4 I, c% k% T2 g1 Y
  13.     int                 flashCnt;- T3 R- }7 v$ G5 r( |# |
  14.     uint32_t        delayTime;//
    8 S: V- J% t( S/ I& P( _/ N
  15.     uint32_t        openTime;//; M/ ~# r: u2 O, D  e! ~
  16.     uint32_t        closeTime;//# y7 C8 E5 t6 e
  17. }twinkleType;3 R4 u) d% d0 W' H% J

  18. 3 v( [" ?; i/ L, Z

  19.   G3 p$ {. B* e

  20. . |. ]. e  H, D7 X5 v
  21. typedef enum
    . V9 ~) H$ h3 P8 z' c8 d- S+ z
  22. {  ^5 N' U9 u) A/ B  ~+ z% a3 ?6 B
  23.     BLINK_OPEN_INIT,
    " Y1 y6 W) X" e4 ]  G/ j7 K3 H
  24.     BLINK_OPEN_DELAY,, t& c1 _7 T2 Q, a5 h# ]& y
  25.     BLINK_OPEN_NOW,9 H& `1 i$ s% q8 J$ e( x0 z
  26.     BLINK_OPEN_ALWAYS,
    + a! m9 b7 g& `, v# y8 s( t+ h
  27. }TwinkleOpenType;
    , y3 i8 V0 m5 v: R6 m
  28. ' y# E4 h, j. P& m/ i6 k/ X
  29. ( o% y8 n4 B* V
  30. void twinkle_timer_isr( twinkleType *p );# x6 b* L/ m3 D  |6 }2 n
  31. ! R& C- e  i; p' i1 n( b+ G0 h
  32. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime);
    $ z' n6 D" h3 f& x

  33. & Q" I0 j5 q* u9 V! i! n; R
  34. extern twinkleType    JustTesk;8 l' L( U9 ~  X& x5 Q+ g' X

  35. ( n4 R$ |* S+ q8 z% S: i

  36. 0 v5 V# g5 u% \, I  W1 O/ C& V
  37. #endif
    + s4 s/ T, p$ D
  38. % d5 a8 q2 q4 H2 x6 k4 j
复制代码
  1. #include "twinkle.h"
    8 p6 ^9 [* u7 u
  2. : r1 @+ {# B+ c! v9 q1 k9 i
  3. #include "Initialise.h"& B: d* c8 X% c1 u$ o5 n

  4. 5 n6 Y0 R- ]* q+ E7 K# n6 \
  5. enum
    $ l0 N$ d7 |. x% S/ C
  6. {
    2 l, e+ u5 W2 ~; k9 S
  7.         FALSE,
    + n, M! g0 @. B; a
  8.         TRUE; a* L8 d" ?8 @" e3 F* W
  9. };/ i  k3 D# W# q' o
  10. ) T5 E' M9 r, `
  11. twinkleType    JustTesk;  ?: ]! W! G6 w8 O

  12. " F/ R  U8 u8 {7 J; L
  13. void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)
    2 L. `6 `- a: W" ^- t+ o
  14. {
    $ I9 C! j& R4 X  m& {
  15.     p->timeCnt = 0;5 L  G9 ], `5 F0 X0 I
  16.     p->mode = Mode;. T1 X9 s  }# W; z4 M
  17.     if( p->mode == BLINK_OPEN_DELAY)
    $ g  w* p) h4 @( ]$ U1 S
  18.     {  
    ) m; P1 }1 `$ a
  19.         p->openFlag = FALSE;
    4 @2 S& ]: j$ Z; R9 N+ D
  20.     }5 T8 v' A' n8 m5 I, A
  21.     else$ `. _6 T: r4 F# ^
  22.     {& Z  S* E( {# G+ o( U7 A  c' p
  23.         p->openFlag = TRUE;: ~) ~; U! |# ~  e
  24.     }
    3 W  O, [! ?% q+ }) w& ?
  25.     p->cnt = 0;" P* C% W, ~, M2 B
  26.     p->flashCnt = OpenCnt;: ^0 t# {9 i- y6 f
  27.     p->delayTime = DelayTime;
    " L2 K% E. P+ ~2 U/ ]! r
  28.     p->openTime = OpenTime;4 ?; @7 f+ a! ?! d2 w
  29.     p->closeTime = CloseTime;
    2 I4 ]' P; s. T
  30.       
    / I2 t" ]$ _" t! c
  31. }  {, T) }" c7 a& |" U
  32. ( q+ B! S& N* p8 m; |2 a. o
  33. void twinkle_timer_isr( twinkleType *p )
    ( A0 y/ L. v) I, W' B
  34. {
    # y% N% U6 X. ^6 q
  35.     if(p->mode == BLINK_OPEN_DELAY)
    , n8 h5 `" ?  g% s1 }7 s
  36.     {
    % j9 `/ C! M: f3 Y
  37.         if(p->timeCnt++ > p->delayTime)
    3 ?0 C0 d& D2 K# E+ }0 `0 V' k
  38.         {% n+ {1 Z  R2 a
  39.             p->timeCnt = 0;3 F$ U& W9 }4 a2 t. G5 j+ Q1 t
  40.             p->openFlag = TRUE;: w- L) a" p$ c1 _9 m
  41.             p->mode = BLINK_OPEN_INIT;8 u' N9 l6 Y; P6 ^
  42.         }1 Q1 ?" i+ f) g1 |( r. f  R4 v0 }
  43.     }
    0 t1 m7 m5 @+ M5 j! c
  44.         //上面的是扩展功能 主要是下面//        / E9 C$ J6 t- J; q% F/ _
  45.     if(p->openFlag == TRUE)
    $ ?; F! ?; J4 N2 o3 A3 D* ~
  46.     {; D" a1 S, X. d8 V1 X
  47.                         if( p->timeCnt ++ < p->openTime)
    ; y3 I" K' e$ N& \* r
  48.                         {
    3 m0 J7 M0 r( ~  r* P% O
  49.                             //pin_ops.pin_write(p->pin , PIN_HIGH);& {) x8 s. c& M3 n* A" P0 j1 |
  50.                                                         TS_LED1_ON() ;
    $ P% `6 a* j. A" U  [( ~' M
  51.                         }
    . }) L. {9 T9 k2 b4 w  L' g
  52.                         else+ Y) N' j* ?2 _. x7 g# u
  53.                         {
    * _5 N; \, Y( Q4 ]
  54.                             //pin_ops.pin_write(p->pin , PIN_LOW);: u1 [- t, |. M! A( k; [2 g/ h- U* ]
  55.                                                         TS_LED1_OFF();! g% _% s3 b2 Q. x! [
  56.                         }) e) d8 z  N2 s- u9 W; v
  57.                         if( p->timeCnt  >   p->openTime+p->closeTime  )
    + @/ g* @. e. i3 U, k5 m6 U% @
  58.                         {
    ) J2 }8 v3 t; N7 q
  59.                             p->timeCnt = 0;0 M: r; N  D# F! x4 B: I6 _( B# A
  60.                             if( p->mode != BLINK_OPEN_ALWAYS)+ s# c) x; s* J9 N* Z2 U, _
  61.                             {
    , X+ k, J6 ^4 T+ e( {
  62.                                 if( ++p->cnt >= p->flashCnt)
    $ [* I$ G. X. R" J* q6 k
  63.                                 {6 \6 V. ]# W0 {
  64.                                     p->openFlag = FALSE;
    8 R1 `- U% K8 u
  65.                                 }
    % |1 {! b' `% H
  66.                             }
    + B5 w+ n1 s0 r9 G# M6 ~) R
  67.                         }
    . e5 z! \! @: r8 p' V
  68.     }    + V7 L! n$ J. q' ^8 i" d, C
  69. }
    & L/ Y6 D1 @2 Z
复制代码
用起来还是挺方便的。
. N! J& U0 J2 v; Q8 D
7 o' N7 V& L4 f& Z. d; ?( ?! y; v$ M0 m- ~# q6 f7 _' ^! j) {

' I+ O0 E8 {+ E上面的代码中为了求简单直接在OPEN时间做开灯 CLOSE时间做关灯 方便测试。
1 n0 f0 g1 ~; Q! U) h( F  }9 s最后是我自己画的图,理解蜜汁方便。& q. _* G* t8 ^8 T6 s, n9 e0 g5 X0 e$ O
QQ截图20180720180245.jpg
3 v8 p  n# i! N, y

评分

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