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

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

[复制链接]
tsuibeyond 发布时间:2018-5-28 13:15
本帖最后由 tsuibeyond 于 2018-5-28 13:18 编辑
$ z6 Y# E+ ]! v  O3 F7 ?; ~! L6 v0 d1 k1 J9 z) v
很惊喜收到STM32L496,只写了关于它的一个帖子,实在有点少,这里补充一个自己常用的一个程序计时器,基于STM32CUBEMX,很简单方便,也很实用,希望各个技术坛友喜欢
+ d/ K( C- _2 _8 g1 N: \4 s' }! H! O# m; ^
4 B- G; c+ s* F# U, X+ v这个是我上个帖子的地址,https://www.stmcu.org.cn/module/forum/thread-615906-1-1.html,本部分内容是基于这个帖子的工程实现的。
) h6 s7 h2 X, T( r! N8 s3 I3 `4 K( j$ r7 i# n. ^
注意:
, N7 t% D0 h/ \RTOS有点占用heap,所以,需要修改写heap大小配置
5 Z  p! U" m1 K9 i) \我的:
! ?/ p) I9 s; r: v; u 1.png 7 _  [$ }" h! a0 p) U0 Q* A
4.png , D- d# |% Z% m" j- X/ B
最后,这里就不会出问题了
' h7 V# Y7 w% A, W. U& [+ o5 n' Z 3.png
# r6 b" k0 {% O
2 X: Z: y3 G6 P回归正题/ P9 O& m+ x4 @* F6 T5 p
我们的功能是基于心跳定时器的
. d8 T; K6 Q# e! { 2.png 9 @; r; K1 ~2 [* C1 f+ R) B

, ^% ^* L9 e+ Z- c! l在工程上添加文件
( W5 H& o0 _& g" z) u' jtime.c3 ~% s8 J1 J% K. t
#include "time.h"
& F% ^1 t1 `% a1 h& U+ O' I: q#include "stm32l4xx_hal.h"
( F- Z! Y$ Y1 Q9 d5 q
& O( M5 s# t4 @% S$ I- g1 Y/ C4 F) Fvolatile unsigned long long sysTickUptime;" W0 N" F/ ~: W/ H
float cycle_T[20][3];
; Y# d& D& S( q) r/ zunsigned long long time_consume[GET_TIME_NUM][2];5 @, l+ u0 \2 }
int task01_time_comsume_us;
3 y; c8 r" r1 z/ z$ s7 x& H5 J2 _int task02_time_comsume_us;0 b6 \5 D2 |" Y) V0 U( p& `
int task03_time_comsume_us;" O% _; V7 ?, \) L! I, h4 L8 y8 k4 ]
Det_t det_t_s;
/ ~( I8 x8 [+ c5 E. ?' V2 i( S& B( z0 X. s0 q8 p) z
float get_cycle_time(int item)8 J5 X9 h7 b5 l& c1 X; }" y0 B
{
! h5 y+ X% l: \  q3 V  cycle_T[item][OLD] = cycle_T[item][NOW];    //上一次的时间! w" U: `! q+ D) M; q" M
  cycle_T[item][NOW] = get_sys_time_us()/1000000.0f; //获取当前时间5 e( e- ^( z1 p
  cycle_T[item][NEW] = ( ( cycle_T[item][NOW] - cycle_T[item][OLD] ) );//获取两次时间差
  D0 n" W" P; r+ o2 L  return cycle_T[item][NEW];5 X% m# g% i4 j$ m( e! v
}6 y/ K+ }2 H/ z; V  B

2 p/ Y* H: \( l+ Qunsigned int get_sys_time_us(void)
3 ]. B5 e, ^7 v5 R% ~( Q{, A. s/ F) Y' z0 G, o& M
  register unsigned int ms;
. Z' x9 a3 m# N- O  unsigned int s_load;
5 w. n9 f; g  t' w' B  unsigned int s_val;# D% u! m+ J- f8 N/ {) O' g
  unsigned int value;
. K4 c7 W: _3 Q% ^  s_load =SysTick->LOAD ;
+ c3 @, ?6 a4 Z( J, E  s_val=SysTick->VAL;2 h, q- y2 Y) U" I  z7 f3 g2 k
  ms = sysTickUptime;
2 I! T/ E* ~4 z2 z8 J  value = ms * 1000 + (s_load - s_val) * 1000 / s_load;//获取us级的计时
' Y8 B0 ^4 Q+ P' J. s  return value;
* t( L( f0 C' R0 D}: l2 c- D5 {; A9 _3 B& g/ [
$ E: L$ Y0 o0 }& S; l9 L$ G8 G
void time_inc_tick(void)  //在心跳中断中添加,每一次心跳,执行一次' R. ]5 R2 B' ~) b8 v& ~
{
/ o0 g" h9 W( u2 I( v5 o  sysTickUptime++;
* K) J* q0 T# n  g( \  M  ^}4 Y: i) Q+ L  g5 R5 E
) ~5 v( Q# V  X0 ^% B% R. m

  Y0 P4 c& n4 f* \0 s1 ~9 Ftime.h
* e, {0 g) n! v! r#ifndef __TIME_H_1 {( G# d* M9 e! P% X2 Q
#define __TIME_H_7 r3 A; {- c" g

+ {1 R2 y8 e: c+ w: o. {#define GET_TIME_NUM     10        
! q$ h( j; T/ E- Benum
. E" f1 s1 Y9 b8 g+ Q5 O{
8 n- Z7 G  r3 \0 G0 O2 k1 N) s  NOW = 0,( T. }$ A. v6 w
  OLD,
- }1 ~+ e3 w0 _& B/ y  NEW,
/ I, C6 A# l2 J};$ }+ h7 l+ O2 I! Q5 W
enum
! j- w0 E% X* c6 w; J% U$ ?{
" ^$ z6 W: `0 ^; `5 d! k  task01_index = 0,
* Q! }8 s  A% g: s  task02_index,7 w$ c  b/ K7 E" F
  tasl03_index,# C$ T- x9 `8 `2 u6 S+ V8 M
};
  H. @8 l8 w3 E5 O$ J0 ctypedef struct" R; ~4 W( m, Z% P6 L+ i: M9 ~
{2 Z" t1 H$ ]. Z9 ?
    float det_t_task01_s;
' S' A  E9 `2 ?- Q9 v/ }( |- A        float det_t_task02_s;& ~/ y* [8 r4 S) `
        float det_t_task03_s;- q/ n" u# v* q7 L& g1 `

, e; h/ x# R; L, I* \0 m: s}Det_t;3 G1 O$ R3 k8 d5 V
extern Det_t det_t_s;# ^# k( H" n" I1 ?* F
extern unsigned long long time_consume[GET_TIME_NUM][2];) O# i2 E/ ?3 e
extern int task01_time_comsume_us;4 ^9 F7 d: z3 j
extern int task02_time_comsume_us;
- j6 Y# ~0 o) x9 _; x2 q# Yextern int task03_time_comsume_us;
# m1 P; G3 ]/ j" m1 k. P: R  I- u% K: m5 H: u! N& B9 D' P
extern volatile unsigned long long sysTickUptime;; X: [. Z, v. `9 ?) E
extern float cycle_T[20][3];
7 n8 z1 K" r) V9 h# e( f
" ?, W: U; A5 r2 Q9 A! p8 Fextern float get_cycle_time(int item);
% o" |: C# N- A) S9 g% ?extern unsigned int get_sys_time_us(void);
( Q2 ^4 ?- H9 K* c5 }$ ~# a# w$ W/ wextern void time_inc_tick(void);: m" f; x( D" U8 T+ l
4 l% a2 {1 G! r' C! Z
#endif
  i& ^; E7 v5 J) Q* O* L

! Y; X2 e6 Z% m  c% M4 M  ^4 f$ J6 B+ |- O2 l! M9 x
在stm32l4xx_it.c中补充void SysTick_Handler(void)代码( k/ S7 a/ |, }8 C- B$ a
/******************************************************************************/
  Q, t! O( B9 O1 w7 s4 [3 K4 r8 m/*            Cortex-M4 Processor Interruption and Exception Handlers         */1 s; r* _' u  l
/******************************************************************************/; ?; W# Y# ~$ ~! a8 u

& _0 P" `6 R; m5 N/**
) G" F" s8 m  N7 ~: Z: t, y2 b7 f* @brief This function handles System tick timer.
3 [4 p9 ?9 h) ~/ Q*/
: G! Q: g6 q* W% Nvoid SysTick_Handler(void)
- P5 T0 a) I5 R) T{
* z+ F: _& O0 b' r, }7 N/ \7 l# E  /* USER CODE BEGIN SysTick_IRQn 0 */" U# f' `, f# M7 c( X
* B; d8 G% B. t/ ]
  /* USER CODE END SysTick_IRQn 0 */
6 Q1 x1 y$ p' a$ {) F  osSystickHandler();: T  j; _4 h0 `: K6 h+ c- r
  /* USER CODE BEGIN SysTick_IRQn 1 */7 y. [$ m' I7 c0 t+ a. Z, j8 f
  time_inc_tick();! R6 |5 j7 Q9 z6 V/ f" M9 L
  /* USER CODE END SysTick_IRQn 1 */
- U2 O" w8 s9 _% h}( n0 P' A, W, c, C# Y

- }! i/ n- C( a" W: R, F5 ~* d5 m7 \3 R5 i* F' x* K6 h$ k, M
接下来,在任务中测试: [$ z, ?% u* q. A3 h0 y: r! |5 L0 o
/* StartTaskLED function */
% ^' e% F+ X* v2 g6 Fvoid StartTaskLED(void const * argument)
* U" j9 h; h1 c) r{4 N0 ?* |: d6 H
  /* USER CODE BEGIN StartTaskLED *// E3 [- _: n6 U$ _5 j7 |' Y  q7 c
  //static uint16_t myQueue01_data;
' P6 g# H- `! g* x$ g- H, ^7 B  /* Infinite loop */  j8 C+ ?- o. z7 v
  for(;;)
3 T% Y) O+ [8 H  {& m0 P9 `; @/ m6 G; b! h
    time_consume[task01_index][0] = get_sys_time_us();) h/ N9 F  W  A" f. [7 u' O+ _0 f
    det_t_s.det_t_task01_s = get_cycle_time(task01_index);; a, {! r9 Q& {% T/ R- ]: }+ r* z
    HAL_GPIO_TogglePin(GPIOB, LD3_Pin|LD2_Pin);
2 e% I, @/ Q! X7 v( t# l2 l    //osSemaphoreRelease(myBinarySem01Handle);// 释放信号量. v! Z4 [& B$ ~7 ]7 D
    //osMessagePut(myQueue01Handle, myQueue01_data++, osWaitForever);4 _$ ~  x3 v/ }" [" c
    time_consume[task01_index][1] = get_sys_time_us();( _. |7 N; o  I1 c, d2 F
    task01_time_comsume_us = time_consume[task01_index][1] - time_consume[task01_index][0];) G0 _1 Q, P- ^# U) |! i
    osDelay(600);* l: b. q+ ?3 O4 B) a
  }. n6 I/ x' G+ h/ C9 G. G1 {
  /* USER CODE END StartTaskLED */1 [& J; x( _, e3 p" {0 t# P% F
}1 O. I" c4 T; J& _* M9 F8 G6 z* M% X
, \1 U8 f2 d- y# q5 P5 e

# \+ v1 s$ \' t1 m" w打开live watch窗口查看(IAR在这一点上比MDK好用很多)- ^$ q! f) y0 ?& e9 \
5.png
  m7 k; o$ B2 O) F" |可以看到,task01执行时间为16us,每0.6s执行一次
! J+ a* {! j% d$ p  o
5 u$ E0 X0 r' H! ^ 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版