自己整理了一个功能模块,名字叫twinkle
, v* s, l6 }; \3 M1 [/ L3 R P) q4 h! {0 d
时驱函数这个词语说不清楚 我在一份头大的代码里面看到一个中文注释。( P$ e g' b. {' `9 }
应用是 比如控制LED灯一闪一闪(好像没啥难的)包括闪动3次以后停止 比如控制蜂鸣器 需要拉高在拉低,就像LED闪烁一样,需要控制电平高低和总次数。 twinkle 本质是一个前后台程序,后台是时驱函数,前台程序是给后台丢配置参数。 时驱函数是需要放到定时器TIME的中断里面或者UCOS的任务里面周期性调用的所以叫时驱函数
' X3 b6 f" W$ d7 M; c2 @
) Y; @; r" s! W0 |, i7 c: j- #ifndef _Twinkle_H_
" ^, F- h4 R: N( z2 I. T, a - #define _Twinkle_H_
$ S. J" B6 I3 b; q - 6 Y, n' y4 I1 \
- #include "sys.h"7 g. a: @& s1 M; `
- * [; D9 p q7 m1 H7 G. X
- typedef struct% N9 T8 H6 H( M7 `* @9 p9 e
- {
# \- X$ p+ u% z6 T% ^- P5 ^) b, K - uint8_t pin;
0 P9 K) ^- W5 V% k0 ]+ A; m - uint32_t timeCnt;: B( Q" @' k; v P% y( z, e9 u. m
- uint8_t mode;//* D5 m2 D! K$ _9 c' V" [) k' v8 _3 `
- uint8_t openFlag;
8 `$ ?4 k( f9 O* g$ m - int cnt;
8 M5 `5 t2 D" C2 ^* K# S6 g - int flashCnt;
4 N% T [& U1 g+ [% ^ i6 l5 y - uint32_t delayTime;//
# S9 l9 K& Z# m4 S2 O# D" \ - uint32_t openTime;//( c/ ^$ m- d! _. G& c- \
- uint32_t closeTime;//& q$ s, g% U3 G* g; R% d
- }twinkleType;1 \% W& {7 @, ?# Q) b$ d
- p& U, a7 T" R
-
9 \+ @5 d. L. u9 k+ J# x* m0 @ -
2 _) K! j! M, c! x - typedef enum
" |' O9 r# J) N# s& N - {2 V; z% a# P8 D6 H4 z* F
- BLINK_OPEN_INIT,
3 g/ X9 b! n' c: o3 F0 l8 z - BLINK_OPEN_DELAY,0 O! E7 t4 b$ Q0 S7 Y
- BLINK_OPEN_NOW,& i! I# V, H; I& s
- BLINK_OPEN_ALWAYS,
: u: b7 P; O5 A# n - }TwinkleOpenType; r% d) H/ }: i2 L8 d
- % e& y. ]- y% Q' h# n
- - `2 h3 H/ N( E9 Y0 x: ^" p
- void twinkle_timer_isr( twinkleType *p );- f: P( F# i: K3 t; D$ f5 _
-
1 P- H, l: X' j( f - void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime); o7 i+ b% R2 z3 g& p2 ]6 y
-
+ c" ^8 a; X1 l) c0 X5 \) z - extern twinkleType JustTesk;8 `8 h; y: @" ~0 S) g
-
9 t$ p1 C5 p, P4 f - 0 B3 Z: T, c; e
- #endif+ s+ ` b8 M0 ?
-
7 o/ v7 _# ~' b
复制代码- #include "twinkle.h"6 }7 U* ^3 p$ A* j7 T; ~- n! T
- # v5 r9 P9 Z2 P4 |/ S5 @
- #include "Initialise.h"
1 u5 R( g) R/ f# |6 }% u. ^ -
+ O7 k. e- O: g0 G4 Q - enum4 a, H) L7 |0 j4 h$ w: }
- {
3 K# U4 _9 H0 o - FALSE,
9 Z. u% O# W8 T* C+ x8 S - TRUE
4 d8 V1 j0 D# W& q7 v* ~ - };
1 E/ F ?0 Q( G' m0 n z -
% f0 d) S/ k8 d7 ?' i - twinkleType JustTesk;
0 n9 |. z4 i6 w - # q! T/ M1 d9 T* a2 a% c
- void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)# K4 ?8 G5 p7 V7 Y& c* x
- {
2 P5 S- o: Y( d3 o - p->timeCnt = 0;- m: w9 g) e! \+ K' h- r) ?
- p->mode = Mode;' N$ A& H8 E1 N' ^) ^# o
- if( p->mode == BLINK_OPEN_DELAY)
. H( l9 J, w5 s; y) Y! f - { % v9 I; z4 O" w4 j5 R' M
- p->openFlag = FALSE;3 v/ M- i" [; ?4 }5 _
- }, z0 l* ]/ l- H
- else% ]8 w5 z' [+ \: r# u2 a0 q! Y' g
- {7 B" X% p7 d2 E5 n, e5 [9 j* O
- p->openFlag = TRUE;1 M5 Z s& K# ]
- }
; ~8 E; E& B0 P g* r/ ^) t - p->cnt = 0;
+ R' C5 i! d2 l6 w; K2 f0 i - p->flashCnt = OpenCnt;. |: J* a4 N. y6 [4 g, {4 h
- p->delayTime = DelayTime;1 w. O8 G) W- F9 l
- p->openTime = OpenTime;
1 ?8 C* G; D' I6 r3 k - p->closeTime = CloseTime;
; l6 G' d, P9 ^9 Q -
5 j1 J/ n2 j, ?0 p - }4 |7 b5 u6 `; D2 V5 r
-
4 t0 w5 O% ?1 f, _ \" S2 V; T - void twinkle_timer_isr( twinkleType *p )
. z, H7 B' `5 J3 X/ b - {0 E# u" |, T9 A
- if(p->mode == BLINK_OPEN_DELAY)1 w6 c( Y! B6 Z. Y% j2 e
- {! _, w' H# F- _
- if(p->timeCnt++ > p->delayTime)
& c5 j/ R% x7 r; U! }; V1 m( o, ~ - {
) T- s) A. i/ m. G9 | - p->timeCnt = 0;
; x) `; s2 |: I - p->openFlag = TRUE;
' ` B8 |1 k4 U: h5 O3 m - p->mode = BLINK_OPEN_INIT;
# L- N& n E* F" ]/ _% S# _ - }6 r$ J/ D" h8 c6 H( L% ?7 e' n6 T
- }0 R8 T8 G5 h9 S: p6 N2 u# T
- //上面的是扩展功能 主要是下面// 5 h$ l6 X2 w$ i# Y; g3 z% v# {
- if(p->openFlag == TRUE)
3 _& B8 W$ b9 `# e; x4 [# s- n - {
1 r+ C6 N) c7 i6 E0 o4 r - if( p->timeCnt ++ < p->openTime)
" E# C) ~; g; a# U8 z - {
6 K R: g3 ] S! {, t( u" ]5 U6 j - //pin_ops.pin_write(p->pin , PIN_HIGH);7 P1 }% `7 P5 \/ w: h
- TS_LED1_ON() ;
' k z' _ S* H* w( s - }
: M% c, l6 |7 O8 o4 v4 I( A# m. b; L& J - else
( w+ J# e) J2 }# V5 s9 r' ~9 l% b - {
; ^! K% |, h' Z( \* v - //pin_ops.pin_write(p->pin , PIN_LOW);
/ I2 i' g+ U" F/ W |# R - TS_LED1_OFF();
" s, ?/ j( d4 c$ \( u/ } - }* m" Q' h8 E/ B# B8 |% v
- if( p->timeCnt > p->openTime+p->closeTime )
2 E& `# L8 s, r6 q1 a% [ - {( w1 g4 ^) G, P" j% H; G
- p->timeCnt = 0;
% E2 d( Q' V% Z) Q( u, k" y: i - if( p->mode != BLINK_OPEN_ALWAYS)
; }/ ~5 c; w" T8 s2 A& x - {
6 J+ r5 o* s' J7 n0 J - if( ++p->cnt >= p->flashCnt)
6 }" q8 K+ u; s, m% y- |( J - {
* q( f7 Z3 u! e+ z - p->openFlag = FALSE;& @! S" R- j6 \2 C
- }- {2 T" ^) h: c6 ^4 V
- }& p/ B* P% s6 R3 c2 [6 n' Q
- }
# n x6 Z( A/ o# |. |; H3 l0 _ - }
2 t. S4 b% e' w - }& c. g) O) z4 r, h, G/ Z3 w/ O+ \
复制代码 用起来还是挺方便的。; t4 y* ~! `) z5 W* }
( i s3 C) H& N
/ z( J+ x# }4 o f6 s. n& z# V' T+ K
上面的代码中为了求简单直接在OPEN时间做开灯 CLOSE时间做关灯 方便测试。
7 F4 l0 A: ]* s; A最后是我自己画的图,理解蜜汁方便。
6 h5 a. F' k9 \
/ b% w' ]8 |; j8 ~& Z' ? |