自己整理了一个功能模块,名字叫twinkle
8 y& b/ g! @! D8 B" k) d) b, c
时驱函数这个词语说不清楚 我在一份头大的代码里面看到一个中文注释。
0 a% R0 \/ M8 l0 e9 M5 L应用是 比如控制LED灯一闪一闪(好像没啥难的)包括闪动3次以后停止 比如控制蜂鸣器 需要拉高在拉低,就像LED闪烁一样,需要控制电平高低和总次数。 twinkle 本质是一个前后台程序,后台是时驱函数,前台程序是给后台丢配置参数。 时驱函数是需要放到定时器TIME的中断里面或者UCOS的任务里面周期性调用的所以叫时驱函数 & s3 N. q( n7 L7 B! C) D+ s
; n2 N. Q9 w, G: j7 Y5 \( n2 F0 T- #ifndef _Twinkle_H_
0 g5 w' j" ^2 U6 S, x - #define _Twinkle_H_0 ?% _) |2 b5 e7 e
- 9 E% l% a+ W# |
- #include "sys.h"
5 g% j8 v/ T4 P S/ K7 _ -
# S, Z# D& W" U! L# o9 K1 n - typedef struct
$ q1 y# a, W7 L$ | - {
8 r: a# v6 u2 w# O3 D7 A% W - uint8_t pin;: p/ _: y& I) l
- uint32_t timeCnt;
$ Z' u( ?+ {; M* ?+ w - uint8_t mode;//4 I' Q( Y- X% J( c* ]2 V0 f* t/ v1 S
- uint8_t openFlag;
" l& c9 V( s( q - int cnt;& i' x. V. T0 [. H
- int flashCnt;
" a: ^8 O' s- V/ L Z) O9 T - uint32_t delayTime;//) G, Y, }' m! j) `& ^4 A+ j
- uint32_t openTime;//# L( W- V; q a I
- uint32_t closeTime;//" t2 ?6 L3 T5 a' R* ~0 G
- }twinkleType;5 d8 J% q' H6 l5 G. m) o. R6 a6 H
-
4 Z6 W8 P% v* F* D - ( {3 O. \+ [! h% M! f% h
-
" ^ A5 B9 A1 K, x0 N - typedef enum( s8 r1 s7 r$ V! H/ ]
- {
Q& \4 F8 ?' Z4 l; y, I* B) M5 R - BLINK_OPEN_INIT,
, ?! F8 ?7 ?5 s; q - BLINK_OPEN_DELAY,% R# b0 T' g. S, z/ x
- BLINK_OPEN_NOW,
6 i% S) j" q1 h4 `, {: n0 v V - BLINK_OPEN_ALWAYS,
( c1 F. {" i- c% N/ s; e - }TwinkleOpenType;% ?# D( u0 x u' g
- ! y3 n7 P7 ?& w; v, j+ A
-
+ g) H& _4 z8 p - void twinkle_timer_isr( twinkleType *p );6 ^+ y' @( @4 U
- 8 ^$ d9 j2 o; n5 U f$ l
- void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime);
' K8 [8 I, n ~# [ - 8 K1 Q- o. c. C& h9 {4 Q
- extern twinkleType JustTesk;
: P! [* u( P% x) | -
" u' R+ {7 L. j8 S9 q' G' L - 2 x# E" l; J$ S( \
- #endif
2 T1 M c+ U4 H4 i) _" D2 z9 { - 2 W, R* y1 \7 E/ N) @) Q
复制代码- #include "twinkle.h"& h/ A4 ?6 ~& `+ R: e1 C
-
1 c @& o( [% p6 F$ r - #include "Initialise.h"
' v6 S6 B: x! R- q - * j# F I& _& J9 a
- enum
l v( [! P) h- i2 l% T - {1 R/ n/ e6 s+ H8 X/ F8 E, w1 O/ T
- FALSE,
. q; ?: e5 i1 z4 K8 o8 p - TRUE
6 E4 a& f+ l2 ?# `1 L. a - };
- O; ] Z7 [* q - # ?0 A3 r5 N f
- twinkleType JustTesk;& l- C2 w! a/ r! u2 @
- 6 ^6 a6 J0 m$ c7 x
- void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)
* [2 Y0 k5 q5 n( c - {
6 O4 T& M. j( W( M - p->timeCnt = 0;3 @7 T3 ]5 [% @, B$ L+ F; ?
- p->mode = Mode;
7 y2 x G4 F0 f, b N5 Z - if( p->mode == BLINK_OPEN_DELAY)
1 O7 ]# L. b2 j- e' p. } - { : s1 l4 v8 Z, n: I
- p->openFlag = FALSE;
0 }' K* ~% A4 `# H - }
, p. H4 i" l& M* }0 [! T7 u - else
3 y9 p- ~+ [/ W- |8 A5 r& W - {
3 o/ U1 K" [: t: ?) e9 S! P - p->openFlag = TRUE;- r/ s. H; ]+ U. O0 k) n5 G
- }
, Y6 _: y) e4 X! {1 g. i - p->cnt = 0;
. A8 k; ~, M" l6 X8 U; q - p->flashCnt = OpenCnt;
0 Z9 o |+ E' |, h1 l7 b: I; L; E - p->delayTime = DelayTime;6 ?5 t, P( g% Q6 O$ n
- p->openTime = OpenTime;
: D4 s7 w0 O ]+ V0 ] - p->closeTime = CloseTime;0 ~; Q ]3 W* _0 i% G1 t
- 1 X# Q- @% {/ _7 I& W0 _4 O
- }
. u' S: }# ?& q* b# f; H1 _: V - 1 I9 |+ H; B a$ o% Y
- void twinkle_timer_isr( twinkleType *p )3 _# u- J9 Y3 ]% h0 t; x" [# x' I" Q
- {, D, R( P0 k; L4 b' Z& A
- if(p->mode == BLINK_OPEN_DELAY)8 K- X4 i2 ]5 H0 I2 J) E7 [
- {
$ d! ?7 X8 o N7 T' O, y - if(p->timeCnt++ > p->delayTime)
1 c# K4 ?2 M( C- r' v# m - {1 n( w, f2 j6 U) ^
- p->timeCnt = 0;/ s2 q2 Q. T- Z% H$ C) ~
- p->openFlag = TRUE;
5 o- p' i. @) L& c) R - p->mode = BLINK_OPEN_INIT;. v6 k+ |: t( V$ W& P# D7 D# g- ?
- }
8 C2 b; R4 z$ c+ h& d$ z( D7 ` - }( e7 S; x6 j0 i$ x
- //上面的是扩展功能 主要是下面//
9 c! R# B1 Z8 o# Q - if(p->openFlag == TRUE)
" I( r' o$ [( Q3 ]% r7 S& S) u - {+ q4 x' [) ?% G' ~( e0 q$ }
- if( p->timeCnt ++ < p->openTime)3 V. G; O1 @8 H. h
- {* n# E. F7 y8 Z
- //pin_ops.pin_write(p->pin , PIN_HIGH);$ z8 {3 k# W6 _ s% ?, A
- TS_LED1_ON() ;9 Q; j) q7 J% t4 T& X8 z
- }3 {9 W9 y7 {, J+ h! l
- else$ t0 q* i* g* E
- {2 S/ B5 P: h' u
- //pin_ops.pin_write(p->pin , PIN_LOW);
" l6 ^) i. K) u* S; U% e' ?: O - TS_LED1_OFF();3 n) @- P$ Z4 S* l3 o4 p. g0 \9 w. P
- }
: {# ?8 {0 b( B9 s+ F3 B, b - if( p->timeCnt > p->openTime+p->closeTime )" g) U/ \8 i7 @. V) P% S) }! x
- {1 D# |/ a% z5 P Z c
- p->timeCnt = 0;
* W( ~' q5 \9 w - if( p->mode != BLINK_OPEN_ALWAYS)- s0 b* [0 x+ D* v' t$ L
- {9 L4 O, K p/ m' E2 w
- if( ++p->cnt >= p->flashCnt)8 G8 D8 I7 G8 {: x
- {" n# @1 g0 B+ P7 E3 I7 B" r. |6 N
- p->openFlag = FALSE;
$ f1 b- |8 ^0 u - }4 L ^* b% e4 B* [. i$ b
- }
6 h' f0 u, x. v - }* @ [+ c4 i* ~9 u9 y; r
- }
* Z C8 a( ^" |8 @+ z& R$ ^+ ^ - }
% z$ E, i+ J, j
复制代码 用起来还是挺方便的。
: {# \, s( D3 d" v* f# r o. g' b k' _4 y! D
& x9 { B2 p) f% L i6 c9 N
t$ p/ ~- m, h上面的代码中为了求简单直接在OPEN时间做开灯 CLOSE时间做关灯 方便测试。 @! b$ [8 z7 a( ~
最后是我自己画的图,理解蜜汁方便。9 n# k: L' G, k$ F/ d; v }
. V+ B. J" |& w: H. e |