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

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

[复制链接]
tsuibeyond 发布时间:2018-5-28 13:15
本帖最后由 tsuibeyond 于 2018-5-28 13:18 编辑 ) E2 n0 C$ J# B3 t5 E) g

& b4 S) A0 ~7 Z+ g1 h- B很惊喜收到STM32L496,只写了关于它的一个帖子,实在有点少,这里补充一个自己常用的一个程序计时器,基于STM32CUBEMX,很简单方便,也很实用,希望各个技术坛友喜欢2 i6 C' o6 w+ ]; u4 @

4 Q. }! ~( {4 U) p& i2 r/ @6 h# r这个是我上个帖子的地址,https://www.stmcu.org.cn/module/forum/thread-615906-1-1.html,本部分内容是基于这个帖子的工程实现的。
. w" d  B  P' U
. @$ q) \2 y! v  c& D, O8 L注意:
1 Z% }2 M- @: M; e/ l" C6 j( JRTOS有点占用heap,所以,需要修改写heap大小配置4 e3 X2 r" ?  |; E( o
我的:% ~+ z/ m# W; ~' f/ `& a
1.png " V& P7 b% p- B" W+ C
4.png + _* K& V. E+ ~2 S7 Q) w) l
最后,这里就不会出问题了/ [* n0 x1 A0 B/ r+ R! a6 i
3.png 8 f9 j2 q" T" o$ Z
4 J9 N3 D8 W! ?6 j- Y9 T' L: k& H
回归正题; r; I  v% t, }7 ^
我们的功能是基于心跳定时器的" b7 \; L8 X8 i! B- k0 Y/ J1 M8 E
2.png
' @. D6 C) Z9 P( U2 P; W& @1 h/ G
在工程上添加文件- [, D; j, B& ~# m! i
time.c" m  u4 B  S- M5 d" {
#include "time.h"
; H  T# s* B+ l; B' Q) ^  b+ o#include "stm32l4xx_hal.h"; \* V! z9 L" B, o, _+ M$ Q8 h5 m

. D. z- N# t  i( \8 xvolatile unsigned long long sysTickUptime;  j% `0 X  ], V/ I! @+ ~
float cycle_T[20][3];# H7 L. c; T- j4 [+ Y) L
unsigned long long time_consume[GET_TIME_NUM][2];9 M7 K& K0 b& }+ G
int task01_time_comsume_us;% U: \; ~6 V2 b$ l( F/ s. A
int task02_time_comsume_us;
) Z+ `- ]' p& b  uint task03_time_comsume_us;
! r$ ^" m' W1 g$ h) g, dDet_t det_t_s;
4 B7 k* C8 J& q# O+ j) `3 _: u6 _+ k
float get_cycle_time(int item)- p! h7 ~2 ?9 r0 e  q6 V* d  l
{  w0 j  O5 o+ K: T
  cycle_T[item][OLD] = cycle_T[item][NOW];    //上一次的时间
5 ?3 u9 V* ^; A* }  F. ^; j) t  cycle_T[item][NOW] = get_sys_time_us()/1000000.0f; //获取当前时间* r3 X: R- Y- r% o; ^3 R9 x# g8 \8 t
  cycle_T[item][NEW] = ( ( cycle_T[item][NOW] - cycle_T[item][OLD] ) );//获取两次时间差
4 {. o& k) f& a  return cycle_T[item][NEW];* Q' `& j4 n! x& d: H) I
}" ?  z1 k$ o5 e
( j/ K! r' N: A
unsigned int get_sys_time_us(void)( I9 r) }5 s5 B! R% M
{
2 M1 {2 E& p% Y7 A- i  register unsigned int ms;
9 n$ R: R. k9 P7 F/ l  unsigned int s_load;
$ D" P3 ]3 c# q8 u  unsigned int s_val;. \; I% L& \3 O. ?4 l: h
  unsigned int value;2 w2 b, S% \3 l* k3 J
  s_load =SysTick->LOAD ;  _* {; C9 ~3 I* Q  _( m
  s_val=SysTick->VAL;
( n- U+ C" m% d% G  ms = sysTickUptime;
$ U1 n9 p" \  e5 l( y  value = ms * 1000 + (s_load - s_val) * 1000 / s_load;//获取us级的计时5 P) R  S& G# j
  return value;
9 Z: v6 U6 I( _2 ^0 I* ?4 ~2 [}  ~( A% @6 f+ r, U8 e: U, b
8 d: G( I2 E# q/ E3 ?9 q
void time_inc_tick(void)  //在心跳中断中添加,每一次心跳,执行一次
3 [8 m, p* K- d{5 D0 C" u8 @0 j6 f# B+ E
  sysTickUptime++;) J; q% y  o/ ]1 k" ^
}* ]: k$ K) ^  D' X( C
1 z$ n' ~. v/ D9 `2 H

( t' `! l4 u7 I. ^time.h8 a( d3 K6 C1 |' P
#ifndef __TIME_H_" ~$ M$ e7 o) n2 i5 w& |& w- v' X
#define __TIME_H_  Q' ~. A- _: v7 e5 G

' B( e" K& Z% D- z# ?. A* I#define GET_TIME_NUM     10        
6 T* ?$ i9 L6 L9 q" j6 eenum" i2 l  j! B$ v! e
{
. i; p, e% \; C0 T) B7 w  NOW = 0,
, i, Q% S- a4 ^1 u! p( v" f  OLD,
7 V/ h+ g) _. P2 e! p0 M  NEW,2 g  m& V# _* s4 ]  B$ L
};7 |7 b2 w! w, X* t
enum6 Q' j2 q3 D( p
{' O/ t' W' q$ o. t
  task01_index = 0,
2 r1 q  X; f  H" [) V' w% q  task02_index,' A2 w5 K- L0 I: M4 S  J/ X! P" H
  tasl03_index,
1 l3 y$ c! r9 f  [- z};' M9 y! R, g8 [) l1 h7 b* I+ v
typedef struct. Y' d( S' y* y/ T
{" c$ q  m; B  y: }! e5 w
    float det_t_task01_s;6 K1 Z" C4 O9 n( i5 k& O5 F: V
        float det_t_task02_s;( C' R6 O7 z; \3 h: Y9 b
        float det_t_task03_s;
5 n8 i# |# H/ M0 z; r5 }8 h" U* v9 s9 ?1 y& z8 T) v
}Det_t;
) |4 N5 i1 q/ w" |# gextern Det_t det_t_s;: ^2 g: K  V2 R- V' Y, K
extern unsigned long long time_consume[GET_TIME_NUM][2];0 V% e, z) h9 ?8 \- V
extern int task01_time_comsume_us;0 j0 w4 v2 e- U% [. s' p
extern int task02_time_comsume_us;
( S+ m  v$ y" Z3 C( E, [  L. rextern int task03_time_comsume_us;
1 d0 \! v$ C, d0 T# {; Q7 I" h7 K$ y8 V( w- m  L. z! {  x
extern volatile unsigned long long sysTickUptime;
( M# @3 i& i; {4 Yextern float cycle_T[20][3];7 P3 J+ N& |  _; @

) Z3 y% `6 T/ E2 i+ o% ^) xextern float get_cycle_time(int item);% L8 b9 `; P1 X8 r" ~! P
extern unsigned int get_sys_time_us(void);/ q) l7 y( v; p, s
extern void time_inc_tick(void);
$ Q) W% Y, K6 ~6 N  F0 L( {' ?. a- N# f' I1 N9 |
#endif
+ C7 g5 {0 G; ?
( @) g6 N2 E; I2 `

7 N# f% k$ R  p7 ^' V6 K在stm32l4xx_it.c中补充void SysTick_Handler(void)代码
. }8 P  n8 M; O' c( a4 z5 ~/******************************************************************************/& L0 q7 W( f* U" c% c1 U
/*            Cortex-M4 Processor Interruption and Exception Handlers         */
, v# {) L% U4 @% y5 K' Y6 n  T/******************************************************************************/
9 w5 n# B. I( S. `; E( s* r1 i
0 _5 f8 w) k) j% p  r3 [- F/**# N+ W9 f9 T, ]; U. `0 u& S0 G
* @brief This function handles System tick timer.% d: o! |5 B$ Q3 M" F7 K
*/, U2 ]2 U  E. m0 H# U$ Y4 {
void SysTick_Handler(void)
+ d% d1 z+ E9 `0 P) J- \% B# \9 `{9 l7 }. E# _6 s8 Q9 r% r# M) S; g
  /* USER CODE BEGIN SysTick_IRQn 0 */0 {+ ?3 q1 b( H) C7 \

+ Y3 S; U$ B8 L) k9 ]  /* USER CODE END SysTick_IRQn 0 */9 B$ p) n# L! Q) h) b! k4 ]
  osSystickHandler();) T! N7 g; u4 z. I9 s
  /* USER CODE BEGIN SysTick_IRQn 1 */* @. O# K7 x% U% ]
  time_inc_tick();
! @: h' O% O6 N: ?( D! b0 O4 f. h  /* USER CODE END SysTick_IRQn 1 */  G  t; y* `1 e% b/ C
}
/ c% Z" I2 P9 k: V+ n0 p7 {' o
1 r1 J0 \' a7 B! {3 E' {( r: ]$ x
7 q0 K0 `' |. @, a' P
接下来,在任务中测试, f# F" F. P- G- P* ~, D; q$ B* E
/* StartTaskLED function */
: T8 X1 _0 Y9 bvoid StartTaskLED(void const * argument)2 C- A* K0 b" I
{3 m) ~) _) C; v% C% P
  /* USER CODE BEGIN StartTaskLED */
  O% q: x; ?' J& R* b  K' B* F  //static uint16_t myQueue01_data;
9 i, ^. ]8 I, g2 c/ U9 B) q+ t  /* Infinite loop */; d* A3 q$ i( F* v+ V- l, F
  for(;;)
) O$ h; [6 ~2 e8 c7 @# L  {/ i: v1 p9 V8 }; w- ]3 _. Z
    time_consume[task01_index][0] = get_sys_time_us();
7 L# y8 U9 p; {    det_t_s.det_t_task01_s = get_cycle_time(task01_index);2 R2 L1 s' [4 D& e; k
    HAL_GPIO_TogglePin(GPIOB, LD3_Pin|LD2_Pin);
3 R( X8 g/ f1 K+ o* C7 j* Y    //osSemaphoreRelease(myBinarySem01Handle);// 释放信号量
4 G9 K4 ^6 e! v  D3 ~    //osMessagePut(myQueue01Handle, myQueue01_data++, osWaitForever);
+ [1 n5 Q( M2 g/ |: _8 J! p  Z: M    time_consume[task01_index][1] = get_sys_time_us();& E2 `7 U3 }& L* Z
    task01_time_comsume_us = time_consume[task01_index][1] - time_consume[task01_index][0];
) N0 B% x% d- Y7 d    osDelay(600);6 X  v- Q! N; B+ V
  }0 [: [6 {" J; {) l1 J
  /* USER CODE END StartTaskLED */
; ^9 j; V0 q) t5 M}6 t- x$ F) x" Q6 D1 G8 ?
. e6 r& ^6 j2 ?1 C4 q+ Z' r1 ]! |5 l
2 O$ K5 Z+ H" f( J6 ?  E2 O
打开live watch窗口查看(IAR在这一点上比MDK好用很多)
- Y8 o# C; g" P" F7 Q5 E$ }9 V7 H 5.png
0 L! i$ T5 w% d  o可以看到,task01执行时间为16us,每0.6s执行一次9 U7 a4 S* c& ]

# V5 ^. Q5 M7 S 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管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版