【嵌入式系统】STM32配置FreeRTOS以及利用多线程完成流水灯、按键、蜂鸣器、数码管工作

目录

  • 1、利用STM32CubeMX配置FreeRTOS
  • 2、完成流水灯、按键、蜂鸣器数码管工作
    • 1、在gpio.c和.h文件里面书写并声明按键扫描和led、数码管子程序
    • 2、在freertos.c文件里面设置全局变量并且在各自任务中载入程序
  • 3、关于FreeRTOS的注意事项

1、利用STM32CubeMX配置FreeRTOS

假设我们之前的配置引脚、配置定时器、配置时钟的步骤均已完成,现在开始导入FreeRTOS。
在这里插入图片描述
接下来为我们的程序配置四个任务,注意这里我们的三个任务的优先级是一样的。如果你设置了某一个任务的优先级高,那么程序运行时会一直运行那个任务而无法进入其他任务。
数码管的优先级设高,不然数码管的扫描如果受键码的解析的拖延会产生闪烁!(可以试着把优先级改为low,然后你就会发现按键按下的时候数码管会闪烁。)这个道理和中断优先级是一样的。具体可以看这篇文章:
关于优先级的一点问题思考
这里的function名字最好也修改成和task名字相对应,我这边是当时上课没注意。。。

图1 ledtask设置
图2 keytask设置
图3 蜂鸣器task设置
图4 数码管task设置

最后导出文件即可。

2、完成流水灯、按键、蜂鸣器数码管工作

1、在gpio.c和.h文件里面书写并声明按键扫描和led、数码管子程序

void SetLeds(uint8_t sta)
{HAL_GPIO_WritePin(L1_GPIO_Port,L1_Pin,(sta & 0x01) ? GPIO_PIN_RESET:GPIO_PIN_SET);HAL_GPIO_WritePin(L2_GPIO_Port,L2_Pin,(sta & 0x02) ? GPIO_PIN_RESET:GPIO_PIN_SET);HAL_GPIO_WritePin(L3_GPIO_Port,L3_Pin,(sta & 0x04) ? GPIO_PIN_RESET:GPIO_PIN_SET);HAL_GPIO_WritePin(L4_GPIO_Port,L4_Pin,(sta & 0x08) ? GPIO_PIN_RESET:GPIO_PIN_SET);HAL_GPIO_WritePin(L5_GPIO_Port,L5_Pin,(sta & 0x10) ? GPIO_PIN_RESET:GPIO_PIN_SET);HAL_GPIO_WritePin(L6_GPIO_Port,L6_Pin,(sta & 0x20) ? GPIO_PIN_RESET:GPIO_PIN_SET);HAL_GPIO_WritePin(L7_GPIO_Port,L7_Pin,(sta & 0x40) ? GPIO_PIN_RESET:GPIO_PIN_SET);HAL_GPIO_WritePin(L8_GPIO_Port,L8_Pin,(sta & 0x80) ? GPIO_PIN_RESET:GPIO_PIN_SET);
}uint8_t KeyScan()
{uint8_t key = 0;if(HAL_GPIO_ReadPin(SW5_GPIO_Port,SW5_Pin) == GPIO_PIN_SET){key = 5;HAL_Delay(50);if(HAL_GPIO_ReadPin(SW5_GPIO_Port,SW5_Pin) == GPIO_PIN_SET)return key;elsereturn 0;}if(HAL_GPIO_ReadPin(SW6_GPIO_Port,SW6_Pin) == GPIO_PIN_SET){key = 6;HAL_Delay(50);if(HAL_GPIO_ReadPin(SW6_GPIO_Port,SW6_Pin) == GPIO_PIN_SET)return key;elsereturn 0;}if(HAL_GPIO_ReadPin(SW1_GPIO_Port,SW1_Pin) == GPIO_PIN_RESET){key = 1;HAL_Delay(50);if(HAL_GPIO_ReadPin(SW1_GPIO_Port,SW1_Pin) == GPIO_PIN_RESET)return key;elsereturn 0;}if(HAL_GPIO_ReadPin(SW2_GPIO_Port,SW2_Pin) == GPIO_PIN_RESET){key = 2;HAL_Delay(50);if(HAL_GPIO_ReadPin(SW2_GPIO_Port,SW2_Pin) == GPIO_PIN_RESET)return key;elsereturn 0;}if(HAL_GPIO_ReadPin(SW3_GPIO_Port,SW3_Pin) == GPIO_PIN_RESET){key = 3;HAL_Delay(50);if(HAL_GPIO_ReadPin(SW3_GPIO_Port,SW3_Pin) == GPIO_PIN_RESET)return key;elsereturn 0;}if(HAL_GPIO_ReadPin(SW4_GPIO_Port,SW4_Pin) == GPIO_PIN_RESET){key = 4;HAL_Delay(50);if(HAL_GPIO_ReadPin(SW4_GPIO_Port,SW4_Pin) == GPIO_PIN_RESET)return key;elsereturn 0;}return 0;
}
void Write595(uint8_t sel,uint8_t num,uint8_t bdot)	//共阴数码管 '0'~'7' , '8'~'F'
{static const uint8_t TAB[16] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};//71HC138输出高电平,关掉数码管显示HAL_GPIO_WritePin(A3_GPIO_Port,A3_Pin,GPIO_PIN_RESET);uint8_t dat = TAB[num & 0x0F] |(bdot?0x80:0x00);	//74HC595锁存8段数据for(uint8_t i=0;i<8;++i){HAL_GPIO_WritePin(SCK_GPIO_Port,SCK_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(SER_GPIO_Port,SER_Pin,(dat & 0x80)? GPIO_PIN_SET:GPIO_PIN_RESET);dat<<=1;HAL_GPIO_WritePin(SCK_GPIO_Port,SCK_Pin,GPIO_PIN_SET);}HAL_GPIO_WritePin(DISLK_GPIO_Port,DISLK_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(DISLK_GPIO_Port,DISLK_Pin,GPIO_PIN_SET);//74HC138译码,sel(0~3)对应4位片选信号输出HAL_GPIO_WritePin(A0_GPIO_Port,A0_Pin,(sel & 0x01) ? GPIO_PIN_SET:GPIO_PIN_RESET);HAL_GPIO_WritePin(A1_GPIO_Port,A1_Pin,(sel & 0x02) ? GPIO_PIN_SET:GPIO_PIN_RESET);HAL_GPIO_WritePin(A2_GPIO_Port,A2_Pin,GPIO_PIN_RESET);HAL_GPIO_WritePin(A3_GPIO_Port,A3_Pin,GPIO_PIN_SET);
}

2、在freertos.c文件里面设置全局变量并且在各自任务中载入程序

1、定义全局变量
在这里插入图片描述
2、四个任务依次对应着我们当初配置
在这里插入图片描述

1、流水灯任务

void StartDefaultTask(void *argument)
{/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */for(;;){SetLeds(sta);osDelay(interval);if(run){if(sta < 0x80) sta<<=1;else sta = 0x01;}osDelay(100);}/* USER CODE END StartDefaultTask */
}

2、按键任务

void StartTask02(void *argument)
{/* USER CODE BEGIN StartTask02 *//* Infinite loop */for(;;){key=KeyScan();if(key!=0) seg[0]=key;if(key == 1)	//start{run = 1;}if(key == 2){run = 0;}if(key == 3)	//speed up{interval/=2;if(interval <= 100) interval=100;}if(key == 4)	//speed down{interval*=2;if(interval >= 2000) interval=2000;}osDelay(100);}/* USER CODE END StartTask02 */
}

3、蜂鸣器任务

void StartTask03(void *argument)
{/* USER CODE BEGIN StartTask03 *//* Infinite loop */for(;;){beep_duty = key*100;TIM3->CCR1 = beep_duty;osDelay(100);}/* USER CODE END StartTask03 */
}

4、数码管任务

void StartTaskSEG(void *argument)
{/* USER CODE BEGIN StartTaskSEG *//* Infinite loop */for(;;){for(uint8_t i =0;i<4;i++){Write595(i,seg[i],0);osDelay(5);}osDelay(1);}/* USER CODE END StartTaskSEG */
}

3、关于FreeRTOS的注意事项

注意点:

1、每个任务函数中都要有延时delay
2、osdelay使当前任务挂起,当延时结束,又唤醒当前任务,相当于释放了cpu。
而HALdelay在延时中还是会占用cpu资源的。
3、时间戳可以在不使用delay的情况下得到当前时间
4、os函数都需要在任务函数中调用

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

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

相关文章

学好Java开发的关键七步

在学习编程的过程中&#xff0c;我觉得不止要获得课本的知识&#xff0c;更多的是通过学习技术知识提高解决问题的能力&#xff0c;这样我们才能走在最前方&#xff0c;本文主要讲述如何学好Java开发的关键七步&#xff0c;更多Java专业知识&#xff0c;广州疯狂Java培训为你讲…

css模糊_如何使用CSS模糊图像?

css模糊Introduction: 介绍&#xff1a; Sometimes even the professional developers tend to forget the various basic properties which can be applied to solve very simple problems, therefore the fundamentals of developing a website or web page should be very …

七、决策树算法和集成算法

一、决策树算法 Ⅰ&#xff0c;树模型 决策树&#xff1a;从根节点开始一步步走到叶子节点&#xff08;决策&#xff09; 所有的数据最终都会落到叶子节点&#xff0c;既可以做分类也可以做回归 对于分类&#xff1a;是由众数决定的&#xff0c;例如爷爷奶奶妈妈都是负数&…

leetcode 538. 把二叉搜索树转换为累加树 思考分析

题目 给出二叉 搜索 树的根节点&#xff0c;该树的节点值各不相同&#xff0c;请你将其转换为累加树&#xff08;Greater Sum Tree&#xff09;&#xff0c;使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下&#xff0c;二叉搜索树满足下列约束条件&…

SQL中GROUP BY语句与HAVING语句的使用

最近在学习SQL Server相关知识&#xff0c;一直不知道怎么使用GROUP BY语句&#xff0c;经过研究和练习&#xff0c;终于明白如何使用了&#xff0c;在此记录一下同时添加了一个自己举的小例子&#xff0c;通过写这篇文章来加深下自己学习的效果&#xff0c;还能和大家分享下&a…

scala语言示例_var关键字与Scala中的示例

scala语言示例Scala var关键字 (Scala var keyword) The var Keyword in scala is used to declare variables. As Scala does not require explicit declaration of data type of the variable, var keyword is used. The variable declared using the var keyword as mutable…

八、决策树算法实验可视化展示

一、树模型的可视化展示 官网下载安装包 右击管理员身份运行&#xff0c;直接下一步即可。 配置环境变量&#xff1a; 将安装好的可视化软件的bin文件夹路径添加到系统环境变量Path下即可 打开cmd&#xff0c;输入dot -version&#xff0c;出现相关信息即安装成功 二、决策…

关于在页面中针对不同版本的IE浏览器实现不同的JS或者CSS样式

一般会用到<!--[if IE]>这里是正常的html代码<![endif]--> 条件注释只能在windows Internet Explorer(以下简称IE)下使用&#xff0c;因此我们可以通过条件注释来为IE添加特别的指令。因为这只是IE浏览器支持的注释。 1&#xff0c;条件注释的基本结构和HTML的注释…

机器学习笔记:PCA的简单理解以及应用建议

用notability做的笔记&#xff0c;比较随意&#xff0c;对于第五点的PCA错误使用需要特别强调。 目录1、PCA与线性回归2、PCA主成分数量选择3、压缩重现4、PCA应用建议5、PCA的错误使用1、PCA与线性回归 2、PCA主成分数量选择 3、压缩重现 4、PCA应用建议 5、PCA的错误使用

关于asp.net中的错误提示“将截断字符串或二进制数据。 语句已终止。”

好久没有更新博客了&#xff0c;今天在写asp.net网站的时候&#xff0c;出现了这个问题。错误提示“将截断字符串或二进制数据。 语句已终止。”通过调试&#xff0c;发现在插入数据的时候&#xff0c;由于插入的数据的字符或者二进制数据的长度大于原来定义的类型的长度。及保…

c# 无法将类型隐式转换_C#中的隐式类型数组

c# 无法将类型隐式转换C&#xff03;隐式类型数组 (C# Implicitly Typed Arrays) Like implicitly typed variables, we can also declare an array without specifying its type such type of arrays are known as Implicitly typed arrays. 像隐式类型的变量一样&#xff0c;…

一、信用卡卡号识别

一、思路分析 大体思路&#xff1a;首先拿到一张银行卡&#xff0c;我们得有银行卡号数字的0-9样式的模板&#xff0c;然后再通过不同数字的轮廓的外接矩形来进行匹配&#xff0c;最终识别出银行卡号所对应的数字。 银行卡数字模板&#xff1a; 银行卡信息&#xff1a; 拿到…

bootstrap网格系统_如何使用Bootstrap网格系统?

bootstrap网格系统In the last article, we learned how to create a simple page of Bootstrap? Now, we will learn what is "Grid System" in Bootstrap and how we can use or implement it in our bootstrap page? As you know bootstrap is a mobile-friendl…

有关WriteableBitmap和BitmapImage之间的相互转换

对于WP7中图形处理有关WriteableBitmap和BitmapImage之间的相互转换&#xff0c;给大家几个简单实用的方法。一、WriteableBitmap转为BitmapImage对象var bi new BitmapImage(); bi.SetSource(wb.ToImage().ToStream()); //其中wb是WriteableBitmap对象。 二、BitmapImage转为…

回溯法初步

本文为参考公众号所做的笔记。 代码随想录原文 回溯法本质是穷举&#xff0c;穷举所有可能&#xff0c;然后选出我们想要的答案&#xff0c;所以它并不是一个高效的算法。但是由于有些问题本身能用暴力搜出来就不错了&#xff0c;所以回溯法也有很多的应用。 回溯法解决的问题…

QEMU中smp,socket,cores,threads几个参数的理解

在用QEMU创建KVM guest的时候&#xff0c;为了指定guest cpu资源&#xff0c;用到了-smp, -sockets, -cores, -threads几个参数&#xff0c; #/usr/bin/qemu-system-x86_64 -name pqsfc085 -enable-kvm -m 2048 -smp 2,sockets2,cores1,threads1 \ -boot ordernc,onced \ -hda …

二、文档扫描OCR

一、思路分析 首先&#xff0c;拿到一张文档&#xff0c;我们需要对文档进行预处理操作&#xff0c;再进行轮廓检测&#xff0c;因为就算拿到文档轮廓&#xff0c;但是这些轮廓也有可能是歪歪扭扭的&#xff0c;这时候需要通过一系列的透视变换操作&#xff0c;将文档摆正。通…

ruby hash方法_Ruby中带有示例的Hash.select方法

ruby hash方法哈希选择方法 (Hash.select Method) In this article, we will study about Hash.select Method. The working of this method can be predicted with the help of its name but it is not as simple as it seems. Well, we will understand this method with the…

leetcode 77. 组合 思考分析

目录1、题目2、回溯法思路3、参考其他思路&#xff0c;更深入了解这个问题4、剪枝优化可能需要回顾到的知识文章&#xff1a;1、常用算法总结(穷举法、贪心算法、递归与分治算法、回溯算法、数值概率算法)2、回溯法初步删除vector容器中的对象元素的三种方法:pop_back, erase与…

ASP 调用dll(VB)及封装dll实例

ASP调用dll及封装dll实例&#xff0c;封装为dll可以提供运行效率&#xff0c;加密代码。 打开VB6&#xff0c;新建ActiveX DLL 2、在工程引用中加入Microsoft Active Server Pages Object Library选择 3、填加代码如下Code Start 声明部分 Private MyScriptingContext As Scrip…