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

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

[复制链接]
tsuibeyond 发布时间:2018-5-28 13:15
本帖最后由 tsuibeyond 于 2018-5-28 13:18 编辑
- b1 W% Z: [) q9 v* s
( ^3 h  k  H7 _' R4 u: B* b很惊喜收到STM32L496,只写了关于它的一个帖子,实在有点少,这里补充一个自己常用的一个程序计时器,基于STM32CUBEMX,很简单方便,也很实用,希望各个技术坛友喜欢
# M/ u& y0 @, ?) x0 ~: ]( ?3 `7 R: G. h8 y) l3 Y( G, Y
这个是我上个帖子的地址,https://www.stmcu.org.cn/module/forum/thread-615906-1-1.html,本部分内容是基于这个帖子的工程实现的。: }/ V6 V; @, O0 c" z$ @
7 n1 t& D/ k$ u% ~$ U0 G. a
注意:
# A  v1 Q0 K: g' D4 [RTOS有点占用heap,所以,需要修改写heap大小配置
: h) v& B; i+ m4 `" f% \* p8 O% @我的:
" D, f. @3 z/ t0 X 1.png
! n9 c. p* q3 _2 q* Y5 k 4.png # E# U5 y4 q5 E8 e
最后,这里就不会出问题了
. N, \4 q1 O6 v( I" G 3.png
! `3 q" r( L8 V8 B: |
! N2 o7 s' h  q% j4 a回归正题  O: s2 e3 N8 z3 s) L
我们的功能是基于心跳定时器的
, P% v- m* w5 e8 c 2.png
. i5 @5 `" b: J. D* G8 s4 c' U. \. p* B3 \% O  S
在工程上添加文件
" T6 l' b; [; J8 N7 A, a, f0 i; Xtime.c9 d+ i' p  |% A7 ]. @- U7 c
#include "time.h"
9 p7 N: O- y# {#include "stm32l4xx_hal.h"
' I- v! V$ f5 s. Z7 \, U5 r3 G0 H+ q# J& M
volatile unsigned long long sysTickUptime;
- x' l$ T8 ?( I; v  Z- Sfloat cycle_T[20][3];
. K' F# h. o5 _2 \unsigned long long time_consume[GET_TIME_NUM][2];3 p2 A7 g; n; O' _" |$ m5 T
int task01_time_comsume_us;( @) G+ ~7 y. u! p
int task02_time_comsume_us;
. n- g% W7 ?, y, G6 ~; ]int task03_time_comsume_us;
3 n* @2 b  l# V/ r- j) Z9 GDet_t det_t_s;1 D# `& @8 K$ O5 v" y6 p6 y% w3 o
. f" X+ ~: x* u/ W
float get_cycle_time(int item)
+ X9 L' U  y6 N! L* T. D{; V' z: H) \# [" H
  cycle_T[item][OLD] = cycle_T[item][NOW];    //上一次的时间
/ j, Y2 \1 E  |1 Z- n: q  cycle_T[item][NOW] = get_sys_time_us()/1000000.0f; //获取当前时间
$ D1 {' `9 ?6 a% S  cycle_T[item][NEW] = ( ( cycle_T[item][NOW] - cycle_T[item][OLD] ) );//获取两次时间差( J  Q0 b3 Y# P8 e! T4 J
  return cycle_T[item][NEW];
) o- J2 l" c/ J}
1 [/ `2 L9 D- q) V' U3 q6 Z/ x) m9 s# [/ S3 |$ H- u  Z6 b% {
unsigned int get_sys_time_us(void)6 m' ~! F5 u4 B: p' ^
{
% }: E. C- i# [  register unsigned int ms;5 N- J, O. v1 E8 u* }' g/ N+ x
  unsigned int s_load;
+ V$ W0 r/ J5 X, s  unsigned int s_val;( o! ?1 ~5 z1 C3 Q
  unsigned int value;, A) K" Y9 d& l1 J7 O$ Y+ t
  s_load =SysTick->LOAD ;/ ]% k% ]- i, ]2 p5 q( M  v8 i
  s_val=SysTick->VAL;5 r0 M. m- y: g
  ms = sysTickUptime;0 Z* G6 r. E+ E1 d  Z7 n
  value = ms * 1000 + (s_load - s_val) * 1000 / s_load;//获取us级的计时3 u8 u1 }  k5 W
  return value;
6 w: E' U8 O. @' s1 c# _5 W: c}
8 t2 m# U& ?5 u; y1 x
7 G: J+ O9 P4 M2 K  K$ `1 M4 X( Xvoid time_inc_tick(void)  //在心跳中断中添加,每一次心跳,执行一次7 E$ I- T" w% a# X
{
4 X) ^4 ?7 ]) L% K% R  sysTickUptime++;& U6 F1 W- _3 X4 M# r9 g0 E
}
! ~0 M) ?  c- b$ V$ |5 `! Q+ a
1 H% B' j, o- I, C& Q
$ _  g9 P6 u) ^. K* V# R: `& U! |
time.h( J# L! M* @. \
#ifndef __TIME_H_
, Q( q2 R* N! w; v#define __TIME_H_6 C4 g6 h+ ^% s. b2 b" \

$ W3 O$ M: k( o5 p6 U, l#define GET_TIME_NUM     10        
$ g# F; _+ g, {3 eenum
6 Z+ n) ~' u; W{
9 T+ N  Z8 A- y5 m0 S  NOW = 0,
8 s, v4 m" Q3 O' |9 M9 {  OLD,5 |" ~. j) O# e9 `
  NEW,
& q# @3 Q6 Y& b! }};
$ P% E- x8 z2 F2 O; b) X7 jenum
1 X: v9 f4 p+ Y{6 K+ }+ A( Y( a5 T4 b, M$ V
  task01_index = 0,
$ `# u8 h, Z: [$ M* M+ v" S# m* ^  task02_index,
) Q% m) r$ D1 d0 T& j  tasl03_index,
' W! A( \4 }; ?1 ]* M};
) G6 C3 C1 F3 @5 E7 Vtypedef struct+ a/ u0 e& s3 q$ ^, k& O
{
7 o1 ^4 A/ p9 {1 U5 Q1 H    float det_t_task01_s;+ Z- L6 J' r. ]4 q
        float det_t_task02_s;
+ G3 _- B; ?% s) F% |        float det_t_task03_s;
# W) G. u, |+ ]9 y! w' K8 w
" E' k1 `( ]4 d2 _7 o: P}Det_t;
. V- `8 `1 l7 yextern Det_t det_t_s;
* L) ~) g3 Z* l! g" A& U9 {extern unsigned long long time_consume[GET_TIME_NUM][2];
$ T! e! n  C7 |( d, _0 h$ \2 hextern int task01_time_comsume_us;
* }& Y( }5 V1 X3 c. Eextern int task02_time_comsume_us;
2 T/ w& l) O+ R" x& Jextern int task03_time_comsume_us;/ T5 ]% ]$ n, V0 B7 v
# e; q% S5 t0 X1 P. G9 o$ I; Z, j
extern volatile unsigned long long sysTickUptime;
5 p( u/ e' Q: g, ]: m, k0 Sextern float cycle_T[20][3];
) u/ W0 k$ U8 c! u7 O/ ?0 g( z* }! g1 {* u( q; Q$ t
extern float get_cycle_time(int item);
$ `  X7 a$ c0 r- n- m8 @% a4 F  {( vextern unsigned int get_sys_time_us(void);2 ~+ o; w( N, o0 q% b
extern void time_inc_tick(void);
: q: Y  e  v: U, t9 z3 E+ f; s1 ~* G7 ?( M) G
#endif
  {2 q$ P; G) J3 F/ y, _
3 H1 e: m* Q% r3 @5 t9 y- W
" A6 H$ `6 k0 e
在stm32l4xx_it.c中补充void SysTick_Handler(void)代码0 q7 ?1 ?6 x% |
/******************************************************************************/: D5 |8 D* A- k1 f: i* x# Z7 S: Y
/*            Cortex-M4 Processor Interruption and Exception Handlers         */1 [  \+ X6 x9 r' B# ^
/******************************************************************************/8 v1 D5 ~& `7 }

, Y0 n9 Y' ^' t$ e8 u/ f- Y/**- v  J$ P- l; [- j. {1 P: r* d
* @brief This function handles System tick timer.4 F7 i1 l+ B/ a& X$ c. N
*/
, H; t/ Q9 v3 Svoid SysTick_Handler(void)5 C1 t# \! k0 O3 g* ~
{, S8 l$ s1 O( i4 Q8 K9 y
  /* USER CODE BEGIN SysTick_IRQn 0 */1 [' }$ K' j: e

$ L0 i! o7 Y  g0 D! I# Z  /* USER CODE END SysTick_IRQn 0 */
- k) ]/ P( U' u5 R+ E. k" i( J  osSystickHandler();! |. M: p" T* m6 ?0 i/ L+ Q
  /* USER CODE BEGIN SysTick_IRQn 1 */# r# H1 `0 D6 G+ o
  time_inc_tick();
8 P: l6 L, m0 @8 T4 G; W. A% s" U1 K  /* USER CODE END SysTick_IRQn 1 */$ _7 U( d! k; G' C% @9 o
}$ K* o# ?5 N+ e5 e( N* M, |
1 c  l6 n5 t, h' `
/ s8 `  C- h' n+ ~$ ~
接下来,在任务中测试, z9 D9 {' L+ m+ k0 u
/* StartTaskLED function */8 W5 j/ q' ]( ]. m% @
void StartTaskLED(void const * argument)/ w  u+ ~* u5 J$ t! n: U2 _; {( ?
{, n/ ?! z* @$ n4 x0 H2 L7 e
  /* USER CODE BEGIN StartTaskLED */- x4 _  W! y! _) R' Y4 c) I5 a, x6 F6 L
  //static uint16_t myQueue01_data;& ~  z- F( z- S- N
  /* Infinite loop */, c9 b  [  [) G* f
  for(;;)
; |( O8 R1 ~* Q5 |( c  {& U. q; Q' x- x: Z" o' ]4 L9 b' O
    time_consume[task01_index][0] = get_sys_time_us();5 V& l0 D4 m0 B3 ]5 T' L5 f# r
    det_t_s.det_t_task01_s = get_cycle_time(task01_index);
2 \% H9 @( n& y9 J$ O    HAL_GPIO_TogglePin(GPIOB, LD3_Pin|LD2_Pin);
6 ^) s9 G1 N7 J0 f' v3 F7 E; @8 U    //osSemaphoreRelease(myBinarySem01Handle);// 释放信号量. ~6 f7 K  k" i$ x# {+ P' u7 B0 S1 y
    //osMessagePut(myQueue01Handle, myQueue01_data++, osWaitForever);! O5 C  D( L- W6 j5 `# N
    time_consume[task01_index][1] = get_sys_time_us();) T0 i/ o: ]/ [  z& E
    task01_time_comsume_us = time_consume[task01_index][1] - time_consume[task01_index][0];
4 j2 P8 m* V+ t6 E7 p6 `    osDelay(600);
  z3 f# D' g  \: d0 G# y3 s  }& f$ T- S' V0 ^
  /* USER CODE END StartTaskLED */
7 t5 D) Z7 y2 `( N: f( @}. j8 s/ [4 }1 ]+ D; W" o5 r6 f
( @( k# U/ @$ m  t1 d$ n7 K

! \4 I0 R5 D9 `9 A% ]9 Z" K' d打开live watch窗口查看(IAR在这一点上比MDK好用很多)
% d' o, U0 R: o; y, h" f; j 5.png
2 x( @3 S9 R5 U: k& f; Y5 Z可以看到,task01执行时间为16us,每0.6s执行一次
: J  U# h( i" a; U) r8 t. l$ P+ _9 c+ k; c3 `) c
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 手机版