自己整理了一个功能模块,名字叫twinkle
8 r& R+ J4 k8 u: v0 B' Y7 O. E, U( m
$ [* a5 x! b2 z% Q& k* g时驱函数这个词语说不清楚 我在一份头大的代码里面看到一个中文注释。
3 t( U5 q# l6 z Q* Z* e, i应用是 比如控制LED灯一闪一闪(好像没啥难的)包括闪动3次以后停止 比如控制蜂鸣器 需要拉高在拉低,就像LED闪烁一样,需要控制电平高低和总次数。 twinkle 本质是一个前后台程序,后台是时驱函数,前台程序是给后台丢配置参数。 时驱函数是需要放到定时器TIME的中断里面或者UCOS的任务里面周期性调用的所以叫时驱函数 9 ]4 G6 z8 g& q3 n a$ V
' O9 G ~+ P Z$ f
- #ifndef _Twinkle_H_
% u+ r# m: R, l# U* E0 }6 {0 ^) | - #define _Twinkle_H_! V" M4 t0 H3 z) J. Y I; f
-
2 V- a( I( a9 e - #include "sys.h"% a+ Q$ N7 g- C* W. Y3 Z
- 8 D: i6 a* _( a" p6 M& P
- typedef struct
. Z6 F' h& j0 e, T. J# e; S }" T- S1 y - {
, \0 c: n# l6 t - uint8_t pin;
4 S, U3 T' i" u4 `" n* _3 U. D - uint32_t timeCnt;' e: L" d0 p T" I/ k9 l5 k) `
- uint8_t mode;//
& |' ]4 x/ O l7 j' e - uint8_t openFlag;1 @' X: C3 k. d* M7 J% N, U
- int cnt;
! i& y2 ?. }! N% \' {, P - int flashCnt;
- j" |" ~; Q& ?6 ]' b6 z7 E - uint32_t delayTime;//* u9 N' v' m2 H$ Q
- uint32_t openTime;//
% P$ z& b6 i5 c2 N - uint32_t closeTime;//6 G. r5 j, z" e" o2 O' b( g8 T" s4 M
- }twinkleType;) s5 c% e1 s' M2 ~0 p
-
% t* N; H4 K, O$ W, W - 8 a* Q7 `% a) A' K
- , E2 K. P% e) {7 f+ k$ Y7 ?
- typedef enum2 _8 E9 K$ k, ^- B; c( c
- {& K- z: P" k" h& I o9 U0 r: J) ]
- BLINK_OPEN_INIT,
5 H8 o. i; Q1 j, w" }% ~- ` - BLINK_OPEN_DELAY,
5 X+ C# m( P, g, L, _ - BLINK_OPEN_NOW,
0 Q4 [3 I+ v4 X+ q0 t - BLINK_OPEN_ALWAYS,! p# a3 A' m4 p# R( L
- }TwinkleOpenType;& b5 z7 J9 \0 ~/ N/ F0 V3 E
-
% _$ Q; J& C3 E' f" t. `; X -
% m& i- Q( }, X' O3 Y - void twinkle_timer_isr( twinkleType *p );7 B/ t+ P: Z$ P, T% p: r
-
- U# T h1 Z. G) A2 ? - void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime);
5 I0 ]7 x* [) V5 N0 I8 X$ \ -
( G! r; o& f9 z7 s" @ - extern twinkleType JustTesk;* x: ?% e2 W: F b
- 2 f% @8 v5 k" x5 r ?# { g
-
2 R* `0 F7 n* d Y5 w, v) e - #endif0 m- ~4 v$ {$ O; p$ W! I
- % \3 u+ Y4 j* y4 [
复制代码- #include "twinkle.h"& _6 W. n5 }: k
- ' h8 q- h4 R: E |
- #include "Initialise.h"- L) M' H9 W l. o
-
# O* j( u# t0 D! E1 S - enum! n3 Q: G$ \2 X4 y6 p
- {( a0 ]$ T8 s J6 W' M) h
- FALSE,$ {6 ?- U2 C. x
- TRUE; Z- A6 Y% a, x1 K! `8 c+ ?1 E
- };; Q, y Y' _' ]. w" b3 X2 ^
-
4 j0 d- ]: M. A* N" g - twinkleType JustTesk;5 Z6 W3 @! y$ u2 `
-
4 R8 l4 j" b7 s/ a - void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)
/ z! X1 j9 v' f$ ~ - {
2 g8 {0 S7 Z6 e. u! ` - p->timeCnt = 0;
: J" w" }0 b2 s4 }! n5 E - p->mode = Mode;
) R8 [# C! A8 w9 q; g - if( p->mode == BLINK_OPEN_DELAY)' o, E5 ^8 O$ V1 ?
- {
( _0 X3 N' ^. ]9 Y! Q8 A - p->openFlag = FALSE;6 z& q! H' P+ d( d
- }
6 A; g! Z6 _# [/ N$ Q0 M1 D! F - else( g8 _/ c. p: _( w
- {
4 J& l7 ~$ N g& c - p->openFlag = TRUE;6 v! R. j2 B+ g) u8 e1 i* w8 Q$ N
- }* B# M; d: c+ P( l0 Y; z4 n
- p->cnt = 0;
7 _* m. h5 `# O. E" g e - p->flashCnt = OpenCnt;
. P" O$ p# y' K7 @( f# Z! Y - p->delayTime = DelayTime;
; e% q7 R# T0 q - p->openTime = OpenTime;
$ ^. `5 J: u( N/ h- r. C4 T - p->closeTime = CloseTime;
1 ~+ u' j* e0 V2 T -
4 j! j, d0 ?2 Q, k0 n - }, i4 ~7 K/ Y; R: q7 y! G+ ~
-
! g$ O2 i- o. i4 i# n& R8 ^/ y - void twinkle_timer_isr( twinkleType *p )
0 p" f! _+ u& W/ Z% Y$ v - {) {' p, z7 q) B' }
- if(p->mode == BLINK_OPEN_DELAY)
) [7 c1 J0 l$ P$ q. ^ - {
6 |) o3 ^. x3 e; J - if(p->timeCnt++ > p->delayTime)/ |4 j0 K" C# z9 U. O5 J
- {
: e ` n4 }, z - p->timeCnt = 0;2 b8 l" T/ R2 x! H# [ D+ h
- p->openFlag = TRUE;5 @( u" x1 o$ I4 m9 T- e9 q
- p->mode = BLINK_OPEN_INIT;
5 `. h4 V; S$ H8 M- Y% L# n - }
4 ~2 o" _! H* r2 g - }4 Z3 A3 d" J- Y
- //上面的是扩展功能 主要是下面// D5 r1 l0 O4 E; x
- if(p->openFlag == TRUE)+ \1 c* C c' l
- {
+ y$ ?- o/ r; f: G% E- o* Q# C; ~ - if( p->timeCnt ++ < p->openTime)0 J+ n' n/ [4 N& ]
- {0 g! G2 w; }$ m! @. w
- //pin_ops.pin_write(p->pin , PIN_HIGH);
3 N/ |2 @$ f5 K5 D7 a2 w: p$ @ - TS_LED1_ON() ;
3 x& l2 }' x, a! f& a7 R - }
4 ?/ Q* ]2 Q1 z; ~# E7 @; { - else
1 t$ j* r/ i8 a - {
9 h+ ^3 R7 s1 L& }) {3 Z - //pin_ops.pin_write(p->pin , PIN_LOW);
2 g3 g2 V: T" G* r - TS_LED1_OFF();
- z W, z' |+ @% Q( u - }3 x8 `2 `6 m. K! I: b2 P4 l1 f4 X
- if( p->timeCnt > p->openTime+p->closeTime )0 C* |$ R5 v1 E% N# V8 X
- {5 L0 h0 f" \/ s
- p->timeCnt = 0;5 }. ^( K& Y9 l7 S& g) M' d& E3 A; n
- if( p->mode != BLINK_OPEN_ALWAYS)
9 l" p7 [! W" E A - {0 r H5 f3 |; V- f$ W, V% K4 q
- if( ++p->cnt >= p->flashCnt)
, S# N8 M- |- k$ v4 g - {
2 t! G: H' G' u) s3 c - p->openFlag = FALSE;
( _0 l' T C. U8 [) O0 t - }+ f% E% N3 C$ f
- } s7 |- ^ v& ^9 P6 D
- }& T% _/ M3 y6 y( u% |# Z" o
- } A v, O+ ?3 F
- }% ]9 J1 D) C q( V+ E
复制代码 用起来还是挺方便的。. F! k$ d+ h& k) N* X. I
9 x! C4 }0 ~6 M" g- f; q1 K: u9 x3 {+ X: [1 }
8 W3 L1 D e* w7 s上面的代码中为了求简单直接在OPEN时间做开灯 CLOSE时间做关灯 方便测试。3 ^/ r Q& [, J# E2 l8 s
最后是我自己画的图,理解蜜汁方便。' L7 n* a4 R- w
' p$ V; f. ]7 I5 B |