自己整理了一个功能模块,名字叫twinkle
: r/ K3 m0 p) M. _: W, E3 B% a4 G0 L4 E0 t8 m0 D
时驱函数这个词语说不清楚 我在一份头大的代码里面看到一个中文注释。
. c/ L7 p, [1 x3 [1 C- n' `应用是 比如控制LED灯一闪一闪(好像没啥难的)包括闪动3次以后停止 比如控制蜂鸣器 需要拉高在拉低,就像LED闪烁一样,需要控制电平高低和总次数。 twinkle 本质是一个前后台程序,后台是时驱函数,前台程序是给后台丢配置参数。 时驱函数是需要放到定时器TIME的中断里面或者UCOS的任务里面周期性调用的所以叫时驱函数 % V( ^1 b2 K% F* r
$ \( G( S$ m. D0 |- #ifndef _Twinkle_H_- b0 j5 t" z+ E
- #define _Twinkle_H_3 u5 i' S5 L8 j' `) B: ^: N& e
-
+ k9 U d- S. V4 }( i - #include "sys.h"8 }% ~0 ] @4 E8 V7 i" W {6 e
- $ t+ e9 T$ u- K" s- T0 R' |. Z
- typedef struct
* ~) G4 t3 R) S _3 N5 a L9 g - {
t" b2 o: ?0 U" @5 {8 j - uint8_t pin;3 z" O$ }; l0 T" i; b
- uint32_t timeCnt;5 W6 s$ A# `% K6 | b3 b
- uint8_t mode;//+ r9 c8 X {* W/ v% O" Z! V
- uint8_t openFlag;
: _, k+ [& f5 z7 y" V) t6 T" G - int cnt;
6 |2 o2 r; r. Q" h, S" R! A' i - int flashCnt;
4 e U6 N8 k1 ^8 N. D - uint32_t delayTime;//
/ I% H9 E. a) T6 i/ X. W - uint32_t openTime;//
- _- a( Q6 N0 P* q" z - uint32_t closeTime;//
* W& X' h/ H4 d) Q) C - }twinkleType;
0 _0 N' _5 r/ _7 [9 A; ~! I - . s3 {7 f, M4 y( m# {
-
$ i' z+ C9 |8 n& z" v* P - 3 k' t" f3 m, r. ]8 v7 i
- typedef enum5 `7 h' T7 T# k+ d5 N# i4 Z% u, m
- {3 S0 g& Y. R! w6 a* n8 d
- BLINK_OPEN_INIT,
9 o0 q5 p; L( h' _2 d' ` - BLINK_OPEN_DELAY,
# Z/ _: m" b: r2 N - BLINK_OPEN_NOW,
1 Q" Z+ P8 x1 o8 b - BLINK_OPEN_ALWAYS,) M6 J9 N" G7 E1 k7 z; q
- }TwinkleOpenType;' F( i8 y- ?5 h3 B7 e
- : G1 J% X! |" l6 o0 F3 [7 E! @* Q
-
, `. Y) \% w6 X/ q; ^* i0 f - void twinkle_timer_isr( twinkleType *p );% r( E; E: v9 d% ~+ W! z
-
8 E: g2 U, _& [9 O! A9 j, z - void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime);2 ~0 z8 T# m) d: N. r$ ^" i) d
- " F3 S& f- A* c9 B! z5 L. ^- | ^8 t
- extern twinkleType JustTesk;$ c, E8 W4 ?7 Y, \
- 4 n% w8 r C& Y( y3 N+ t
- / d3 _/ r: W% W3 [* q' ]! [
- #endif
6 Q& y" A8 h2 j& D0 ^ - ; m8 z* O0 s7 S% S" Q) [. j/ b5 w2 O% A
复制代码- #include "twinkle.h" e$ X! v1 a; e# I
-
' g% E3 O: u1 t - #include "Initialise.h"
& P9 ]9 r' O' b/ V ~" J -
* _1 E3 L$ @/ {! Q7 U. \ - enum
* n& D0 E2 i O - {2 d; R3 O- K" G3 M, I" V7 W
- FALSE,
( f8 i! K% [9 B0 V - TRUE5 a$ ~! J i) Z
- };
2 c- p. K' L# ^3 i6 o- Q/ F - 7 b8 u6 P; W- ^& k
- twinkleType JustTesk;, \" y' [# M. W/ k! n
- ( t# i+ e6 m5 h% S
- void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)! @9 E! _3 G2 F( h5 F
- {
) L: I6 G) E8 g' M3 \3 K - p->timeCnt = 0;
+ B' T5 B* F3 @9 i - p->mode = Mode;
1 ?3 w% \( k( ~! M7 P - if( p->mode == BLINK_OPEN_DELAY)& l2 {( `9 K' v- Y* b% M
- {
, F# P( A( y/ ?, P7 h! v$ g* P - p->openFlag = FALSE;, Y- a( F" f/ l3 v: E
- }- K/ L! \3 ~8 _; C6 M& K/ N
- else9 J0 j3 i! \$ X1 R
- {! f4 @, o0 h! `+ H
- p->openFlag = TRUE;
! g! u1 _) r) U9 C4 Z7 g - }
& Y# ]: G: k- a ?3 F f) ?/ ^- N - p->cnt = 0;- s, X+ {3 J0 K3 o# T* T
- p->flashCnt = OpenCnt;% f# r% _, G" x1 c0 |! U
- p->delayTime = DelayTime;
5 [" L1 @5 a+ L8 L( [- m( n - p->openTime = OpenTime;, w9 O, o1 [/ m1 h, A
- p->closeTime = CloseTime;+ c' L- |) V' D7 `4 d; K
-
6 t1 g5 u) K* D4 i - }
+ @/ S* y4 s4 X2 z r5 V' { -
* Z, e& J( |' Q# a( E+ t - void twinkle_timer_isr( twinkleType *p )
$ s+ T& h2 C! X - {
; l) [$ ~) s' D. O% z - if(p->mode == BLINK_OPEN_DELAY)4 \" @' U, A( y$ ~# X
- {
$ s/ e5 H' H$ l2 e: y# N, l - if(p->timeCnt++ > p->delayTime)# A0 K% G! [/ L
- {
; u* A0 c! I" L n - p->timeCnt = 0;/ `; t3 V1 {$ Z G" q! N
- p->openFlag = TRUE;9 o, n* \6 F# @& W. S
- p->mode = BLINK_OPEN_INIT;
7 Y; f$ |- ?2 U& }2 }7 b - }
) I8 G' q; v* u3 G - }) O6 w* m" C3 m9 q8 X( l
- //上面的是扩展功能 主要是下面//
/ V# U4 `" B/ p. @. K2 A - if(p->openFlag == TRUE)# @4 X$ n- q ~$ a, [/ f
- {1 M9 b- s. T* m& w# E
- if( p->timeCnt ++ < p->openTime)! M, t4 u' y9 n- @2 V# c' n, g
- {
m1 v: `: E: M6 n! E% [/ a - //pin_ops.pin_write(p->pin , PIN_HIGH);
4 A, E! x6 M' J; \ - TS_LED1_ON() ;" l& |9 j& {& `
- }
! Q5 P* p5 Q+ y5 W( N1 K* u - else
* n5 F6 ]% T0 q/ k7 Z% l1 z9 U1 }# S - {
p. G- ]. A. B9 |* ^+ h - //pin_ops.pin_write(p->pin , PIN_LOW);5 Z0 d8 q1 e; |1 V8 P( h
- TS_LED1_OFF();
4 f4 h1 r S3 C2 j4 c5 O2 c4 e - }
: X5 v/ e f' g+ M7 g - if( p->timeCnt > p->openTime+p->closeTime )
. X+ M) E: i% k$ z; y: s- b - {
8 G, ]3 F9 j! l; C0 J - p->timeCnt = 0;, p, E2 M" j. t
- if( p->mode != BLINK_OPEN_ALWAYS)
+ Z# x( o& _- P; f9 r - {- v$ V5 u8 T2 {6 ]" I
- if( ++p->cnt >= p->flashCnt)
8 F! J ^3 c2 I, c1 t7 r - {2 j9 i+ ? z t! ^' g
- p->openFlag = FALSE;
6 U8 P, o3 _0 u - }8 s( Q) ]4 g; z/ S0 ]
- }9 O$ f" G4 O$ Z+ \3 e
- }
5 E B; j2 Q- O( j6 j( l - }
0 K0 L( D) ]% K p) B A. o) i6 w - }
: t3 V& K# |2 R, M0 W9 h
复制代码 用起来还是挺方便的。) @0 N: W! H2 h/ b7 Y
: V5 B, C% t+ c, r: z
7 z( D6 Y# l3 W0 Q2 o1 G
- d4 ]# L. U f$ u% O8 p8 t1 U- w上面的代码中为了求简单直接在OPEN时间做开灯 CLOSE时间做关灯 方便测试。
" \% c2 A0 ]& I/ W# l最后是我自己画的图,理解蜜汁方便。
3 O9 L- y1 \' d
) B9 ^' ]% m1 j; U" K9 O
|