
本帖最后由 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执行一次 ![]() |
学习下,感谢分享 |
STM32如何分配原理图IO
【实测教程】STM32CubeMX-STM32L4之研究(ADC)
【STWINKT1B评测】2.初步测试IIS3DWB振动传感器
【圣诞专享活动】使用TouchGFX做GUI显示:圣诞快乐&Merry Christmas!
串口通信波特率异常的解决办法
【STWINKT1B 评测】6. NanoEdge AI 音频分类器 (2)
【STWINKT1B 评测】5. NanoEdge AI 音频分类器 (1)
STWINKT1B评测】4.测试板载ISM330DHCX(6轴)
【STWINKT1B评测】-03-CoreMark跑分测试
【STWINKT1B评测】-02-串口-定时器LED灯测试