自己整理了一个功能模块,名字叫twinkle
, ]3 Q& P( j. ?8 R% c
3 j5 M8 l' L0 j5 q! j& t时驱函数这个词语说不清楚 我在一份头大的代码里面看到一个中文注释。0 y6 w; Z6 e2 Y: K9 Q
应用是 比如控制LED灯一闪一闪(好像没啥难的)包括闪动3次以后停止 比如控制蜂鸣器 需要拉高在拉低,就像LED闪烁一样,需要控制电平高低和总次数。 twinkle 本质是一个前后台程序,后台是时驱函数,前台程序是给后台丢配置参数。 时驱函数是需要放到定时器TIME的中断里面或者UCOS的任务里面周期性调用的所以叫时驱函数 $ }# z1 F# _ |% D' _
. `5 V# r7 _9 D3 ` r- b0 e- #ifndef _Twinkle_H_
0 ]! ]: F9 m; ]9 } - #define _Twinkle_H_- C& c; X) h. Y2 o. a: Q
-
- O( d# o1 X p9 A+ G/ {6 Q5 o - #include "sys.h"* A7 _1 X0 C% i3 d/ R# o: t0 u% U
- : C* K5 j9 f6 r9 K5 f8 ]) ]; a
- typedef struct
; w; H( h4 W7 r - {& j, X0 m" C9 Y/ @
- uint8_t pin;
" w5 s/ [* H4 |' b8 d - uint32_t timeCnt;: s5 z1 z$ u" j( D5 R f
- uint8_t mode;//6 D F, T; w9 c5 M
- uint8_t openFlag;
8 F0 f$ g3 a! ^0 `; f - int cnt;6 q0 ]8 h$ Q% L0 b
- int flashCnt;. g" g, i$ x9 S
- uint32_t delayTime;//
9 m! B+ _; |. M4 _- H2 q: \+ l - uint32_t openTime;//
/ O1 c/ s7 _1 r - uint32_t closeTime;//8 W [$ }# l! @7 l( W
- }twinkleType;
, X9 _2 I& a1 X2 P7 x6 ^) U+ E - 6 u1 c2 g, r" N. f, ?9 ~( l
- ; W; w4 u# z3 b7 t$ m6 b* B
-
* J6 S8 o7 h7 Y- S/ B - typedef enum
# g& n. x4 C; Z9 v* c3 _ - {
0 c# p! U0 n2 @1 h7 @; [ - BLINK_OPEN_INIT,+ N A% r" Y- N$ E2 b& i6 V
- BLINK_OPEN_DELAY,
) G+ ^) }! g& Y7 R8 ~# r& ?3 z' h - BLINK_OPEN_NOW,
* Q* w1 |) R8 E; }: j: m - BLINK_OPEN_ALWAYS,
& a! E$ [$ p2 J3 k. K3 H# l2 J: {6 p2 o - }TwinkleOpenType;( Q9 j6 }5 D* U# a. m. D7 q
-
8 \! k5 ~" V1 d( w% M" ` -
/ h: o6 [( m9 R. } - void twinkle_timer_isr( twinkleType *p );
+ j; J# O' W2 D5 n0 _* a( n* P( t - + A" H+ H6 V5 [7 j8 X3 ?; P, V! [
- void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime);
7 P) M1 I D; W2 m! L4 H - ) U$ i. i' _) B/ I5 D
- extern twinkleType JustTesk;% a3 Z7 g: F ]0 E( I9 S& B D! C! u
-
0 b& X* T- R3 ] - 3 @9 b2 M! T+ s4 k
- #endif
/ \: P# k$ h2 m6 J, w- X -
& J7 v, i+ j3 ^) A2 h
复制代码- #include "twinkle.h"* D* u |, n( x n4 f9 I) W. Q- X6 l
- ' R/ l+ t4 h/ M7 w
- #include "Initialise.h"
& [/ }* _- J3 J3 k1 N -
% @: z$ [: ]: w* I O4 H" K% F - enum
8 W" ^5 S- C- O/ c. l - {
. ^( T, B- V% U/ a! } - FALSE,& n$ F* K K: S6 R4 u
- TRUE
1 q* C6 }& R: c0 L - };& h4 E h7 X; j1 y2 m7 Q% p4 S
-
2 B+ ]2 M& u& z' t2 ? e - twinkleType JustTesk;& j: V. [* ]- E5 [/ y
-
# |4 n) ~& l' u+ t3 t2 g - void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)
% v' J/ w. g: p/ ^+ _ - {7 C ] ^- U+ o
- p->timeCnt = 0;
2 ~/ K! v& V6 P, v7 a - p->mode = Mode;
, n& K! k1 D# W( x - if( p->mode == BLINK_OPEN_DELAY)! J: Q/ P% r( ]
- { 4 D4 V8 `3 t* A( p* ^% C. o; ^4 R
- p->openFlag = FALSE;
0 J) Z! B; F6 o' U - }
6 S* E& g. a3 z* L& r - else
. F0 p5 f2 _0 q6 V - {
6 f) E, m, x2 B% z: G! J0 L - p->openFlag = TRUE;* t. M) P+ {: J: a: }, l
- }4 A. W5 v" q9 q. `2 k+ x
- p->cnt = 0;9 |5 b0 q4 ?, C5 F
- p->flashCnt = OpenCnt;
7 Y. A0 v8 S8 |$ T/ M3 `% D g; P. o% ^ - p->delayTime = DelayTime;5 \5 ]: I* R: u
- p->openTime = OpenTime;6 `2 [% t" U U
- p->closeTime = CloseTime;$ x5 y8 q& J, J- Q% d' _
-
! M8 i' m- c; l9 p/ q/ I# Z, j - }0 p# s% ?" f2 U) y
- 8 N* ` [: |9 d4 m% s3 y4 O& X
- void twinkle_timer_isr( twinkleType *p )) `1 t8 z Q0 q7 C- j
- {7 {& k+ }- J7 ^0 ?8 v# S m2 v
- if(p->mode == BLINK_OPEN_DELAY)3 d6 [6 m' ~ ?# Q. s
- {
! g5 S" \; d% m( v - if(p->timeCnt++ > p->delayTime). C" `0 [2 T1 E% A9 v+ a
- {; {# t- W8 F- W6 g+ h: N6 E
- p->timeCnt = 0;
/ r( e9 F. ~2 J+ }7 _ - p->openFlag = TRUE;
8 A, F z2 P' z$ c" v2 f( [3 m - p->mode = BLINK_OPEN_INIT; c1 T; }4 ]3 @8 R
- }# s2 L$ T, T% d2 h+ p# N
- }
- ~: b0 z6 h- t. C' }1 s - //上面的是扩展功能 主要是下面// ( _7 f. w* t4 c2 d& T
- if(p->openFlag == TRUE)
5 ^1 X; u; ]/ d% n: o! i2 p) T - {
7 w: }; j! M7 p* K - if( p->timeCnt ++ < p->openTime)5 S" j; h$ G! @) x& i
- {
6 \; P2 W1 c3 v5 S; h. }$ u - //pin_ops.pin_write(p->pin , PIN_HIGH);
; O+ ?. W' O; E | - TS_LED1_ON() ;0 d- D5 W! t9 C! b4 t
- }0 z, F, t8 M3 p$ P [$ }- M
- else
6 p( s* ~5 O6 z - { {, ?8 ~1 A, S' ?6 I! k4 R, f
- //pin_ops.pin_write(p->pin , PIN_LOW);- e5 j# W- V- j5 ^# q- E
- TS_LED1_OFF();
9 \4 y" ^1 `: `, F$ ]$ n - }+ [3 _2 M; i: e
- if( p->timeCnt > p->openTime+p->closeTime )9 f! N& a, h/ z5 L& Y: O8 B; j `1 ~9 J. Y
- {( ?5 i1 ^$ ?. l9 \
- p->timeCnt = 0;
& K* e* V* Q) {9 X* o t1 d o - if( p->mode != BLINK_OPEN_ALWAYS)
( c% \. C9 I) S+ y a$ y6 u5 G/ w - {
$ Q! d' A, C) Y - if( ++p->cnt >= p->flashCnt)
/ O6 C; p: q6 |$ y - {
; q# f# B& i, [+ r1 w - p->openFlag = FALSE;
8 r# W0 c! U' o) { - }
0 g7 [ r% \' o4 ]( |) b - }
6 O5 b9 ^. b3 H# T+ t; @ - }8 }6 I/ u% U7 |+ G* D' c
- } 1 [/ W+ A* c3 F) x
- }5 z6 n: A, ]- M$ {, _4 F
复制代码 用起来还是挺方便的。/ B. G7 C' V2 B* n
5 P% D, D# j& n% u5 q4 b
& [" J# A6 g. N
# q. \5 w/ |' ?. k/ D9 E" {8 ^上面的代码中为了求简单直接在OPEN时间做开灯 CLOSE时间做关灯 方便测试。- e" T/ H& x# y4 R
最后是我自己画的图,理解蜜汁方便。
5 c# l( T m# X
7 v$ }/ T8 X6 F
|