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

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

[复制链接]
tsuibeyond 发布时间:2018-5-28 13:15
本帖最后由 tsuibeyond 于 2018-5-28 13:18 编辑
) ^8 v1 [  q4 U6 ~  ~1 i5 e( h3 D
很惊喜收到STM32L496,只写了关于它的一个帖子,实在有点少,这里补充一个自己常用的一个程序计时器,基于STM32CUBEMX,很简单方便,也很实用,希望各个技术坛友喜欢
$ l/ }" X) ^! n) I7 }0 C# R7 Y& B4 r4 Q& U3 W0 m, o. Z
这个是我上个帖子的地址,https://www.stmcu.org.cn/module/forum/thread-615906-1-1.html,本部分内容是基于这个帖子的工程实现的。
$ @$ h. w+ H8 M
$ G( i$ n( @2 z9 K# R: n  S注意:
* @7 s: W6 `, x: y, a* ZRTOS有点占用heap,所以,需要修改写heap大小配置
( b- G! Z+ a  D" |, C4 `我的:: m, M7 p9 l% u6 s9 v
1.png
7 n+ F8 ^9 U1 F1 w 4.png - A/ f" r# ?) ]
最后,这里就不会出问题了, `) A% q  M  U4 M
3.png
; L5 W8 N: P1 S* A. N2 b6 |0 H6 S+ _8 b# ]8 E# ~/ n5 z) w, w
回归正题' x$ }9 p4 A  K# G) D
我们的功能是基于心跳定时器的1 ]4 X# R3 S) ~  \
2.png ) q+ H" o9 w7 T- ?. a

6 C' C7 C4 V) l: {! b8 L在工程上添加文件
6 G2 }  _# d% ^% Y. G* ^$ F5 Jtime.c
" g4 j* H5 Q0 t#include "time.h"
9 [. S; z3 G- R#include "stm32l4xx_hal.h"! f( i$ L& p* @. B3 U% G
  _7 e: |8 `: c& }# u: [/ C
volatile unsigned long long sysTickUptime;4 {. y5 c, {% X  a
float cycle_T[20][3];4 i9 @& M  L8 h7 i5 g% ?8 t4 t/ f
unsigned long long time_consume[GET_TIME_NUM][2];2 q8 J0 A* G+ V
int task01_time_comsume_us;
% @) Y* F' t5 k/ `  I6 W# }int task02_time_comsume_us;0 [1 b8 J$ u: A& y2 M" v
int task03_time_comsume_us;! X( N9 j' t; j5 _, q0 P. d( o2 @
Det_t det_t_s;3 ]* A- H6 X& J2 D

  \9 |, ^: e, R0 k- v2 W# V/ Efloat get_cycle_time(int item)
2 l, A1 D- S- n5 _) v{
# m! b: n1 k5 e9 q  c  cycle_T[item][OLD] = cycle_T[item][NOW];    //上一次的时间; t8 f  ^: g4 Y  Z9 i
  cycle_T[item][NOW] = get_sys_time_us()/1000000.0f; //获取当前时间/ r1 S: c$ S% j9 D8 v+ f7 G; G
  cycle_T[item][NEW] = ( ( cycle_T[item][NOW] - cycle_T[item][OLD] ) );//获取两次时间差5 c" @  C& z2 P& X; e
  return cycle_T[item][NEW];" _/ |' f) }; |; x
}
& P0 _7 O3 n. b. s) n3 i% v- ?0 j8 [+ n& [: m) q
unsigned int get_sys_time_us(void)
) n* u1 b! O% n1 I+ U7 A- {+ [{
2 H& [8 H- R# F$ K: M  register unsigned int ms;6 ?$ H0 C  W% G) k1 P
  unsigned int s_load;3 O7 S5 A6 B: c
  unsigned int s_val;6 S: V0 G* o3 ^) B2 a
  unsigned int value;
, b2 e, H  r6 K1 y) l- m  s_load =SysTick->LOAD ;  w+ {& V# P' F# T) O5 X
  s_val=SysTick->VAL;3 b( c7 ^2 Z5 N  b2 @% ?
  ms = sysTickUptime;9 L# F4 p+ r$ {* H! U- T  M
  value = ms * 1000 + (s_load - s_val) * 1000 / s_load;//获取us级的计时. i- h5 |/ S  W" V- A) n  i+ t
  return value;
. ?" q& D7 [& }}
. D9 C( Y' P4 y9 w2 U+ _$ {/ R8 e6 W* T
void time_inc_tick(void)  //在心跳中断中添加,每一次心跳,执行一次
) S0 s$ U" Z, F+ I# g& P{, U& o" Q5 w/ I3 y# u& G) v
  sysTickUptime++;+ k& q7 @3 i3 j6 \  c! p
}
* X% i8 m9 B6 T* p7 k

( z& r- d! O9 \7 t, S2 g, i& ~6 y7 a3 T7 y' A9 Q
time.h
+ D' F  e! @  }7 }6 q- I#ifndef __TIME_H_0 v# f1 N4 x1 W  q" _8 `
#define __TIME_H_# {  g# ]3 N7 h9 f1 S

% h0 _, O4 y- x( X; \' l#define GET_TIME_NUM     10        ; L) V! t% V+ i8 N) ^2 m- d
enum
' D/ y( Z$ V6 P& F: X{
# k0 Z& ~7 O; U  NOW = 0,( s- O$ f& a) T$ M6 D
  OLD,
7 f; X1 B) @) {  S4 |  @. |  NEW,0 m$ H8 e& Q8 F3 B5 ^
};
1 p! ^* L) G/ c# z' ienum9 m/ {4 V" g/ x. K, [+ [
{
4 U# k. t6 }) ?. K  task01_index = 0,' h1 E( B# i% t# \# ~( ?" @
  task02_index,: f9 a/ S9 e% W, _
  tasl03_index,& t+ K2 L2 `2 r# g2 [; }
};
" i* a, P: j4 j; qtypedef struct
5 S; V. L3 a3 p# b' f; j, @{6 j0 @* i5 H, a7 U2 g
    float det_t_task01_s;
, ?% l% }: v  R        float det_t_task02_s;
; F1 |( G& K; w  q8 q; S. ]4 a        float det_t_task03_s;
* H5 N8 x2 ?( \. D' Y+ w3 R: w  F
}Det_t;
7 y; e" l0 g% X: s7 |extern Det_t det_t_s;
$ O" b& e5 q$ Z. T0 r3 qextern unsigned long long time_consume[GET_TIME_NUM][2];5 d0 P7 l% P, H  L
extern int task01_time_comsume_us;
0 B1 _5 S9 Q* l/ y# u0 uextern int task02_time_comsume_us;% l' b! g4 C! [, b# j( m
extern int task03_time_comsume_us;
9 _+ O* t8 W! Q/ W1 G) `
- t7 h0 e. R  U7 M9 |extern volatile unsigned long long sysTickUptime;
0 r! s1 x$ h3 n* nextern float cycle_T[20][3];
7 y1 N4 C1 b4 F, k
; b" T" `. y7 U* s# Z. eextern float get_cycle_time(int item);8 X. c9 s5 g8 F0 I
extern unsigned int get_sys_time_us(void);0 [  O& ~) R3 p7 G1 T8 d
extern void time_inc_tick(void);( v0 s7 `1 d) w2 D1 i. W  ^5 R& w

1 P+ k! P& K4 Q1 r/ e; T#endif
6 ?0 M5 T& z6 W( Q* c
, p9 H2 h) g0 i5 M1 q& v

/ n1 Q% I4 o# o+ M在stm32l4xx_it.c中补充void SysTick_Handler(void)代码: j% k0 g6 o) C& }
/******************************************************************************/
$ a- U5 \/ Y6 [/ X) ~% h* ~' B, X/*            Cortex-M4 Processor Interruption and Exception Handlers         */& ]) A; i4 w3 j( c
/******************************************************************************/5 F4 x8 `( ^) F  |
5 v8 v5 j- q  {4 ~4 A3 L' R3 r
/**
  }' i4 E7 v2 G* @brief This function handles System tick timer.
% h! A5 c' l  g1 q, l. e; ~' N*/1 v* f; J2 j* q0 M4 Q
void SysTick_Handler(void)! C: y! Q- a& v! O' y1 [6 j
{0 n5 ]7 I9 p2 ~& D$ \+ `
  /* USER CODE BEGIN SysTick_IRQn 0 */6 c! C9 A3 m- m' }$ S- h/ U

2 s( u* b, @8 S# P3 |  /* USER CODE END SysTick_IRQn 0 */
: X! r3 G  E9 ]9 g/ R  osSystickHandler();% D1 b" e8 X' k0 a$ p2 v
  /* USER CODE BEGIN SysTick_IRQn 1 */
' q1 x- K3 e. c+ |  time_inc_tick();* l3 w1 l+ E" [
  /* USER CODE END SysTick_IRQn 1 */' R9 Q/ q  w. p6 J1 M+ Y: p# K
}6 o$ _: Y$ s. D  r" @3 Q7 R

1 F! w: p! `7 i& a  Y. l+ y1 X+ V
5 N8 I0 Q  g  T7 I$ S1 {2 S! r接下来,在任务中测试1 p3 \  V0 G9 [$ W
/* StartTaskLED function */9 h' V- m5 L2 u% v' [
void StartTaskLED(void const * argument)# ^% J% L% @9 V! m) l" j4 A0 {: v' S
{
0 {" f- z" Z: J" w. P% S  /* USER CODE BEGIN StartTaskLED */
7 F/ S; c" M8 e0 _  //static uint16_t myQueue01_data;3 c7 k, h3 e+ S3 O2 _& b
  /* Infinite loop */
- c: t# f; U- u& t  |8 J' D  for(;;)/ |' ~# d7 j8 g# L: \
  {2 Z2 `* o# R3 ~" E# }9 W0 }8 ]
    time_consume[task01_index][0] = get_sys_time_us();
0 O! W3 Z0 g! V" _5 [    det_t_s.det_t_task01_s = get_cycle_time(task01_index);: Y: B1 f4 {( D: z2 y% h( }
    HAL_GPIO_TogglePin(GPIOB, LD3_Pin|LD2_Pin);! P( v0 t% n: @) j
    //osSemaphoreRelease(myBinarySem01Handle);// 释放信号量1 O4 w# _  N. _
    //osMessagePut(myQueue01Handle, myQueue01_data++, osWaitForever);
3 u9 i  T( J) \2 L& x    time_consume[task01_index][1] = get_sys_time_us();
  w# `9 ~3 e6 M4 z' D    task01_time_comsume_us = time_consume[task01_index][1] - time_consume[task01_index][0];' Z2 q4 `9 f6 k% f8 v" G/ x
    osDelay(600);4 z6 X9 d7 E& X( O7 ?' z
  }
+ X% P# V2 V2 a6 {  /* USER CODE END StartTaskLED */
' o5 z6 {# o) a3 f}$ K) q  g5 _, T0 M2 p

3 |3 E7 Q2 ~' f2 x) f( Z& E# ]1 o2 j: G( V
打开live watch窗口查看(IAR在这一点上比MDK好用很多)- X9 f% D) W( L; ~
5.png 2 g1 X+ j2 ?# ]9 C4 `& T
可以看到,task01执行时间为16us,每0.6s执行一次1 \0 V$ T7 I, s2 s3 r& _4 {8 }6 n+ o

  N' I+ H- `7 [9 W' 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 手机版