你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32cubeMX配置FreeRTOS软件定时器

[复制链接]
STMCU小助手 发布时间:2022-5-22 21:53
前言
/ w- f% f/ V# X0 T6 \本文主要带大家了解什么是软件定时器,并且带大家使用cubeMX配置软件定时器。8 [  A6 W- B: F) {! e
) O4 Q( [3 h% k6 D
1.软件定时器概述
2 F3 m8 A  V0 [2 t: A7 |% s5 v$ K) m一.软件定时器特性

) k! a2 A1 l# i! O# a0 I0 G+ G软件定时器就是一个闹钟当时间到了就执行相对应的任务或者代码。软件定时器是基于系统滴答中断的。在FreeRTOS中我们可以设置无数个软件定时器。
/ s- S9 M  t" c5 [9 y6 i指定时间:启动定时器和运行回调函数,两者的间隔被称为定时器的周期7 T. r+ T. R& k0 t  Z' y
(period)。5 E2 }! j/ |! r) H4 |
" v- [- l8 r5 K9 L
指定类型定时器有两种类型:
) s# H8 j: i* T" h. ~* H% T1.一次性
+ c; w( k  U# O$ V这类定时器启动后,它的回调函数只会被调用一次;可以手工再次启动它,但是不会自动启动它。/ k9 ^- ~, O* u  X5 c
2.自动加载定时器. t1 s* m/ \( Y7 F
这类定时器启动后,时间到之后它会自动启动它;这使得回调函数被周期性地调用。
2 r. C6 `; k. I4 {9 X( x( R- a. u& S8 C8 x  `7 T8 n; H3 L
二、使用cubeMX生成软件定时器+ y  Y- E# C4 a9 Z' n
1.开启软件定时器的相应宏- P$ H* p, X& N0 u7 U

) s! W) M& Y, C) S9 { KP`YW1[5UUCOK3(D1KI%KK1.png 3 E4 N. C0 r; z  C( y
/ L$ C2 o! n" G+ F* q: C' W
2.添加软件定时器
! i% [' h/ o! r& } D`OR%@VMETWJC22]QKPIIGR.png ) m  U) @+ w0 k; U6 z7 U  s1 k, i
* @* D: z# T+ P6 y+ C& c1 b
3.设置软件定时器参数
: O8 W4 ]& u- E
6 B8 q3 q" ^# L0 p NMKUSL$X2G@~%9]QNT6EQ.png
* [# R1 B- ]0 E6 J2 v/ j$ E) K7 F( n' o3 }
1.Timer Name:定时器名字: x( E. H% O$ ?' a3 B, i
2.CallBack:定时器回调函数名字+ ]8 M0 B% Y1 A
3.Type:定时器类型选择(周期性,一次性)
  u# j( c- f1 T3 Y; B3 e% {0 n2 @! `
6 F! \$ G, r  `4 }0 m三、代码讲解- i: @+ N9 R0 w8 p, H& O/ a  x/ M7 }
1.定时器相关宏修改: A5 c. ^( i6 N4 S* M8 N+ v
我们在这里需要将configTIMER_TASK_PRIORITY这个宏进行修改这个宏代表的是软件定时器的优先级,软件定时器优先级如果设置的太低将会导致软件定时器无法运行,所以要修改相应的宏。
  1. /* Software timer definitions. */6 [; x" D( F- c% r2 X' @
  2. #define configUSE_TIMERS                         1
    $ ?' o+ b* U$ e. m
  3. #define configTIMER_TASK_PRIORITY                3//( 2 )
    1 s2 ~  V) d4 ~3 M6 g0 e4 z7 F% }
  4. #define configTIMER_QUEUE_LENGTH                 10
    ' ^8 L7 V& j$ C- |0 A' G& ]7 ~" X
  5. #define configTIMER_TASK_STACK_DEPTH             256
复制代码
+ X0 R% ^6 R0 w0 r( m) K
2.创建定时器及开启软件定时器
" c# I/ |' u1 B0 j1 s' e. `+ m7 ?8 [* f7 n0 }
  1. /* Create the timer(s) */
    / @5 D; w4 y/ t& N
  2. /* definition and creation of myTimer01 */
    7 u; R7 q3 Q! s' N, c5 o
  3. osTimerDef(myTimer01, Callback01);8 N) K; c! }$ D9 {4 ^
  4. myTimer01Handle = osTimerCreate(osTimer(myTimer01), osTimerPeriodic, NULL);
    / |# B% j% x7 j/ f7 Q, H- x4 f0 O- K* |

  5.   K  J3 A5 S  R5 B* l! V- W
  6. /* USER CODE BEGIN RTOS_TIMERS */! B1 r/ g6 q6 i0 |
  7. /* start timers, add new ones, ... */& P# e) D, z& l# S
  8. /* USER CODE END RTOS_TIMERS */
复制代码
' n0 H- }* k$ B; \0 ^1 a
下面代表的是选择定时器是一次性的还是周期性的% I* c+ C: v9 d0 ^2 z

+ V  U+ {+ A7 b, C; B
  1. typedef enum  {
    * Q( M: a; n5 z; F2 o$ n/ R
  2.   osTimerOnce             =     0,       ///< one-shot timer
    $ H9 C1 |5 I6 Q
  3.   osTimerPeriodic         =     1        ///< repeating timer) o( O) A* o# _. b; R- B
  4. } os_timer_type;
复制代码
4 O: R; y3 J; b. K* e
软件定时器回调函数
4 B* ?* M6 ?) S5 v# t9 n& |
. l. H) g; X  S% ^3 H
  1. /* Callback01 function */4 C2 P  @" R& Q0 k% e( \
  2. void Callback01(void const * argument)
    8 ^3 Q2 d& y# N; O" x' u5 c
  3. {1 k- [7 n6 C6 s# F# y
  4.   /* USER CODE BEGIN Callback01 */
    ! v! n$ ?, n. S2 h5 e
  5. / Z: Y: S8 ~) T& D3 X; Z7 y4 ]1 R
  6.   /* USER CODE END Callback01 */
    7 i9 y# z8 P' w, }! v
  7. }
复制代码

' o! o* ]/ B- W9 R开启软件定时器, J$ f, u9 ?4 w. \5 I0 w
6 h$ }8 G6 z* B9 t
  1. osTimerStart(myTimer01Handle,1000);//1000代表回调函数回调周期
复制代码
3 r/ ?: K( b& L
总结
* ~8 V' k! z+ p7 g4 _+ Z一般我们只会使用到硬件定时器,但是在硬件定时器不足的时候我们可以创建软件定时器来代替硬件定时器的使用。
; Z. G! v: ~4 @) h! Y/ {5 Y9 u. d, g1 \

# S4 U+ D7 K& w
. J1 u; T/ w. l1 K7 o0 d
赞 收藏 评论0 发布时间:2022-5-22 21:53

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版