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

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

[复制链接]
tsuibeyond 发布时间:2018-5-28 13:15
本帖最后由 tsuibeyond 于 2018-5-28 13:18 编辑 ( e* m% i4 f$ t% w' l
8 Q8 v8 ^! X# a) D
很惊喜收到STM32L496,只写了关于它的一个帖子,实在有点少,这里补充一个自己常用的一个程序计时器,基于STM32CUBEMX,很简单方便,也很实用,希望各个技术坛友喜欢4 D( E, ~( ^/ X1 q# {
! U. ?; I* p; x/ x' K5 {
这个是我上个帖子的地址,https://www.stmcu.org.cn/module/forum/thread-615906-1-1.html,本部分内容是基于这个帖子的工程实现的。
5 w" L. \7 Z# f- R
4 k! C* j# m' v" ?0 l注意:$ Y% b( J; j, {! Q  _* B$ X
RTOS有点占用heap,所以,需要修改写heap大小配置
0 ]. }9 B3 G5 f3 Z我的:/ t7 g+ y! A- |
1.png ) Q0 k" Z% B5 T* X" M& }
4.png
4 @+ f* H5 w& P/ q" Y最后,这里就不会出问题了, L8 d( c2 K% i
3.png 5 U* o" H; }7 Y! @

& t$ L' G7 ]: ?回归正题& ^2 r# X0 v. d/ q4 D
我们的功能是基于心跳定时器的
  q/ Z3 R. p3 g& V 2.png
5 N) R8 g4 r2 O, T/ \; b
. r3 n3 U6 E1 f  ~在工程上添加文件
4 e* U/ c- H6 s( P, V' U, a# vtime.c
6 K+ P* A: u3 o: w#include "time.h". O+ b7 ^5 |, ]+ h
#include "stm32l4xx_hal.h"
. l" y& I3 @  W* }" \+ B: ~" t5 u) B1 q5 g: ^0 r! H* J- i
volatile unsigned long long sysTickUptime;8 l; x0 a7 ]' T5 h& R  V
float cycle_T[20][3];
' V" Y2 M+ m! W4 }unsigned long long time_consume[GET_TIME_NUM][2];% L7 j& W4 ?9 n6 n5 ^0 h% P. @! p
int task01_time_comsume_us;
1 V! z$ V* x& Zint task02_time_comsume_us;9 x. r* B" H1 }$ S3 ]& w  f
int task03_time_comsume_us;5 \- S: A2 q# K. S  h  V6 g
Det_t det_t_s;! }& t+ k3 Y2 _4 Z6 z0 g4 k& w8 _; \
6 i% s, w0 c' w7 l! o; O! \1 R" N
float get_cycle_time(int item)" E4 @" y* \" V- q3 x+ C! r
{9 [) {! T% b' v$ F
  cycle_T[item][OLD] = cycle_T[item][NOW];    //上一次的时间
0 U- a: p: P9 |  cycle_T[item][NOW] = get_sys_time_us()/1000000.0f; //获取当前时间
9 T5 X! }% M! |$ j# N  cycle_T[item][NEW] = ( ( cycle_T[item][NOW] - cycle_T[item][OLD] ) );//获取两次时间差0 v% b+ a6 _: q
  return cycle_T[item][NEW];4 t0 X% m6 O) L" _8 k2 C+ [
}2 F5 i1 x; K/ ]% W/ O( @* }  N2 e

, m5 D7 f% x! A$ ^unsigned int get_sys_time_us(void)$ |! @% B( u8 F
{/ _( m4 w- i0 \4 P+ C' G
  register unsigned int ms;
, f! Z5 i) O3 d% y: m: m! r  unsigned int s_load;
. G& s/ v# X& k% {+ X" z4 ?6 y  unsigned int s_val;' n- b% o2 A& W: S' Q% i
  unsigned int value;# m, ^. ]1 P- Z. I& E
  s_load =SysTick->LOAD ;. j5 D) F  P; F; y0 g% ~
  s_val=SysTick->VAL;
* m$ X0 ]) z3 _6 F+ N" J: g  ms = sysTickUptime;. T9 D# X6 G& P( J9 o  l( y9 }
  value = ms * 1000 + (s_load - s_val) * 1000 / s_load;//获取us级的计时
' h, y6 ]' V! y0 ^/ p. D. @6 G; V  return value;% _8 f! s; Z* o7 Q$ f
}; F9 B1 Z: \! i% K
! t: Q. M* ^& @+ U
void time_inc_tick(void)  //在心跳中断中添加,每一次心跳,执行一次
2 v: d% g: d6 L# D{" E/ H: l$ D% w! H
  sysTickUptime++;& ]* b5 |7 U  b- `- m' M
}
9 G5 S8 Z: z$ v  f+ K6 {+ Q1 }
9 }/ U2 `  p- k. j* h8 G! a

9 Q0 |% P3 Y8 B& b. T, d% ztime.h
; k- K6 j; G( G+ G: j: M#ifndef __TIME_H_
  e6 B) t, J7 [3 x4 E) \#define __TIME_H_$ O9 r% |/ X- y3 C
" T& l" _7 ^2 q' @% ^* B  {- c: d; N+ E9 ^
#define GET_TIME_NUM     10        ! }" M9 C6 P0 n
enum- f% F% i/ W; K( S1 l/ }
{8 [4 }' ]% u' j, Y
  NOW = 0,' j- ?% w1 u( U( Q
  OLD,( x6 H$ ?: }$ M4 @
  NEW,
$ w# t, ?6 \* j2 K& @4 i};
, |6 z3 G, J: v2 ^enum
2 \6 d. Q5 i* y{
0 r. \5 ~# i0 n! m2 g( ]  task01_index = 0,
5 `' u4 x& I( a# a  task02_index,) ^' ^2 f  @, g( N! |- \6 L
  tasl03_index,
! r9 V3 {9 z7 f3 Z  p6 z};
- x9 p" n# E* b/ Ftypedef struct2 E5 f4 k( B- {8 s0 e8 y9 y" u
{8 J- V  x) o; h3 g$ ?" A
    float det_t_task01_s;
* {/ X) `9 d  h' Y$ V        float det_t_task02_s;
& g, y! T( g5 r, D( ]3 v7 `        float det_t_task03_s;
' g8 S( D: O! C9 N3 ~0 U0 V- A, L- Y2 V0 e& l7 W1 m1 k- D
}Det_t;
3 h. H4 {5 k6 ^! t5 j: f& xextern Det_t det_t_s;! \9 A" \) T5 k% m5 G& ~
extern unsigned long long time_consume[GET_TIME_NUM][2];
% J9 L* S0 w/ t) ?7 B8 v: D7 Wextern int task01_time_comsume_us;
2 P9 G7 p9 J# a1 Wextern int task02_time_comsume_us;
* f: a: h8 Z$ ]% l% W) P9 Zextern int task03_time_comsume_us;
' A0 V, |& P, q. b/ a$ D3 b3 I) H/ T) z5 a
extern volatile unsigned long long sysTickUptime;
2 n4 o" z' v; O* N" j" d) Mextern float cycle_T[20][3];
7 k5 v2 t# J, P. ^6 F! _  o
( k* g4 @; _! f  b! nextern float get_cycle_time(int item);, m6 z1 S4 {! N8 _2 u
extern unsigned int get_sys_time_us(void);) L; m) Q1 {+ F8 p' v  X
extern void time_inc_tick(void);- ~2 Y( g- ~+ B: }5 B6 F

5 m2 s, B3 h: B; h" o9 K#endif2 m4 ~' R: C% N- O: y/ v
, D+ q( h. e/ R. h* D- D5 R( B) x
9 v  V" y8 H8 {$ i0 J
在stm32l4xx_it.c中补充void SysTick_Handler(void)代码3 I; ]9 S: Y) V9 y
/******************************************************************************/
* h# h- S: E5 |6 b/*            Cortex-M4 Processor Interruption and Exception Handlers         */
. J, J! V- n9 C' J( e" W. \9 F; ?0 T( I/******************************************************************************/
5 M+ D0 |* L# e( n" l/ Q# G8 |
2 u- w5 L/ {" ~& o5 x4 Z% J. }% u/**
/ u7 p8 i! x6 X1 K. t) [* @brief This function handles System tick timer.
1 Z  P1 u0 L+ A/ B8 T0 H*/
$ O( C% s' N, w( o4 Jvoid SysTick_Handler(void)
5 _  w6 T1 b0 j9 i5 x. l5 V7 |{
5 p8 Q  ?9 K$ s: S0 }7 c+ c  /* USER CODE BEGIN SysTick_IRQn 0 */( C; E$ W4 C! C6 ]# k

, U' w' q. l) e" g; i6 f9 D  /* USER CODE END SysTick_IRQn 0 */
" x& O: i: l% w0 B0 c  osSystickHandler();$ @& d1 e+ w& G
  /* USER CODE BEGIN SysTick_IRQn 1 *// i0 i+ e3 I; x8 D/ q; B" |! I" f7 H
  time_inc_tick();
  [4 K, n! {' v; G0 M  /* USER CODE END SysTick_IRQn 1 */, j! M) v+ e* ~0 ~- `
}
0 y- a- V  L' ~/ U

3 Y8 y7 g' T5 Z) j
4 n3 m0 R) n4 |' Z# n接下来,在任务中测试$ k  f- k$ C* t$ p6 Y4 Z0 g  q
/* StartTaskLED function */
5 ]. t) s/ N, w: Ovoid StartTaskLED(void const * argument)
2 i1 Y, y) M9 I/ D{3 a5 u5 s; [+ G# g# Q9 A
  /* USER CODE BEGIN StartTaskLED */1 q" B' j# J* t
  //static uint16_t myQueue01_data;
+ A9 t$ p2 Q5 E+ t# F7 c  /* Infinite loop */
% o+ j! X6 s8 K0 m1 v, {4 O: w  for(;;)
9 G- B" {+ u' ]' O# l  {" D% B* z: i* z) v2 q* e" w: ?
    time_consume[task01_index][0] = get_sys_time_us();! C7 y/ P, u4 }6 Q; Z
    det_t_s.det_t_task01_s = get_cycle_time(task01_index);/ M1 m! {1 n6 A( j. r! x6 p
    HAL_GPIO_TogglePin(GPIOB, LD3_Pin|LD2_Pin);
5 t6 ?7 ]' \. k  k5 C    //osSemaphoreRelease(myBinarySem01Handle);// 释放信号量2 ?9 b4 H$ I. @, u. a' y
    //osMessagePut(myQueue01Handle, myQueue01_data++, osWaitForever);
- w/ O3 {6 w/ V+ r) Q% n  \7 q    time_consume[task01_index][1] = get_sys_time_us();2 L/ @0 m5 T5 Z' l" l- x; J
    task01_time_comsume_us = time_consume[task01_index][1] - time_consume[task01_index][0];
8 B- {' j& S, R4 o: E* z    osDelay(600);
6 c4 B' D1 b; M$ }( U" a" j7 d  }
9 H6 T" J. W8 f- ^; F9 a  /* USER CODE END StartTaskLED */2 C9 ]4 B2 L+ b8 f
}4 q# ?, U# u0 r' w' h5 }; K
. S7 P+ q9 W# R1 @; U: |& x

! ]1 `% u8 [& H( E打开live watch窗口查看(IAR在这一点上比MDK好用很多)
2 R# C8 c$ l- S* G! h0 O" x+ j7 S0 q 5.png
% e) _! k: a2 T3 h可以看到,task01执行时间为16us,每0.6s执行一次
* M. j5 N& I! |$ O3 V
+ m; x* p4 K6 y9 T) k 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 手机版