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

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

[复制链接]
tsuibeyond 发布时间:2018-5-28 13:15
本帖最后由 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
收藏 评论1 发布时间:2018-5-28 13:15

举报

1个回答
zero99 回答时间:2018-5-28 13:45:37
学习下,感谢分享

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版