自己整理了一个功能模块,名字叫twinkle
Q$ H. a9 D# w$ n; C G7 k8 o; B' z% ]/ R& M, u3 u0 W
时驱函数这个词语说不清楚 我在一份头大的代码里面看到一个中文注释。
& O5 |) m! T C0 l5 P# V& j应用是 比如控制LED灯一闪一闪(好像没啥难的)包括闪动3次以后停止 比如控制蜂鸣器 需要拉高在拉低,就像LED闪烁一样,需要控制电平高低和总次数。 twinkle 本质是一个前后台程序,后台是时驱函数,前台程序是给后台丢配置参数。 时驱函数是需要放到定时器TIME的中断里面或者UCOS的任务里面周期性调用的所以叫时驱函数
! N7 }0 O2 b! \/ _
0 u- y [# a8 y! h- #ifndef _Twinkle_H_2 L: C$ n& U) }7 V9 a
- #define _Twinkle_H_8 N# R7 p1 w" x1 d% k2 \
- 7 i9 n- i. J2 b- B
- #include "sys.h") O! d- A3 S1 _
- & ~$ W. K1 x& u# c
- typedef struct( `- p2 X0 x' ? g6 h# \4 D
- {9 E; m6 V, J: t% x! h5 z7 P! f
- uint8_t pin;/ B E& Y5 `- p5 l: r8 z
- uint32_t timeCnt;4 T& `' H( m1 W4 A
- uint8_t mode;//
, H' z+ S n2 l7 z3 Z6 m. Q$ H - uint8_t openFlag;
2 I# w' k$ l, u0 B7 J: W8 }/ Y3 F& b2 r& C+ J - int cnt;
& a+ d5 `2 M# Z5 m8 _: u - int flashCnt;
& U ~- t% w" y5 j' p - uint32_t delayTime;//4 W, `; Y" V& H: L8 A4 V5 w
- uint32_t openTime;//
! k- w! L0 p: ~; |" t" w, X; i - uint32_t closeTime;//! w2 @# S% v, f# L+ G/ a
- }twinkleType;
" X* a6 d! Z1 l. \4 |) D; R3 o -
3 |& a2 X2 _7 D* n* x+ H -
% z% _& x1 Q/ d- w -
9 `" a8 O8 s: [( {- I! J - typedef enum
2 g! p2 P$ M2 | h- g - {1 B: Q2 k) u9 C" A7 k+ C
- BLINK_OPEN_INIT,
( E: \& J/ G1 `3 K - BLINK_OPEN_DELAY,
4 g, D1 C% S6 n# X. s9 Q* W* a - BLINK_OPEN_NOW,
% l! Q7 z6 ]$ r6 [# L* B" E - BLINK_OPEN_ALWAYS,
9 V* a9 ] e/ P' s h% g ^3 N - }TwinkleOpenType;
. h0 K, a5 D- r$ W, @" a" h -
5 ^5 `6 ^3 a" f" C% d, \3 z -
0 W |8 n+ L7 m, x. y - void twinkle_timer_isr( twinkleType *p );; E t1 ^' e' n# `
- , s/ u% U7 Y4 m+ Z" }- n
- void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime);; n8 v8 w9 U% W/ d* l
- ' t+ Y: X6 g! P5 d5 W1 b
- extern twinkleType JustTesk;8 r) E7 N; q3 T$ t/ }' p
- $ o4 _+ @$ E q, Q+ H* v g! V
- ! i/ I; E8 J* U1 ^+ g& B) i" U9 U, Y5 a
- #endif0 D/ A2 Q3 q0 i! _0 X# C! ?. o
- 4 M0 g- W- \" W2 o2 b/ x4 j
复制代码- #include "twinkle.h"$ H# n5 ?! n: x9 @# K' q. D
-
3 A k8 z9 F, M4 F - #include "Initialise.h"
8 `0 p+ Q" t! M% f& c! W# t -
) ]; `4 ~& x# x1 h, ^* G - enum
& }; T+ G+ H- `1 q - {/ [# J7 x2 U M) u
- FALSE,
& M' _$ k4 M2 `+ V" Q6 S$ S - TRUE
2 }4 ^, m, I C2 n% n' _ - };, ?- q$ M; E1 `
-
+ ~1 i {+ \ w1 z' I* B" n - twinkleType JustTesk;
2 {1 X' w" r: |9 a1 c* G/ q/ C -
1 v1 q5 H9 [7 y: | - void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)
; I8 x, P+ h. o r- C1 r - {3 {8 Y, Y( V! x+ k
- p->timeCnt = 0;
6 l2 R! ~3 @7 ?. J - p->mode = Mode;
7 z0 I- m+ p) S$ H4 `4 T - if( p->mode == BLINK_OPEN_DELAY)8 r( O8 K: s0 I U
- {
- e, G/ b! f8 W6 ]/ H8 g - p->openFlag = FALSE;; S* e: u* e. L; R ^, K* f
- }
# ^( r6 W9 D3 f - else
) Y( S' x9 k6 K/ F - {
5 L" a. W+ L5 u$ a, t; Q - p->openFlag = TRUE;
. A- [3 |# J V6 c& X+ p6 l5 s - }
* z; {; u/ I5 S - p->cnt = 0;
9 W# A, V7 @( L- O. ~) v/ d - p->flashCnt = OpenCnt;/ V& h) h$ q: Z0 w
- p->delayTime = DelayTime;- v. P( e" J0 w1 o$ O
- p->openTime = OpenTime;
5 G! d6 T' u i/ x# W# J4 } - p->closeTime = CloseTime;
3 t7 ~' S7 U$ l0 B2 e - ( ~7 ]7 J2 y/ F7 \$ I& }3 U( z( \% l8 n
- } i- S6 g, a! p5 F+ f$ T
- 7 u* L( s7 z; F/ V) I$ g) r& q
- void twinkle_timer_isr( twinkleType *p )+ J+ x# \1 i( `) b* K: `
- {
2 G. j% l6 U0 [, P9 X4 ^ - if(p->mode == BLINK_OPEN_DELAY)3 v8 |. x/ C/ S! b& O @3 E
- {( B: B4 i% B0 t5 f# D3 M# a+ d: z
- if(p->timeCnt++ > p->delayTime)
) R& b8 w+ B' k7 |4 T$ m - {5 }) N- A; F( E2 `& z
- p->timeCnt = 0;
3 ~5 F: h, o9 y3 E5 V) z - p->openFlag = TRUE;
7 ]* V- H- i, ^- ` - p->mode = BLINK_OPEN_INIT;
7 f6 ]1 ` M3 I - }
7 g& [# i# i# W - }; }& B% v! G5 p7 N% ^
- //上面的是扩展功能 主要是下面// 9 J6 c4 a7 j7 a
- if(p->openFlag == TRUE)
& J4 J t0 o' r - {& v* j6 P+ W9 U2 b6 M% v
- if( p->timeCnt ++ < p->openTime)
1 p3 x2 g. u% s7 n- X - {+ X, _) A& I$ ], n
- //pin_ops.pin_write(p->pin , PIN_HIGH);
9 T5 [( N( Y; Q - TS_LED1_ON() ;9 ?# Q/ T- }) S# @5 g N
- }
: e- V% O; L' p. F. n$ U - else7 C, Y. A' L9 n* p! ]+ K# x! C
- {6 v) C2 R [1 [7 T1 p
- //pin_ops.pin_write(p->pin , PIN_LOW);
& Y( D( F& a3 c% M/ d; R0 q, q - TS_LED1_OFF();/ l4 x' X7 J4 I# z( w! o# J+ d
- }
% \- ^$ H; n* I- D - if( p->timeCnt > p->openTime+p->closeTime )6 i, H- v! [& r6 d; f8 ^
- {
3 j& ~+ c1 i' z6 v- w - p->timeCnt = 0;
$ c0 e. ?1 {9 a* W8 i% Y7 Z/ \/ _" p - if( p->mode != BLINK_OPEN_ALWAYS)1 K2 P- G3 P4 B! i" J+ {
- {$ y1 N2 }+ i- i7 G" u3 v7 U# P
- if( ++p->cnt >= p->flashCnt)
! r, H i% l& k5 c/ v - {
0 ^0 ?! }" P. W0 G0 U' r% {9 t - p->openFlag = FALSE;
7 g6 O9 L5 \4 r' F# P; d - }! a, {4 v: n0 L9 n- E, y( Z
- } k/ w" q( u/ G" d7 H2 I2 b
- }
- y# Y/ h( w: ]$ y' R7 F% l, o( F - } 1 ?$ ~" b" w4 f9 h, A
- }0 ?- t) {1 h# T+ ^1 O0 D
复制代码 用起来还是挺方便的。
* v2 v; M* [# c4 d& f0 F( W) I, w. ~' q3 J/ T
3 @; }8 a" s. |, P( r0 B
$ z. j" |- }3 _) A( r7 D9 {. R上面的代码中为了求简单直接在OPEN时间做开灯 CLOSE时间做关灯 方便测试。
( E% e6 h" R# H" P5 y. Q最后是我自己画的图,理解蜜汁方便。
4 U# R; P* [! R; n7 q
) a' I& L- h/ j7 w! U% [9 c |