前言+ e% N: |' F! y2 ]* K7 }+ B
本文主要带大家了解什么是软件定时器,并且带大家使用cubeMX配置软件定时器。( b' r) u! d+ ?0 i4 S
/ X8 ~. r& O! Z; P% y$ L0 `
1.软件定时器概述* }1 |& { Y+ U
一.软件定时器特性
( r4 C: H% k1 U/ d" s1 B" b软件定时器就是一个闹钟当时间到了就执行相对应的任务或者代码。软件定时器是基于系统滴答中断的。在FreeRTOS中我们可以设置无数个软件定时器。
: I7 z( m7 h+ h$ }指定时间:启动定时器和运行回调函数,两者的间隔被称为定时器的周期
& [8 l. D( x. r$ v* ]5 ^(period)。
% ?& Y N0 R5 g9 `( \! ^3 w
1 T. g: e% i' I指定类型定时器有两种类型:$ Y( C) b. E' R$ Z8 I, p8 m$ e$ L
1.一次性
/ w' F& p; s- y( c这类定时器启动后,它的回调函数只会被调用一次;可以手工再次启动它,但是不会自动启动它。
$ {( ^6 s# I3 W1 V( }4 Q( V2.自动加载定时器1 c: ~: v! v8 Q4 \
这类定时器启动后,时间到之后它会自动启动它;这使得回调函数被周期性地调用。' f! ?& G( j* g1 F x9 ?
* [8 I8 H/ A; s9 E: l/ d+ s K二、使用cubeMX生成软件定时器
7 `; b+ n U" _6 q# H9 S6 z1.开启软件定时器的相应宏4 q) L/ u6 i" L
+ l- c. j( z( _
* i6 E+ Y2 K z. W, G( V) b. s! i/ U* E: r% o/ L: E; J1 ?2 W' M
2.添加软件定时器" R- i* C/ Q+ _$ F. M3 x
) v4 o6 ~0 m( K0 W
{0 E; R2 j+ e) z# W/ D
3.设置软件定时器参数' |( M/ x% _. X
: S+ K9 l, o8 O5 D
3 m, X# F' P( J" R, d; u* i, c$ X! H3 p* L/ Y6 }
1.Timer Name:定时器名字
) Z% R! P6 C7 Y1 E2.CallBack:定时器回调函数名字
$ q& ~; b+ e5 j' t& Q+ C3.Type:定时器类型选择(周期性,一次性)
1 ^6 t ]. w' F
/ t5 L. {) }# {' `3 U' ?+ ~* Z三、代码讲解8 o# i& |) ~0 S# ]+ @0 w! w" I
1.定时器相关宏修改
& u0 O, X1 K1 u) \3 t我们在这里需要将configTIMER_TASK_PRIORITY这个宏进行修改这个宏代表的是软件定时器的优先级,软件定时器优先级如果设置的太低将会导致软件定时器无法运行,所以要修改相应的宏。- /* Software timer definitions. */
" R1 e/ z: n9 b# _! h - #define configUSE_TIMERS 1
+ R- n. |6 P" S/ E - #define configTIMER_TASK_PRIORITY 3//( 2 )1 }, H+ I5 |. i
- #define configTIMER_QUEUE_LENGTH 10
: Z8 M1 I+ h, ^, H* y, m. o% n - #define configTIMER_TASK_STACK_DEPTH 256
复制代码
/ ^& M' e( Y3 J8 m0 l# Q6 q2.创建定时器及开启软件定时器3 j. p* s D3 V# b8 V
. v0 U% W* q/ d
- /* Create the timer(s) */3 R: D5 L& w. s. i/ g
- /* definition and creation of myTimer01 */
' L5 V" H8 x3 G7 D. N# _/ Y; \ - osTimerDef(myTimer01, Callback01);! l- b& u+ C/ U8 z) h
- myTimer01Handle = osTimerCreate(osTimer(myTimer01), osTimerPeriodic, NULL);$ J9 s4 G/ R$ N- ]
- 0 D" k2 ^% h3 G
- /* USER CODE BEGIN RTOS_TIMERS */, n5 r" J9 ^& t, L; d" q
- /* start timers, add new ones, ... */, d1 d, U: S( j+ ~( D' v
- /* USER CODE END RTOS_TIMERS */
复制代码
7 _ p& J* m- A i; A下面代表的是选择定时器是一次性的还是周期性的
0 [1 ~: R0 m+ c v; {4 ?1 P! O& f" s5 P' q
- typedef enum {
( N' P' x9 R h K6 d - osTimerOnce = 0, ///< one-shot timer; _$ E% g: X4 w
- osTimerPeriodic = 1 ///< repeating timer/ z- Q$ F5 s+ B# [( h* U3 `& A9 g
- } os_timer_type;
复制代码
2 Q' I% t: w- |+ r软件定时器回调函数
# }" @) N J8 V z$ z* m+ |
7 b. W4 V w, n8 l' Q# u) X# P- /* Callback01 function */
) ^% M6 @1 D: _8 b$ Q5 F - void Callback01(void const * argument): T9 k1 Q3 D9 \$ k0 _+ s2 }
- {$ L/ e3 ]* j$ ~# \, K
- /* USER CODE BEGIN Callback01 */5 ?! n5 x, D8 u9 w. }- S
- 4 F X2 o$ x, B. a, {. c* i
- /* USER CODE END Callback01 */; @# s! U7 A) Q1 n b9 I
- }
复制代码 4 ?, P) `% Z% Y* a9 {4 x9 b5 @% `
开启软件定时器6 y% `( `# G- m7 N
& l3 i) P0 s( h* x' q7 _
- osTimerStart(myTimer01Handle,1000);//1000代表回调函数回调周期
复制代码
0 J0 U) t5 k+ U$ ~: X3 |/ f4 V; O总结 T( }9 e1 Y% Q# c# R: t! J: u$ c
一般我们只会使用到硬件定时器,但是在硬件定时器不足的时候我们可以创建软件定时器来代替硬件定时器的使用。2 c9 A4 B/ W! \3 }+ B
3 G$ C% m8 R3 ?7 S" o9 a: O) q
- w/ w9 \1 s! Q- P8 A, [" B& q# S+ B/ F% s
|