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

基于STM32CUBEMX的程序时间计时器(简单易用)(STM32L496)

[复制链接]
tsuibeyond 发布时间:2018-5-28 13:15
本帖最后由 tsuibeyond 于 2018-5-28 13:18 编辑
8 e3 H1 r0 m4 r3 d% h. _3 T2 V- Q' p( o" P' i2 W
很惊喜收到STM32L496,只写了关于它的一个帖子,实在有点少,这里补充一个自己常用的一个程序计时器,基于STM32CUBEMX,很简单方便,也很实用,希望各个技术坛友喜欢0 R0 e' J4 K' F" w
3 T+ E3 l+ q5 u' V9 j
这个是我上个帖子的地址,https://www.stmcu.org.cn/module/forum/thread-615906-1-1.html,本部分内容是基于这个帖子的工程实现的。
5 V* K9 O- V. y8 G4 t# h# q' C1 M
! b- t' O$ V' b+ R8 D注意:2 p' Z- [/ ~0 Y/ f/ q* Z
RTOS有点占用heap,所以,需要修改写heap大小配置
* ~& N# C) K3 S我的:  U! K4 U* h; T
1.png
: H$ B' j9 l* o4 \4 Z8 } 4.png
  X; ?$ i3 F/ O, z& \最后,这里就不会出问题了
' U5 l8 i6 E, R 3.png
, \9 r8 b( r+ `2 Z. w- d: Z; O6 m7 {" W
回归正题
0 G& j, O- g) Q我们的功能是基于心跳定时器的
" p6 ]2 K. X& U) U& K 2.png
: I6 p0 D+ Z4 k+ m: l
4 H, g! R  S" f在工程上添加文件" C% @& M7 s5 ~5 b: l) N( L
time.c
8 |: _: f' W0 H% K  z6 W#include "time.h"+ q, i" A5 C! Z6 ~1 V4 N
#include "stm32l4xx_hal.h"1 L+ U% `) y+ @1 _! }

* m2 H/ T$ N4 K. k6 [! Hvolatile unsigned long long sysTickUptime;
5 K0 g# `6 r; y% R& vfloat cycle_T[20][3];
1 ~- }+ k6 f6 a% u& Kunsigned long long time_consume[GET_TIME_NUM][2];
% H1 r0 g* S6 L- n9 yint task01_time_comsume_us;
+ x1 s& n( g( O$ d3 ~' E* @int task02_time_comsume_us;
& S8 h4 s4 d$ e" w: w; q+ e# ~& Dint task03_time_comsume_us;/ G! J5 H% t8 }0 r
Det_t det_t_s;
2 k. A" S7 ~  [+ w  I$ k, T0 u3 S, F" ~
float get_cycle_time(int item)1 P6 _6 s" `6 l$ B
{
  M8 S. ^: H. U% }$ f2 K1 {) c  cycle_T[item][OLD] = cycle_T[item][NOW];    //上一次的时间( P9 R8 E% P. h1 v" q' y& F  x
  cycle_T[item][NOW] = get_sys_time_us()/1000000.0f; //获取当前时间
, f) V& E  A5 R, P; _: M  cycle_T[item][NEW] = ( ( cycle_T[item][NOW] - cycle_T[item][OLD] ) );//获取两次时间差9 U; ^% y% W6 q: [. ]
  return cycle_T[item][NEW];; o: M4 p: f7 D( P; l
}
# Y1 }  A4 K- a0 i/ m2 ~" J: e7 J  ?
unsigned int get_sys_time_us(void), M' N. I3 K9 r2 C
{
. [, j3 h% K- ]2 r- }  register unsigned int ms;, B# H+ j5 z6 W3 ?
  unsigned int s_load;/ ^! R& [4 H9 e/ |
  unsigned int s_val;. V- a8 H8 _4 p
  unsigned int value;
. p) o# e! `  K' g- N0 A- G3 v+ l  s_load =SysTick->LOAD ;: Y' V4 {3 R" p% S. y# t/ P8 e
  s_val=SysTick->VAL;- O+ u% V6 O3 B0 m
  ms = sysTickUptime;8 i( D7 L8 N2 C9 t
  value = ms * 1000 + (s_load - s_val) * 1000 / s_load;//获取us级的计时
* h3 Q5 Q" s2 D2 n1 r4 Z$ |  return value;
" U+ q8 M! ^% g8 ^) R- W}( O) ?; d) ~# c

0 n% k1 d! f2 t2 yvoid time_inc_tick(void)  //在心跳中断中添加,每一次心跳,执行一次
" v$ D, n) U6 Z2 ^& ^3 b' l! }{. {5 B% \$ \' x2 f# R# \
  sysTickUptime++;: P- Q! V! t6 J# @8 b
}
9 f6 j# U  E3 b; [

: [- M$ O8 l+ ?5 r2 M3 |% e, t3 k5 y: G5 I' s
time.h
% ]0 a) V% U6 `+ y9 g3 a7 K#ifndef __TIME_H_% w) O! a5 x* n
#define __TIME_H_
# A* ~# @% L+ ^; ^* a3 S- E8 q$ D& ~& @' ~- o% z
#define GET_TIME_NUM     10        
" X% H: f* e  @" e, Cenum1 m: [' N- l+ E6 {
{9 r: R, f* v$ j6 p: E1 Z
  NOW = 0,
+ H1 A  z, J4 J. S9 w  OLD,# D7 j1 ^* G) n0 i/ e
  NEW,; n# K9 o7 `4 M4 O6 T+ e) F- x
};5 q0 \8 p; M$ T
enum5 {& Y2 v% q9 `
{2 ~" T0 j" y% r5 i7 i
  task01_index = 0,$ [1 ~0 T* t: P# Q" r3 K5 I: j3 @
  task02_index,
2 @4 i% y# @; i4 n2 c8 v$ }  tasl03_index,
' w. o7 g8 w, P: B};' s6 m- q: J0 f2 l1 _4 _
typedef struct
' L+ R4 {- {- Z1 U{! b$ n* d7 S# y3 q( z2 b* V
    float det_t_task01_s;9 c* i& e5 _: R6 U
        float det_t_task02_s;
( h2 q6 O2 ~7 C2 X! M1 o        float det_t_task03_s;
/ M: M! N/ M8 }# h! C% F/ r2 h4 ?. r) k( x2 H1 w- D
}Det_t;* X/ I" Q# @4 S1 M
extern Det_t det_t_s;- x1 ?, B& w$ @
extern unsigned long long time_consume[GET_TIME_NUM][2];8 Q0 d- C  d' G& f
extern int task01_time_comsume_us;
7 @* o. a5 s6 mextern int task02_time_comsume_us;7 e0 `6 D$ h3 U9 ~
extern int task03_time_comsume_us;6 A) A' E& f: _# w
# O2 j' V6 I5 D# v" W  P" J! @
extern volatile unsigned long long sysTickUptime;
. f4 ]. M+ r$ E7 o2 [% N5 Z8 pextern float cycle_T[20][3];: w) D7 F# ^+ J) p4 ?; G
8 {* K3 E, d% ?( Q+ t
extern float get_cycle_time(int item);# a9 g! q- T8 P# u
extern unsigned int get_sys_time_us(void);0 W& f7 n+ y5 P
extern void time_inc_tick(void);
" N, w  v  f* B- X
# Z, V5 m$ j9 ], q$ c& N; k#endif
  x; [0 ^% j+ A9 V8 s$ Z  R6 d
/ H* `- _8 a0 i' v" a9 i

1 l+ I% e: Y. V  W6 ^6 p在stm32l4xx_it.c中补充void SysTick_Handler(void)代码
0 a7 r) B, d* r9 w& Y: X% @8 |: b3 o/******************************************************************************/
4 q8 h$ ^/ _, |9 p/*            Cortex-M4 Processor Interruption and Exception Handlers         */+ V- O' V' G; M
/******************************************************************************/
* r6 f# N/ Y0 s  L! J/ N& |+ l7 c; k) x8 o
/**3 m" ~* Q1 _  `9 Y( `1 O$ P
* @brief This function handles System tick timer.6 I9 m1 x: r; i- I2 P
*/3 X4 i# j; m1 E% `4 |) X
void SysTick_Handler(void)
: _% a* f0 S- R$ @{* y' M$ R2 P. ]* x
  /* USER CODE BEGIN SysTick_IRQn 0 *// S- Z6 s  u; g; C% L3 F
( ]9 P' s+ _5 ~& `" K7 X
  /* USER CODE END SysTick_IRQn 0 */3 e8 U" f9 y4 }& e" n
  osSystickHandler();' `9 ?; B3 m% V/ e, R
  /* USER CODE BEGIN SysTick_IRQn 1 */" H3 m. w  c7 d% |2 Y* E
  time_inc_tick();
/ i2 j, T- `* j6 X# U  /* USER CODE END SysTick_IRQn 1 */
0 k- A$ ^& r: i: T}% A; _6 \1 C# ~0 J5 d& \: Q- b

* o4 W  ?+ o- H' d6 S6 a
9 V9 s1 V/ B4 O( F4 O% i' l. n3 b接下来,在任务中测试. V- e9 H+ v, V  X+ M  y+ Z
/* StartTaskLED function */
" ]; p# n- f3 v  @  \+ bvoid StartTaskLED(void const * argument)7 S" P# I$ e# o) d
{
4 R, f4 I5 z& p; x' |! R  /* USER CODE BEGIN StartTaskLED */
2 C1 k9 I3 S# _/ c1 G  //static uint16_t myQueue01_data;) r6 m5 I) R# @$ ~8 V4 \6 G/ l, k" ~
  /* Infinite loop */
8 A5 g2 ?4 `9 r  for(;;)& e7 m3 M4 p# r" V) _# D
  {
( _9 m% x( |* F% Z/ J9 V    time_consume[task01_index][0] = get_sys_time_us();$ X1 O1 H5 L1 l0 G
    det_t_s.det_t_task01_s = get_cycle_time(task01_index);
# w1 _3 U/ y& K: q    HAL_GPIO_TogglePin(GPIOB, LD3_Pin|LD2_Pin);
6 N/ k- e8 ^7 @+ R& e    //osSemaphoreRelease(myBinarySem01Handle);// 释放信号量7 C6 T* |- b9 N7 ~4 x9 @
    //osMessagePut(myQueue01Handle, myQueue01_data++, osWaitForever);" }- g( u, n1 `8 _. M& ?/ Q
    time_consume[task01_index][1] = get_sys_time_us();3 y" R- e) O5 j) _6 N8 c; W
    task01_time_comsume_us = time_consume[task01_index][1] - time_consume[task01_index][0];
8 @/ A, s+ u- d) _    osDelay(600);3 U  ^6 V/ ~* c1 K4 d: A
  }3 A# W+ n9 S1 Q) r# y
  /* USER CODE END StartTaskLED */
$ J4 l, u  a( |7 Q$ W}
/ Q) p. C7 u" T1 w  M

# e/ ^" f5 C5 {. b
! j0 ~! Z( u3 N$ n6 Y8 o' E) a打开live watch窗口查看(IAR在这一点上比MDK好用很多)
4 Z& C& o+ p0 {5 Z8 | 5.png
7 c$ J+ |1 x) V+ A' h: L+ _可以看到,task01执行时间为16us,每0.6s执行一次
' U2 V& c7 G6 j" P! j& c. y
: J4 x% m- ]( n6 ?  m TEST.part02.rar (2.66 MB, 下载次数: 4)
1.png
5.png
收藏 评论1 发布时间:2018-5-28 13:15

举报

1个回答
zero99 回答时间:2018-5-28 13:45:37
学习下,感谢分享
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版