自己整理了一个功能模块,名字叫twinkle( X( N$ T+ s: o( U* q
7 z! @" c7 o% L+ r& `( W时驱函数这个词语说不清楚 我在一份头大的代码里面看到一个中文注释。
' }. n+ D E8 t' J应用是 比如控制LED灯一闪一闪(好像没啥难的)包括闪动3次以后停止 比如控制蜂鸣器 需要拉高在拉低,就像LED闪烁一样,需要控制电平高低和总次数。 twinkle 本质是一个前后台程序,后台是时驱函数,前台程序是给后台丢配置参数。 时驱函数是需要放到定时器TIME的中断里面或者UCOS的任务里面周期性调用的所以叫时驱函数
3 U6 k1 n; Q' U1 [1 W
3 m3 y, t) o% G! {' C- #ifndef _Twinkle_H_( G/ D4 @$ U9 l3 P1 n& [
- #define _Twinkle_H_8 Q' t- |9 ~( `- V
-
1 {! L4 Y: t; E0 n0 O - #include "sys.h"
y4 b! b A3 l& `- L- S -
$ ~# x% ~+ K0 ^ - typedef struct
& y8 B3 L4 |' P8 g* o3 A. [/ D1 q - {* Z( ~4 B) K. m
- uint8_t pin;
; a" ?% g: `( r0 M - uint32_t timeCnt;$ i" R6 }' g7 W1 k
- uint8_t mode;//
8 ~5 f E; T2 k9 N Y* w/ r - uint8_t openFlag;9 v; r7 v0 E4 O9 i
- int cnt;
' N6 O4 I, c% k% T2 g1 Y - int flashCnt;- T3 R- }7 v$ G5 r( |# |
- uint32_t delayTime;//
8 S: V- J% t( S/ I& P( _/ N - uint32_t openTime;//; M/ ~# r: u2 O, D e! ~
- uint32_t closeTime;//# y7 C8 E5 t6 e
- }twinkleType;3 R4 u) d% d0 W' H% J
-
3 v( [" ?; i/ L, Z -
G3 p$ {. B* e -
. |. ]. e H, D7 X5 v - typedef enum
. V9 ~) H$ h3 P8 z' c8 d- S+ z - { ^5 N' U9 u) A/ B ~+ z% a3 ?6 B
- BLINK_OPEN_INIT,
" Y1 y6 W) X" e4 ] G/ j7 K3 H - BLINK_OPEN_DELAY,, t& c1 _7 T2 Q, a5 h# ]& y
- BLINK_OPEN_NOW,9 H& `1 i$ s% q8 J$ e( x0 z
- BLINK_OPEN_ALWAYS,
+ a! m9 b7 g& `, v# y8 s( t+ h - }TwinkleOpenType;
, y3 i8 V0 m5 v: R6 m - ' y# E4 h, j. P& m/ i6 k/ X
- ( o% y8 n4 B* V
- void twinkle_timer_isr( twinkleType *p );# x6 b* L/ m3 D |6 }2 n
- ! R& C- e i; p' i1 n( b+ G0 h
- void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime);
$ z' n6 D" h3 f& x -
& Q" I0 j5 q* u9 V! i! n; R - extern twinkleType JustTesk;8 l' L( U9 ~ X& x5 Q+ g' X
-
( n4 R$ |* S+ q8 z% S: i -
0 v5 V# g5 u% \, I W1 O/ C& V - #endif
+ s4 s/ T, p$ D - % d5 a8 q2 q4 H2 x6 k4 j
复制代码- #include "twinkle.h"
8 p6 ^9 [* u7 u - : r1 @+ {# B+ c! v9 q1 k9 i
- #include "Initialise.h"& B: d* c8 X% c1 u$ o5 n
-
5 n6 Y0 R- ]* q+ E7 K# n6 \ - enum
$ l0 N$ d7 |. x% S/ C - {
2 l, e+ u5 W2 ~; k9 S - FALSE,
+ n, M! g0 @. B; a - TRUE; a* L8 d" ?8 @" e3 F* W
- };/ i k3 D# W# q' o
- ) T5 E' M9 r, `
- twinkleType JustTesk; ?: ]! W! G6 w8 O
-
" F/ R U8 u8 {7 J; L - void twinkle_set(twinkleType *p , uint8_t Mode , uint8_t OpenCnt , uint32_t OpenTime ,uint32_t CloseTime ,uint32_t DelayTime)
2 L. `6 `- a: W" ^- t+ o - {
$ I9 C! j& R4 X m& { - p->timeCnt = 0;5 L G9 ], `5 F0 X0 I
- p->mode = Mode;. T1 X9 s }# W; z4 M
- if( p->mode == BLINK_OPEN_DELAY)
$ g w* p) h4 @( ]$ U1 S - {
) m; P1 }1 `$ a - p->openFlag = FALSE;
4 @2 S& ]: j$ Z; R9 N+ D - }5 T8 v' A' n8 m5 I, A
- else$ `. _6 T: r4 F# ^
- {& Z S* E( {# G+ o( U7 A c' p
- p->openFlag = TRUE;: ~) ~; U! |# ~ e
- }
3 W O, [! ?% q+ }) w& ? - p->cnt = 0;" P* C% W, ~, M2 B
- p->flashCnt = OpenCnt;: ^0 t# {9 i- y6 f
- p->delayTime = DelayTime;
" L2 K% E. P+ ~2 U/ ]! r - p->openTime = OpenTime;4 ?; @7 f+ a! ?! d2 w
- p->closeTime = CloseTime;
2 I4 ]' P; s. T -
/ I2 t" ]$ _" t! c - } {, T) }" c7 a& |" U
- ( q+ B! S& N* p8 m; |2 a. o
- void twinkle_timer_isr( twinkleType *p )
( A0 y/ L. v) I, W' B - {
# y% N% U6 X. ^6 q - if(p->mode == BLINK_OPEN_DELAY)
, n8 h5 `" ? g% s1 }7 s - {
% j9 `/ C! M: f3 Y - if(p->timeCnt++ > p->delayTime)
3 ?0 C0 d& D2 K# E+ }0 `0 V' k - {% n+ {1 Z R2 a
- p->timeCnt = 0;3 F$ U& W9 }4 a2 t. G5 j+ Q1 t
- p->openFlag = TRUE;: w- L) a" p$ c1 _9 m
- p->mode = BLINK_OPEN_INIT;8 u' N9 l6 Y; P6 ^
- }1 Q1 ?" i+ f) g1 |( r. f R4 v0 }
- }
0 t1 m7 m5 @+ M5 j! c - //上面的是扩展功能 主要是下面// / E9 C$ J6 t- J; q% F/ _
- if(p->openFlag == TRUE)
$ ?; F! ?; J4 N2 o3 A3 D* ~ - {; D" a1 S, X. d8 V1 X
- if( p->timeCnt ++ < p->openTime)
; y3 I" K' e$ N& \* r - {
3 m0 J7 M0 r( ~ r* P% O - //pin_ops.pin_write(p->pin , PIN_HIGH);& {) x8 s. c& M3 n* A" P0 j1 |
- TS_LED1_ON() ;
$ P% `6 a* j. A" U [( ~' M - }
. }) L. {9 T9 k2 b4 w L' g - else+ Y) N' j* ?2 _. x7 g# u
- {
* _5 N; \, Y( Q4 ] - //pin_ops.pin_write(p->pin , PIN_LOW);: u1 [- t, |. M! A( k; [2 g/ h- U* ]
- TS_LED1_OFF();! g% _% s3 b2 Q. x! [
- }) e) d8 z N2 s- u9 W; v
- if( p->timeCnt > p->openTime+p->closeTime )
+ @/ g* @. e. i3 U, k5 m6 U% @ - {
) J2 }8 v3 t; N7 q - p->timeCnt = 0;0 M: r; N D# F! x4 B: I6 _( B# A
- if( p->mode != BLINK_OPEN_ALWAYS)+ s# c) x; s* J9 N* Z2 U, _
- {
, X+ k, J6 ^4 T+ e( { - if( ++p->cnt >= p->flashCnt)
$ [* I$ G. X. R" J* q6 k - {6 \6 V. ]# W0 {
- p->openFlag = FALSE;
8 R1 `- U% K8 u - }
% |1 {! b' `% H - }
+ B5 w+ n1 s0 r9 G# M6 ~) R - }
. e5 z! \! @: r8 p' V - } + V7 L! n$ J. q' ^8 i" d, C
- }
& L/ Y6 D1 @2 Z
复制代码 用起来还是挺方便的。
. N! J& U0 J2 v; Q8 D
7 o' N7 V& L4 f& Z. d; ?( ?! y; v$ M0 m- ~# q6 f7 _' ^! j) {
' I+ O0 E8 {+ E上面的代码中为了求简单直接在OPEN时间做开灯 CLOSE时间做关灯 方便测试。
1 n0 f0 g1 ~; Q! U) h( F }9 s最后是我自己画的图,理解蜜汁方便。& q. _* G* t8 ^8 T6 s, n9 e0 g5 X0 e$ O
3 v8 p n# i! N, y |