在线时间5 小时
UID2109289
ST金币53
蝴蝶豆2
注册时间2016-9-2
该用户从未签到
初级会员
- 最后登录
- 2018-9-28
|
本帖最后由 tsuibeyond 于 2018-5-28 13:18 编辑
很惊喜收到STM32L496,只写了关于它的一个帖子,实在有点少,这里补充一个自己常用的一个程序计时器,基于STM32CUBEMX,很简单方便,也很实用,希望各个技术坛友喜欢
这个是我上个帖子的地址,https://www.stmcu.org.cn/module/forum/thread-615906-1-1.html,本部分内容是基于这个帖子的工程实现的。
注意:
RTOS有点占用heap,所以,需要修改写heap大小配置
我的:
最后,这里就不会出问题了
回归正题
我们的功能是基于心跳定时器的
在工程上添加文件
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好用很多)
可以看到,task01执行时间为16us,每0.6s执行一次
TEST.part02.rar
(2.66 MB, 下载次数: 4)
|
|