STM32CubeIDE+FreeRTOS软件定时器实验
软件定时器实验是在 FreeRTOS 中创建了两个软件定时器,其中一个软件定时器是单次模式, 5000 个 tick 调用一次回调函数,另一个软件定时器是周期模式, 1000 个 tick 调用一次回调函数,在回调函数中输出相关信息,。
创建工程RTOS_Timer,
配置HCLK,使用内部晶振,频率为180MHZ(根据板子设置)
将SYS中时基源(Timebase Source)改为除SysTick之外的任意定时器即可,如:
配置FreeRTOS,使用CMSIS_V1,使能USE_TIMERS
添加2个定时器,周期定时器myTimer01,单次定时器myTimer02
Ctrl + S生成代码
修改代码,
1,在main.h中添加
/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "stdio.h" /* USER CODE END Includes */
2,在mian.c中添加
/* USER CODE BEGIN PFP */ int _write(int file , char *ptr,int len) { int i = 0; for(i = 0;i<len;i++) ITM_SendChar((*ptr++)); return len; } /* USER CODE END PFP */ ... ... ... /* USER CODE BEGIN RTOS_TIMERS */ /* start timers, add new ones, ... */ printf("starting...\n"); osTimerStart(myTimer01Handle, 1000); osTimerStart(myTimer02Handle, 5000); /* USER CODE END RTOS_TIMERS */
3,在main.c中修改2个定时器的回调函数
/* CallbackTimer01 function */ void CallbackTimer01(void const * argument) { /* USER CODE BEGIN CallbackTimer02 */ static uint32_t timer1Counts = 1; uint32_t TickCount ; TickCount = xTaskGetTickCount(); /* 获取滴答定时器的计数值 */ printf("Timer01 run times %ld TickCount is %ld \n",timer1Counts++,TickCount); /* USER CODE END CallbackTimer02 */ }
/* CallbackTimer02 function */ void CallbackTimer02(void const * argument) { /* USER CODE BEGIN CallbackTimer02 */ static uint32_t timer2Counts = 1; uint32_t TickCount ; TickCount = xTaskGetTickCount(); /* 获取滴答定时器的计数值 */ printf("Timer02 run times %ld TickCount is %ld \n",timer2Counts,TickCount); /* USER CODE END CallbackTimer02 */ }
修改完毕后点击 小锤子 构建工程,然后点击Debug,按如下步骤配置ITM调试
全速运行之前一定要先点击SWV ITM data Console 页面中的红色圆圈
现象:
可以看到Timer01每1秒执行一次,5秒钟之后Timer02执行,且只执行这一次