【北京迅为】《STM32MP157开发板使用手册》- 第四十一章 计数信号量实验

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7+单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板+底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐用,可满足高速信号环境下使用。共240PIN,CPU功能全部引出:底板扩展接口丰富底板板载4G接口(选配)、千兆以太网、WIFI蓝牙模块HDMI、CAN、RS485、LVDS接口、温湿度传感器(选配)光环境传感器、六轴传感器、2路USB OTG、3路串口,CAMERA接口、ADC电位器、SPDIF、SDIO接口等


第四十一章 计数信号量实验

41.1计数信号量的基本概念

二进制信号量可以被认为是长度为 1 的队列,而计数信号量则可以被认为长度大于 1 的队列,信号量使用者依然不必关心存储在队列中的消息,只需关心队列是否有消息即可。

顾名思义,计数信号量肯定是用于计数的,在实际的使用中,我们常将计数信号量用于事件计数与资源管理。每当某个事件发生时,任务或者中断将释放一个信号量(信号量计数值加 1),当处理被事件时(一般在任务中处理),处理任务会取走该信号量(信号量计数值减 1),信号量的计数值则表示还有多少个事件没被处理。此外,系统还有很多资源,我们也可以使用计数信号量进行资源管理,信号量的计数值表示系统中可用的资源数目,任务必须先获取到信号量才能获取资源访问权,当信号量的计数值为零时表示系统没有可用的资源,但是要注意,在使用完资源的时候必须归还信号量,否则当计数值为 0的时候任务就无法访问该资源了。

41.2实验目的

1)STM32CubeIDE工具软件建立freertos工程

2)学习计数信号量的相关知识与初步使用

我们的实验任务为通过两个按键和串口,来观察计数信号量的特性。

首先对实验进行分析,总共需要有两个任务,分别为TAKE 释放任务和GIVE获取任务,并通过串口打印对应的信息。所实现的功能如下:

TAKE 任务:通过按下VOL_UP按键来实现计数信号量的释放,释放成功和失败会通过串口进行打印。

GIVE任务:通过按下VOL_DN按键来实现计数信号量的获取。获取成功和失败会通过串口进行打印。

本章节完成的实验存放位置为“iTOP-STM32MP157开发板\iTOP-STM32MP157开发板网盘资料汇总\08_freertos实验例程\05_计数信号量实验.zip

41.3 计数信号量实验

41.3.1建立freertos_Count工程

首先我们打开STM32CubeIDE软件,进入软件界面之后,我们点击File属性,选择NEW下的STM32 Project的选项,如下图所示:

然后我们会进入下图所示界面:在Part Number选择框输入STM32MP157A,然后在右边的选择界面选择STM32MP157AAA,然后点击Next选项

在Project Name框中输入工程名字freertos_Count,然后点击Finish选项即可,如下图所示: 

 等待工程创建完毕,会询问我们是否要安装OpenSTLinux ,由于我们是在windows环境下,所以我们不需要安装,点击NO即可

至此我们的工程创建完毕,进入工程界面如下图所示界面: 

41.3.2串口引脚的功能配置

首先我们在下面的搜索框之中输入我们要配置的引脚,我们在这里以PB2为例进行搜索,输入名称之后,对应的引脚在工程中会闪烁,如下图所示:

然后我们使用鼠标左键点击对应的引脚会弹出PB2的复用功能选择,我们在这里选择复用为UART4_RX功能,如下图所示: 

用同样的方法对PG11进行搜索,然后我们使用鼠标左键点击对应的引脚会弹出PG11的复用功能选择,我们在这里选择复用为UART4_TX功能,如下图所示: 

配置完成之后打开左侧菜单的 System CoreàGPIO 进入 GPIO 模式配置界面:如下图所示: 

点击对应的引脚配置之后会弹出右下方的管脚配置界面,如上图所示:

在下方会列出要配置选项的具体说明和我们要进行的配置。

选项 GPIO Pull-up/Pull-down 用来设置 IO 口是上拉/下拉/没有上下拉。本实验我们设置为上拉(Pull-up)。

选项 GPIO mode用来设置 GPIO 口的模式,这里默认为alternate function,也就是复用功能。

选项 User Label 是用来设置初始化的 IO 口 Pin 值为我们自定义的宏,这里我们填写为 UART_RX。按照如上要求设置后的界面如下(由于PG11的配置相同,只是最后的Label值不同,也在下方列了出来):

 而PG11和PB2的设置相似,只是多了出了一个选项:选项 Mzximum ouput speed 用来设置 IO 口输出速度为低速(Low)/中速(Medium)/高速 (Hign)/快速(Very High)。我们设置为高速Very High 。

41.3.3时钟的配置

我们本次实验所采用的时钟为外部时钟HSE,所以我们要在左侧属性栏中的System Core 属性下找到RCC将High Speed Clock选择为Crystal/Ceramic Resonator(晶体/陶瓷晶振)。如下图所示:

 

然后在Clock Configuration里我们选择 HSE,作为锁相环 PLL3P 的时钟源,在 MCU 子系统时钟里输入 209 并回车,软件会自动设置相应的倍频和分频,如下图所示: 

设置完成之后,如下图所示,然后再手动配置 APB1DIV、APB2DIV 和 APB3DIV的分频值为 2。当 APB1DIV 的分频数大于 1 的时候,基本定时器的倍频器倍频值始终为 2,所以基本定时器的时钟频率为 209MHz。 

41.3.4 配置 FreeRTOS

时钟配置完成之后,我们要在左侧属性栏中的Middleware属性下找到FREERTOS将Interface函数接口选择 CMSIS_V2,选择完成如下图所示:

每个功能窗口对应的功能如下: 

 

窗口

对应的功能

Mutexes

互斥量

Events

事件

FreeRTOS Heap Usage

堆情况使用

User Constants

常量的定义

Tasks and Queues

任务和消息队列

Timers and Semaphores

软件定时器和信号

Config parameters

配置参数

Inclued parameters

头文件配置

Advanced settings

高级设置

然后我么进入到Tasks and Queues任务和消息队列窗口,如下图所示: 

随后我们点击default默认创建的任务,添加任务名字为TAKE的工程,修改优先级为最低osPriorityLow如下图所示: 

我们只需要修改任务名称和设置线程函数名即可,修改完成之后点击OK按钮,随后我们以同样的方式,创建任务名字为GIVE的任务,创建完成如下图所示:

随后我们来到Timers and Semaphores选项界面(即软件定时器和信号界面),在该页面中总共有三个任务栏,分别为定时器、二值信号量、计数信号量,如下图所示,然后我们点击下方的二值信号量的Add添加按钮如下图所示: 

弹出队列的添加窗口之后,对默认的Semaphore Name进行修改,修改为CountingSem,然后对于计数量Count我们修改为4,然后我们点击确定按钮,如下图所示: 

配置完成之后我们需要在Project Manage下的Code Generator选项下勾选 Generate peripheral initialization as a pair of ".c/.h' files per peripheral 选项,这样可以独立生成对应外设的初始化.h 和.c 文件(方便配置的查看),如下图所示: 

 

41.4.5工程的生成与完善

在上述的步骤完成之后,按下键盘的Ctrl+S组合键保存保存 freertos_Count.ioc 文件,系统开始生成初始化代码此处会弹出一个警告,提示我们 Systick 定时器已被 HAL 库占用,在 STM32MP157 Cortex-M4 内核上我们更换不了其他的定时器,选择 Yes 继续生成代码即可。

工程生成之后如下图所示: 

然后我们进行工程的完善,以及添加对应的逻辑代码。

41.3.5.1 对应文件与文件夹的添加

由于我们在裸机章节已经完善了对应的LED,BEEP和KEY文件,所以我们将iTOP-STM32MP157开发板网盘资料汇总\06_Cortex-M4实验例程\03_KEY\KEY\CM4\Core\BSP文件拷贝到当前工程对应的位置,拷贝完成如下下图所示:

41.3.5.2 uart.h文件的完善

首先打开uart.h文件,文件存放位置如下图所示:

 

进入uart.h文件后在/* USER CODE BEGIN Private defines */和/* USER CODE END Private defines */之间添加定义

uint8_t RxBuffer;

用来设置串口发送和接收缓冲区的大小。添加完成如下图所示:

41.3.5.3 uart.c文件的完善

首先打开uart.h文件,文件存放位置如下图所示:

进入uart.c文件后在/* USER CODE BEGIN 1 */和/* USER CODE END 1 */之间添加回调函数,在没有编写回调函数的时候,串口只能完成一次发送和接收,在完成一次中断接收以后,就关闭串口中断了,该回调函数的作用是实现字符的循环发送和接收,添加内容如下:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)

{

  HAL_UART_Transmit(&huart4,&RxBuffer,1,0);

  HAL_UART_Receive_IT(&huart4,&RxBuffer,1);

}

添加完成之后如下图所示:

 

41.3.5.4 main.c文件的完善

我们要修改的main.c文件路径如下图所示:

打开main.c文件,在 /* USER CODE BEGIN 2 */和/* USER CODE END 2 */之间添加以下内容:

HAL_UART_Receive_IT(&huart4,&RxBuffer,1);

 

在/* USER CODE BEGIN 4 */和/* USER CODE END 4 */之间添加以下内容: 

#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHAR_PROTOTYPE
{while ((UART4->ISR & 0X40) == 0);UART4->TDR = (uint8_t) ch;return ch;
}

该函数的目的是实现串口输出重定向,重定向是指将fputc里面的输出指向目标设备。因printf函数调用了fputc,而fputc输出有默认指向的目标,且不同库中的fputc输出指向不同,所以需要重写fputc。

41.3.5.5 app_freertos.c文件的完善

我们要修改的 app_freertos.c文件路径如下图所示:

打开app_freertos.c文件,我们首先在/* USER CODE BEGIN Includes */和/* USER CODE END Includes */中间添加以下内容,将led、beep和key的头文件进行添加。

#include "../BSP/Include/led.h"

#include "../BSP/Include/key.h"

添加完成如下图所示:

 

然后我们来到文件的底部可以看到我们创建的TAKE_Task 和GIVE_Task任务

修改TAKE_Task 任务的for循环中的内容,修改内容如下:

	uint8_t key;osStatus_t xReturn = osOK ;for(;;){key = key_scan();if (key){switch (key){case VOL_UP_PRES:xReturn = osSemaphoreAcquire(CountingSemHandle,0);LED2_TOGGLE();if(osOK == xReturn){printf("Conuting_Handle Task Success!\n");}else{printf("Conuting_Handle Take Error!\n");}break;}}}osDelay(20);

修改完成如下图所示:

随后我们修改GIVE_Task 任务的内容,修改内容如下: 

	uint8_t key;osStatus_t xReturn = osOK ;for(;;){key = key_scan();if (key){switch (key){case VOL_DN_PRES:xReturn =osSemaphoreRelease(CountingSemHandle);LED3_TOGGLE();if(osOK == xReturn){printf("Conuting_Handle Release Success!\n");}else{printf("Conuting_Handle Release Error!\n");}break;}}}osDelay(20);

至此,我们的内容就添加完成了。之后进行编译烧写,当我们对VOL_UP和VOL_DN进行按下时,可以看到串口的打印信息如下图所示:

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

中国火锅变局:从群雄逐鹿到双雄角逐

中国火锅,正在进入新的变局。 前不久,沙利文发布的《2024年中国火锅行业发展白皮书》,揭示出中国火锅新的市场变化和竞争格局。 首先在品类上,川渝火锅的市场份额高达66%,远超排在后面的北派火锅和粤式火锅。 在川渝…

围剿Model Y,小米SUV也来拼刺刀了

文 | AUTO芯球 作者 | 雷慢 马斯克真是被小米雷军盯上了, 前面小米SU7死磕Model 3, 现在小米SUV又来打Model Y了, 别不信啊,就刚刚,小米SUV出现了最大的曝光, 外观谍照,内饰中控台都曝光了…

基于SpringBoot+Vue的商场停车场管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

标签云效果

产品要求&#xff0c;词云要实现动态滚动。查资料&#xff0c;改写效果。 echarts词云效果 传统的echarts-wordCloud不能满足需求。 标签云 换了标签云&#xff0c;以下是代码 <template><div class"mx-auto" :style"{ width: width px }"&g…

正点原子RK3588(一)——开机测试+AI初探

一、adb adb shell&#xff0c;进入板子的根目录 exit&#xff0c;退出到linux adb pull 板子 linux&#xff08;从板子到linux&#xff09; adb push linux 板子&#xff08;从linux到板子&#xff09; 二、测试AI功能 2.1 resnet18 import cv2 import numpy as np import…

全视通解读政策风向,智慧手术室究竟怎么做信息化?

尽管智慧手术室的建设与发展日益重要&#xff0c;但是目前国内外对智慧手术室的定义仍是众说纷纭&#xff0c;直至日前&#xff0c;上海交通大学医学院附属瑞金医院、上海市数字医学创新中心联合L.E.K.咨询发布的《中国智慧手术室发展与实践白皮书》&#xff08;后简称《白皮书…

序列化方式二——JSON之fastjson

fastjson&fastjson2(版本&#xff1a;1.2.83_noneautotype) 扩展点 Fastjson通过其丰富的扩展点显著增强了用户定制序列化和反序列化行为的灵活性&#xff0c;完美契合了实际开发中的多样化需求。在SpringBoot与SpringCloud的集成环境中&#xff0c;开发者能够利用Seriali…

五、 共射极放大电路

共射极放大电路 1、三极管的结构、三极管各极电流关系、特性曲线、放大条件。   2、元器件的作用、电路的用途、电压放大倍数、输入和输出的信号电压相位关系、交流和直流等效电路图。 3、静态工作点的计算、电压放大倍数的计算。

【PCL实现点云分割】ROS深度相机实践指南(上):PCL库初识和ROS-PCL数据类型转换

前言 本教程使用PCL对ROS深度相机捕获到的画面进行操场上锥桶的分割 本人相关的RGBD深度相机原理及其使用教程&#xff1a; [csdn 博客] 上手一个RGBD深度相机&#xff1a;从原理到实践–ROS noeticAstra S&#xff08;上&#xff09;&#xff1a;解读深度测距原理和内外参推导…

金属3D打印经济效益高吗?

在我国制造业迈向产业升级的重要阶段&#xff0c;3D打印技术如同一股强劲的新风&#xff0c;特别是在航空航天、汽车、生物医疗等领域&#xff0c;已成为复杂构件制造的“明星”技术。那么&#xff0c;对于众多生产厂家而言&#xff0c;金属3D打印的经济账到底怎么算&#xff1…

rabbitmq 短信验证码

1.生成的验证码用redis存 减少数据库压力 2.通知运营商发送短信的事情交给rabbitmq的队列去做&#xff0c;无论成功或者是失败&#xff0c;用户那边都不知道。没有收到验证码&#xff08;监听失败&#xff09;用户只会觉得是运营商的问题&#xff0c;而不会怀疑是我们的系统有问…

深入掌握 Go 单元测试:从基础到进阶的完整指南

你好&#xff0c;我是陈明勇&#xff0c;一名热爱技术、乐于分享的开发者&#xff0c;同时也是开源爱好者。 成功的路上并不拥挤&#xff0c;有没有兴趣结个伴&#xff1f; 个人网站&#xff1a;https://chenmingyong.cn 文章持续更新&#xff0c;如果本文能让您有所收获&#…

罗马数字详解

一. 罗马数字の背景 1. 罗马数字的诞生与进化 罗马数字起源于古罗马帝国&#xff0c;拥有一个漫长而复杂的历史&#xff0c;始于公元前 8 世纪至 9 世纪&#xff0c;与古罗马帝国在帕兰丁山&#xff08;Palantine Hill&#xff09;周围建立的时间大致相同。不过&#xff0c;罗…

铲屎官进!宠物空气净化器真的有用吗?哪款去浮毛效果好

国庆小长假就要来了&#xff0c;别人都在苦恼抢票问题&#xff0c;而我在想会不会被我妈赶出家门... 毕业后我就留在了广州上班&#xff0c;独自一人租房难免会感觉孤独&#xff0c;就养了一只小猫和我作伴。这次放假这么久&#xff0c;我不放心留它一个人在家&#xff0c;也没…

SpringBoot 项目如何使用 pageHelper 做分页处理 (含两种依赖方式)

分页是常见大型项目都需要的一个功能&#xff0c;PageHelper是一个非常流行的MyBatis分页插件&#xff0c;它支持多数据库分页&#xff0c;无需修改SQL语句即可实现分页功能。 本文在最后展示了两种依赖验证的结果。 文章目录 一、第一种依赖方式二、第二种依赖方式三、创建数…

Virtuoso服务在centos中自动停止的原因分析及解决方案

目录 前言1. 问题背景2. 原因分析2.1 终端关闭导致信号12.2 nohup命令的局限性 3. 解决方案3.1 使用 screen 命令保持会话3.2 使用 tmux 作为替代方案3.3 使用系统服务&#xff08;systemd&#xff09; 4. 其他注意事项4.1 网络配置4.2 日志监控 结语 前言 在使用Virtuoso作为…

Transformer 的可视化解释

Transformer 的可视化解释&#xff1a;了解 LLM Transformer 模型如何与交互式可视化配合使用 部署 Nodejs version > 20.0 git clone https://github.com/poloclub/transformer-explainer.git cd transformer-explainer npm install npm run dev# fix: cnpm install --pl…

AD9854 为什么输出波形幅度受限??

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

lambda 自调用递归

从前序与中序遍历序列构造二叉树 官方解析实在是记不住&#xff0c;翻别人的题解发现了一个有意思的写法 class Solution { public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {auto dfs [](auto&& dfs, auto&&…

Pandas和matplotlib实现同期天气温度对比

目录 1、下载近两年的天气Excel数据 2、pandas加载Excel 3、将时间作为索引 4、按日计算最值、均值 5、选取近两年同期温度数据 6、同期温度曲线对比,共享y轴 1、下载近两年的天气Excel数据 一个免费的天气数据下载网址:METAR北京(机场)历史天气 (rp5.ru) 选择”北京天…