【STM32】STM32CubeMX使用FreeRTOS教程1----定时器学习

article/2025/4/27 2:13:29

【STM32】STM32CubeMX使用FreeRTOS教程1----定时器学习

前言

本教程将对应外设原理,HAL库、STM32CubeMX和FreeRTOS结合在一起讲解,分析学习过程中遇到的问题和一些注意事项。

知识概括:

SMT32定时器原理
STM32CubeMX创建定时器例程
HAL库TIM定时器函数库
定时器中断的创建与使用
FreeRTOS中断级临界代码段理解

定时器简介

SMT32F1系列共有8个定时器:

高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5);基本定时器(TIM6、TIM7)。

SMT32F4系列共有15个定时器:

高级定时器(TIM1、TIM8);通用定时器(TIM2、TIM3、TIM4、TIM5、TIM9~TIM14);基本定时器(TIM6、TIM7)。

基本定时器功能(TIM6、TIM7):

1. 16位向上、向下、向上/下自动装载计数器
2. 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值
3. 触发DAC的同步电路 注:此项是TIM6/7独有功能.
4. 位于APB1总线上
**

通用定时器(TIM2~TIM5)的主要功能:

  1. 16位向上、向下、向上/下自动装载计数器

  2. 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65535之间的任意数值

  3. 4 个独立通道(TIMx_CH1~4)可以用作:
    测量输入信号的脉冲长度( 输入捕获)
    输出比较
    单脉冲模式输出
    PWM输出(边缘或中间对齐模式)

  4. 支持针对定位的增量(正交)编码器和霍尔传感器电路

  5. 如下事件发生时产生中断/DMA:
    更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
    触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
    输入捕获
    输出比较

  6. 位于APB1总线上

CubeMX创建freertos工程

CubeMX工程中我选的芯片为STM32F103C8T6

1、设置RCC

设置高速外部时钟HSE 选择外部时钟源
在这里插入图片描述

2、设置时钟

选择外部时钟为8MHz,在HCLK中直接输入72,CubeMX会自动配置好。
在这里插入图片描述
设置时钟后,需要选择系统时钟来源,当使用了FreeRtos的时候,强烈建议HAL库使用除了Systick以外的时钟源。也就是说当不使用FreeRtos的时候,HAL使用的是systick作为时钟源,现在使用了rtos,不建议hal库和rtos一起使用systick作为时钟源。在这里我选择了TIM1作为HAL库时钟。
在这里插入图片描述

3、设置定时器

定时器选择内部时钟
Prtscaler (定时器分频系数) : 7199
Counter Mode(计数模式) Up(向上计数模式)
Counter Period(自动重装载值) : 4999
CKD(时钟分频因子) : No Division 不分频
auto-reload-preload(自动重装载) : Enable 使能

在这里定时器溢出时间公式,根据公式溢出时间为500ms
在这里插入图片描述

在NVIC Settings中使能定时器中断
在这里插入图片描述

4、配置freeRTOS

在Middleware中选中FREERTOS

根据自己需要裁剪freertos,我一般选中系统默认配置。
在这里插入图片描述

编写定时器中断代码

在这里使用了两个定时器,定时器3每1s触发一次,优先级为4(优先级分组4),定时器4每0.5s触发一次,优先级为5,在FreeRTOS中优先级低于configMAX_SYSCALL_INTERRUPT_PRIORITY优先级的中断在临界代码段开启时会被屏蔽(这里优先级越高,数字越低)。如果使用FreeRTOS默认配置的话configMAX_SYSCALL_INTERRUPT_PRIORITY为5。在任务中会开启临界代码段观察定时器情况。

任务代码

在这里使用的HAL_Delay(5000);会用到TIM定时器1,他的优先级等于0,优先级最高!

void StartDefaultTask(void *argument)
{/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */for(;;){printf("close\r\n");portDISABLE_INTERRUPTS();HAL_Delay(5000);printf("open\r\n");portENABLE_INTERRUPTS();osDelay(2000);}/* USER CODE END StartDefaultTask */
}

定时器回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{/* USER CODE BEGIN Callback 0 *//* USER CODE END Callback 0 */if (htim->Instance == TIM1) {HAL_IncTick();}/* USER CODE BEGIN Callback 1 */if (htim->Instance == TIM3){printf("time3\r\n");}if (htim->Instance == TIM4){printf("time4\r\n");}/* USER CODE END Callback 1 */
}

定时器相关函数讲解:

  /* USER CODE BEGIN 2 *//*使能定时器3、4中断*/HAL_TIM_Base_Start_IT(&htim3);HAL_TIM_Base_Start_IT(&htim4);/* USER CODE END 2 */

打开定时器

HAL_TIM_IRQHandler(&htim2);

定时器中断处理函数在stm32f1xx_it.c中 ,定时器中断服务函数中这个函数的具体作用是判断中断是否正常,然后判断产生的是哪一类定时器中断(溢出中断/PWM中断…),然后进入相应的中断回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

在HAL库中,每进行完一个中断,并不会立刻退出,而是会进入到中断回调函数中,这里我们是使用定时器溢出中断回调函数
void TIM3_IRQHandler(void) 首先进入中断函数HAL_TIM_IRQHandler(&htim2);之后进入定时器中断处理函数判断产生的是哪一类定时器中断(溢出中断/PWM中断…) 和定时器通道void HAL_TIM_PeriodElapsedCallback(&htim2); 进入相对应中断回调函数(此处为溢出中断)
在中断回调函数中添加用户代码你也可以在在stm32f1xx_it.c中找到中断回调函数

__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)   

现象

在开启临界保护时,优先级低于configMAX_SYSCALL_INTERRUPT_PRIORITY的中断不会被触发,而time3定时器为4,所有可以一直触发。当关闭临界保护后,time4中断才能被触发。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/usFad0ZD.shtml

相关文章

[FreeRTOS系列教程]学习FreeRTOS前的准备工作-----初学者必看

转自:http://bbs.armfly.com/read.php?tid1552 转载说明:本文仅为转载,下面有几位同学询问对应的教程,教程请参考下面的链接,是以帖子的形式分章节说明。 http://bbs.armfly.com/thread.php?fid14&type29&…

FreeRTOS基本教程零:STM32 FReeRTOS 移植流程

一、资料准备 FreeRTOS源码下载地址: https://github.com/FreeRTOS/FreeRTOShttps://github.com/FreeRTOS/FreeRTOS我移植的是FreeRTOSv9.0.0 stm32裸机程序: 二、FreeRTOS目录 一共有三个文件夹 其中Demo文件夹中是FreeRTOS的例程,Licen…

基于STM32的实时操作系统FreeRTOS移植教程(手动移植)

前言:此文为笔者FreeRTOS专栏下的第一篇基础性教学文章,其主要目的为:帮助读者朋友快速搭建出属于自己的公版FreeRTOS系统,实现后续在实时操作系统FreeRTOS上的开发与运用。操作系统的学习与运用可以说是每位嵌入式开发工程师必须…

STM32F103--移植FreeRTOS完整教程

最近按照正点原子教程开始学习FreeRTOS,发现其手册的移植教程中有些地方可能不是那么详细,在此基于正点原子做一期最完整的FreeRTOS移植教程给大家。 小b将本次教程整理的资料放在网盘,以下链接供各位小伙伴下载和学习: 链接&…

FreeRTOS 正点原子教程学习笔记

正点原子视频教程 FreeRTOS(教程非常详细) 小知识 如果创建了任务却完全空着,没有while(1){延时}的话,整个程序会卡住,其他正常的任务无法运行。如果任务里单单有赋值之类的操作也会卡死在这个任务&#…

FreeRTOS入门教程(堆和栈)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、FreeRTOS操作系统介绍二、堆1.概念介绍2.简单实现 三、栈总结 前言 本篇文章正式学习FreeRTOS操作系统,我打算编写一系列文章带大家轻松快速入…

FreeRTOS移植到STM32

一、找一个STM32的裸机工程模板 我们以STM32F103裸机程序为例 随便找的一个裸机程序 二、去官网上下载FreeRTOS V9.0.0 源码 在移植之前,我们首先要获取到 FreeRTOS 的官方的源码包。这里我们提供两个下载 链 接 , 一 个 是 官 网 : http:…

韦东山freeRTOS系列教程之【第一章】FreeRTOS概述与体验

文章目录 教程目录1.1 FreeRTOS目录结构1.1 FreeRTOS目录结构1.2 核心文件1.3 移植时涉及的文件1.4 头文件相关1.4.1 头文件目录1.4.2 头文件 1.5 内存管理1.6 Demo1.7 数据类型和编程规范1.7.1 数据类型1.7.2 变量名1.7.3 函数名1.7.4 宏的名 1.8 安装Keil1.8.1 下载Keil1.8.2…

freeRTOS中文实用教程1

资料转载出处 https://www.cnblogs.com/smartjourneys/p/7073450.html 1.前言 FreeRTOS是小型多任务嵌入式操作系统,硬实时性。本章主要讲述任务相关特性及调度相关的知识。 任务的总体特点 任务的状态 (1)任务有两个状态,运行态…

FreeRTOS入门

目录 一、简介 二、堆的概念 三、栈的概念 四、从官方源码中精简出第一个FreeRTOS程序 五、修改官方源码增加串口打印 一、简介 FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、…

freeRTOS系列教程之【第一章】FreeRTOS概述与体验

文章目录 教程目录1.1 FreeRTOS目录结构1.1 FreeRTOS目录结构1.2 核心文件1.3 移植时涉及的文件1.4 头文件相关 1.4.1 头文件目录1.4.2 头文件 1.5 内存管理1.6 Demo1.7 数据类型和编程规范 1.7.1 数据类型1.7.2 变量名1.7.3 函数名1.7.4 宏的名 1.8 安装Keil 1.8.1 下载Keil1.…

【机器学习】3-4-2 流行学习

#3-4-2流行学习 import mglearn import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.datasets import load_breast_cancer from sklearn.datasets import make_moons from sklearn.datasets import make_blobs from sklearn.datasets impor…

【机器学习】(十八)用t-SNE进行流行学习:手写数字分类

PCA是用于变换数据的首选方法,也可以进行可视化,但它的性质(先旋转然后减少方向)限制了有效性。 流行学习算法:是一类用于可视化的算法,它允许进行更复杂的映射,通常也可以给出更好的可视化。t-…

用Python实现流行机器学习算法

对于此库的Octave/MatLab版本,请检查machine-learning-octave项目。 该库包含在Python中实现的流行机器学习算法的示例,其中包含数学背后的解释。 每个算法都有交互式Jupyter Notebook演示,允许您使用训练数据,算法配置&#xff0…

【流行学习】局部线性嵌入(Locally Linear Embedding)

一、前言 局部线性嵌入(LLE)假设数据在较小的局部是线性的,也就是说,某一个样本可以由它最近邻的几个样本线性表示,离样本远的样本对局部的线性关系没有影响,因此相比等距映射算法,降维的时间复…

流行-Manifold学习理解与应用

流行-Manifold【1】 流形,也就是 Manifold 。 1. 比较好的形象理解 流形学习的观点是认为,我们所能观察到的数据实际上是由一个低维流形映射到高维空间上的,即这些数据所在的空间是“嵌入在高维空间的低维流形。”。由于数据内部特征的限制&a…

【流行学习】拉普拉斯映射(Laplacian Eigenmaps)

一、前言 拉普拉斯特征映射是一种基于图的降维算法,它希望在原空间中相互间有相似关系的点,在降维后的空间中尽可能的靠近,从而在降维后仍能保持原有的数据结构信息。 二、主要步骤 拉普拉斯特征映射通过构建邻接矩阵为 W W W(…

7个流行的强化学习算法及代码实现

目前流行的强化学习算法包括 Q-learning、SARSA、DDPG、A2C、PPO、DQN 和 TRPO。 这些算法已被用于在游戏、机器人和决策制定等各种应用中,并且这些流行的算法还在不断发展和改进,本文我们将对其做一个简单的介绍。 1、Q-learning Q-learning&#xff1…

流行学习,比较好的一篇博客

转载自:https://blog.csdn.net/sinat_32043495/article/details/78997758 嵌入在高维空间的低维流形 流形:局部具有欧几里得空间性质的空间 1.较好的描述转载 作者:暮暮迷了路 链接:https://www.zhihu.com/question/2401548…

深度学习—近年来流行的卷积神经网络(一)

近年来流行的卷积神经网络 1. 回顾与目标2. 近年来流行的卷积神经网络2.1 VGGNet2.1.1 感受野的概念2.1.2 感受野的计算 2.2 GooleNet2.3 ResNet 3. 结尾参考资料 1. 回顾与目标 前面几讲,我们以LeNet和AlexNet为例,详细讲解了卷积神经网络的结构。从20…