【实战】STM32 FreeRTOS移植系列教程4:FreeRTOS 软件定时器

2023-05-16

写在前面:

本文章为《STM32MP157开发教程之FreeRTOS操作系统篇》系列中的一篇,笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板)。stm32mp157是ARM双核,2个A7核,1个M4核,A7核上可以跑Linux操作系统,M4核上可以跑FreeRTOS、RT-Thread等实时操作系统,STM32MP157开发板所以既可以学嵌入式linux,也可以学stm32单片机。

针对FS-MP1A开发板,除了FreeRTOS操作系统篇外,还包括其他多系列教程,包括Cortex-A7开发篇、Cortex-M4开发篇、扩展板驱动移植篇、Linux应用开发篇、Linux系统移植篇、Linux驱动开发篇、硬件设计篇、人工智能机器视觉篇、Qt应用编程篇、Qt综合项目实战篇等。欢迎关注,更多stm32mp157开发教程及视频,可加技术交流Q群459754978,感谢关注。

FS-MP1A开发板详情介绍:https://item.taobao.com/item.htm?id=622457259672

2.FreeRTOS软件定时器

2.1软件定时器简介

对于MCU而言,其自带的定时器属于硬件定时器,在FreeRTOS系统中,另外提供了软件定时器功能。软件定时器的精度比不上硬件定时器,但对于要求不高的周期性处理任务来说足够了。

软件定时器可以设置一段时间,当设置的时间到达以后就去执行回调函数,其中,回调函数的两次执行间隔就是定时器的定时周期,即每次定时周期到达以后就去执行一次回调函数。因为回调函数是在定时器服务函数中执行的,因此在回调函数中一定不能调用会阻塞任务的API函数。

软件定时器分为周期定时器和单次定时器两种。周期定时器启动以后就会在执行完回调函数后自动的重新启动,所以回调函数可以周期性执行,对于单次定时器,回调函数只执行一次,执行完以后,定时器就会停止运行,当然我们可以调用函数再次手动重新启动。

2.2软件定时器函数

2.2.1 复位定时器

在定时器正常运行时,我们有时可能需要定时器的复位操作,当复位软件定时器时,系统会重新计算定时周期到达的时间点,但此时间点是相对于复位时刻计算的,并不是第一次启动软件定时器的那个时间点。

在新版FreeRTOS中,共有两个API函数可以完成软件定时器的复位,分别应用于任务中和中断中。

任务级复位软件定时器函数xTimerReset(),此函数是一个宏,其函数原型如下

BaseType_t xTimerReset( TimerHandle_t xTimer,

TickType_t xTicksToWait)

参数:

xTimer:要复位的软件定时器的句柄。

xTickToWait:设置阻塞时间。

返回值:

pdPASS:软件定时器复位成功,即命令发送成功。

pdFAIL:软件定时器复位失败,即命令发送失败。

任务级复位软件定时器函数xTimerReset(),此函数是一个宏,其函数原型如下

BaseType_t xTimerResetFromISR( TimerHandle_t xTimer,

BaseType_t * pxHigherPriorityTaskWoken );

参数:

xTimer:要复位的软件定时器的句柄。

pxHigherPriorityTaskWoken:记退出此函数以后是否进行任务切换,用户不用进行设置。

返回值:

pdPASS:软件定时器复位成功,即命令发送成功。

pdFAIL:软件定时器复位失败,即命令发送失败。

2.2.2 创建软件定时器

创建软件定时器的函数有两个,分别如下:

xTimerCreate(),此函数用于创建软件定时器,所需要的内存通过动态内存管理方法分配,创建以后软件定时器处于休眠状态,其函数原型如下:

TimerHandle_t xTimerCreate( const char * const pcTimerName,

TickType_t xTimerPeriodInTicks,

UBaseType_t uxAutoReload,

void * pvTimerID,

TimerCallbackFunction_t pxCallbackFunction )

参数:

pcTimerName: 软件定时器名字,是一串字符串,用于调试使用。

xTimerPeriodInTicks: 定时器周期,单位是时钟节拍数。

uxAutoReload: 设置定时器模式,单次定时器还是周期定时器。

pvTimerID: 定时器ID号。

pxCallbackFunction: 定时器回调函数。

返回值:

NULL:软件定时器创建失败。

其他值:创建成功的软件定时器句柄。

xTimerCreateStatic(),此函数也用于创建软件定时器,所需要的内存通过用户自行分配,创建以后软件定时器处于休眠状态,其函数原型如下:

TimerHandle_t xTimerCreateStatic(const char * const pcTimerName,

TickType_t xTimerPeriodInTicks,

UBaseType_t uxAutoReload,

void * pvTimerID,

TimerCallbackFunction_t pxCallbackFunction,

StaticTimer_t * pxTimerBuffer )

参数:

pcTimerName: 软件定时器名字,是一串字符串,用于调试使用。

xTimerPeriodInTicks:定时器周期,单位是时钟节拍数。

uxAutoReload: 设置定时器模式,单次定时器还是周期定时器。

pvTimerID: 定时器ID号。

pxCallbackFunction: 定时器回调函数。

pxTimerBuffer: 指向一个StaticTimer_t类型的变量,用来保存定时器结构体。

返回值:

NULL:软件定时器创建失败。

其他值:创建成功的软件定时器句柄。

2.2.3 开启软件定时器

开启软件定时器的函数也有两个,分别如下:

任务级开启定时器函数xTimerStart(),此函数是个宏,如果软件定时器没有运行的话调用函数 xTimerStart()就会计算定时器到期时间,如果软件定时器正在运行的话调用函数 xTimerStart()的结果和 xTimerReset()一样,其函数原型如下:

BaseType_t xTimerStart( TimerHandle_t xTimer,

TickType_t xTicksToWait )

参数:

xTimer: 要开启的软件定时器句柄。

xTickToWait: 设置阻塞时间。

返回值:

pdPASS:软件定时器开启成功,即命令发送成功。

pdFAIL:软件定时器开启失败,即命令发送失败。

中断级开启定时器函数xTimerStartFromISR(),此函数也是个宏,为函数xTimerStart()的中断版本,只能用于中断服务函数中,其函数原型如下:

BaseType_t xTimerStartFromISR( TimerHandle_t xTimer,

BaseType_t * pxHigherPriorityTaskWoken );

参数:

xTimer: 要开启的软件定时器句柄。

pxHigherPriorityTaskWoken: 标记退出此函数以后是否进行任务切换。

返回值:

pdPASS:软件定时器开启成功,即命令发送成功。

pdFAIL:软件定时器开启失败,即命令发送失败。

2.2.4 停止软件定时器

与开启软件定时器一样,停止软件定时器的函数也有两个,分别如下:

任务级停止定时器函数xTimerStop(),此函数是个宏,其函数原型如下:

BaseType_t xTimerStop( TimerHandle_t xTimer,

TickType_t xTicksToWait )

参数:

xTimer: 要停止的软件定时器句柄。

xTickToWait: 设置阻塞时间。

返回值:

pdPASS:软件定时器停止成功,即命令发送成功。

pdFAIL:软件定时器停止失败,即命令发送失败。

中断级停止定时器函数xTimerStopFromISR(),此函数也是个宏,为函数xTimerStop()的中断版本,只能用于中断服务函数中,其函数原型如下:

BaseType_t xTimerStopFromISR( TimerHandle_t xTimer,

BaseType_t * pxHigherPriorityTaskWoken );

参数:

xTimer: 要停止的软件定时器句柄。

pxHigherPriorityTaskWoken: 标记退出此函数以后是否进行任务切换。

返回值:

pdPASS:软件定时器停止成功,即命令发送成功。

pdFAIL:软件定时器停止失败,即命令发送失败。

2.3操作实验

2.3.1实验设计

本次实验创建两个软件定时器,分别为周期定时器CycleTimer_Handle和单次定时器SingleTimer_Handle,其中,CycleTimer_Handle的定时器周期为1000个时钟节拍,SingleTimer_Handle的定时器周期为2000个时钟节拍。

可参考12.3.2章节进行导入已有工程,工程存放路径【华清远见-FS-MP1A开发资料\02-程序源码\ARM体系结构与接口技术\FreeRTOS\4_MP1A-FreeRTOS-TIMER】

通过按键中断设置不同的指令,在任务中根据接收到的指令来控制周期定时器与单次定时器的工作。

任务及其功能如下:

StartTask02(): 控制LED3闪烁,提示系统正在运行。

StartDefaultTask():进行指令处理,根据接收的指令控制定时器工作。

2.3.2实验过程与分析

首先,根据之前几章内容配置好CubeMX,按照上一节配置“FREERTOS”,完成后生成代码。 在StartDefaultTask() 与StartTask02()中添加代码如下。

STM32MP157资源扩展板驱动移植篇10:FreeRTOS软件定时器

当按下KEY1键时,单次定时器工作,当定时器时间到了以后就会调用OneShotCallback()函数,此时会发现LED1的电平发生翻转,然后停止运行。当按下KEY2键时,周期定时器工作,当定时器时间到了以后就会调用AutoReloadCallback()函数,因为周期定时器不会停止运行,此时会发现LED2每隔1秒电平发生翻转。当按下KEY3键时,单次定时器和周期定时器关闭,LED灯的电平不再发生变化。

硬件平台:华清远见FS-MP1A开发板(STM32MP157)

部分开发教程下载:加QQ群459754978,群文件里有。

部分视频课程收看:华清远见研发中心的个人空间_哔哩哔哩_Bilibili

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【实战】STM32 FreeRTOS移植系列教程4:FreeRTOS 软件定时器 的相关文章

  • 不重新编译为PHP安装MySQL模块

    当初安装PHP的源码目录我没有删除 xff0c 直接在此基础上安装 xff1a 1 进入php ext mysql xff1a cd php ext mysql 2 执行phpize命令 xff0c 这个命令一定得在php的模块目录下执行
  • Linux 下 netbeans 字体抗锯齿正解

    在netbeans安装目录找到 etc 目录下的 netbeans conf 文件 xff0c 用你喜欢的编辑器打开这个文件 xff0c 在其中加入这个选项 J Dawt useSystemAAFontSettings 61 on 这里你要
  • 如何在CentOS系统中安装字体

    以linux下安装宋体 xff0c 黑体为例 xff0c 介绍字体安装方法 xff1a 第一步 拷贝 把对应字体的的ttf文件拷到 usr share fonts 的任意目录下 xff0c 假设宋体已拷贝到 usr share fonts
  • Intel CPU简介

    现在Intel已然成了CPU的代名词 xff0c 但当年的Intel并没有现在这么风光 从1978年发布的8086到2013年的四代i7 xff0c 整整35年 xff0c 她见证了从PC到互联网 移动互联网的几次巨变 xff1b 这些年的
  • 让AndroidX86竖屏显示

    以VirtualBox为例 xff0c Android X86的下载地址可以百度搜索 这种界面非常不爽 xff0c 尤其在调试程序时 xff0c 如何才能显示成竖屏呢 xff1f 先把AndroidX86装到硬盘上 然后进行下面设置 1 完
  • Call to undefined function imagettftext()

    今天将公司官网弄到本地测试到时候 xff0c 发现验证码无法显示 xff0c 公司的官网以前是用dede做的 xff0c 找到dede中的include vdimgck php 单独运行 xff0c 没有报错 xff0c 也不显示 顺着文件
  • 在linux下安装glut包

    转自 xff1a http blog csdn net delacroix xu article details 5478429 在linux下opengl编程 xff0c 首先需要安装glut包 1 安装glut xff08 1 xff0
  • configure: error: could not find working GL library

    plib1 8 3下载地址 xff1a http pkgs fedoraproject org repo pkgs plib plib 1 8 3 tar gz de10b19dfcee5da7115ee2a69656f34c plib 1
  • 一篇关于su和sudo以及visudo的很好的介绍性文档

    一 使用 su 命令临时转换用户身份 1 su 的适用条件和威力 su命令就是转换用户的工具 xff0c 怎么理解呢 xff1f 比如我们以普通用户beinan登录的 xff0c 但要添加用户任务 xff0c 执行useradd xff0c
  • 微信公众号开发中的openid值并不是固定的

    在做微信开发时 xff0c 今天犯了一个错误 xff0c 检查了半天才检查出来 微信在向第三方推送信息时会带上一个openid 这是发送信息者的唯一标识 xff0c 看文档说是唯一标识 就以为这个id只与微信号有关 xff0c 而今天才发现
  • linux下单独编译安装Apache rewrite_module

    转自 xff1a http blog chinaunix net uid 25266990 id 145266 html Apache已经编译安装完了 xff0c 上传程序 xff0c 发现必须得用rewrite xff0c 重新上载模块
  • linux 下安装php的openssl扩展

    1 安装openssl 解压php的源码包 tar zxvf php 5 3 8 tar gz cd soft php 5 3 8 ext openssl mv config0 m4 config m4 否则报错 xff1a 找不到conf
  • php安装 出现Sorry, I cannot run apxs. ***错误解决方法

    tar zvxf php 5 1 2 tar gz cd php 5 1 2 configure prefix 61 usr local php with mysql 61 usr local mysql with apxs2 61 usr
  • linux下mysql的root密码忘记解决方

    1 xff0e 首先确认服务器出于安全的状态 xff0c 也就是没有人能够任意地连接MySQL数据库 因为在重新设置MySQL的root密码的期间 xff0c MySQL数据库完全出于没有密码保护的 状态下 xff0c 其他的用户也可以任意
  • Pandas DataFrame

    http pandas pydata org pandas docs stable api html dataframe 构造函数 方法描述DataFrame data index columns dtype copy 构造数据框 属性和数
  • Apache域名自动指向虚拟主机目录

    用apache做项目时 xff0c 是经常需要在httpd vhost conf文件中配置虚拟主机 xff0c 用于单独的项目 xff0c 每新开一个项目就需要重新加一个配置 xff0c 着实麻烦 xff0c apache2其实是支持在配置
  • CentOS上升级PHP5.3至PHP5.5

    最近想玩玩儿symfony2 发现自己CentOS上的PHP版本还是5 3不符合要求 xff0c 所以想升级至5 5 但是 CentOS通过yum更新的源最新版本是5 3 无法升级 xff0c 通过网上查找资料 发现 更新下yum的源后 可
  • 启动docker web服务时 虚拟机端口转发 外部无法访问

    centos 7 docker 启动了一个web服务 但是启动时 报 WARNING IPv4 forwarding is disabled Networking will not work 网上查询了下 需要做如下配置 解决办法 xff1
  • CentOS7下docker启动报Error starting daemon: Error initializing network controller: could not delete ...v

    前一天晚上强制关闭了虚拟机 CentOS7 导致早上启动docker 报Error starting daemon Error initializing network controller could not delete ve endp
  • 在ubuntu1404下安装PHP AMQP拓展 并进行docker容器封装

    有项目用到过rabbitmq 是技术负责人搭建好环境 xff0c 今天自己在本地 ubuntu 开发 xff0c 重新搞了下 xff0c 在网上查了下资料 xff0c 把安装重点记录下来 项目开发语言PHP 需要与一台rabbitmqser

随机推荐

  • centos7下将docker的storage 由loop-lvm 更改为 direct-lvm

    本机服务器环境是centos7 xff08 vbox虚拟机 xff09 安装docker后 运行正常 xff0c 某次强行关闭了虚拟机 导致后续docker运行不起来 xff0c 发现报错是与storage有关 xff0c 所以网上查原因是
  • ubuntu1604下添加自启动项 开机启动docker开发环境

    在win7下安装的vbox虚拟机 xff0c 虚拟机起了一个ubuntu1604作为宿主机 xff0c 安装的docker服务 通过vbox的挂载工具将win7下的程序开发目录挂载到了ubuntu下 作为共享目录 docker安装的开发环境
  • apache2自签名证书开启ssl

    生成私钥文件 需要输入密码 openssl genrsa des3 out apache key 1024 防止APACHE启动 读取私钥文件也需要输入密码 去除密码输入 openssl rsa in apache key out apac
  • alpine 下编译php5.4的源码报Invalid configuration `x86_64-linux-musl'错误

    Invalid configuration 96 x86 64 linux musl 39 system 96 musl 39 not recognized configure error bin bash 在alpine3 7上编译php
  • golang GRPC安装

    1 下载protoc编译器 https github com protocolbuffers protobuf releases 将protoc exe放到系统环境变量设置的目录下 2 安装golang相关的package go get g
  • reStructuredText

    段落 段落必须由空行代替 段落1 段落2 内联标记 span class hljs emphasis 斜体 span span class hljs strong 粗体 span span class hljs code 96 96 代码块
  • win10下安装kubernets

    win10下安装docker for windows后 xff0c 新版是有一个kubernets选项 xff0c 选择启动后 xff0c 一直报 kubernets is starting 的错误 xff0c 原因是 xff0c kube
  • 嵌入式工程师的自我修养

    文章目录 前言一 认知的四个阶段1 不知不知2 知道不知3 知道己知3 1 软硬件3 2 网络3 3 安全技术 xff08 换成你自己的领域 xff09 3 4 真正知道的三个阶段3 4 1 会用3 4 2 了解怎么实现3 4 3 明白为什
  • 利用uORB机制实现数据在不同进程中通信

    uORB实际上是一种设计模式中的观察者模式 xff0c 用于实现一种一对多的依赖关系 xff0c 让多个观察者 xff08 Observer xff09 同时监听某一主题对象 xff08 Subject xff09 当这个主题对象 xff0
  • Android-注解篇

    1 什么是注解 从JDK 5 开始 xff0c Java 增加了注解 xff0c 注解是代码里的特殊标记 xff0c 这些标记可以在编译 类加载 运 行时被读取 xff0c 并执行相应的处理 通过使用注解 xff0c 开发人员可以在不改变原
  • 新品BCM6755A1KFEBG/MT7921LE/MT7921AU WiFi芯片

    博通在WiFi市场具有相当的实力 在WiFi6上有下面这几个解决方案 xff1a 型号 xff1a BCM6755 BCM6755A1KFEBG 类型 xff1a 四核1 5GHz CPU 封装 xff1a BGA 批次 xff1a 新 B
  • Ubuntu : GPG签名验证错误 解决之道sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 6DFBCBAE

    Ubuntu GPG签名验证错误 解决之道 转载 sudo apt key adv keyserver keyserver ubuntu com recv keys Key Where key 61 61 the gpg key id Th
  • T265深度图像输出

    1 T265深度图像输出 1 1 环境依赖 T265摄像头python3pip3opencv pythonpyrealsense2 1 2 安装运行环境 安装秘钥 span class token function sudo span ap
  • Linux版本号串记录(ubuntu系列)

    Linux version 4 4 0 112 generic buildd 64 lgw01 amd64 010 gcc version 5 4 0 20160609 Ubuntu 5 4 0 6ubuntu1 16 04 5 135 U
  • 死锁的四个必要条件

    死锁 在高并发中是一个常见的名词 产生的四个必要条件如下 xff1a 互斥条件 xff1a 一个资源同一时间能且只能被一个线程访问 xff1b 不可掠夺 xff1a 当资源被一个线程占用时 xff0c 其他线程不可抢夺该资源 xff1b 请
  • Sphinx index.rst

    假设我们有两个文本file1 rst和file2 rst他们的内容如下 file1 rst span class hljs header file1 title1 61 61 61 61 61 61 61 61 61 61 61 61 sp
  • Git - 图形化界面操作

    目录 1 新建仓库 2 代码提交 3 代码回滚 4 新建分支 5 合并分支 6 重置合并 7 分支变基 8 分支优选 Git 的图形化界面操作 xff0c 使用 Idea 进行演示 1 新建仓库 对于一个代码仓库 Create Git re
  • CMakeLists

    1 指定 cmake 的最小版本 cmake minimum required VERSION 3 4 1 2 设置项目名称 xff0c 它会引入两个变量 demo BINARY DIR 和 demo SOURCE DIR xff0c 同时
  • 七步实现STM32MP157多核协同工作(Cortex-A7与Cortex-M4通信)

    写在前面 xff1a STM32MP157是ST进军Linux的首款微处理器 xff0c 采用MCU 43 MPU的组合 xff0c 集成两颗主频微800MHz的Cortex A7应用处理器内核 xff08 支持开源linux操作系统 xf
  • 【实战】STM32 FreeRTOS移植系列教程4:FreeRTOS 软件定时器

    写在前面 xff1a 本文章为 STM32MP157开发教程之FreeRTOS操作系统篇 系列中的一篇 xff0c 笔者使用的开发平台为华清远见FS MP1A开发板 xff08 STM32MP157开发板 xff09 stm32mp157是