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执行,且只执行这一次

原文地址:https://www.cnblogs.com/tianxxl/p/12028397.html

时间: 2024-10-08 09:13:31

STM32CubeIDE+FreeRTOS软件定时器实验的相关文章

STM32CubeIDE+FreeRTOS互斥量实验

在 FreeRTOS 操作系统中为了降低优先级翻转问题利用了优先级继承算法.优先级继承算法是指,暂时提高某个占有某种资源的低优先级任务的优先级,使之与在所有等待该资源的任务中优先级最高那个任务的优先级相等,而当这个低优先级任务执行完毕释放该资源时,优先级重新回到初始设定值.因此,继承优先级的任务避免了系统资源被任何中间优先级的任务抢占.互斥量与二值信号量最大的不同是:互斥量具有优先级继承机制,而信号量没有.也就是说,某个临界资源受到一个互斥量保护,如果这个资源正在被一个低优先级任务使用,那么此时

软件定时器osTimerCreate返回NULL

CMSIS-RTOS是对FreeRtos的封装,函数名比較适合纯软件编程. 如今的版本号是1.0.2. id1 = osTimerCreate(osTimer(Timer_1), osTimerOnce, NULL); 可是这个osTimerCreate总是返回0x00000000. 就是创建软件定时器不成功. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/di

毫秒,微妙级别软件定时器

单片机开发中,软件定时器是常用的工具.定时执行特定任务和延时功能,都可以用软件定时器实现. 常见的延时函数的实现做法有: 1. 使用空指令进行延时,通过控制空指令的执行次数,进行延时.优点:不需要占用系统外设.缺点:系统运行指定个空指令的时间不稳定,中途出现的中断处理会严重影响计时的精确性. 2.使用单片机的定时器外设,设定特定的时间产生中断,进行计时.优点:计时准确,不受其他中断影响计时.缺点:浪费单片机外设资源,并且延时处理不能嵌套调用,灵活性不够. 这里要介绍的是利用单片机内部的sysTi

实现自己的软件定时器

为什么要实现软件定时器: 在芯片平台上,地址空间也是相当宝贵的,如果保留了更多的硬件定时器的话,就需要更多的地址空间,那么我们能不能作个折中方案呢?答案是肯定的,我们可以使用一个硬件定时器,来模拟实现一个软件定时器,可以满足更多的定时需求,需要注意的一点就是软件定时器精度可能会有稍微误差,因为会涉及到任务调度.锁中断等,在对定时精度要求不高的场景,可以考虑使用软件定时器.Linux内核中的timer_list精度为10ms,这里我们来实现一套精度为1ms的软件定时器(当然可以实现精度为微秒级的,

高效软件定时器的设计

软件定时器在协议栈等很多场景都有广泛的应用,有时候会有大量的定时器同时处于工作状态,它们的超时时间各异,要高效的保证每个定时器都能够较为准确的超时并执行到其回调函数并不是一件易事.本文分析嵌入式实时操作系统Nucleus的定时器方案,它巧妙的管理了一条按照相对时间来排序的双向链表,避免每次tick中断都要遍历链表检查超时和更新剩余时间,实现了一种相当高效的软件定时器. 结构体TM_TCB来表示动态创建的定时器,其定义如下 typedef struct TM_TCB_STRUCT { /*Nucl

软件定时器-闹钟提醒我们该吃饭吃饭,该睡觉睡觉

闹钟提醒我们该吃饭吃饭,该睡觉睡觉 原文地址:http://blog.csdn.net/u011833609/article/details/28862125 softwaretimer.h #ifndef _SOFTWARETIMER_H_ #define _SOFTWARETIMER_H_ typedef enum{z_false = 0, z_true = !z_false} z_bool; typedef unsigned char z_uchar; typedef unsigned c

μC/OS-II中使用软件定时器

在试着将μC/OS-II移植到ARM7芯片(LPC2138)上的过程中,发现使用OSTmrCreate创建的OSTmr始终都不能执行CallbackFunction,OS版本是v2.85,最后是这么解决的. 在文档<uCOS-II-RefMan.PDF>中找到了关于“OSTmrSignal()”这个函数的一段描述: OSTmrSignal() is called either by a task or an ISR to indicate that it’s time to update th

软件体系结构-实验一 - 林毓锋 -130242014068

实验一-132042014068-林毓锋 课程    软件体系结构     实验名称  实验一.软件设计的网络支持环境              第      页 1.概念理解 (1) 软件体系结构是具有一定形式的结构化元素,即构件的集合,包括处理构件.数据构件和连接构件.处理构件负责对数据进行加工,数据构件是被加工的信息,连接构件把体系结构的不同部分组合连接起来. (2) A."软件开发知识半衰期"是指一个在软件领域很有学问或有丰富专业知识的人,如果不再学习,在一定时间后进入知识半衰

OSAL之时间管理,软件定时器链表管理

读源码写作,尊重原创: 本博文根据蓝牙4.0, 协议族版本是1.3.2 OSAL的时钟实现在OSAL_CockBLE.c与OSAL_Clock.h两个文件中.OSAL支持完整的UTC(世界统一时间),以2000年1月1日00:00:00为时间起点,可以精确到年.月.日.时.分.秒的时间值. 背景知识 // number of seconds since 0 hrs, 0 minutes, 0 seconds, on the 1st of January 2000 UTC存储自2000年1月1日开