STM32---FreeRTOS中断管理试验
一、实验
实验目的:学会使用FreeRTOS的中断管理
创建两个定时器,一个优先级为4,另一个优先级为6;注意:系统所管理的优先级范围 :5~15
现象:两个定时器每1s,打印一段字符串,当关中断时,停止打印,开中断时持续打印。
实验设计:创建两个任务:start_task、task1
2个任务的功能如下:
start_task:用于创建task1任务
task1:中断测试任务,任务中将调到用关中断和开中断函数来体现对中断的管理。
代码:
main.c
#include "stm32f10x.h"
#include "FreeRTOS.h"
#include "task.h"
#include "freertos_demo.h"
#include "Delay.h"
#include "sys.h"
#include "usart.h"
#include "Timer.h"
#include "delay.h"int main(void){	uart_init(9600);Timer_Init();delay_init();// 创建任务FrrrRTOS_Demo(); 	  
}freertos_demo.c
#include "FreeRTOS.h"
#include "task.h"
#include "usart.h"
#include "Timer.h"
#include "delay.h"/******************************************************************任务配置****************************************************/
//任务优先级
#define START_TASK_PRIO					1
//任务堆栈大小	
#define START_TASK_STACK_SIZE 	64  
//任务句柄
TaskHandle_t StartTask_Handler;
//任务函数
void start_task(void *pvParameters);//任务优先级
#define TASK1_PRIO					2
//任务堆栈大小	
#define TASK1_STACK_SIZE 		64  
//任务句柄
TaskHandle_t Task1_Handler;
//任务函数
void task1(void *pvParameters);/******************************************************************任务函数****************************************************/
void FrrrRTOS_Demo(void)
{//创建开始任务xTaskCreate((TaskFunction_t )start_task,            			//任务函数( char*         )"start_task",          			//任务名称(uint16_t       )START_TASK_STACK_SIZE, 			//任务堆栈大小(void*          )NULL,                  			//传递给任务函数的参数(UBaseType_t    )START_TASK_PRIO,       			//任务优先级(TaskHandle_t*  )&StartTask_Handler);   			//任务句柄 // 启动任务调度vTaskStartScheduler();
}void start_task(void *pvParameters)
{taskENTER_CRITICAL();           //进入临界区//创建LED0任务xTaskCreate((TaskFunction_t )task1,     	(const char*    )"task1",   	(uint16_t       )TASK1_STACK_SIZE, (void*          )NULL,				(UBaseType_t    )TASK1_PRIO,	(TaskHandle_t*  )&Task1_Handler); vTaskDelete(StartTask_Handler); //删除开始任务taskEXIT_CRITICAL();            //退出临界区
}// 任务1函数
void task1(void *pvParameters)
{uint8_t task1_num = 0;while(1){if(++task1_num == 5){task1_num = 0;printf("关中断\r\n");portDISABLE_INTERRUPTS();delay_xms(5000);												//不可以使用vTaskDelay()函数:因为此函数会在内部开启中断引起任务切换printf("开中断\r\n");portENABLE_INTERRUPTS();}vTaskDelay(1000);}
}Timer.c
#include "stm32f10x.h"                  // Device header
#include "usart.h"void Timer_Init(void)
{//RCC打开时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//选择时基单元的时钟,内部时钟一般默认初始化可以写可以不写TIM_InternalClockConfig(TIM2);TIM_InternalClockConfig(TIM3);//配置时基单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//TIM_CKD_DIV1代表1分屏TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//代表向上计数TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInitStructure.TIM_Period = 10000 - 1;//72MHZ分频7200,就是10k,10k计10000个数就是1sTIM_TimeBaseInitStructure.TIM_Prescaler = 7200 - 1;//高级定时器才有,现在是通用定时器给0TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure);//如果不加入这一句,会导致复位之后从1开始计数TIM_ClearFlag(TIM2, TIM_FLAG_Update);TIM_ClearFlag(TIM3, TIM_FLAG_Update);//TIM_IT_Update代表更新中断,中断控制,用来控制某个中断能不能通往NIVCTIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 15;									//新版RTOS可管理的NVIC中断:11~15NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_Init(&NVIC_InitStructure);//启动定时器TIM_Cmd(TIM2, ENABLE);TIM_Cmd(TIM3, ENABLE);
}void TIM2_IRQHandler(void)
{if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET){printf("优先级4\r\n");TIM_ClearITPendingBit(TIM2, TIM_IT_Update);}
}void TIM3_IRQHandler(void)
{if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET){printf("优先级15\r\n");TIM_ClearITPendingBit(TIM3, TIM_IT_Update);}
}二、实验现象

三、重点

开中断和关中断函数:
portDISABLE_INTERRUPTS();                    //关中断
portENABLE_INTERRUPTS();                     //开中断      关中断之后不能使用vTaskDelay()函数,此函数中会打开中断。(Delay函数不能使用的可以找找我的文章,有专门修改后适用于FreeRTOS操作系统的延迟函数)

FreeRTOS可管理的中断优先级,版本不一样,可管理的优先级就不一样;
是由FreeRTOSConfig.h文件里面的宏决定:
#define configKERNEL_INTERRUPT_PRIORITY 255 // 内核中断优先级(最低优先级)
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191// 允许调用 FreeRTOS API 的最高中断优先级(优先级 11)
//可管理的中断优先级:11 到 15

适用于STM32F103C8T6项目带注释完整的FreeRTOSConfig.h文件:
/** FreeRTOS V202212.01* Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  All Rights Reserved.** Permission is hereby granted, free of charge, to any person obtaining a copy of* this software and associated documentation files (the "Software"), to deal in* the Software without restriction, including without limitation the rights to* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of* the Software, and to permit persons to whom the Software is furnished to do so,* subject to the following conditions:** The above copyright notice and this permission notice shall be included in all* copies or substantial portions of the Software.** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.** https://www.FreeRTOS.org* https://github.com/FreeRTOS**/#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H// 如果需要支持操作系统,可以取消注释以下宏定义
//#define SYSTEM_SUPPORT_OS 1/*-----------------------------------------------------------* 应用程序特定的定义。** 这些定义应根据您的硬件和应用程序需求进行调整。** 这些参数在 FreeRTOS API 文档的“配置”部分中有详细描述,* 文档可在 FreeRTOS.org 网站上找到。** 参见 http://www.freertos.org/a00110.html*----------------------------------------------------------*/// 将 FreeRTOS 的中断处理函数映射到 CMSIS 标准的中断处理函数
#define xPortPendSVHandler               PendSV_Handler  // PendSV 中断处理函数
//#define xPortSysTickHandler              SysTick_Handler // SysTick 中断处理函数(注释掉,使用自定义的 SysTick_Handler)
#define vPortSVCHandler                  SVC_Handler     // SVC 中断处理函数// 启用获取当前任务句柄的 API
#define INCLUDE_xTaskGetCurrentTaskHandle 1/*-------------------------------- FreeRTOS 内核配置 --------------------------------*/
#define configUSE_PREEMPTION            1  // 启用抢占式调度
#define configUSE_IDLE_HOOK             0  // 禁用空闲任务钩子函数
#define configUSE_TICK_HOOK             0  // 禁用时钟节拍钩子函数
#define configCPU_CLOCK_HZ              ( ( unsigned long ) 72000000 )  // CPU 时钟频率,72MHz
#define configTICK_RATE_HZ              ( ( TickType_t ) 1000 )         // 系统节拍频率,1000Hz(1ms 一个节拍)
#define configMAX_PRIORITIES            ( 5 )                           // 最大任务优先级数
#define configMINIMAL_STACK_SIZE        ( ( unsigned short ) 128 )      // 空闲任务的最小堆栈大小
#define configTOTAL_HEAP_SIZE           ( ( size_t ) ( 17 * 1024 ) )    // 系统堆的总大小,17KB
#define configMAX_TASK_NAME_LEN         ( 16 )                          // 任务名称的最大长度
#define configUSE_TRACE_FACILITY        0  // 禁用可视化跟踪调试功能
#define configUSE_16_BIT_TICKS          0  // 使用 32 位 Tick 计数器
#define configIDLE_SHOULD_YIELD         1  // 空闲任务在有同等优先级的用户任务时主动让出 CPU/*-------------------------------- FreeRTOS API 包含配置 --------------------------------*/
// 以下宏定义用于控制是否包含特定的 FreeRTOS API 函数
#define INCLUDE_vTaskPrioritySet        1  // 包含任务优先级设置函数
#define INCLUDE_uxTaskPriorityGet       1  // 包含获取任务优先级函数
#define INCLUDE_vTaskDelete             1  // 包含任务删除函数
#define INCLUDE_vTaskCleanUpResources   0  // 不包含任务资源清理函数
#define INCLUDE_vTaskSuspend            1  // 包含任务挂起函数
#define INCLUDE_vTaskDelayUntil         1  // 包含绝对延时函数
#define INCLUDE_vTaskDelay              1  // 包含相对延时函数
#define INCLUDE_vTaskResumeFromISR      1  // 包含从中断恢复任务函数
#define INCLUDE_xTaskGetSchedulerState  1  // 包含获取调度器状态函数/*-------------------------------- 中断优先级配置 --------------------------------*/
/*-------------------------------- 可管理的中断优先级:11 到 15(对应 NVIC 优先级 191 到 255) --------------------------------*/// Cortex-M3/M4 的 NVIC 中断优先级配置
#define configKERNEL_INTERRUPT_PRIORITY 255  // 内核中断优先级(最低优先级)
// configMAX_SYSCALL_INTERRUPT_PRIORITY 不能设置为 0
// 参见 http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191  // 允许调用 FreeRTOS API 的最高中断优先级(优先级 11)// STM32 库使用的中断优先级范围是 0-15,15 对应最低优先级 255
#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY 15  // 内核中断优先级(最低优先级)#endif /* FREERTOS_CONFIG_H */相关文章:
 
STM32---FreeRTOS中断管理试验
一、实验 实验目的:学会使用FreeRTOS的中断管理 创建两个定时器,一个优先级为4,另一个优先级为6;注意:系统所管理的优先级范围 :5~15 现象:两个定时器每1s,打印一段字符串&#x…...
 
深色系B端系统界面,在何种场景下更加适合?
在数字化办公日益普及的当下,B 端系统已成为企业运营管理不可或缺的工具。B 端系统界面设计的优劣,直接影响着用户体验和工作效率。界面不仅仅是人与系统交互的媒介,更是企业业务流程的可视化呈现。随着设计理念和技术的不断发展,…...
如何使用 Python+Flask+win32print 实现简易网络打印服务1
Python 实现网络打印机:Flask win32print 在工作场景中,我们可能需要一个简单的网页接口,供他人上传文档并自动打印到指定打印机。 本文将演示如何使用 Python Flask win32print 库来实现这一需求。 代码详见:https://github.…...
 
深度学习DNN实战
导包: import matplotlib as mpl import matplotlib.pyplot as plt %matplotlib inline import numpy as np import sklearn import pandas as pd import os import sys import time from tqdm.auto import tqdm import torch import torch.nn as nn import torch…...
 
课程3. 分批训练与数据规范、标准化
课程3. 分批训练与数据规范、标准化 理论神经网络的梯度优化反向传播算法 批量训练网络输入的规范化BatchNorm 验证样本实践加载数据集网络构建训练神经网络 课程计划: 1.理论: 批量训练; 输入数据的规范化; 批量标准化ÿ…...
《机器学习数学基础》补充资料:过渡矩阵和坐标变换推导
尽管《机器学习数学基础》这本书,耗费了比较长的时间和精力,怎奈学识有限,错误难免。因此,除了在专门的网页( 勘误和修订 )中发布勘误和修订内容之外,对于重大错误,我还会以专题的形…...
linux指令学习--sudo apt-get install vim
1. 命令分解 部分含义sudo以管理员权限运行命令(需要输入用户密码)。apt-getUbuntu 的包管理工具,用于安装、更新、卸载软件包。installapt-get 的子命令,表示安装软件包。vim要安装的软件包名称(Vim 文本编辑器&…...
 
类和对象—多态—案例2—制作饮品
案例描述: 制作饮品的大致流程为:煮水-冲泡-倒入杯中-加入辅料 利用多态技术实现本案例,提供抽象制作产品基类,提供子类制作咖啡和茶叶 思路解析: 1. 定义抽象基类 - 创建 AbstractDrinking 抽象类,该类…...
 
嵌入式产品级-超小尺寸游戏机(从0到1 硬件-软件-外壳)
Ultra-small size gaming console。 超小尺寸游戏机-Pico This embedded product is mainly based on miniaturization, followed by his game functions are also very complete, for all kinds of games can be played, and there will be relevant illustrations in the fo…...
 
计算机毕业设计Python+Django+Vue3微博数据舆情分析平台 微博用户画像系统 微博舆情可视化(源码+ 文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
 
前端开发10大框架深度解析
摘要 在现代前端开发中,框架的选择对项目的成功至关重要。本文旨在为开发者提供一份全面的前端框架指南,涵盖 React、Vue.js、Angular、Svelte、Ember.js、Preact、Backbone.js、Next.js、Nuxt.js 和 Gatsby。我们将从 简介、优缺点、适用场景 以及 实际…...
 
Mybatis 的关联映射(一对一,一对多,多对多)
前言 在前面我们已经了解了,mybatis 的基本用法,动态SQL,学会使用mybatis 来操作数据库。但这些主要操作还是针对 单表实现的。在实际的开发中,对数据库的操作,常常涉及多张表。 因此本篇博客的目标:通过my…...
 
深度解码!清华大学第六弹《AIGC发展研究3.0版》
在Grok3与GPT-4.5相继发布之际,《AIGC发展研究3.0版》的重磅报告——这份长达200页的行业圣经,不仅预测了2025年AI技术爆发点,更将「天人合一」的东方智慧融入AI伦理建构,堪称数字时代的《道德经》。 文档:清华大学第…...
/dev/console文件详解
/dev/console概览 /dev/console 是 Linux 系统中的一个特殊设备文件,通常用于与系统的控制台进行交互。它的作用和特点如下: 1. 作用 init 进程(PID 1)和某些系统服务在启动时会使用 /dev/console 进行日志输出,以确…...
 
ProfibusDP主站转ModbusTCP网关如何进行数据互换
ProfibusDP主站转ModbusTCP网关如何进行数据互换 在现代工业自动化领域,通信协议的多样性和复杂性不断增加。Profibus DP作为一种经典的现场总线标准,广泛应用于工业控制网络中;而Modbus TCP作为基于以太网的通信协议,因其简单易…...
springboot3 WebClient
1 介绍 在 Spring 5 之前,如果我们想要调用其他系统提供的 HTTP 服务,通常可以使用 Spring 提供的 RestTemplate 来访问,不过由于 RestTemplate 是 Spring 3 中引入的同步阻塞式 HTTP 客户端,因此存在一定性能瓶颈。根据 Spring 官…...
 
牛客周赛 Round 83
A.和猫猫一起起舞! 思路:遇到‘U’和‘D’,输出‘R’或者‘L’;遇到‘R’和‘L’,输出‘U’或者‘D’.(这题比较简单) AC代码: void solve() {int n, m, k;char ch;cin >> ch;if (ch U || ch D)…...
 
硬通货用Deekseek做一个Vue.js组件开发的教程
安装 Node.js 与 Vue CLI npm install -g vue/cli vue create my-vue-project cd my-vue-project npm run serve 通过 Vue CLI 可快速生成项目骨架,默认配置适合新手快速上手 目录结构 src/ ├── components/ # 存放组件文件 │ └── …...
 
Windows权限维持之利用安全描述符隐藏服务后门进行权限维持(八)
我们先打开cs的服务端 然后我们打开客户端 我们点击连接 然后弹出这个界面 然后我们新建一个监听器 然后我们生成一个beacon 然后把这个复制到目标主机 然后我们双击 运行 然后cs这边就上线了 然后我们把进程结束掉 然后我们再把他删除掉 然后我们创建服务 将后门程序注册…...
 
Ubuntu20.04双系统安装及软件安装(七):Anaconda3
Ubuntu20.04双系统安装及软件安装(七):Anaconda3 打开Anaconda官网,在右侧处填写邮箱(要真实有效!),然后Submit。会出现如图示的Success界面。 进入填写的邮箱,有一封Ana…...
 
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
 
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
 
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
 
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
