【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 --------------------------------------------------*/

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java算法_ 房子强盗(LeetCode_Hot100)

题目描述&#xff1a;你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表…

【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析

**本人是第六届字节跳动青训营&#xff08;后端组&#xff09;的成员。本文由博主本人整理自该营的日常学习实践&#xff0c;首发于稀土掘金&#xff1a;&#x1f517;Go语言入门指南&#xff1a;基础语法和常用特性解析 | 青训营 本文主要梳理自第六届字节跳动青训营&#xff…

【对于一维信号的匹配】对一个一维(时间)信号y使用自定义基B执行匹配追踪(MP)研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

C++——关于命名空间

写c项目时&#xff0c;大家常用到的一句话就是&#xff1a; using namespace std; 怎么具体解析这句话呢&#xff1f; 命名冲突&#xff1a; 在c语言中&#xff0c;我们有变量的命名规范&#xff0c;如果一个变量名或者函数名和某个库里面自带的库函数或者某个关键字重名&…

python优雅地爬虫

申明&#xff1a;仅用作学习用途&#xff0c;不提供任何的商业价值。 背景 我需要获得新闻&#xff0c;然后tts&#xff0c;在每天上班的路上可以听一下。具体的方案后期我也会做一次分享。先看我喜欢的万能的老路&#xff1a;获得html内容-> python的工具库解析&#xff0…

Multimap用法详解

Multimap Multimap 是 Google 的 Guava 库为 Java 引入的一种新集合类型&#xff0c;它允许将多个值存储在单个键下。它被设计为一种替代 Map<K, List> 或 Map<K, Set>&#xff08;JDK 标准集合框架&#xff09;的方案。 Multimap<K, V> 扩展了 AbstractMul…

0基础学C#笔记09:希尔排序法

文章目录 前言一、希尔排序的思想二、使用步骤总结 前言 希尔排序可以说是插入排序的一种变种。无论是插入排序还是冒泡排序&#xff0c;如果数组的最大值刚好是在第一位&#xff0c;要将它挪到正确的位置就需要 n - 1 次移动。也就是说&#xff0c;原数组的一个元素如果距离它…

LeetCode--HOT100题(26)

目录 题目描述&#xff1a;142. 环形链表 II&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;142. 环形链表 II&#xff08;中等&#xff09; 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返…

Vue--》打造个性化医疗服务的医院预约系统(五)

今天开始使用 vue3 + ts 搭建一个医院预约系统的前台页面,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的GithHub上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关…

stm32项目(8)——基于stm32的智能家居设计

目录 一.功能设计 二.演示视频 三.硬件选择 1.单片机 2.红外遥控 3.红外探测模块 4.光敏电阻模块 5.温湿度检测模块 6.风扇模块 7.舵机 8.WIFI模块 9.LED和蜂鸣器 10.火焰传感器 11.气体传感器 四.程序设计 1.连线方式 2.注意事项 3.主程序代码 五.课题意义…

【Linux】线程的概念以及与进程的区别

目录 背景知识 什么是线程&#xff1f; 进程和线程的区别 线程的优缺点 背景知识 在了解线程前&#xff0c;我们要首先知道&#xff0c;OS是可以做到让进程进行细粒度划分的! 比如我们所说的进程地址空间中的堆区&#xff0c;它在进程PCB中的mm_structz中有一个start和…

re学习(30)攻防世界-hackme(代码复原2)

思路&#xff1a; 1.输出成功&#xff0c;v26不为0,说明关系式&#xff1a;v21((unsigned __int8)v24 ^ v20) →2.在汇编代码第37行&#xff0c;输入v16v20&#xff0c;所以求的值为v20 →3.根据关系式&#xff0c;求的值v20v21^v24 →4.v21在第汇编代码第36行也可以提取出来…

【时间格式引发的事故】

时间格式引发的事故 背景实战演示结论 背景 前不久写了一个删除数据接口&#xff0c;条件是根据时间删除时间后面的数据。入参是 时间字符串。后台的时间格式 是 yyyyMMdd。然后当时前端传参数的时候&#xff0c;随意的传了2023-07-31的时间&#xff0c;然后将该表的数据全部删…

servlet三大类HttpSevlet,HttpServletRequest,HttpServletResponse介绍

一、HttpServlet HttpServlet类是一个被继承的方法&#xff0c;可以看做一个专门用来响应http请求的类&#xff0c;这个类的所有方法都是为响应http请求服务的&#xff0c;要对一个某个路径谁知http响应时&#xff0c;需要写一个类来继承HttpServlet类&#xff0c;并重写里面的…

【深度学习】多粒度、多尺度、多源融合和多模态融合的区别

多粒度&#xff08;multiresolution&#xff09;和多尺度&#xff08;multiscale&#xff09; 多粒度&#xff08;multiresolution&#xff09;和多尺度&#xff08;multiscale&#xff09;都是指在不同的空间或时间尺度上对数据或信号进行分析和处理。其中 多尺度&#xff1…

ABPVNEXT-微服务框架基础入门

准备工作&#xff1a; 1.登录ABPvNext官网 网址 http://abp.io 2.跳转到商业版的说明文档&#xff0c;目前商业版没有中文&#xff0c;只能使用谷歌浏览器的内置翻译功能了 3.框架的相关环境要求&#xff0c;请自自行查看 适用于 Windows 的Visual Studio 2022 (v17.3) /…

战术的勤奋,弥补不了战略的重大缺陷

战术的勤奋&#xff0c;弥补不了战略的大缺陷 战略的懒惰&#xff0c;遍地都是 王兴说过&#xff1a;人为了逃避思考可以干任何事 趣讲大白话&#xff1a;局部优秀&#xff0c;改变不了整体 【趣讲信息科技252期】 **************************** 中小企业顶顶层设计薄弱 这也是…

最后一次模拟考试题解

哦我想这不用看都知道是为了水任务 T1 黑白染色 其实这题有原 什么手写体 md (指 markdown) 分析 首先这题如果你题目没看错的话 ,会发现其实他是 n m n \times m nm 让你求 n n n \times n nn 的区域内的点&#xff08;不会只有我一个人题目看错了罢 然后我们会发现…

使用 prometheus client SDK 暴露指标

目录 1. 使用 prometheus client SDK 暴露指标1.1. How Go exposition works1.2. Adding your own metrics1.3. Other Go client features 2. Golang Application monitoring using Prometheus2.1. Metrics and Labels2.2. Metrics Types2.2.1. Counters:2.2.2. Gauges:2.2.3. …

MySQL中的索引

1.2.MySQL中的索引 InnoDB存储引擎支持以下几种常见的索引&#xff1a;B树索引、全文索引、哈希索引&#xff0c;其中比较关键的是B树索引 1.2.1.B树索引 InnoDB中的索引自然也是按照B树来组织的&#xff0c;前面我们说过B树的叶子节点用来放数据的&#xff0c;但是放什么数…