搜索
查看: 2673|回复: 1

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

[复制链接]

该用户从未签到

2

主题

5

帖子

2

蝴蝶豆

初级会员

最后登录
2018-9-28
发表于 2018-5-28 13:15:24 | 显示全部楼层 |阅读模式
本帖最后由 tsuibeyond 于 2018-5-28 13:18 编辑

很惊喜收到STM32L496,只写了关于它的一个帖子,实在有点少,这里补充一个自己常用的一个程序计时器,基于STM32CUBEMX,很简单方便,也很实用,希望各个技术坛友喜欢

这个是我上个帖子的地址,https://www.stmcu.org.cn/module/forum/thread-615906-1-1.html,本部分内容是基于这个帖子的工程实现的。

注意:
RTOS有点占用heap,所以,需要修改写heap大小配置
我的:
1.png
4.png
最后,这里就不会出问题了
3.png

回归正题
我们的功能是基于心跳定时器的
2.png

在工程上添加文件
time.c
#include "time.h"
#include "stm32l4xx_hal.h"

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;
Det_t det_t_s;

float get_cycle_time(int item)
{
  cycle_T[item][OLD] = cycle_T[item][NOW];    //上一次的时间
  cycle_T[item][NOW] = get_sys_time_us()/1000000.0f; //获取当前时间
  cycle_T[item][NEW] = ( ( cycle_T[item][NOW] - cycle_T[item][OLD] ) );//获取两次时间差
  return cycle_T[item][NEW];
}

unsigned int get_sys_time_us(void)
{
  register unsigned int ms;
  unsigned int s_load;
  unsigned int s_val;
  unsigned int value;
  s_load =SysTick->LOAD ;
  s_val=SysTick->VAL;
  ms = sysTickUptime;
  value = ms * 1000 + (s_load - s_val) * 1000 / s_load;//获取us级的计时
  return value;
}

void time_inc_tick(void)  //在心跳中断中添加,每一次心跳,执行一次
{
  sysTickUptime++;
}


time.h
#ifndef __TIME_H_
#define __TIME_H_

#define GET_TIME_NUM     10        
enum
{
  NOW = 0,
  OLD,
  NEW,
};
enum
{
  task01_index = 0,
  task02_index,
  tasl03_index,
};
typedef struct
{
    float det_t_task01_s;
        float det_t_task02_s;
        float det_t_task03_s;

}Det_t;
extern Det_t det_t_s;
extern unsigned long long time_consume[GET_TIME_NUM][2];
extern int task01_time_comsume_us;
extern int task02_time_comsume_us;
extern int task03_time_comsume_us;

extern volatile unsigned long long sysTickUptime;
extern float cycle_T[20][3];

extern float get_cycle_time(int item);
extern unsigned int get_sys_time_us(void);
extern void time_inc_tick(void);

#endif


在stm32l4xx_it.c中补充void SysTick_Handler(void)代码
/******************************************************************************/
/*            Cortex-M4 Processor Interruption and Exception Handlers         */
/******************************************************************************/

/**
* @brief This function handles System tick timer.
*/
void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  osSystickHandler();
  /* USER CODE BEGIN SysTick_IRQn 1 */
  time_inc_tick();
  /* USER CODE END SysTick_IRQn 1 */
}


接下来,在任务中测试
/* StartTaskLED function */
void StartTaskLED(void const * argument)
{
  /* USER CODE BEGIN StartTaskLED */
  //static uint16_t myQueue01_data;
  /* Infinite loop */
  for(;;)
  {
    time_consume[task01_index][0] = get_sys_time_us();
    det_t_s.det_t_task01_s = get_cycle_time(task01_index);
    HAL_GPIO_TogglePin(GPIOB, LD3_Pin|LD2_Pin);
    //osSemaphoreRelease(myBinarySem01Handle);// 释放信号量
    //osMessagePut(myQueue01Handle, myQueue01_data++, osWaitForever);
    time_consume[task01_index][1] = get_sys_time_us();
    task01_time_comsume_us = time_consume[task01_index][1] - time_consume[task01_index][0];
    osDelay(600);
  }
  /* USER CODE END StartTaskLED */
}


打开live watch窗口查看(IAR在这一点上比MDK好用很多)
5.png
可以看到,task01执行时间为16us,每0.6s执行一次

TEST.part02.rar (2.66 MB, 下载次数: 4)
1.png
5.png
回复

使用道具 举报

  • TA的每日心情
    开心
    2018-2-6 09:20
  • 签到天数: 1 天

    [LV.1]初来乍到

    1182

    主题

    4967

    帖子

    1

    蝴蝶豆

    论坛元老

    最后登录
    2020-3-17
    发表于 2018-5-28 13:45:37 | 显示全部楼层
    学习下,感谢分享
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

    GMT+8, 2024-4-27 07:47 , Processed in 1.163847 second(s), 38 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表