自己整理了一个功能模块,名字叫twinkle. `! e5 u F3 w' [* }
* P5 V0 c1 o0 d' Z3 v x/ i+ n时驱函数这个词语说不清楚 我在一份头大的代码里面看到一个中文注释。; v6 ~7 i! ?$ H) U |
应用是 比如控制LED灯一闪一闪(好像没啥难的)包括闪动3次以后停止 比如控制蜂鸣器 需要拉高在拉低,就像LED闪烁一样,需要控制电平高低和总次数。 twinkle 本质是一个前后台程序,后台是时驱函数,前台程序是给后台丢配置参数。 时驱函数是需要放到定时器TIME的中断里面或者UCOS的任务里面周期性调用的所以叫时驱函数
& t, ~: J2 v: a9 P$ g; b
3 V3 Q& O3 ?2 p) c6 t1 Z- #ifndef _Twinkle_H_% _9 Z8 [) |: s5 h$ |& [- z: d
- #define _Twinkle_H_: U$ }* I5 S6 M. Q; v4 u7 P f) g
-
5 W( M5 L2 Q) N' R0 h( q- T - #include "sys.h"
# s! o8 V) R6 T! c7 N+ o+ V - 7 q% {* E2 S2 e, e* X; x/ y
- typedef struct! I# M/ `+ R7 b( o* r' i3 \
- {2 o f$ O: h: C5 |$ `( p8 P M
- uint8_t pin;
# g4 {6 l1 w8 I6 c+ m$ A* U- | - uint32_t timeCnt;
8 s$ ?0 m1 T4 u. m - uint8_t mode;//
) l' k# W& ?( a' ?! s3 \ h. { - uint8_t openFlag;
5 x7 \9 z% i7 a. a4 s: k - int cnt;
1 m, Z0 A8 F# s( n* d c$ J - int flashCnt;. T9 g& R0 @8 L1 c
- uint32_t delayTime;//
+ L' S/ L, E6 l - uint32_t openTime;//
9 u/ k: x7 L+ y+ ^0 O' M8 \& Z- m - uint32_t closeTime;//
' K2 a) X" Q4 t) K! N - }twinkleType;
6 |1 [/ G5 M u# y* k5 u" k$ ~ - * Y' ^; g, }; Z6 Y* h8 K1 t4 ^
- + U$ `7 y5 G" x+ `+ o( d
- 0 @& i/ h$ K" x" j
- typedef enum( A/ s* Y( ?4 I! E2 B3 k) ~9 `
- {! ^( w6 N6 X0 y U
- BLINK_OPEN_INIT,
l. h$ X5 S# v6 V3 z! v V+ _9 y _ - BLINK_OPEN_DELAY,% V$ I7 F6 B/ S' q( `
- BLINK_OPEN_NOW,2 |2 c1 T, j9 L
- BLINK_OPEN_ALWAYS,! H' h& E) g7 I* c+ B9 R7 o
- }TwinkleOpenType;
0 ^2 N. e' i( p9 }* [: r -
0 z0 A* w' c) k3 w( Z - i0 Q" ~' X' Y2 E% w0 E/ A
- void twinkle_timer_isr( twinkleType *p );
7 u$ Y; e* J% u% b -
& u3 G$ z" e3 b- T* t - void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime);
3 g5 K' O% B5 J' M+ g' J -
) t3 F) W b# x7 o - extern twinkleType JustTesk;8 ~% M7 V' x* v1 }- {
- . t- v& v" @# w, @8 w
- 8 w7 i1 a: }0 S0 s3 _
- #endif6 W' u( Y& O$ |0 L; Q+ }
- ' y8 o( C% [. |. o+ I8 {3 n5 j3 l
复制代码- #include "twinkle.h"$ Q- w) y3 x0 K$ k
- - h" j) H* S) o k& k* ]
- #include "Initialise.h"
/ r$ h) X! u, B4 T. y {. C/ i - / Y6 c7 S% g& M0 {( J( f: [
- enum
3 D; d+ k0 [" i4 k1 t7 ?1 i - {
/ ^& U, L+ X) i* c( A/ n' N - FALSE,' L a* U3 k# `8 j U: x1 m
- TRUE
' T4 ^2 E A( G: M - };7 x; A9 r) ^7 N/ I( }1 C5 n4 b
-
6 s$ ?9 i! C- @( X - twinkleType JustTesk;
5 [) L' z: D) r; p9 d - 1 D' n5 \; n9 X6 I1 Z0 G: g
- void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)
9 @4 X( }% d+ A8 ]2 v6 C2 ] - { C; s0 s* w2 ^( u- m5 k
- p->timeCnt = 0;# [. ~: W: G" \) |- d: R
- p->mode = Mode;% s4 k2 Z: P% T
- if( p->mode == BLINK_OPEN_DELAY)
9 s" p/ p" a1 N! t5 d5 H* ]2 C3 e - {
: m2 J! e8 h% P0 x. x- g - p->openFlag = FALSE;
: J! j3 }" |. \. H - }/ c S5 N2 m# E/ E
- else
' ~+ |1 T5 {! w( @3 }6 [, ]9 ?& L - {
4 a K; [. ~; x7 X0 K/ i, h - p->openFlag = TRUE;
# G7 F/ l( Q( B$ Y4 { - }
# F- k. X' {0 @' m9 o - p->cnt = 0;% c s3 L, k4 s+ ~" y' W
- p->flashCnt = OpenCnt;
, O9 ^4 F! V5 e6 \' C) y - p->delayTime = DelayTime;
( K" a! ^% |; ?8 W. L, M - p->openTime = OpenTime;' \1 h; X* `$ u
- p->closeTime = CloseTime; C5 j$ q. a M \8 N6 x& o2 `
- " U& v* d4 _8 g$ L) }1 b+ v
- }
. k" n) D4 A U, Q" u+ \: j - 7 f, G) @( g4 C1 g- U: P
- void twinkle_timer_isr( twinkleType *p )* G, E- T8 j* Z/ T) o
- {, n4 }* x N6 F7 ]$ ?6 g! Q
- if(p->mode == BLINK_OPEN_DELAY)) r" z- M6 T8 s
- {
9 s: B0 z; w* E9 h5 h - if(p->timeCnt++ > p->delayTime)
4 m5 l% e& I7 c) i. s. F - {! }2 o5 x4 T9 J7 T2 Y+ X7 b* c
- p->timeCnt = 0;
: ~, S y6 E# s - p->openFlag = TRUE;
: J: {5 U, c' M ]7 ^! A; `3 l - p->mode = BLINK_OPEN_INIT;% W! o$ M6 o" j+ b5 h
- }
/ p6 y3 u( Y- L0 m5 D - }5 L* k$ ]0 e& _1 {+ K2 z; }' T
- //上面的是扩展功能 主要是下面// & _# e/ F, F& m4 v p
- if(p->openFlag == TRUE)
3 q* p/ Z0 M& X - {; \6 c: F n4 ~
- if( p->timeCnt ++ < p->openTime): F+ b) L6 x" d9 e0 _" r
- {
# B" D- L$ j% V* u9 K- { - //pin_ops.pin_write(p->pin , PIN_HIGH);
$ m, `0 ^7 f& n: p$ r - TS_LED1_ON() ;
4 K( Z( x6 y; ] b7 O" q2 Z0 W - }/ A# T/ T4 I0 }8 Y; |: ?5 m
- else
- g, {* \& v Q1 D5 D - {
! _/ i6 ]/ A" _3 l* X - //pin_ops.pin_write(p->pin , PIN_LOW);
. Q- R9 E/ h6 s9 P) a r1 A* h5 N - TS_LED1_OFF();1 d8 n* r: A. q( ~) N+ \5 B
- }. g8 d& i& }0 F% ^3 w: s( L! {
- if( p->timeCnt > p->openTime+p->closeTime )
5 R* E+ z+ N' d/ y - {" z& v, b1 d- L& W/ r8 m# J9 ?8 @# s+ \: M
- p->timeCnt = 0;
+ M5 R6 i# a4 a - if( p->mode != BLINK_OPEN_ALWAYS)
1 ?% }) z* r+ i4 K$ n9 v) q - {
+ }5 y* u8 ~: N( i/ n' z4 I - if( ++p->cnt >= p->flashCnt)
" d' t- Q; P( \6 L - {1 y7 O) W5 y, G3 }6 s. a
- p->openFlag = FALSE;
' H" D% c" ~$ v* [ - }, m- v& a: b/ Z4 o
- }
! n( E' z2 l$ T9 H! s - }
. z; `- {, n( j6 W4 M, O9 D- T - }
) X( V" V3 _3 y% s0 [) T/ @ - }. x6 c- J# u) O" L! B; I
复制代码 用起来还是挺方便的。
) R( V0 r3 n* [" c" Y5 s$ ~0 T, _3 I' ?# U) E/ r) \
' l% r# A, `; k4 G& a( q& y6 L$ ^3 \, e3 R
上面的代码中为了求简单直接在OPEN时间做开灯 CLOSE时间做关灯 方便测试。
* r) K5 n6 P! m" f0 L6 U" ^最后是我自己画的图,理解蜜汁方便。
x: K4 j; f3 K$ e3 q
7 Y! R2 r8 M# I1 {
|