【北京迅为】《STM32MP157开发板使用手册》-第四十三章 软件定时器实验

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7+单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板+底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐用,可满足高速信号环境下使用。共240PIN,CPU功能全部引出:底板扩展接口丰富底板板载4G接口(选配)、千兆以太网、WIFI蓝牙模块HDMI、CAN、RS485、LVDS接口、温湿度传感器(选配)光环境传感器、六轴传感器、2路USB OTG、3路串口,CAMERA接口、ADC电位器、SPDIF、SDIO接口等


第四十三章 软件定时器实验

43.1 软件定时器的基本概念

定时器,是指从指定的时刻开始,经过一个指定时间,然后触发一个超时事件,用户可以自定义定时器的周期与频率。类似生活中的闹钟,我们可以设置闹钟每天什么时候响,还能设置响的次数,是响一次还是每天都响。

定时器有硬件定时器和软件定时器之分:

硬件定时器是芯片本身提供的定时功能。一般是由外部晶振提供给芯片输入时钟,芯片向软件模块提供一组配置寄存器,接受控制输入,到达设定时间值后芯片中断控制器产生时钟中断。硬件定时器的精度一般很高,可以达到纳秒级别,并且是中断触发方式。

软件定时器,软件定时器是由操作系统提供的一类系统接口,它构建在硬件定时器基础之上,使系统能够提供不受硬件定时器资源限制的定时器服务,它实现的功能与硬件定时器也是类似的。使用硬件定时器时,每次在定时时间到达之后就会自动触发一个中断,用户在中断中处理信息; 而使用软件定时器时,需要我们在创建软件定时器时指定时间到达后要调用的函数。

在很多应用中,我们需要一些定时器任务,硬件定时器受硬件的限制,数量上不足以满足用户的实际需求,无法提供更多的定时器,那么可以采用软件定时器来完成,由软件定时器代替硬件定时器任务。但需要注意的是软件定时器的精度是无法和硬件定时器相比的,因为在软件定时器的定时过程中是极有可能被其他中断所打断,因为软件定时器的执行上下文环境是任务。所以,软件定时器更适用于对时间精度要求不高的任务,一些辅助型的任务。

43.2 实验目的

1)STM32CubeIDE工具软件建立freertos工程

2)学习软件定时器相关的知识与初步使用

我们的实验任务为串口打印软件定时器的信息,软件定时器来观察计数信号量的特性。

首先对实验进行分析,总共需要有一个任务,需要设置定时器的计时时间,然后在回调函数中,通过串口来进行定时时间的打印。

本章节完成的实验存放位置为“iTOP-STM32MP157开发板\iTOP-STM32MP157开发板网盘资料汇总\08_freertos实验例程\07_软件定时器实验.zip”。

43.3 软件定时器实验

43.3.1建立freertos_TIME工程

首先我们打开STM32CubeIDE软件,进入软件界面之后,我们点击File属性,选择NEW下的STM32 Project的选项,如下图所示:

然后我们会进入下图所示界面:在Part Number选择框输入STM32MP157A,然后在右边的选择界面选择STM32MP157AAA,然后点击Next选项 

在Project Name框中输入工程名字freertos_TIME,然后点击Finish选项即可,如下图所示: 

等待工程创建完毕,会询问我们是否要安装OpenSTLinux ,由于我们是在windows环境下,所以我们不需要安装,点击NO即可 

至此我们的工程创建完毕,进入工程界面如下图所示界面: 

43.3.2串口引脚的功能配置

首先我们在下面的搜索框之中输入我们要配置的引脚,我们在这里以PB2为例进行搜索,输入名称之后,对应的引脚在工程中会闪烁,如下图所示:

然后我们使用鼠标左键点击对应的引脚会弹出PB2的复用功能选择,我们在这里选择复用为UART4_RX功能,如下图所示: 

用同样的方法对PG11进行搜索,然后我们使用鼠标左键点击对应的引脚会弹出PG11的复用功能选择,我们在这里选择复用为UART4_TX功能,如下图所示: 

配置完成之后打开左侧菜单的 System CoreàGPIO 进入 GPIO 模式配置界面:如下图所示: 

 

点击对应的引脚配置之后会弹出右下方的管脚配置界面,如上图所示:

在下方会列出要配置选项的具体说明和我们要进行的配置。

选项 GPIO Pull-up/Pull-down 用来设置 IO 口是上拉/下拉/没有上下拉。本实验我们设置为上拉(Pull-up)。

选项 GPIO mode用来设置 GPIO 口的模式,这里默认为alternate function,也就是复用功能。

选项 User Label 是用来设置初始化的 IO 口 Pin 值为我们自定义的宏,这里我们填写为 UART_RX。按照如上要求设置后的界面如下(由于PG11的配置相同,只是最后的Label值不同,也在下方列了出来):

而PG11和PB2的设置相似,只是多了出了一个选项:选项 Mzximum ouput speed 用来设置 IO 口输出速度为低速(Low)/中速(Medium)/高速 (Hign)/快速(Very High)。我们设置为高速Very High 。 

43.3.3时钟的配置

我们本次实验所采用的时钟为外部时钟HSE,所以我们要在左侧属性栏中的System Core 属性下找到RCC将High Speed Clock选择为Crystal/Ceramic Resonator(晶体/陶瓷晶振)。如下图所示:

 

然后在Clock Configuration里我们选择 HSE,作为锁相环 PLL3P 的时钟源,在 MCU 子系统时钟里输入 209 并回车,软件会自动设置相应的倍频和分频,如下图所示:

设置完成之后,如下图所示,然后再手动配置 APB1DIV、APB2DIV 和 APB3DIV的分频值为 2。当 APB1DIV 的分频数大于 1 的时候,基本定时器的倍频器倍频值始终为 2,所以基本定时器的时钟频率为 209MHz。 

43.3.4 配置 FreeRTOS

时钟配置完成之后,我们要再所以我们要在左侧属性栏中的Middleware属性下找到FREERTOS将Interface函数接口选择 CMSIS_V2,选择完成如下图所示:

每个功能窗口对应的功能如下: 

窗口

对应的功能

Mutexes

互斥量

Events

事件

FreeRTOS Heap Usage

堆情况使用

User Constants

常量的定义

Tasks and Queues

任务和消息队列

Timers and Semaphores

软件定时器和信号

Config parameters

配置参数

Inclued parameters

头文件配置

Advanced settings

高级设置

然后我么进入到Tasks and Queues任务和消息队列窗口,如下图所示: 

随后我们点击default默认创建的任务,添加任务名字为TIME的工程,修改优先级为最低osPriorityLow如下图所示: 

创建完成如下图所示: 

随后我们来到Timers and Semaphores选项界面(即软件定时器和信号界面),在该页面中总共有三个任务栏,分别为定时器、二值信号量、计数信号量,如下图所示,然后我们点击最上方软件定时器的Add添加按钮如下图所示:

弹出队列的添加窗口之后,对默认的Timer Name进行修改,修改为Timer01,然后我们点击确定按钮,如下图所示: 

用同样的方法创建Timer02软件定时器,这里要注意的是,Timer02的类型为osTimeOnce, 

创建完成如下图所示: 

配置完成之后我们需要在Project Manage下的Code Generator选项下勾选 Generate peripheral initialization as a pair of ".c/.h' files per peripheral 选项,这样可以独立生成对应外设的初始化.h 和.c 文件(方便配置的查看),如下图所示: 

43.3.5工程的生成与完善

在上述的步骤完成之后,按下键盘的Ctrl+S组合键保存保存 LED.ioc 文件,系统开始生成初始化代码此处会弹出一个警告,提示我们 Systick 定时器已被 HAL 库占用,在 STM32MP157 Cortex-M4 内核上我们更换不了其他的定时器,选择 Yes 继续生成代码即可。

 

工程生成之后如下图所示: 

然后我们进行工程的完善,以及添加对应的逻辑代码。

43.3.5.1 uart.h文件的完善

首先打开uart.h文件,文件存放位置如下图所示:

进入uart.h文件后在/* USER CODE BEGIN Private defines */和/* USER CODE END Private defines */之间添加定义

uint8_t RxBuffer;

用来设置串口发送和接收缓冲区的大小。添加完成如下图所示:

 

43.3.5.2 uart.c文件的完善

首先打开uart.h文件,文件存放位置如下图所示:

进入uart.c文件后在/* USER CODE BEGIN 1 */和/* USER CODE END 1 */之间添加回调函数,在没有编写回调函数的时候,串口只能完成一次发送和接收,在完成一次中断接收以后,就关闭串口中断了,该回调函数的作用是实现字符的循环发送和接收,添加内容如下: 

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)

{

  HAL_UART_Transmit(&huart4,&RxBuffer,1,0);

  HAL_UART_Receive_IT(&huart4,&RxBuffer,1);

}

添加完成之后如下图所示: 

43.3.5.3 main.c文件的完善

我们要修改的main.c文件路径如下图所示:

 

打开main.c文件,在 /* USER CODE BEGIN 2 */和/* USER CODE END 2 */之间添加以下内容:

HAL_UART_Receive_IT(&huart4,&RxBuffer,1);

 

在/* USER CODE BEGIN 4 */和/* USER CODE END 4 */之间添加以下内容:

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{while ((UART4->ISR & 0X40) == 0);UART4->TDR = (uint8_t) ch;return ch;
}

该函数的目的是实现串口输出重定向,重定向是指将fputc里面的输出指向目标设备。因printf函数调用了fputc,而fputc输出有默认指向的目标,且不同库中的fputc输出指向不同,所以需要重写fputc。

43.3.5.4 app_freertos.c文件的完善

我们要修改的 app_freertos.c文件路径如下图所示:

打开app_freertos.c文件,然后我们来到文件的底部可以看到我们创建的TIME_Task任务

修改TIME_Task 任务的for循环上方添加以下内容:

osTimerStart (Timer01Handle, 1000);

osTimerStart (Timer02Handle, 5000);

添加完成如下图所示:

 

随后我们对回调函数Callback01 进行内容的添加,添加内容如下:

uint32_t tick_num1;

static uint32_t Count1;

Count1++;

tick_num1 = osKernelGetTickCount();

printf("Callback01 number is %lu \r\n", Count1);

printf("system counting =%lu \r\n", tick_num1);

添加完成如下图所示:

然后我们对回调函数Callback02 进行内容的添加,添加内容如下: 

	static uint32_t Count2;uint32_t tick_num2;Count2++;tick_num2 = osKernelGetTickCount();printf("Callback01 number is %lu \r\n", Count2);printf("system counting =%lu \r\n", tick_num2);

添加完成如下图所示:

至此,我们的内容就添加完成了。之后进行编译烧写,可以看到串口打印时间的输出如下图所示:

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

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

相关文章

Vue使用axios实现Ajax请求

1、什么是 axios 在实际开发过程中,浏览器通常需要和服务器端进行数据交互。而 Vue.js 并未提供与服务器端通信的接口。从 Vue.js 2.0 版本之后,官方推荐使用 axios 来实现 Ajax 请求。axios 是一个基于 promise 的 HTTP 客户端。 关于 promise 的介绍…

【Day03-MySQL单表】

数据库 数据库介绍 什么是数据库 数据存储的仓库,其本质也是一个文件系统 数据库会按照特定的格式对数据进行存储,用户可以对数据库中的数据进行增加,修改,删除及查询操作。 数据库管理系统层次 数据库管理系统 (DataBase Ma…

安装python包的四种常用方式

前言 Pycharm使用过程中总是需要根据任务安装一些python的包,有时候还会遇到某些包安装失败,今天总结了四种常见的安装方式,希望在一种方式安装失败的情况下,可以换其他方式进行尝试安装。 一、鼠标点击安装 1. Python Interpre…

qt--Qml控件库如何从外部导入

文章目录 两种方案方案1 给项目添加子项目方案2 使用pri文件 综合来说 : 两种方案 方案1 给项目添加子项目 利用git的特性 对应的子项目就是我们的控件库 然后需要哪个控件 在父项目的qrc路径进行导入 即可将控件库里面的控件给导入项目 在使用的时候 使用模…

通过蓝图Blueprint完成项目拆分、模块化以及模块化后项目结构分析

1、不拆分项目之前的写法 在上一篇Flask入门和视图中我们讲解了Flask项目的一个启动流程,引入Flask、创建Flask对象,然后由路由进入在视图函数中通过模版渲染或者json系列化的方式返回页面或者数据。我们发现这些所有的操作都是在一个页面中完成的&…

不只是模仿,伯克利新研究赋予机器人跨实体自主学习的能力,零样本时代已来

导读: 在当今科技飞速发展的时代,机器人技术正不断地给我们带来惊喜和变革。2024 年 9 月,一篇来自加州大学伯克利分校、丰田研究所和Physical Intelligence 的研究论文RoVi-Aug: Robot and Viewpoint Augmentation for Cross-Embodiment Rob…

C++ | 二叉搜索树

前言 本篇博客讲解c中的继承 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见📝 🎉欢迎大家点赞&…

超详细!百分百安装成功pytorch,建议收藏

文章目录 一、Anaconda安装1.1下载anaconda1.2配置Anaconda环境1.3验证anaconda是否安装成功 二、查看电脑显卡三、更新显卡驱动3.1下载驱动3.2、查看显卡驱动版本 四、cuda安装4.1CUDA下载4.2CUDA环境配置4.3验证CUDA是否安装成功 五、安装pytorch4.1下载pytorch5.2验证pytorc…

OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【内核通信机制】上

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 子系统开发内核 轻量系统内核(LiteOS-M) 轻量系统内核&#…

力扣 18.四数之和

文章目录 题目介绍解法 题目介绍 解法 思路和 15. 三数之和 一样,排序后,枚举 nums[a] 作为第一个数,枚举 nums[b] 作为第二个数,那么问题变成找到另外两个数,使得这四个数的和等于 target,这可以用双指针…

《线性代数》常用公式定理总结

文章目录 1 行列式1.1 克拉默法则1.2 基本性质1.3 余子式 M i j M_{ij} Mij​1.4 代数余子式 A i j ( − 1 ) i j ⋅ M i j A_{ij} (-1)^{ij} \cdot M_{ij} Aij​(−1)ij⋅Mij​1.5 具体型行列式计算(化为基本型)1.5.1 主对角线行列式:主…

git 本地分支误删,怎么恢复?误删本地已提交未推送的分支!

误删本地已提交未推送的分支! 前提: 已提交! 重点:未推送! 要是推送了,再拉一下代码就行了。你也不会来搜这个帖子了。 如果你删除的分支里有你未提交的代码,不用往下看了,帮不到你…

树莓派4B+UBUNTU20.04+静态ip+ssh配置

树莓派4B+UBUNTU20.04+静态ip+ssh配置 1.烧录Ubuntu镜像1.1选择pi 4b1.2选择ubuntu server (服务器版,无桌面)20.041.3选择sd卡1.4 点击右下角 NEXT ,编辑设置,输入密码,wifi选CN, 开启ssh1.5 烧录,依次点击“是”,等待完成2 烧录完成后装入树莓派,上电,等待系统完成配…

电竞显示器哪个牌子好

电竞显示器哪个好?你想成为电竞选手吗?显示器很关键,下面我就列举7款市面流行的电竞显示器给大家看看,总有一款适合你。 1.电竞显示器哪个好 - 蚂蚁电竞 ANT255VF电竞显示器 一、产品概述 蚂蚁电竞 ANT255VF电竞显示器是一款专为…

鱼哥好书分享活动第31期:如何构建出更好的大模型RAG系统?《大模型RAG实战》

鱼哥好书分享活动第31期:如何构建出更好的大模型RAG系统?《大模型RAG实战》 S1 初级RAGS2 高级RAG模型测策略测模型微调测 S3 超级RAG购买链接:内容简介:赠书抽奖规则: ChatGPT爆火之后,以ChatPDF为首的产品组合掀起了…

Node-red 某一时间范围内满足条件的数据只返回一次

厂子里有个业务需求增加一段逻辑,根据点位数值,判断是否让mes执行之后的逻辑。 网关采集周期5s/次,及数据上报周期5s/次; iot通过网关写入时间为8s左右; 同类设备共用一条规则链; 想当触发条件时修改”完成上传“不…

简单题67.二进制求和 (java)20240919

题目描述: Java: class Solution {public String addBinary(String a, String b) {StringBuilder result new StringBuilder();int i a.length()-1;int j b.length()-1;int carry 0; //记录进位信息while(i>0 || j>0 || carry!0){int sum ca…

[Linux#55][网络协议] 序列化与反序列化 | TcpCalculate为例

目录 1. 理解协议 1.1 结构化数据的传输 序列化与反序列化 代码感知: Request 类 1. 构造函数 2. 序列化函数:Serialize() 3. 反序列化函数:DeSerialize() 补充 4. 成员变量 Response 类 1. 构造函数 2. 序列化函数:…

免费下载PDF | 自然语言处理新范式:基于预训练模型的方法

前言 本次给大家推荐阅读的书籍是——《自然语言处理:基于预训练模型的方法》。近些年来,以GPT、BERT为代表的预训练模型在自然语言处理领域掀起了一股浪潮,打开了“预训练精调”的自然语言处理新范式的大门。 由电子工业出版社出版的《自然…

动手学深度学习(pytorch土堆)-06损失函数与反向传播、模型训练、GPU训练

模型保存与读取 完整模型训练套路 import torch import torchvision.datasets from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linear from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriterfrom model impo…