【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.rhkb.cn/news/93314.html

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

相关文章

爬虫逆向实战(十四)--某培训平台登录

一、数据接口分析 主页地址&#xff1a;某培训平台 1、抓包 通过抓包可以发现登录是表单提交到j_spring_security_check 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现有一个j_password加密参数 请求头是否加密&#xff1f; 无响应是…

java初级算法(杨辉三角)

java初级算法&#xff08;杨辉三角&#xff09; java初级算法&#xff08;杨辉三角&#xff09;内容&#xff1a;思路解法&#xff1a;代码实现 学习时间&#xff1a;2023/08/16 java初级算法&#xff08;杨辉三角&#xff09; 每日一算法&#xff1a;杨辉三角 内容&#xff1a…

好用画流程图软件推荐 excalidraw

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;蚂蚁集团高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《EffectiveJava》独家解析》专栏作者。 热门文章推荐…

java.security.InvalidKeyException: Illegal key size

JDK受版本安全限制&#xff0c;默认只允许128位长度以内的。秘钥长度&#xff0c;如果密钥大于128, 会抛出java.security.InvalidKeyException: Illegal key size 异常. java运行时环境默认读到的是受限的policy文件. 文件位于${java_home}/jre/lib/security, 这种限制是因为美…

docker入门,这一篇就够了。

Docker入门&#xff0c;这一篇就够了。 Docker容器虚拟化平台。 前言 接触docker很长时间了&#xff0c;但是工作中也没有用到&#xff0c;所以总是学了忘&#xff0c;忘了学。不过这次&#xff0c;我打算跟大家分享一下我的学习历程&#xff0c;也算是我的独特的复习笔记&…

【hadoop】windows上hadoop环境的搭建步骤

文章目录 前言基础环境下载hadoop安装包下载hadoop在windows中的依赖配置环境变量 Hadoop hdfs搭建创建hadfs数据目录修改JAVA依赖修改配置文件初始化hdfs namenode启动hdfs 前言 在大数据开发领域中&#xff0c;不得不说说传统经典的hadoop基础计算框架。一般我们都会将hadoo…

清除pip安装库时的缓存

目录 1、命令清除缓存 2、路径手动清除 在使用pip安装Python库时&#xff0c;如果之前已经下载过该库&#xff0c;pip会默认使用缓存来安装库&#xff0c;而不是重新从网络上下载。缓存文件通常存储在用户目录下的缓存文件夹中&#xff0c;具体位置因操作系统和Python版本而异…

区间预测 | MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测

区间预测 | MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 MATLAB实现QRGRU门控循环单元分位数回归时间序列区间预测。基于分位…

SAP复杂表格转换为JASON格式的例子

分享一个三层表格转换伙JASON格式的例子&#xff0c;代码如下。 REPORT zjason_test. "// 定义 DATA: lv_json TYPE string.DATA: BEGIN OF ls_detail_l3,code_l3 TYPE string,name_l3 TYPE string,age_l3 TYPE string,END OF ls_detail_l3,lt_detail_l3 LIKE TABLE OF…

SpringBoot复习:(34)@EnableWebMvc注解为什么让@WebMvcAutoconfiguration失效?

它导入了DelegatingWebMvcConfiguration 它会把容器中的类型为WebMvcConfigurer的bean注入到类型为WebMvcConfigurerComposite的成员变量configurers中。 可以看到它继承了WebMvcConfigurerSupport类 而WebMvcConfigureAutoConfiguration类定义如下 可以看到一个Conditional…

使用GraphQL在Postman中进行API测试

GraphQL 是一种用于API的开源数据查询和操作语言&#xff0c;用于API的查询语言和运行时。它使客户端能够精确地指定其数据需求&#xff0c;并获得预测性地结果。GraphQL旨在提高API的效率、灵活性和可靠性。 Postman 是一款用于API开发的强大工具&#xff0c;它支持REST和Gra…

tk切换到mac的code分享

文章目录 前言一、基础环境配置二、开发软件与扩展1.用到的开发软件与平替、扩展情况 总结 前言 最近换上了coding人生的第一台mac&#xff0c;以前一直偏好tk&#xff0c;近来身边的朋友越来越多的用mac了&#xff0c;win的自动更新越来越占磁盘了&#xff0c;而且win11抛弃了…

记录--JS 的垃圾回收机制

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 垃圾回收(Garbage Collection)是一种内存管理机制&#xff0c;用于检测和清理不再被程序使用的内存&#xff0c;这些不再被使用的内存就被称为垃圾。垃圾回收器会在 JS 引擎(浏览器或者 nodejs)内…

什么是数据结构

目录 什么是数据结构 线性表 顺序表 链表 栈和队列 树存储结构 图存储结构 什么是数据结构 数据结构&#xff0c;直白地理解&#xff0c;就是研究数据的存储方式。 我们知道&#xff0c;数据存储只有一个目的&#xff0c;即为了方便后期对数据的再利用&#xff0c;就如…

基于Spring Boot的高校在线考试系统的设计与实现(Java+spring boot+VUE+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的高校在线考试系统的设计与实现&#xff08;Javaspring bootVUEMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java s…

[PaddlePaddle] [学习笔记] [上] 计算机视觉(卷积、卷积核、卷积计算、padding计算、BN、缩放、平移、Dropout)

1. 计算机视觉的发展历程 计算机视觉作为一门让机器学会如何去“看”的学科&#xff0c;具体的说&#xff0c;就是让机器去识别摄像机拍摄的图片或视频中的物体&#xff0c;检测出物体所在的位置&#xff0c;并对目标物体进行跟踪&#xff0c;从而理解并描述出图片或视频里的场…

时序预测 | MATLAB实现基于LSTM长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于LSTM长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于LSTM长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 Matlab实现LSTM长短期记忆神经…

word之插入尾注+快速回到刚才编辑的地方

1-插入尾注 在编辑文档时&#xff0c;经常需要对一段话插入一段描述或者附件链接等&#xff0c;使用脚注经常因占用篇幅较大导致文档页面内容杂乱&#xff0c;这事可以使用快捷键 ControlaltD 即可在整个行文的末尾插入尾注&#xff0c;这样文章整体干净整洁&#xff0c;需要…

DiffusionDet: Diffusion Model for Object Detection

DiffusionDet: Diffusion Model for Object Detection 论文概述不同之处整体流程 论文题目&#xff1a;DiffusionDet: Diffusion Model for Object Detection 论文来源&#xff1a;arXiv preprint 2022 论文地址&#xff1a;https://arxiv.org/abs/2211.09788 论文代码&#xf…

JAVA编程学习笔记

常用代码、特定函数、复杂概念、特定功能……在学习编程的过程中你会记录下哪些内容&#xff1f;快来分享你的笔记&#xff0c;一起切磋进步吧&#xff01; 一、常用代码 在java编程中常用需要储备的就是工具类。包括封装的时间工具类。http工具类&#xff0c;加解密工具类&am…