【STM32RT-Thread零基础入门】 3. PIN设备(GPIO)的使用

硬件:STM32F103ZET6、ST-LINK、usb转串口工具、4个LED灯、1个蜂鸣器、4个1k电阻、2个按键、面包板、杜邦线

文章目录

  • 前言
  • 一、PIN设备介绍
    • 1. 引脚编号获取
    • 2. 设置引脚的输入/输出模式
    • 3. 设置引脚的电平值
    • 4. 读取引脚的电平值
    • 5. 绑定引脚中断回调函数
    • 6. 脱离引脚中断回调函数
    • 7. 使能中断
  • 二、任务1:LED灯双闪控制
    • 1. 任务描述
    • 2. 代码编写
  • 三、任务2:蜂鸣器控制(查询法)
    • 1. 任务描述
    • 2. 代码编写
    • 3. 测试
  • 四、任务3:蜂鸣器控制(中断回调法)
    • 1. 任务描述
    • 2. 代码编写
    • 3. 测试
  • 五、任务4:同时实现LED闪烁和按键控制喇叭
    • 1. 任务描述
    • 2. 代码编写
    • 3. 测试
  • 总结


前言

在嵌入式系统中,GPIO是最常用的一种设备,在RT-Thread操作系统中,把GPIO命名为PIN设备。


一、PIN设备介绍

RT-Thread通过PIN设备对芯片的GPIO引脚进行管理,应用程序可以通过其提供的一组PIN设备管理接口来操作GPIO,PIN设备管理接口如表所示

接口描述
rt_pin_get()获取引脚编号
rt_pin_mode()设置引脚模式
rt_pin_write()设置引脚电平
rt_pin_read()读取引脚电平
rt_pin_attach_irq()绑定引脚中断回调函数
rt_pin_irq_enable()使能引脚中断
rt_pin_detach_irq()脱离引脚中断回调函数

1. 引脚编号获取

引脚变化和芯片的引脚号不是同一概念。RT-Thread的PIN设备驱动程序把芯片的不同引脚赋予不同的编号,操作PIN设备时,需要使用引脚编号来指定对哪个引脚进行操作。
可通过三种方法获得引脚编号:
(1)API法
利用rt_pin_get() 函数来获取引脚编号,例如获取PD9的引脚编号,则可以使用
pin_number = rt_pin_get("PD.9")
(2)宏定义法
对于STM32芯片,可以使用GET_PIN(PORTx,PIN)获取引脚编号,如硬件的PD9用于驱动LED_R_PIN,则可以把宏LED_R_PIN定义为相应的引脚编号,如下:
#define LED_R_PIN GET_PIN(D, 9)
(3)查看驱动文件
在drivers/drv_gpio.c中,pin[]数组定义了硬件平台的GPIO引脚编号,通过查看该数组,得到引脚PD9的编号为57。
具体数组代码如下:

static const struct pin_index pins[] = 
{
#if defined(GPIOA)__STM32_PIN(0 ,  A, 0 ),__STM32_PIN(1 ,  A, 1 ),__STM32_PIN(2 ,  A, 2 ),__STM32_PIN(3 ,  A, 3 ),__STM32_PIN(4 ,  A, 4 ),__STM32_PIN(5 ,  A, 5 ),__STM32_PIN(6 ,  A, 6 ),__STM32_PIN(7 ,  A, 7 ),__STM32_PIN(8 ,  A, 8 ),__STM32_PIN(9 ,  A, 9 ),__STM32_PIN(10,  A, 10),__STM32_PIN(11,  A, 11),__STM32_PIN(12,  A, 12),__STM32_PIN(13,  A, 13),__STM32_PIN(14,  A, 14),__STM32_PIN(15,  A, 15),
#if defined(GPIOB)__STM32_PIN(16,  B, 0),__STM32_PIN(17,  B, 1),__STM32_PIN(18,  B, 2),__STM32_PIN(19,  B, 3),__STM32_PIN(20,  B, 4),__STM32_PIN(21,  B, 5),__STM32_PIN(22,  B, 6),__STM32_PIN(23,  B, 7),__STM32_PIN(24,  B, 8),__STM32_PIN(25,  B, 9),__STM32_PIN(26,  B, 10),__STM32_PIN(27,  B, 11),__STM32_PIN(28,  B, 12),__STM32_PIN(29,  B, 13),__STM32_PIN(30,  B, 14),__STM32_PIN(31,  B, 15),
#if defined(GPIOC)__STM32_PIN(32,  C, 0),__STM32_PIN(33,  C, 1),__STM32_PIN(34,  C, 2),__STM32_PIN(35,  C, 3),__STM32_PIN(36,  C, 4),__STM32_PIN(37,  C, 5),__STM32_PIN(38,  C, 6),__STM32_PIN(39,  C, 7),__STM32_PIN(40,  C, 8),__STM32_PIN(41,  C, 9),__STM32_PIN(42,  C, 10),__STM32_PIN(43,  C, 11),__STM32_PIN(44,  C, 12),__STM32_PIN(45,  C, 13),__STM32_PIN(46,  C, 14),__STM32_PIN(47,  C, 15),
#if defined(GPIOD)__STM32_PIN(48,  D, 0),__STM32_PIN(49,  D, 1),__STM32_PIN(50,  D, 2),__STM32_PIN(51,  D, 3),__STM32_PIN(52,  D, 4),__STM32_PIN(53,  D, 5),__STM32_PIN(54,  D, 6),__STM32_PIN(55,  D, 7),__STM32_PIN(56,  D, 8),__STM32_PIN(57,  D, 9),__STM32_PIN(58,  D, 10),__STM32_PIN(59,  D, 11),__STM32_PIN(60,  D, 12),__STM32_PIN(61,  D, 13),__STM32_PIN(62,  D, 14),__STM32_PIN(63,  D, 15),

2. 设置引脚的输入/输出模式

宏定义描述
PIN_MODE_OUTPUT推挽输出
PIN_MODE_OUTPUT_OD开漏输出,硬件需要外接上拉电阻
PIN_MODE_INPUT输入
PIN_MODE_INPUT_PULLUP上拉输入,引脚悬空时为高电平
PIN_MODE_INPUT_PULLDOWN下拉输入,引脚悬空时为低电平
引脚可通过以下函数设置输入/输出模式:

void rt_pin_mode(rt_base_t pin, rt_base_t mode)

pin:引脚编号
mode:输入/输出模式所对应的宏

#define LED_R_PIN GET_PIN(D, 9)
rt_pin_mode(LED_R_PIN, PIN_MODE_OUTPUT);

3. 设置引脚的电平值

设置函数如下:
void rt_pin_write(rt_base_t pin, rt_base_t value)
pin:引脚编号
value:高电平为PIN_HIGH;低电平为PIN_LOW

4. 读取引脚的电平值

设置函数如下:
int rt_pin_read(rt_base_t pin)
pin:引脚编号
返回值:高电平为PIN_HIGH;低电平为PIN_LOW

5. 绑定引脚中断回调函数

引脚作为中断输入时,需要设置引脚的中断触发方式,引脚的中断触发模式有5种,RT-Thread中分别有5个宏与之对应,具体如下:

宏定义描述
PIN_IQR_MODE_RISING上升沿触发
PIN_IQR_MODE_FALLING下降沿触发
PIN_IQR_MODE_RISING_FALLING双边沿触发
PIN_IQR_MODE_HIGH_LEVEL高电平触发
PIN_IQR_MODE_LOW_LEVEL低电平触发

当引脚产生中断时,通过中断回调函数响应中断。绑定中断回调函数到引脚后,引脚有中断发生,就会执行对应的中断回调函数。

具体函数如下:
rt_err_t rt_pin_attach_irq(rt_int32_t pin, rt_uint32_t mode, void (*hdr)(void *args), void *args)
pin:引脚编号
mode:中断触发模式
hdr:中断回调函数指针,用户需要自定义这个函数
args:中断回调函数的参数,不需要设置时为RT_NULL
返回:绑定成功为RT_EOK;失败产生错误码

6. 脱离引脚中断回调函数

如不希望响应中断,或者想更换中断响应函数,则可以使用如下脱离引脚中断回调函数:
rt_err_t rt_pin_detach_irq(rt_int32_t pin)
pin:引脚编号
返回:脱离成功为RT_EOK;失败产生错误码

7. 使能中断

rt_err_t rt_pin_irq_enable(rt_base_t pin, rt_uint32_t enabled)
pin:引脚编号
enable:PIN_IRQ_ENABLE(开启),PIN_IRQ_DISABLE(关闭)
返回:使能成功为RT_EOK;失败产生错误码

二、任务1:LED灯双闪控制

1. 任务描述

控制LED1、LED2轮流闪烁。通过本任务,学习PIN设备输出功能的设置方法。

在这里插入图片描述

2. 代码编写

在项目的main.c文件中,编写如下代码:

#include <rtthread.h>
#include <rtdevice.h>
#include "drv_common.h"/* 定义左右转向灯的控制引脚 */
#define LED_L_PIN GET_PIN(D, 8)
#define LED_R_PIN GET_PIN(D, 9)int main(void)
{/* 把引脚设置为推拉输出模式 */rt_pin_mode(LED_L_PIN, PIN_MODE_OUTPUT);rt_pin_mode(LED_R_PIN, PIN_MODE_OUTPUT);while (1){rt_pin_write(LED_L_PIN, PIN_HIGH);//灭左灯rt_pin_write(LED_R_PIN, PIN_LOW);//亮右灯rt_thread_mdelay(500);//延迟500毫秒rt_pin_write(LED_L_PIN, PIN_LOW);//亮左灯rt_pin_write(LED_R_PIN, PIN_HIGH);//灭右灯rt_thread_mdelay(500);}return RT_EOK;
}

三、任务2:蜂鸣器控制(查询法)

1. 任务描述

通过按键控制蜂鸣器的开关。当按键按下时,蜂鸣器响起;当按键松开时,蜂鸣器关闭。通过本任务,学习PIN设备输入功能的使用。
在这里插入图片描述
在这里插入图片描述

2. 代码编写

#include <rtthread.h>
#include <rtdevice.h>
#include "drv_common.h"/* 定义左右转向灯的控制引脚 */
#define BEEP_PIN GET_PIN(A, 5)
#define KEY1_PIN GET_PIN(A, 0)int main(void)
{/* 把蜂鸣器引脚设置为推拉模式 */rt_pin_mode(BEEP_PIN, PIN_MODE_OUTPUT);/* 把按键引脚设置为上拉输入模式 */rt_pin_mode(KEY1_PIN, PIN_MODE_INPUT_PULLUP);while (1){if(PIN_LOW==rt_pin_read(KEY1_PIN)){//按键按下rt_thread_mdelay(20);//延时去抖if(PIN_LOW==rt_pin_read(KEY1_PIN))rt_pin_write(BEEP_PIN, PIN_LOW);//蜂鸣器响}elsert_pin_write(BEEP_PIN, PIN_HIGH);//否则,蜂鸣器不响rt_thread_mdelay(300);//每0.3秒进行一次按键扫描}return RT_EOK;
}

3. 测试

按下按键,蜂鸣器发声,松开按键,停止发声,但是经过多次尝试发现,按键检测成功率较低,所以需要利用中断进行改进。

四、任务3:蜂鸣器控制(中断回调法)

1. 任务描述

通过按键控制蜂鸣器的开关。当按键按下时,蜂鸣器响起;当按键松开时,蜂鸣器关闭。通过本任务,掌握PIN设备中断回调函数的使用方法。

2. 代码编写

#include <rtthread.h>
#include <rtdevice.h>
#include "drv_common.h"#define BEEP_PIN GET_PIN(A, 5)  //定义蜂鸣器的控制引脚
#define KEY1_PIN GET_PIN(A, 0)  //定义按键的控制引脚/* 定义中断回调函数实现 */
void beep_on(void *args)
{/* 判断按键是否按下 */if(PIN_LOW==rt_pin_read(KEY1_PIN)){/* 按键按下,驱动蜂鸣器响  */rt_pin_write(BEEP_PIN, PIN_LOW);/* 等待按键台起  */while(PIN_LOW==rt_pin_read(KEY1_PIN));/* 关闭蜂鸣器  */rt_pin_write(BEEP_PIN, PIN_HIGH);}
}
int main(void)
{rt_pin_mode(BEEP_PIN, PIN_MODE_OUTPUT); //把蜂鸣器引脚设置为推拉模式rt_pin_write(BEEP_PIN, PIN_HIGH); //初始化蜂鸣器默认状态为不响/* 把按键引脚设置为上拉输入模式 */rt_pin_mode(KEY1_PIN, PIN_MODE_INPUT_PULLUP);/* 绑定中断,下降沿触发模式,回调函数名为beep_on */rt_pin_attach_irq(KEY1_PIN, PIN_IRQ_MODE_FALLING, beep_on, RT_NULL);rt_pin_irq_enable(KEY1_PIN, PIN_IRQ_ENABLE); //使能中断return RT_EOK;
}

3. 测试

按下按键,蜂鸣器发声,松开按键,停止发声,经过多次尝试发现,按键检测成功率较高,所以中断法比查询法更具优势。

五、任务4:同时实现LED闪烁和按键控制喇叭

1. 任务描述

本任务功能为同时实现LED灯双闪功能和按键控制蜂鸣器的功能,要求两个功能不能相互影响,按键检测灵敏度要高,即每次发生按键按下的事件,程序都能成功检测该事件并开启蜂鸣器。

2. 代码编写

#include <rtthread.h>
#include <rtdevice.h>
#include "drv_common.h"#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>/* 定义左右转向灯的控制引脚 */
#define LED_L_PIN GET_PIN(D, 8)
#define LED_R_PIN GET_PIN(D, 9)
/* 定义蜂鸣器的控制引脚 */
#define BEEP_PIN GET_PIN(A, 5)
/* 定义按键的控制引脚 */
#define KEY1_PIN GET_PIN(A, 0)/* 定义中断回调函数 */
void beep_on(void *args)
{/* 判断按键是否按下 */if(PIN_LOW==rt_pin_read(KEY1_PIN)){rt_pin_write(BEEP_PIN, PIN_LOW); //按按键下,驱动蜂鸣器响 while(PIN_LOW==rt_pin_read(KEY1_PIN)); //等待按键台起rt_pin_write(BEEP_PIN, PIN_HIGH); //关闭蜂鸣器}
}int main(void)
{/* 把LED灯引脚设置为输出模式 */rt_pin_mode(LED_L_PIN, PIN_MODE_OUTPUT);rt_pin_mode(LED_R_PIN, PIN_MODE_OUTPUT);/* 把蜂鸣器引脚设置为推拉模式 */rt_pin_mode(BEEP_PIN, PIN_MODE_OUTPUT);/* 初始化蜂鸣器默认状态为不响 */rt_pin_write(BEEP_PIN, PIN_HIGH);/* 把按键引脚设置为上拉输入模式 */rt_pin_mode(KEY1_PIN, PIN_MODE_INPUT_PULLUP);/* 绑定中断,下降沿触发模式,回调函数名为beep_on */rt_pin_attach_irq(KEY1_PIN, PIN_IRQ_MODE_FALLING, beep_on, RT_NULL);rt_pin_irq_enable(KEY1_PIN, PIN_IRQ_ENABLE); // 使能中断 while(1){rt_pin_write(LED_L_PIN, PIN_HIGH);//亮左灯rt_pin_write(LED_R_PIN, PIN_LOW);//灭右灯rt_thread_mdelay(500);//延迟500毫秒rt_pin_write(LED_L_PIN, PIN_LOW);//灭左灯rt_pin_write(LED_R_PIN, PIN_HIGH);//亮右灯rt_thread_mdelay(500);}return RT_EOK;
}

3. 测试

测试过程如下:
(1)系统启动后,观察左右转向灯是否轮流闪烁;
(2)当按下按键时,喇叭是否发出响声;
(3)当松开按键时,喇叭是否停止发出响声;
(4)一直按住按键不松开,观察灯的闪烁情况。
测试结果:
(1)系统启动后,左右转向灯轮流闪烁;
(2)当按下按键时,喇叭发出响声;
(3)当松开按键时,喇叭停止发出响声;
(4)一直按住按键不松开,喇叭发出响声,灯停止闪烁。


总结

从任务4测试结果中,我们可以发现,按键功能影响了闪灯的功能,说明两个功能还是没有很好地解耦,依然存在相互影响的情况。
出现这种情况,主要是由于中断回调函数中存在需要长时间等待的代码,当按键一直按住不松开的时候,中断回调函数由于一直停留在等待按键松开的地方而无法退出中断处理。而中断的优先级又高于main()线程的优先级,从而导致main()线程无法得到执行。
通常,我们不应该在中断回调函数中进行长时间的处理,中断回调函数应该只做一些必要的快速处理操作,而把长时间的处理操作放到线程中实现。
关于线程和优先级的概念,我们在下一节讲述。

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

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

相关文章

大语言模型之二 GPT发展史简介

得益于数据、模型结构以及并行算力的发展&#xff0c;大语言模型应用现今呈井喷式发展态势&#xff0c;大语言神经网络模型成为了不可忽视的一项技术。 GPT在自然语言处理NLP任务上取得了突破性的进展&#xff0c;扩散模型已经拥有了成为下一代图像生成模型的代表的潜力&#x…

【Unity细节】Unity打包后UI面板消失是怎么回事

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;unity细节和bug ⭐关于物体的动画碰到其他碰撞器后停止播放的问题⭐ 文章目录 ⭐关于物体的动画碰…

整数中1出现的次数(从1到n整数中1出现的次数)

解题思路1&#xff1a; 设定整数点&#xff08;如1、10、100等等&#xff09;作为位置点i&#xff08;对应n的各位、十位、百位等等&#xff09;&#xff0c;分别对每个数位上有多少包含1的点进行分析。 第一步&#xff1a;对n进行分割&#xff0c;分为两部分&#xff1a;高位…

[git] git基础知识

git是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目 git易于学习&#xff0c;性能极快 什么是版本控制&#xff1f; 版本控制是一种记录文件内容变化&#xff0c;以便将来查阅特定版本修订情况&#xff0c;可以记录文件修改历史…

c语言——统计分类

我们将一个班的成绩进行分类&#xff0c; 成绩60分以下的为c、成绩61-89分的为b&#xff0c;90分以上的为A //统计分类 /*我们将一个班的成绩进行分类&#xff0c; 成绩60分以下的为c、成绩61-89分的为b&#xff0c;90分以上的为A */ #include<stdio.h> int main() …

云计算-知识点大纲

前言&#xff1a;云计算的基本概念学习&#xff0c;基础知识大纲梳理。 目录 云计算的概念 云计算的特征 部署模式 服务模式 云计算的发展 云计算的核心技术 虚拟化技术 常见的虚拟化技术 服务器虚拟化 裸金属型技术 服务器虚拟化技术的特点 存储虚拟化 CPU 内存…

C语言每日一题:16:数对。

思路一&#xff1a;基本思路 1.x,y均不大于n&#xff0c;就是小于等于n。 2.x%y大于等于k。 3.一般的思路使用双for循环去遍历每一对数。 代码实现&#xff1a; #include <stdio.h> int main() {int n 0;int k 0;//输入scanf("%d%d", &n, &k);int x…

gitee(码云)如何生成并添加公钥配置用户信息

一&#xff0c;简介 在使用Gitee的时候&#xff0c;公钥是必须的&#xff0c;无论是克隆还是上传。本文主要介绍如何本地生成和添加公钥到服务器&#xff0c;然后配置自己的用户信息&#xff0c;方便日后拉取与上传代码。 二&#xff0c;步骤介绍 2.1 本地生成公钥 打开git ba…

【Kubernetes】Kubernetes之YAML文件详解

YAML 一、YAML 的概述1. Kubernetes 支持资源管理格式2. YAML 语法格式 二、YAML 文件1. 如何获取 api 资源相关信息2. 编写资源配置文件2.1 手动编写 yaml 文件详解K8S中的port 2.2 使用镜像生成 yaml 文件2.3 根据现有资源导出 yaml 文件 总结1. 如何获取资源清单文件&#x…

elk开启组件监控

elk开启组件监控 效果&#xff1a; logstash配置 /etc/logstash/logstash.yml rootnode1:~# grep -Ev "^#|^$" /etc/logstash/logstash.yml path.data: /var/lib/logstash path.logs: /var/log/logstash xpack.monitoring.enabled: true xpack.monitoring.elasti…

JavaWeb-Servlet服务连接器(一)

目录 1.Servlet生命周期 2.Servlet的配置 3.Servlet的常用方法 4.Servlet体系结构 5.HTTP请求报文 6.HTTP响应报文 1.Servlet生命周期 Servlet&#xff08;Server Applet&#xff09;是Java Servlet的简称。其主要的功能是交互式地浏览和修改数据&#xff0c;生成一些动态…

OCP China Day 2023:五大社区齐聚,加速开源开放创新与落地

8月10日&#xff0c;2023年开放计算中国社区技术峰会&#xff08;OCP China Day 2023&#xff09;在北京举行。智慧时代&#xff0c;计算多元化、应用多样化、技术复杂化正驱动数据中心新一轮变革&#xff0c;开源开放社区已成为推动数据中心持续创新的重要力量&#xff0c;通过…

微信小程序实现双向滑动快捷选择价格(价格区间)

实现样子 提示&#xff1a;效果可以自己自定义&#xff0c;自己将文字样式更改为自己项目属性即可 实现达到方法 1、左边为最低价&#xff0c;右边为最高价格&#xff0c;可以拖动左边最低价选择价格。拖动右边为最高价。 2、当两个价格重合时&#xff0c;继续拖动&#xff0…

家电用PCM板:市场现状研究分析与发展前景预测

家电PCM板属于一种兴起不久的功能性复合材料。属于家电复合外观材料中占比较大的一种。家电复合外观材料主要分为覆膜板&#xff08;VCM&#xff09;系列和有机涂层板&#xff08;PCM&#xff09;系列两大类&#xff1a;VCM系列表面复合各类功能性薄膜&#xff0c;可根据需要实…

pve组网实现公网访问pve,访问电脑,访问pve中的openwrt同时经过openwrt穿透主路由地址nginx全公网访问最佳办法测试研究...

一台路由器 做主路由 工控机 装pve虚拟机 虚拟机里面装一个openwrt, 外网可以直接访问pve,可以访问pve里的openwrt 一台主机 可选择连 有4个口&#xff0c;分别eth0,eth1,eth2,eth3 pve有管理口 这个情况下 &#xff0c;没有openwrt 直接电脑和pve管理口连在一起就能进pve管理界…

PyTorch深度学习环境安装(Anaconda、CUDA、cuDNN)及关联PyCharm

1. 关系讲解 Tytorch&#xff1a;Python机器学习库&#xff0c;基于Torch&#xff0c;用于自然语言处理等应用程序 Anaconda&#xff1a;是默认的python包和环境管理工具&#xff0c;安装了anaconda&#xff0c;就默认安装了conda CUDA&#xff1a;CUDA是一种由显卡厂商NVIDI…

AI:03-基于深度神经网络的低空无人机目标检测图像识别的研究

文章目录 数据集收集与预处理深度神经网络模型设计模型训练与优化目标检测与图像识别代码实现:实验结果与分析讨论与展望低空无人机的广泛应用为许多领域带来了巨大的潜力和机会。为了实现无人机的自主导航和任务执行,准确的目标检测和图像识别是至关重要的。本文旨在研究并提…

PHP最简单自定义自己的框架数据库封装调用(五)

1、实现效果调用实现数据增删改查封装 2、创建数据表 CREATE TABLE test (id int(11) NOT NULL AUTO_INCREMENT,name varchar(30) DEFAULT NULL,age int(11) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEMyISAM AUTO_INCREMENT4 DEFAULT CHARSETutf8;3、index.php 入口定义数据库…

matplotlib 笔记 注释annotate

在图中的特定位置添加文本注释、箭头和连接线&#xff0c;以便更清晰地解释图形中的数据或信息 主要参数 text文本内容xy箭头指向的目标点的坐标xytext注释文本的坐标arrowprops 一个字典&#xff0c;指定注释箭头的属性&#xff0c;如颜色、箭头样式等 没有arrowprops的时候…

PE启动盘和U启动盘(第三十六课)

PE启动盘和U启动盘(第三十六课) 一 WindowsPE工具盘 1. 制作WinPE镜像光盘 双击WePE64_V2.2-是-点击右下角光盘图标-选择ISO的输出位置-立即生成ISO 2. 通过光盘启动WinPE