本帖最后由 tsuibeyond 于 2018-5-28 13:18 编辑 % h. _3 T2 V- Q' p( o" P' i2 W 很惊喜收到STM32L496,只写了关于它的一个帖子,实在有点少,这里补充一个自己常用的一个程序计时器,基于STM32CUBEMX,很简单方便,也很实用,希望各个技术坛友喜欢0 R0 e' J4 K' F" w 3 T+ E3 l+ q5 u' V9 j 这个是我上个帖子的地址,https://www.stmcu.org.cn/module/forum/thread-615906-1-1.html,本部分内容是基于这个帖子的工程实现的。 注意:2 p' Z- [/ ~0 Y/ f/ q* Z RTOS有点占用heap,所以,需要修改写heap大小配置 我的: U! K4 U* h; T 最后,这里就不会出问题了 . w- d: Z; O6 m7 {" W 回归正题 我们的功能是基于心跳定时器的 在工程上添加文件" C% @& M7 s5 ~5 b: l) N( L time.c #include "time.h"+ q, i" A5 C! Z6 ~1 V4 N #include "stm32l4xx_hal.h"1 L+ U% `) y+ @1 _! } volatile unsigned long long sysTickUptime; float cycle_T[20][3]; unsigned long long time_consume[GET_TIME_NUM][2]; int task01_time_comsume_us; int task02_time_comsume_us; int task03_time_comsume_us;/ G! J5 H% t8 }0 r Det_t det_t_s; , T0 u3 S, F" ~ float get_cycle_time(int item)1 P6 _6 s" `6 l$ B { cycle_T[item][OLD] = cycle_T[item][NOW]; //上一次的时间( P9 R8 E% P. h1 v" q' y& F x cycle_T[item][NOW] = get_sys_time_us()/1000000.0f; //获取当前时间 cycle_T[item][NEW] = ( ( cycle_T[item][NOW] - cycle_T[item][OLD] ) );//获取两次时间差9 U; ^% y% W6 q: [. ] return cycle_T[item][NEW];; o: M4 p: f7 D( P; l } 0 i/ m2 ~" J: e7 J ? unsigned int get_sys_time_us(void), M' N. I3 K9 r2 C { register unsigned int ms;, B# H+ j5 z6 W3 ? unsigned int s_load;/ ^! R& [4 H9 e/ | unsigned int s_val;. V- a8 H8 _4 p unsigned int value; s_load =SysTick->LOAD ;: Y' V4 {3 R" p% S. y# t/ P8 e s_val=SysTick->VAL;- O+ u% V6 O3 B0 m ms = sysTickUptime;8 i( D7 L8 N2 C9 t value = ms * 1000 + (s_load - s_val) * 1000 / s_load;//获取us级的计时 return value; }( O) ?; d) ~# c void time_inc_tick(void) //在心跳中断中添加,每一次心跳,执行一次 {. {5 B% \$ \' x2 f# R# \ sysTickUptime++;: P- Q! V! t6 J# @8 b } 3 |% e, t3 k5 y: G5 I' s time.h #ifndef __TIME_H_% w) O! a5 x* n #define __TIME_H_ 3 S- E8 q$ D& ~& @' ~- o% z #define GET_TIME_NUM 10 enum1 m: [' N- l+ E6 { {9 r: R, f* v$ j6 p: E1 Z NOW = 0, OLD,# D7 j1 ^* G) n0 i/ e NEW,; n# K9 o7 `4 M4 O6 T+ e) F- x };5 q0 \8 p; M$ T enum5 {& Y2 v% q9 ` {2 ~" T0 j" y% r5 i7 i task01_index = 0,$ [1 ~0 T* t: P# Q" r3 K5 I: j3 @ task02_index, tasl03_index, };' s6 m- q: J0 f2 l1 _4 _ typedef struct {! b$ n* d7 S# y3 q( z2 b* V float det_t_task01_s;9 c* i& e5 _: R6 U float det_t_task02_s; float det_t_task03_s; 2 h4 ?. r) k( x2 H1 w- D }Det_t;* X/ I" Q# @4 S1 M extern Det_t det_t_s;- x1 ?, B& w$ @ extern unsigned long long time_consume[GET_TIME_NUM][2];8 Q0 d- C d' G& f extern int task01_time_comsume_us; extern int task02_time_comsume_us;7 e0 `6 D$ h3 U9 ~ extern int task03_time_comsume_us;6 A) A' E& f: _# w # O2 j' V6 I5 D# v" W P" J! @ extern volatile unsigned long long sysTickUptime; extern float cycle_T[20][3];: w) D7 F# ^+ J) p4 ?; G 8 {* K3 E, d% ?( Q+ t extern float get_cycle_time(int item);# a9 g! q- T8 P# u extern unsigned int get_sys_time_us(void);0 W& f7 n+ y5 P extern void time_inc_tick(void); #endif / H* `- _8 a0 i' v" a9 i 在stm32l4xx_it.c中补充void SysTick_Handler(void)代码 /******************************************************************************/ /* Cortex-M4 Processor Interruption and Exception Handlers */+ V- O' V' G; M /******************************************************************************/ ! J/ N& |+ l7 c; k) x8 o /**3 m" ~* Q1 _ `9 Y( `1 O$ P * @brief This function handles System tick timer.6 I9 m1 x: r; i- I2 P */3 X4 i# j; m1 E% `4 |) X void SysTick_Handler(void) {* y' M$ R2 P. ]* x /* USER CODE BEGIN SysTick_IRQn 0 *// S- Z6 s u; g; C% L3 F ( ]9 P' s+ _5 ~& `" K7 X /* USER CODE END SysTick_IRQn 0 */3 e8 U" f9 y4 }& e" n osSystickHandler();' `9 ?; B3 m% V/ e, R /* USER CODE BEGIN SysTick_IRQn 1 */" H3 m. w c7 d% |2 Y* E time_inc_tick(); /* USER CODE END SysTick_IRQn 1 */ }% A; _6 \1 C# ~0 J5 d& \: Q- b 接下来,在任务中测试. V- e9 H+ v, V X+ M y+ Z /* StartTaskLED function */ void StartTaskLED(void const * argument)7 S" P# I$ e# o) d { /* USER CODE BEGIN StartTaskLED */ //static uint16_t myQueue01_data;) r6 m5 I) R# @$ ~8 V4 \6 G/ l, k" ~ /* Infinite loop */ for(;;)& e7 m3 M4 p# r" V) _# D { time_consume[task01_index][0] = get_sys_time_us();$ X1 O1 H5 L1 l0 G det_t_s.det_t_task01_s = get_cycle_time(task01_index); HAL_GPIO_TogglePin(GPIOB, LD3_Pin|LD2_Pin); //osSemaphoreRelease(myBinarySem01Handle);// 释放信号量7 C6 T* |- b9 N7 ~4 x9 @ //osMessagePut(myQueue01Handle, myQueue01_data++, osWaitForever);" }- g( u, n1 `8 _. M& ?/ Q time_consume[task01_index][1] = get_sys_time_us();3 y" R- e) O5 j) _6 N8 c; W task01_time_comsume_us = time_consume[task01_index][1] - time_consume[task01_index][0]; osDelay(600);3 U ^6 V/ ~* c1 K4 d: A }3 A# W+ n9 S1 Q) r# y /* USER CODE END StartTaskLED */ } 打开live watch窗口查看(IAR在这一点上比MDK好用很多) 可以看到,task01执行时间为16us,每0.6s执行一次 |
学习下,感谢分享 |
基于STM32L476+64M QSPI接口PSRAM(IPS6404L)开源分享(含源码)
基于STM32L4R9 的QuadSPI Flash 通讯速率不理想经验分享
STM32L4超低功耗功能概述
基于STM32L431RC Standby和RTC中断唤醒经验分享
基于STM32L431的睡眠模式经验分享
STM32L4R9 的 QuadSPI Flash 通讯速率不理想
STM32L4、STM32L4+和STM32G4系列 微控制器上的专利代码读取保护
STM32L433在STOP模式USART不能工作的解决办法
【实测教程】基于STM32L4系列的实测教程分享合集
STM32L4系列MCU的五种振荡器和使用说明