STM32软件定时器

news2024/11/16 21:41:20

目录

什么是定时器?

软件定时器优缺点

软件定时器原理

软件定时器相关配置

单次定时器和周期定时器

软件定时器相关 API 函数

1. 创建软件定时器

2. 开启软件定时器

3. 停止软件定时器

4. 复位软件定时器

5. 更改软件定时器定时时间

实操

cubeMX配置

代码实现 


什么是定时器?

简单可以理解为闹钟,到达指定一段时间后,就会响铃。
STM32 芯片自带硬件定时器,精度较高,达到定时时间后会触发中断,也可以生成 PWM 、输入
捕获、输出比较,等等,功能强大,但是由于硬件的限制,个数有限。
软件定时器也可以实现定时功能,达到定时时间后可调用回调函数,可以在回调函数里处理信
息。

软件定时器优缺点

优点:
1. 简单、成本低;
2. 只要内存足够,可创建多个;
缺点:
精度较低,容易受中断影响。在大多数情况下够用,但对于精度要求比较高的场合不建议使用。

软件定时器原理

定时器是一个可选的、不属于 FreeRTOS 内核的功能,它是由定时器服务任务来提供的。
在调用函数 vTaskStartScheduler() 开启任务调度器的时候,会创建一个用于管理软件定时器的任
务,这个任务就叫做软件定时器服务任务。
1. 负责软件定时器超时的逻辑判断
2. 调用超时软件定时器的超时回调函数
3. 处理软件定时器命令队列
FreeRTOS 提供了很多定时器有关的 API 函数,这些 API 函数大多都使用 FreeRTOS 的队列发送命令给
定时器服务任务。 这个队列叫做定时器命令队列 。定时器命令队列是提供给 FreeRTOS 的软件定时
器使用的, 用户不能直接访问

 

软件定时器相关配置

软件定时器有一个定时器服务任务和定时器命令队列,这两个东西肯定是要配置的,相关的配置
也是放到文件 FreeRTOSConfig.h 中的,涉及到的配置如下:
1 configUSE_TIMERS
如果要使用软件定时器的话宏 configUSE_TIMERS 一定要设置为 1 ,当设置为 1 的话定时器服务任务就会在启动FreeRTOS 调度器的时候自动创建。
2 configTIMER_TASK_PRIORITY
设置软件定时器服务任务的任务优先级,可以为 0~(configMAX_PRIORITIES-1) 。优先级一定要根
据实际的应用要求来设置。如果定时器服务任务的优先级设置的高的话,定时器命令队列中的命 令和定时器回调函数就会及时的得到处理。
3 configTIMER_QUEUE_LENGTH
此宏用来设置定时器命令队列的队列长度。
4 configTIMER_TASK_STACK_DEPTH
此宏用来设置定时器服务任务的任务堆栈大小。

单次定时器和周期定时器

单次定时器: 只超时一次,调用一次回调函数。可手动再开启定时器;
周期定时器: 多次超时,多次调用回调函数。

软件定时器相关 API 函数

函数
描述
xTimerCreate()
动态方式创建软件定时
xTimerCreateStatic()
静态方式创建软件定时器
xTimerStart()
开启软件定时器定时
xTimerStop()
停止软件定时器定时
xTimerReset()
复位软件定时器定时
xTimerChangePeriod()
更改软件定时器的定时超时时间
xTimerStartFromISR()
在中断中开启软件定时器定时
xTimerStopFromISR()
在中断中停止软件定时器定时
xTimerResetFromISR()
在中断中复位软件定时器定时
xTimerChangePeriodFromISR()
在中断中更改定时超时时间

1. 创建软件定时器

TimerHandle_t xTimerCreate
( const char * const pcTimerName ,
const TickType_t xTimerPeriod ,
const UBaseType_t uxAutoReload ,
void * const pvTimerID ,
TimerCallbackFunction_t pxCallbackFunction );
参数:
pcTimerName :软件定时器名称 xTimerPeriodInTicks :定时超时时间,单位:系统时钟节拍。宏
pdMS_TO_TICKS() 可用于将以毫秒为单位指定的时间转换为以 tick 为单位指定的时间。
uxAutoReload :定时器模式, pdTRUE :周期定时器, pdFALSE :单次定时器 pvTimerID :软件
定时器 ID ,用于多个软件定时器公用一个超时回调函数 pxCallbackFunction :软件定时器超时回
调函数
返回值:
成功:定时器句柄
失败: NULL

2. 开启软件定时器

BaseType_t xTimerStart ( TimerHandle_t xTimer ,
TickType_t xBlockTime );
参数:
xTimer :待开启的软件定时器的句柄 xTickToWait :发送命令到软件定时器命令队列的最大等待时
返回值:
pdPASS :开启成功 pdFAIL :开启失败

3. 停止软件定时器

BaseType_t xTimerStop ( TimerHandle_t xTimer ,
TickType_t xBlockTime );
参数与返回值同上。

4. 复位软件定时器

BaseType_t xTimerReset ( TimerHandle_t xTimer ,
TickType_t xBlockTime );
参数与返回值同上。
该功能将使软件定时器的重新开启定时,复位后的软件定时器以复位时的时刻作为开启时刻重新
定时。

5. 更改软件定时器定时时间

BaseType_t xTimerChangePeriod ( TimerHandle_t xTimer ,
TickType_t xNewPeriod ,
TickType_t xBlockTime );
xNewPeriod :新的定时超时时间,单位:系统时钟节拍。
其余参数与返回值同上。

实操

实验需求
创建两个定时器:
定时器 1 ,周期定时器,每 1 秒打印一次  CHL shuai
定时器 2 ,单次定时器,启动后 2 秒打印一次 laochen shuai

cubeMX配置

代码实现 

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * File Name          : freertos.c
  * Description        : Code for freertos applications
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "FreeRTOS.h"
#include "task.h"
#include "main.h"
#include "cmsis_os.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN Variables */

/* USER CODE END Variables */
osThreadId defaultTaskHandle;
osTimerId myTimer01Handle;
osTimerId myTimer02Handle;

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN FunctionPrototypes */

/* USER CODE END FunctionPrototypes */

void StartDefaultTask(void const * argument);
void Callback01(void const * argument);
void Callback02(void const * argument);

void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */

/* GetIdleTaskMemory prototype (linked to static allocation support) */
void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize );

/* GetTimerTaskMemory prototype (linked to static allocation support) */
void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize );

/* USER CODE BEGIN GET_IDLE_TASK_MEMORY */
static StaticTask_t xIdleTaskTCBBuffer;
static StackType_t xIdleStack[configMINIMAL_STACK_SIZE];

void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize )
{
  *ppxIdleTaskTCBBuffer = &xIdleTaskTCBBuffer;
  *ppxIdleTaskStackBuffer = &xIdleStack[0];
  *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;
  /* place for user code */
}
/* USER CODE END GET_IDLE_TASK_MEMORY */

/* USER CODE BEGIN GET_TIMER_TASK_MEMORY */
static StaticTask_t xTimerTaskTCBBuffer;
static StackType_t xTimerStack[configTIMER_TASK_STACK_DEPTH];

void vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize )
{
  *ppxTimerTaskTCBBuffer = &xTimerTaskTCBBuffer;
  *ppxTimerTaskStackBuffer = &xTimerStack[0];
  *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;
  /* place for user code */
}
/* USER CODE END GET_TIMER_TASK_MEMORY */

/**
  * @brief  FreeRTOS initialization
  * @param  None
  * @retval None
  */
void MX_FREERTOS_Init(void) {
  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* USER CODE BEGIN RTOS_MUTEX */
  /* add mutexes, ... */
  /* USER CODE END RTOS_MUTEX */

  /* USER CODE BEGIN RTOS_SEMAPHORES */
  /* add semaphores, ... */
  /* USER CODE END RTOS_SEMAPHORES */

  /* Create the timer(s) */
  /* definition and creation of myTimer01 */
  osTimerDef(myTimer01, Callback01);
  myTimer01Handle = osTimerCreate(osTimer(myTimer01), osTimerPeriodic, NULL);

  /* definition and creation of myTimer02 */
  osTimerDef(myTimer02, Callback02);
  myTimer02Handle = osTimerCreate(osTimer(myTimer02), osTimerOnce, NULL);

  /* USER CODE BEGIN RTOS_TIMERS */
  /* start timers, add new ones, ... */
  /* USER CODE END RTOS_TIMERS */

  /* USER CODE BEGIN RTOS_QUEUES */
  /* add queues, ... */
  /* USER CODE END RTOS_QUEUES */

  /* Create the thread(s) */
  /* definition and creation of defaultTask */
  osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);
  defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);

  /* USER CODE BEGIN RTOS_THREADS */
  /* add threads, ... */
  /* USER CODE END RTOS_THREADS */

}

/* USER CODE BEGIN Header_StartDefaultTask */
/**
  * @brief  Function implementing the defaultTask thread.
  * @param  argument: Not used
  * @retval None
  */
/* USER CODE END Header_StartDefaultTask */
void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask */
	//osTimerStart(myTimer01Handle, 1000);
	xTimerChangePeriod(myTimer01Handle, pdMS_TO_TICKS(1000), 0);
	osTimerStart(myTimer02Handle, 2000);
  /* Infinite loop */
  for(;;)
  {
    osDelay(1);
  }
  /* USER CODE END StartDefaultTask */
}

/* Callback01 function */
void Callback01(void const * argument)
{
  /* USER CODE BEGIN Callback01 */
	printf("liangxu shuai\r\n");
  /* USER CODE END Callback01 */
}

/* Callback02 function */
void Callback02(void const * argument)
{
  /* USER CODE BEGIN Callback02 */
	printf("laochen shuai\r\n");
  /* USER CODE END Callback02 */
}

/* Private application code --------------------------------------------------*/
/* USER CODE BEGIN Application */

/* USER CODE END Application */

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/655293.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python设置画布背景颜色

Python设置画布背景颜色 Python语言是一种广泛应用于科学计算、数据处理和数据可视化的高级脚本语言。它之所以如此流行,主要是因为它简单易学,并且具有很强的灵活性。在Python中,我们可以使用各种库来创建图形化界面、游戏和数据可视化应用…

C高级 day35

1、ubuntu的网络配置 1、查看网络是否连接 ping baidu.com 2、保证虚拟机有桥接网络 虚拟机---->设置---->网络适配器------>选择桥接或者是Vmnet0 给虚拟机添加桥接网络,如果没有vmnet0,添加网络 3、配置虚拟机的桥接网络 右上角网络图标-----…

RunCat 自定义动图

下载资源 下载资源 Runners Store 在商店购买 Self-Made Runner 设置 添加多张图片 下载 zhiyin_basketball 图片 zhiyin_basketball 下载 更新版本 设置图片 Format: PNGHeight: 36pxWidth: 10~100px 调整图片大小 使用convert命令查看图片宽和高 convert 0.png -print …

MFC视类和框架类学习1

VC6新建一个单文档工程,名称为test;将会生成如下的类; 这里说的框架类是指CMainFrm类; 视类是指CxxxxView类; 生成的视类公共继承自CView类, class CTestView : public CView { ...... CView类继承自CWnd…

安装ps出现计算机丢失d3dcompiler_47.dll缺失的解决方法

本教程操作系统:Windows系统、 d3dcompiler_47.dll是电脑文件中的dll文件(动态链接库文件)。如果计算机中丢失了某个dll文件,可能会导致某些软件和游戏等程序无法正常启动运行,并且导致电脑系统弹窗报错。 在我们打开…

局域网视频会议系统相较于SaaS会议系统的优势

局域网视频会议系统和SaaS会议系统都是远程协作和视频通讯的应用技术,各自有各自的特点和功能。 局域网视频会议系统相较于SaaS会议系统可以具备以下一些优势: 1. 安全性更高:局域网视频会议系统在企业内部进入,采用专属的内外网安…

Win10电脑C盘爆红了可以删除哪些文件?

Win10电脑C盘爆红了可以删除哪些文件?Win10电脑中用户发现C盘爆红了,想通过删除C盘内的文件来解决C盘爆红的问题,那么哪些文件可以删除呢,用户可以打开Temp、Help、Prefectch等文件夹进行删除,以下就是Win10电脑C盘爆红…

Python入门基本练习题(54题)

Python入门基本练习题(54题) 目录 第一节 、Python基础关键字和语法 1、 用单引号括出需要打印输出的内容 2、 用双引号括出需要打印输出的内容 3、 用三引号括出需要打印输出的内容 4、 \n(换行符)的使用 5、 \t&#xff0…

chatgpt赋能python:Python词云入门:构建你自己的词云图

Python词云入门:构建你自己的词云图 如果你是一个数据科学家或者是数据分析师,那么你肯定已经听过了“词云图”这个词。词云图是数据可视化的一种方式,用于呈现文本数据中最频繁出现的词汇。在这篇文章中,我将提供一个详细的教程…

前端怎么使用node-input-validator给接口添加参数校验(以strapi 4.9为例)

node-input-validator是什么? 简称NIV (Node Input Validator)用于node.js的验证库使用它可以扩展库以添加自定义规则。npm NIV文档 使用方法 我们以strapi 4.9 版本项目为例,来试用一下它对我们接口的校验规则 下载依赖 npm i node-input-validat…

【人工智能】人工智能和双曲几何

一、说明 作为人工智能技术的理论支撑,几何学是必不可少的;目前直接的几何技术有:计算几何--对集合体如点云处理有用;射影几何--对3d重构有用;双曲几何--在自然语言的词嵌入做基础数学模型,另外深度学习国外…

Intellij IDEA编写Spark应用程序的环境配置和操作步骤

本文介绍如何在win系统中使用IDEA开发spark应用程序,并将其打成jar包上传到虚拟机中的三个Ubuntu系统,然后在分布式环境中运行。 主要步骤包括: 安装Scala插件:在Intellij IDEA中安装Scala插件,并重启IDEA。创建Mave…

航空保障装备虚拟3d展览展示仿真系统助力企业降本增效

航空装备被认为是一个现代化国家核心竞争力的集中体现。航空装备制造业不仅是维护发展环境稳定的重要保障,也是推动经济转型升级的战略性产业。 3D虚拟展示技术是数字化转型中一项不可或缺的技术手段,将3D虚拟现实技术与工业制造业的有机融合&#xff0c…

chatgpt赋能python:Python第三方包安装方法详解

Python第三方包安装方法详解 为什么要安装第三方包? 在Python编程中,常常需要使用到一些额外的功能模块,但是Python自身不具备这些功能,需要通过安装第三方包来实现。例如,Python标准库中没有Jupyter Notebook工具&a…

T5、RoBERTa、悟道·天鹰、紫东太初、CPM作者谈基础模型前沿技术丨大模型科研、创业避坑指南...

导读 大语言模型日益火爆,学者们的研究方向是指明灯。那么相关大模型重要项目的主要贡献者怎么看?6月9日的北京智源大会“基础模型前沿技术”论坛邀请了T5、RoBERTa、悟道天鹰、紫东太初、CPM等重要模型工作作者出席。 图注:五位嘉宾现场讨论…

chatgpt赋能python:Python如何设置画布颜色:一份详尽指南

Python如何设置画布颜色:一份详尽指南 在计算机图形学中,画布颜色是指画布的背景颜色。当然,通过Python设置画布颜色非常简单,本篇文章将为您提供一份详尽指南。 什么是画布颜色? 在Python中创建一个画布时&#xf…

MySQL 官方示例数据库如何下载

文章结构 下载 MySQL 的示例数据库示例数据库介绍以及安装后续就是自己使用了参考网址 MySQL 提供了一些非常好的用来演示 MySQL 各项功能的示例数据库,同 Oracle 也提供了示例数据库。但是很少有人知道 MySQL 也提供,或许是因为它没有像 Oracle 一样在安…

chatgpt赋能python:Python教程:如何设置画布大小?

Python教程:如何设置画布大小? 在Python中,我们可以使用各种图形库来创建各种类型的图。有时,我们需要调整图像的大小以适应我们的需求。所以,在这篇文章中,我将介绍如何使用Python来设置画布大小。 什么…

cocos creator 帧同步游戏示例

最近闲来无事重新研究一下同步策略里面的帧同步,首先说下帧同步与状态同步的区别, 1:帧同步: 帧同步是一种多人游戏中常用的网络同步技术,用于确保不同玩家之间的游戏状态保持一致。在帧同步中,所有玩家通…

chatgpt赋能python:Python计算字符串中的小写字母

Python计算字符串中的小写字母 在搜索引擎优化中,我们经常需要计算一个文本中小写字母的数量。Python语言的强大和灵活性使得它成为实现这一目标的理想选择。在本文中,我们将介绍如何使用Python语言计算字符串中的小写字母。 了解Python字符串 在Pyth…