当前位置: 首页 > news >正文

【STM32】利用CubeMX对FreeRTOS用按键控制任务

对于FreeRTOS中的操作,最常用的就是创建、删除、暂停和恢复任务。

此次实验目标:

1.创建任务一:LED1每间隔1秒闪烁一次,并通过串口打印

2.创建任务二:LED2每间隔0.5秒闪烁一次,并通过串口打印

3.创建任务三:通过KEY1实现对任务一的创建和删除。

按键按下以后如果有任务一就删除任务一,没有任务一就创建任务一。

4. 创建任务四:通过KEY2实现对任务二的暂停和恢复。

按键按下以后如果任务二在执行就暂停任务二,任务二在暂停就恢复任务二。

实现方式:

使用正点原子探索者,主控芯片为STM32F407ZGT6。

一、主要的电气原理图如下:

 

二、CubeMX配置

1.设置FreeRTOS

2.设置usart1

波特率115200

3.设置时钟,选择外部高速时钟

配置时钟树如下

4.注意一定要修改时基

5.生成代码

三、编写代码(都在freertos.c中写)

1.串口重定向

#include <stdio.h>// 包含标准输入输出头文件int fputc(int ch,FILE *f)
{
//采用轮询方式发送1字节数据,超时时间设置为无限等待
HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,HAL_MAX_DELAY);
return ch;
}
int fgetc(FILE *f)
{
uint8_t ch;
// 采用轮询方式接收 1字节数据,超时时间设置为无限等待
HAL_UART_Receive( &huart1,(uint8_t*)&ch,1, HAL_MAX_DELAY );
return ch;
}

2.实现任务的代码

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 *//* 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 LED1 */osThreadDef(LED1, led1, osPriorityNormal, 0, 128);LED1Handle = osThreadCreate(osThread(LED1), NULL);/* definition and creation of LED2 */osThreadDef(LED2, led2, osPriorityIdle, 0, 128);LED2Handle = osThreadCreate(osThread(LED2), NULL);/* definition and creation of KEY1 */osThreadDef(KEY1, key1, osPriorityIdle, 0, 128);KEY1Handle = osThreadCreate(osThread(KEY1), NULL);/* definition and creation of KEY2 */osThreadDef(KEY2, key2, osPriorityIdle, 0, 128);KEY2Handle = osThreadCreate(osThread(KEY2), NULL);/* USER CODE BEGIN RTOS_THREADS *//* add threads, ... *//* USER CODE END RTOS_THREADS */}/* USER CODE BEGIN Header_led1 */
/*** @brief  Function implementing the LED1 thread.* @param  argument: Not used* @retval None*/
/* USER CODE END Header_led1 */
void led1(void const * argument)
{/* USER CODE BEGIN led1 *//* Infinite loop */for(;;){printf("led1\n\r");HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);osDelay(1000);}/* USER CODE END led1 */
}/* USER CODE BEGIN Header_led2 */
/**
* @brief Function implementing the LED2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_led2 */
void led2(void const * argument)
{/* USER CODE BEGIN led2 *//* Infinite loop */for(;;){printf("led2\n\r");HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);osDelay(500);}/* USER CODE END led2 */
}/* USER CODE BEGIN Header_key1 */
/**
* @brief Function implementing the KEY1 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_key1 */
void key1(void const * argument)
{/* USER CODE BEGIN key1 *//* Infinite loop */for(;;){if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)==0){osDelay(20);//防误触if(LED1Handle==NULL){printf("key1==creat\n\r");osThreadDef(LED1, led1, osPriorityNormal, 0, 128);LED1Handle = osThreadCreate(osThread(LED1), (void*)"new task1");}else{vTaskDelete(LED1Handle);LED1Handle=NULL;printf("key1==delete\n\r");}}}/* USER CODE END key1 */
}/* USER CODE BEGIN Header_key2 */
/**
* @brief Function implementing the KEY2 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_key2 */
void key2(void const * argument)
{/* USER CODE BEGIN key2 */char Flag=0;/* Infinite loop */for(;;){if(HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)==0){osDelay(20);//防误触if(Flag==0){printf("key2 suspend\n\r");vTaskSuspend(LED2Handle);Flag=1;}else{vTaskResume(LED2Handle);printf("key2  resume \n\r");Flag=0;}}}/* USER CODE END key2 */
}/* Private application code --------------------------------------------------*/

注意:任务被删除时,句柄不会删除,需要手动清空。

相关文章:

【STM32】利用CubeMX对FreeRTOS用按键控制任务

对于FreeRTOS中的操作&#xff0c;最常用的就是创建、删除、暂停和恢复任务。 此次实验目标&#xff1a; 1.创建任务一&#xff1a;LED1每间隔1秒闪烁一次&#xff0c;并通过串口打印 2.创建任务二&#xff1a;LED2每间隔0.5秒闪烁一次&#xff0c;并通过串口打印 3.创建任…...

c# .net mvc的IHttpHandler奇妙之旅--图片文件请求安全过滤,图片防盗链

源码下载: c# .net mvc图片文件请求安全过滤,图片防盗链 https://download.csdn.net/download/cplvfx/88206428 在阅读该文章前,请先阅读该文章 c# .net mvc的IHttpHandler奇妙之旅。.net的生命周期和管道你听说过吗?你可以利用他处理业务如:跳转业务页面,文件请求的安全…...

STM32F407使用Helix库软解MP3并通过DAC输出,最精简的STM32+SD卡实现MP3播放器

只用STM32单片机SD卡耳机插座&#xff0c;实现播放MP3播放器&#xff01; 看过很多STM32软解MP3的方案&#xff0c;即不通过类似VS1053之类的解码器芯片&#xff0c;直接用STM32和软件库解码MP3文件&#xff0c;通常使用了labmad或者Helix解码库实现&#xff0c;Helix相对labm…...

STM32 CAN 过滤器设置

做个笔记吧 &#xff0c;免得以后忘记了 芯片是stm32F207 &#xff0c;用cubeMX 6.80 版本生成 CAN 的使用总体包含4个部分 第一步&#xff1a;CAN初始化&#xff0c;配置波特率 (cubeMX 里面配置好后自动生成&#xff0c;不需要手动添加) MX_CAN1_Init(); 第二步&#…...

日常BUG—— maven编译报错

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;日常BUG、BUG、问题分析☀️每日 一言 &#xff1a;存在错误说明你在进步&#xff01; 一、问题描述 一个maven项目在由于在代码中书写了如下代码&#xff1a; public static ConcurrentMap<…...

Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理

Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理 目录 Unity 工具 之 Azure 微软SSML语音合成TTS流式获取音频数据的简单整理 一、简单介绍 二、实现原理 三、实现步骤 四、关键代码 一、简单介绍 Unity 工具类&#xff0c;自己整理的一些游戏开发可…...

学习Vue:插值表达式和指令

在 Vue.js 中&#xff0c;Vue 实例与数据绑定是构建动态交互界面的关键。在这篇文章中&#xff0c;我们将重点介绍 Vue 实例中两种实现数据绑定的方式&#xff1a;插值表达式和指令。这些机制允许您将数据无缝地渲染到界面上&#xff0c;实现实时的数据更新和展示。 插值表达式…...

echart 3d立体颜色渐变柱状图

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 1.需求描述 根据业务需求将不同的法律法规&#xff0c;展示不同的3d立体渐变柱状图。 2.先看下效果图 3. 确定三面的颜色&#xff0c;这里我是自定义的颜色 // 右面生成颜色const rightColorArr ref(["#79D…...

linux shell变量

linux shell变量 1、变量命名规则2、只读变量3、删除变量 1、变量命名规则 变量名不能加$命名只能使用英文字母、数字和下划线&#xff0c;首个字母不能以数字开头中间不能有空格。可以有下划线不能使用标点符号不能使用bash中的关键字 username"tom"引用 $userna…...

Linux 发行版 Debian 12.1 发布

在今年 6 月初&#xff0c;Debian 12“bookworm”发布&#xff0c;而日前 Debian 迎来了 12.1 版本&#xff0c;主要修复系统用户创建等多个安全问题。 Debian 是最古老的 GNU / Linux 发行版之一&#xff0c;也是许多其他基于 Linux 的操作系统的基础&#xff0c;包括 Ubuntu…...

【Rust】Rust学习 第七章使用包、Crate和模块管理不断增长的项目

目前为止&#xff0c;我们编写的程序都在一个文件的一个模块中。伴随着项目的增长&#xff0c;你可以通过将代码分解为多个模块和多个文件来组织代码。一个包可以包含多个二进制 crate 项和一个可选的 crate 库。伴随着包的增长&#xff0c;你可以将包中的部分代码提取出来&…...

网站SSL安全证书是什么及其重要性

网站SSL安全证书具体来说是一个数字文件&#xff0c;是由受信任的数字证书颁发机构&#xff08;CA机构&#xff09;进行审核颁发的&#xff0c;其中包含CA发布的信息&#xff0c;该信息表明该网站已使用加密连接进行了安全保护。 网站SSL安全证书也被称为SSL证书、https证书和…...

Android Alarm闹钟API使用心得

前言 有什么办法可以在不打开App的时候&#xff0c;也能够触发一些操作呢&#xff1f;比如说发送通知&#xff0c;解决这个需求的办法有很多种选择&#xff0c;比如说官方推荐的WorkManager API&#xff0c;可以在后台执行一次性、耗时、定时的任务&#xff0c;但WorkManager是…...

什么是业务敏捷,如何实现业务敏捷?

点击链接了解详情 作者介绍 前言 随着越来越多行业的企业开始关注敏捷&#xff0c;业务敏捷&#xff08;Business Agility&#xff09;成为一个新的热点。毕竟大部分的行业和组织与软件无关&#xff0c;但是依然要实现业务上的敏捷&#xff0c;所以这个系列会主要谈两点&#…...

​ATF(TF-A)安全通告 TFV-7 (CVE-2018-3639)​

安全之安全(security)博客目录导读 ATF(TF-A)安全通告汇总 目录 一、ATF(TF-A)安全通告 TFV-7 (CVE-2018-3639) 二、静态缓解&#xff08;Static mitigation&#xff09; 三、动态缓解&#xff08;Dynamic mitigation&#xff09; 一、ATF(TF-A)安全通告 TFV-7 (CVE-2018…...

第三天课程下

1.项目目录介绍和运行流程 工程化开发模式中&#xff1a;这里不再直接编写模板语法&#xff0c;通过 App.vue 提供结构渲染 main.js文件 // 文件核心作用&#xff1a;导入App.vue&#xff0c;基于App.vue创建结构渲染index.html // 1. 导入 Vue 核心包 import Vue from vue// …...

嵌入式编译FFmpeg6.0版本并且组合x264

下载直通车:我用的是6.0版本的 1.准备编译: 2.进入ffmpeg源码目录&#xff0c;修改Makefile&#xff0c;添加编译选项&#xff1a; CFLAGS -fPIC 不加会报错 3.使用命令直接编译 ./configure --cross-prefix/home/xxx/bin/arm-linux-gnueabihf- --enable-cross-compile --targ…...

原子css 和 组件化css如何搭配使用

如果让你来实现下面这种页面&#xff0c;该怎么实现呢 原子化和css组件化方式写法&#xff0c;可以搭配起来使用&#xff0c;常用的css 原子css 比如 下面这些类似flex 布局&#xff0c;lstn curser-pointer 等常用的或者 具备一定规律性的padding margin 样式可以抽取为单独…...

Python 实现Selenium录屏的一种方法(图片整合成动态图)

由于UI层自动化的不稳定性&#xff0c;经常会遇到执行中断或用例失败的问题&#xff0c;以下是一些常见的措施。 1.详细的日志 2.定位出错时截图 3.Pytest的缓存机制(可以记录成功了哪些失败了哪些) 4.自动重试机制(如pytest-rerunfailures) 5.用例录像 用例录像是最直观的一…...

【设计模式——学习笔记】23种设计模式——策略模式Strategy(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入传统方案实现实现分析 介绍基本介绍登场角色 案例实现案例一类图实现 案例二类图实现问答 策略模式在JDK源码中的使用总结文章说明 案例引入 有各种鸭子&#xff0c;比如野鸭、北京鸭、水鸭等。 鸭子有各种行为&#xff0c;比如走路、叫、飞行等。不同鸭子的…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...