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

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

[复制链接]
tsuibeyond 发布时间:2018-5-28 13:15
本帖最后由 tsuibeyond 于 2018-5-28 13:18 编辑
# R4 Z+ I5 u4 K5 @, `/ m/ t+ S* y8 ]+ W4 K& `- s% Y( R9 v( Y
很惊喜收到STM32L496,只写了关于它的一个帖子,实在有点少,这里补充一个自己常用的一个程序计时器,基于STM32CUBEMX,很简单方便,也很实用,希望各个技术坛友喜欢# E' [- _, ~$ ?

7 k' y% y3 w  a. Q! c7 ]这个是我上个帖子的地址,https://www.stmcu.org.cn/module/forum/thread-615906-1-1.html,本部分内容是基于这个帖子的工程实现的。. F8 B2 ?( Y! ?& ?' q, U$ G

# o, C& \. O; a5 a2 M! m注意:
. H- {6 \0 y! S- t$ e, kRTOS有点占用heap,所以,需要修改写heap大小配置
6 q! A! y) r4 O/ _( V- q我的:$ D* y$ q; K9 R( z: E# e+ G
1.png 8 ?7 x5 P  |4 k; Z/ b' X, V
4.png
1 G# z$ \8 g) K7 s3 v' c4 @最后,这里就不会出问题了
, n( U$ ^: G' e  P3 x: b5 R 3.png
3 [! h$ |& @. _/ T# p# e4 P4 g+ a5 g6 r) f. \
回归正题. r  w0 C/ b3 j, B5 x$ T9 n
我们的功能是基于心跳定时器的
' M# `- p4 s; S: G& X, s; b 2.png
1 f0 F' l" _' `5 r0 w0 B( w) D# Y0 Y" z0 g/ y% @. t- P9 M
在工程上添加文件; P4 a+ N& [) [) Q; p1 Z5 A+ L
time.c
9 R9 M1 l9 V( o- [#include "time.h") N( k5 U! C3 x% _4 [# {1 Z# G
#include "stm32l4xx_hal.h"
4 o! h% H  z# c4 J  H6 x7 h+ h( _8 B
volatile unsigned long long sysTickUptime;
3 u$ \9 D7 ?3 dfloat cycle_T[20][3];
% w: J  S& j% G. R& h+ Y& eunsigned long long time_consume[GET_TIME_NUM][2];
7 E* m8 s) g% {% M9 Jint task01_time_comsume_us;
6 m* }: H" x! k* iint task02_time_comsume_us;$ G1 i$ j4 i& i* V9 P% c& d
int task03_time_comsume_us;4 y# j; C- r( d7 g
Det_t det_t_s;
/ Q, }# i, `) x' s) n, `# U! h3 K- [9 l! _
float get_cycle_time(int item)
  `% b/ Y& ?  v$ b; V{
+ C7 t$ k( w4 R" [* K8 ~  cycle_T[item][OLD] = cycle_T[item][NOW];    //上一次的时间
( k" w1 ^- W( F* O# M  cycle_T[item][NOW] = get_sys_time_us()/1000000.0f; //获取当前时间/ S0 H9 Z% u& v) e6 C, n) t
  cycle_T[item][NEW] = ( ( cycle_T[item][NOW] - cycle_T[item][OLD] ) );//获取两次时间差
" V6 h% u; ?! o& r6 j3 g3 U  return cycle_T[item][NEW];; \5 @: }  X3 \3 w
}# v; P' ?6 b5 @1 i

8 m. d6 q: |  N$ @5 Dunsigned int get_sys_time_us(void)$ }* P" J2 K5 n0 `% n( Z! Y8 O
{0 s8 z1 u3 J* D$ a4 {0 A" B4 g. E
  register unsigned int ms;8 K- g2 E5 y1 t8 A
  unsigned int s_load;( `9 ^7 }+ k" `0 U+ B
  unsigned int s_val;
4 r& \. y8 u$ [4 C! Q" a: V  unsigned int value;8 [; u  x5 J9 ^
  s_load =SysTick->LOAD ;+ R3 V( p; a( B8 F
  s_val=SysTick->VAL;
, O& ^3 P- |9 L# s% Z" k$ M7 e  ms = sysTickUptime;" p( b" q4 ^  t
  value = ms * 1000 + (s_load - s_val) * 1000 / s_load;//获取us级的计时# Z: B5 @/ v! R% _) i9 u
  return value;
. Q0 L: b8 W/ I}
4 a2 i! X0 _: G3 G1 S0 k* U/ k; L7 K& `* m1 b
void time_inc_tick(void)  //在心跳中断中添加,每一次心跳,执行一次
2 y( |4 D. {) b  |* I: K, i8 l{
: s% s9 b0 H6 J, B  sysTickUptime++;+ ?2 e' v2 z' j
}: f  Q1 B/ y: ?+ r  [' n4 E: H
  x4 ?0 B9 B2 {. C+ q, y# Y3 T0 d

$ M/ W5 a  |) j: T$ Vtime.h
6 V7 z9 S; Z* {# F, z#ifndef __TIME_H_; \; D! B! N2 N/ i! j) Q
#define __TIME_H_0 K. |4 ~# u& y* V' j
& [* P; `6 T$ q2 G& ?+ n1 \; }7 Y" Y
#define GET_TIME_NUM     10        - z$ ~: F! `* s+ B' j
enum% T2 V/ \$ F: Z2 t8 ^. C" p
{
3 @* m- h. ^0 E5 e+ M  NOW = 0,
* Z( a( D9 E& |/ x  OLD,
, q4 k$ w3 d8 b$ t2 v8 ]' |7 g  NEW,
: X! O3 y7 i1 A$ Z" b};* z& M" A! @1 u7 _0 r
enum( G. H; P  x- ?+ v
{; [2 j: f; J& l" a7 d8 U
  task01_index = 0,- D5 t4 N& z1 Z$ w  K; b8 e
  task02_index,. z9 o( U) [$ e9 K- t6 x6 W( L
  tasl03_index,
. z4 p% I5 A, H4 a; ~/ w2 B};9 H# l5 y6 A# }) r9 H; Q
typedef struct
- a7 E( I: k6 O; Q7 ~{- k. H: F0 F4 Q8 Z2 I& l' v
    float det_t_task01_s;! h' E7 @' f+ x7 J
        float det_t_task02_s;0 V; y& L' p9 n+ U# e7 l
        float det_t_task03_s;: J/ Y' g# v7 T! ]# U
; ~) N& k# S( \; E& B' ^/ [
}Det_t;. u0 k2 y+ e0 x3 v
extern Det_t det_t_s;  X$ C4 Y0 l& o0 K" m- ?. G" W
extern unsigned long long time_consume[GET_TIME_NUM][2];
" `, |: C' f2 k: W- A& c) ~extern int task01_time_comsume_us;
& a2 m3 ]9 j- G3 ?4 D& ^/ ^6 f3 fextern int task02_time_comsume_us;
. V& Z( ]$ L) j( y/ V' {. Gextern int task03_time_comsume_us;9 x9 ?- Y' U5 f; F" j

4 Q3 Q7 Y5 m8 ]: [extern volatile unsigned long long sysTickUptime;
2 Y( I4 j, k1 }6 ^0 e5 `extern float cycle_T[20][3];
% J! i2 X1 R; w6 Y! O: e- }3 ?3 @8 L' [* z
extern float get_cycle_time(int item);, _& X/ i. {( Y2 C3 r& [
extern unsigned int get_sys_time_us(void);# N! N8 u  o4 G' y1 |0 ]$ I+ ^# K% U
extern void time_inc_tick(void);
+ q  j. V1 I' g- a) }1 b, ~! w% s4 [) W: \9 B  ~6 p& L7 A
#endif
8 T: i1 x5 z% X
$ u* X1 b3 h' D2 e

* ?$ S& O$ y0 @+ t# Y% m0 ~6 k在stm32l4xx_it.c中补充void SysTick_Handler(void)代码( ~5 _3 }6 I! l8 F$ x
/******************************************************************************/
+ r5 V2 Y/ u) P/*            Cortex-M4 Processor Interruption and Exception Handlers         */
& n. d* o# I6 ~6 q/******************************************************************************/
4 ]$ p! [3 h$ Q) C6 ?+ x; B
9 o7 e; ?1 i" O/ a/**
; j% p+ J  f) l9 P* @brief This function handles System tick timer.
& }: e9 D+ }6 X; E% T( E*/( B7 }1 B2 T1 H9 S6 |# U) ]
void SysTick_Handler(void)% [' x  g4 O' s9 T: b+ D
{% P6 a+ X/ B$ E$ H+ }, U/ c5 h
  /* USER CODE BEGIN SysTick_IRQn 0 */
. d. F$ v  q" W; k% G9 c* X9 v3 T# j% \7 w8 x
  /* USER CODE END SysTick_IRQn 0 */0 L" |& n7 l9 ?  ]" X) X* G( b
  osSystickHandler();/ s+ q/ v+ E) H3 G
  /* USER CODE BEGIN SysTick_IRQn 1 */, N& v+ s# r% I" r  ]( A6 r
  time_inc_tick();/ r8 `! I) X* B" ^: G# r
  /* USER CODE END SysTick_IRQn 1 */
5 a( t" n- F1 T. Q4 [}
" D# [, B5 R# Q/ F' P

# L0 C6 P& \. [- O/ C% N; e7 h3 i) d" Y. {7 W# o5 `5 S* ?4 ^
接下来,在任务中测试
. j9 }; V0 P( E4 y& g0 o+ ~7 P& K/* StartTaskLED function */3 a5 s- m0 f" X  r
void StartTaskLED(void const * argument)' a5 Z6 g$ X7 O, V) ]6 Y  V
{( W3 j6 G" _: T; I$ y" ?
  /* USER CODE BEGIN StartTaskLED */
1 D& T2 i  D; X) ^% G  //static uint16_t myQueue01_data;2 T$ _7 r$ D8 q& P' a
  /* Infinite loop */" d9 f; {  K  x  O
  for(;;)  ~8 O: ^6 ~8 c
  {" S0 K2 P$ g2 L  M- m1 ~7 ?0 _
    time_consume[task01_index][0] = get_sys_time_us();
0 ], ?! J- l% d# e  n# A3 }    det_t_s.det_t_task01_s = get_cycle_time(task01_index);3 Q: o1 o. U0 u
    HAL_GPIO_TogglePin(GPIOB, LD3_Pin|LD2_Pin);
. M  z- K$ u' l    //osSemaphoreRelease(myBinarySem01Handle);// 释放信号量1 e) J1 N+ k/ |) y" I
    //osMessagePut(myQueue01Handle, myQueue01_data++, osWaitForever);* |4 Y5 n, E0 y, q
    time_consume[task01_index][1] = get_sys_time_us();1 N; \; M2 r# s
    task01_time_comsume_us = time_consume[task01_index][1] - time_consume[task01_index][0];. q, y, [* S# d3 Y0 }# _5 {" P  f
    osDelay(600);
  G* z; ^. ^( E! E  }7 y$ a! a- V, F( A
  /* USER CODE END StartTaskLED */& N7 E  O# M& ^8 @4 n
}
' b2 y# x8 Z' U, v4 I0 M- p
, L! ]2 Y/ X7 s  f! T6 L

: A5 G0 q  X7 J! @; K/ L7 n0 @打开live watch窗口查看(IAR在这一点上比MDK好用很多)  e3 ^: v) u( X  u. V
5.png 6 m$ E& R/ |& X9 ~+ Z
可以看到,task01执行时间为16us,每0.6s执行一次
2 e. V$ H% V- q
- C  h0 x% o7 W- {5 L2 _- ] 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 手机版