自己整理了一个功能模块,名字叫twinkle* t q- p+ |6 Z+ }
/ g' v: S! E. g: K$ l
时驱函数这个词语说不清楚 我在一份头大的代码里面看到一个中文注释。6 [% A% {7 V g
应用是 比如控制LED灯一闪一闪(好像没啥难的)包括闪动3次以后停止 比如控制蜂鸣器 需要拉高在拉低,就像LED闪烁一样,需要控制电平高低和总次数。 twinkle 本质是一个前后台程序,后台是时驱函数,前台程序是给后台丢配置参数。 时驱函数是需要放到定时器TIME的中断里面或者UCOS的任务里面周期性调用的所以叫时驱函数 0 ^8 D6 @0 P; F" ]8 n. x
* U1 `4 u& K0 |' P' s% \! l- #ifndef _Twinkle_H_9 Q% j/ [6 O3 X+ J+ o5 \
- #define _Twinkle_H_
5 _8 J3 C( D% l, ~1 L& t2 w - " h- A: u5 ~( P3 s6 I& L
- #include "sys.h"/ {+ z7 Q- F% @
-
7 x# i* D; Y: X2 L% V7 H - typedef struct; Q) ^2 Y4 A) r! `4 x* Q
- {
, ?0 K2 M7 |$ r3 Q& M4 z$ X - uint8_t pin;' D. p& [* N( y
- uint32_t timeCnt;
' f) { G, n7 K; n+ j8 g - uint8_t mode;//
+ d: a( m% H/ R( F' D/ \ - uint8_t openFlag;
. @3 Z6 m* Q+ o" v* i4 m - int cnt;9 f7 N6 U, @, A
- int flashCnt;0 c2 i- [) R" g' D! Z7 B8 g# l
- uint32_t delayTime;//5 v0 V& Z0 F% C4 a/ G6 C
- uint32_t openTime;//
! @6 L" \0 @4 V7 `& D4 o' k - uint32_t closeTime;//
' E) Z l' ?1 n, o: a9 g; D! W- H8 p' j - }twinkleType;5 n1 o3 D& n9 h( k+ p! p
-
7 f2 F% u" P$ {3 P% a' B$ L, s8 _ - * x* c7 |. K: ?, B6 g
-
6 a$ P+ R( J1 h; p; {0 _. @1 u - typedef enum
: `1 h9 f9 Z( Q. r - {
* t7 {" _- c& P U" ]; A. b% F - BLINK_OPEN_INIT,
- ?9 j; O, b, d" ~& u' Y - BLINK_OPEN_DELAY,) r2 l# c3 i D& }8 B
- BLINK_OPEN_NOW,
6 X/ d% J) h, {* f# c - BLINK_OPEN_ALWAYS,+ G! X0 s& F! ~% s) g9 D
- }TwinkleOpenType;; y+ F" }9 S' ^+ X- T
- . y6 I \" I8 I6 A
- 9 f0 G7 w+ m5 @& q% g
- void twinkle_timer_isr( twinkleType *p );
, e8 \" @1 I' R/ E8 L2 `4 r& I - 4 _2 Y- m+ i+ B1 \: {6 O! s( o3 {5 o
- void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime);
: ?. L& @2 E0 W0 I/ o - " {. b) _! Z5 z* \. X6 L) W |
- extern twinkleType JustTesk;
1 T& `6 e- v# ?2 k+ P - 2 u. i/ Y' W9 z4 m7 B' z
- 4 M/ T1 ~) o6 o* `3 D
- #endif3 F9 S" O1 b; R% I1 ^
-
/ X- l! g6 V8 F" Y( [
复制代码- #include "twinkle.h"
5 T1 O" w+ e# D8 |* r+ M -
6 d4 a" s! _2 h7 o: P7 G2 T j - #include "Initialise.h"
B7 ~7 n- h9 w1 l7 d, c3 s7 G9 B - 1 w; \& m( D5 J/ m+ h& j
- enum, ]5 Z; ~3 k" w l1 t, J
- {& {- S( t' y9 v4 B2 b `7 n
- FALSE,
; S# m. _' |! @+ t; u5 ^& L - TRUE+ I5 P& T* l5 m4 e& v! `
- };
6 W% ~4 q s$ z% A" c W - " G8 Z) F% Y( u C( W! W% w
- twinkleType JustTesk;( |. z) q* ^1 e* _0 [) K
- 4 ~1 G3 O7 c4 K
- void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)6 q$ z. d2 a. ?0 ]% p, |! `
- {' B" @/ o; e& ]7 f7 L6 a
- p->timeCnt = 0;! s) a. r% F6 L# \8 [% t; O
- p->mode = Mode;
! [. }2 j3 i& \$ d# T+ j - if( p->mode == BLINK_OPEN_DELAY)
; [, @. z1 c7 q. s4 s) T g7 D - { 4 B( C0 X7 n$ m7 N% N- a! g7 B2 Q$ `9 Z
- p->openFlag = FALSE;. n; v# ~, J9 f. V [' s
- }
0 m8 g; s# _ l8 j9 w! ]+ Q1 `: R - else
% F3 ]+ \; E& D2 Y" t( K - {% I; R2 E) L p
- p->openFlag = TRUE;
: i' a/ q0 j; Y4 Z! }* | - }
3 N4 f K( r, w& P: l- v7 e2 f- G - p->cnt = 0;
7 _/ C1 F# ?( ]8 D1 q - p->flashCnt = OpenCnt;' _, c' A$ `! E' u/ F. {- \6 q% |
- p->delayTime = DelayTime;
1 y! b0 b, S* g- p4 v6 R - p->openTime = OpenTime;
2 I0 o* R/ n( ~) W2 C X - p->closeTime = CloseTime;
' ?' c% K& O3 [, c% u/ K -
- X% O0 o" e* n/ v! C0 a - }
# r2 @# E9 ?2 n f7 B" P& a - ; n$ \! T8 v: g' v
- void twinkle_timer_isr( twinkleType *p )
# d& }/ R: P' d/ N1 w - {+ C' L" }5 Q6 j2 J6 J
- if(p->mode == BLINK_OPEN_DELAY)
2 d) T! |7 N1 d1 d3 ?2 z, H - {
# C9 V) u7 q; R/ @$ d - if(p->timeCnt++ > p->delayTime)+ n( N1 `4 Y2 Z. t* m2 @( p
- {
3 j6 U% W: Z* u8 S - p->timeCnt = 0;: C% }8 h& M1 n J3 M& Z
- p->openFlag = TRUE;
) o+ E0 s7 S) ?) ^ - p->mode = BLINK_OPEN_INIT;
7 n$ o' S! s0 d) }5 ], J k G - }/ p9 p2 `8 A$ d+ q
- }
0 v" |9 j M" r L6 G - //上面的是扩展功能 主要是下面// - c0 O; J' {) c
- if(p->openFlag == TRUE)( C, r" U1 j) ]$ p, _9 P
- {
9 P1 b0 a( a. n( ?1 E0 ? - if( p->timeCnt ++ < p->openTime)
a4 T2 G [8 C8 c8 F7 `9 G" K - {
7 O( }5 _/ U. c% j- D - //pin_ops.pin_write(p->pin , PIN_HIGH);4 |! N# I$ P# |+ y8 L2 q
- TS_LED1_ON() ;
* } A* f. ]$ ? - }+ x% ~( E$ ?; v+ \- N2 u$ V
- else; m# z2 ~( [, a, t
- {
. [) G% h! y+ V; }. g7 \ - //pin_ops.pin_write(p->pin , PIN_LOW);
- p1 m$ z! D- ~: K - TS_LED1_OFF();6 b. ^) T) M8 L* X, s, ]9 L
- }+ ?! n0 r# g% v. W7 W
- if( p->timeCnt > p->openTime+p->closeTime )
- U7 O4 L9 ]. j" |6 ? - {# n _. [% B3 Y& @5 P& ^% K- M
- p->timeCnt = 0;
7 Z3 `2 K- T3 V* v8 P0 d. a - if( p->mode != BLINK_OPEN_ALWAYS)/ u" i6 L h* S$ c2 m
- {
& _: a2 V" m. h9 { - if( ++p->cnt >= p->flashCnt)
3 X6 o0 q2 B3 l# |' m: y - {
! O* i. W: ?* a- J - p->openFlag = FALSE;
. y3 L9 u6 L- V) g# ~7 | - }8 k* v. W8 i+ D3 o8 A o/ m
- }- |" y9 a( y' |1 ^* Z$ L" A/ P
- }6 P. A1 I' x& u
- } . a3 Z+ v8 a/ ]. Y; R) \
- }
, k# x' c# z( D" ^1 K. \! H" Q
复制代码 用起来还是挺方便的。
Z }5 F4 e$ C
4 T- B$ W2 k! c5 J$ E. Q5 E- P. G0 h- ?+ Z6 Z8 L! P
' R4 I3 i* y6 [+ v上面的代码中为了求简单直接在OPEN时间做开灯 CLOSE时间做关灯 方便测试。
9 P6 n+ H" t5 S7 T7 A最后是我自己画的图,理解蜜汁方便。
" o, ~. V" j7 P U
0 \8 y) T% E6 P+ z
|