当前位置: 首页 > news >正文

STM32——05-按键、时钟控制、中断复位 点亮LED灯

如何点亮一颗LED灯

 

编程实现点灯

常用的 GPIO HAL 库函数:

void HAL_GPIO_Init ( GPIO_TypeDef * GPIOx , GPIO_InitTypeDef * GPIO_Init );
void HAL_GPIO_WritePin ( GPIO_TypeDef * GPIOx , uint16_t GPIO_Pin , GPIO_PinState
PinState );
void HAL_GPIO_TogglePin ( GPIO_TypeDef * GPIOx , uint16_t GPIO_Pin );

 结构体 GPIO_InitTypeDef 定义:

typedef struct
{
uint32_t Pin ;
uint32_t Mode ;
uint32_t Pull ;
uint32_t Speed ;
} GPIO_InitTypeDef ;    

按键点亮LED灯(轮询法) 

输入(按键):

  • KEY1:PA0
  • KEY2:PA1

输出( LED 灯):

  • LED1:PB8
  • LED2:PB9
    #define KEY_ON 0
    #define KEY_OFF 1
    //自己编写的检测按键返回值的函数
    uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
    {if( HAL_GPIO_ReadPin(GPIOx,GPIO_Pin) == GPIO_PIN_RESET)
    {
    /* 按键按下 */return KEY_ON;
    }
    else
    {
    /* 按键松开 */while(HAL_GPIO_ReadPin(GPIOx, GPIO_Pin) == GPIO_PIN_RESET);return KEY_OFF;
    }
    }while (1)
    {/* USER CODE END WHILE */if(Key_Scan(GPIOA,GPIO_PIN_0) == KEY_ON)HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);if(Key_Scan(GPIOA,GPIO_PIN_1) == KEY_ON)HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_9);/* USER CODE BEGIN 3 */
    }
    四、复位和时钟控制( RCC
  • 复位
    系统复位
    当发生以下任一事件时,产生一个系统复位:
    1. NRST 引脚上的低电平 ( 外部复位 )
    2. 窗口看门狗计数终止 (WWDG 复位 )
    3. 独立看门狗计数终止 (IWDG 复位 )
    4. 软件复位 (SW 复位)
    5. 低功耗管理复位
    电源复位
    当以下事件中之一发生时,产生电源复位:
    1. 上电 / 掉电复位 (POR/PDR 复位 )
    2. 从待机模式中返回
    备份区复位
    备份区域拥有两个专门的复位,它们只影响备份区域。
    当以下事件中之一发生时,产生备份区域复位。
    1. 软件复位,备份区域复位可由设置备份域控制寄存器 (RCC_BDCR)( 6.3.9 ) 中的
    BDRST 位产生。
    2. VDD VBAT 两者掉电的前提下, VDD VBAT 上电将引发备份区域复位。
    时钟控制
    什么是时钟?
    时钟打开,对应的设备才会工作。
    时钟来源
    三种不同的时钟源可被用来驱动系统时钟 (SYSCLK)
    HSI 振荡器时钟(高速内部时钟)
    HSE 振荡器时钟(高速外部时钟)
    PLL 时钟(锁相环倍频时钟)
    二级时钟源 :
    40kHz 低速内部 RC LSIRC )振荡器
    32.768kHz 低速外部晶体( LSE 晶体)
    如何使用 CubeMX 配置时钟
    五、中断和事件
    中断概述
    什么是中断?
    中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的
    程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
    什么是 EXTI
    外部中断 / 事件控制器 (EXTI) 管理了控制器的  23  个中断 / 事件线。每个中断 / 事件线都对应有一
    个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。  EXTI  可以实现对每个中断 /
    件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。
    EXTI  可分为两大部分功能,一个是产生中断,另一个是产生事件,这两个功能从硬件上就有所不
    同。
    产生中断线路目的是把输入信号输入到  NVIC ,进一步会运行中断服务函数,实现功能,这样是软
    件级的。而产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且是电路级别的信号传
    输,属于硬件级的。 EXTI 初始化结构体:
    typedef struct
    {
    // 中断 / 事件线
    uint32_t EXTI_Line ; /*!< Specifies the EXTI lines to be enabled or
    disabled.
    This parameter can be any combination value
    of @ref EXTI_Lines */
    //EXTI 模式
    EXTIMode_TypeDef EXTI_Mode ; /*!< Specifies the mode for the EXTI lines.
    This parameter can be a value of @ref
    EXTIMode_TypeDef */
    // 触发类型
    EXTITrigger_TypeDef EXTI_Trigger ; /*!< Specifies the trigger signal active edge for
    the EXTI lines.
    This parameter can be a value of @ref
    EXTITrigger_TypeDef */
    //EXTI 控制
    FunctionalState EXTI_LineCmd ; /*!< Specifies the new state of the selected EXTI
    lines.
    This parameter can be set either to ENABLE or
    DISABLE */
    } EXTI_InitTypeDef ;

     

    中断 / 事件线:
    # define EXTI_Line0 (( uint32_t ) 0x00001 ) /*!< External interrupt line 0 */
    # define EXTI_Line1 (( uint32_t ) 0x00002 ) /*!< External interrupt line 1 */
    # define EXTI_Line2 (( uint32_t ) 0x00004 ) /*!< External interrupt line 2 */
    # define EXTI_Line3 (( uint32_t ) 0x00008 ) /*!< External interrupt line 3 */
    # define EXTI_Line4 (( uint32_t ) 0x00010 ) /*!< External interrupt line 4 */
    # define EXTI_Line5 (( uint32_t ) 0x00020 ) /*!< External interrupt line 5 */
    # define EXTI_Line6 (( uint32_t ) 0x00040 ) /*!< External interrupt line 6 */
    # define EXTI_Line7 (( uint32_t ) 0x00080 ) /*!< External interrupt line 7 */
    # define EXTI_Line8 (( uint32_t ) 0x00100 ) /*!< External interrupt line 8 */
    # define EXTI_Line9 (( uint32_t ) 0x00200 ) /*!< External interrupt line 9 */
    # define EXTI_Line10 (( uint32_t ) 0x00400 ) /*!< External interrupt line 10 */
    # define EXTI_Line11 (( uint32_t ) 0x00800 ) /*!< External interrupt line 11 */
    # define EXTI_Line12 (( uint32_t ) 0x01000 ) /*!< External interrupt line 12 */
    # define EXTI_Line13 (( uint32_t ) 0x02000 ) /*!< External interrupt line 13 */
    # define EXTI_Line14 (( uint32_t ) 0x04000 ) /*!< External interrupt line 14 */
    # define EXTI_Line15 (( uint32_t ) 0x08000 ) /*!< External interrupt line 15 */
    # define EXTI_Line16 (( uint32_t ) 0x10000 ) /*!< External interrupt line 16
    Connected to the PVD Output */
    # define EXTI_Line17 (( uint32_t ) 0x20000 ) /*!< External interrupt line 17
    Connected to the RTC Alarm event */
    # define EXTI_Line18 (( uint32_t ) 0x40000 ) /*!< External interrupt line 18
    Connected to the USB OTG FS Wakeup from suspend event */
    # define EXTI_Line19 (( uint32_t ) 0x80000 ) /*!< External interrupt line 19
    Connected to the Ethernet Wakeup event */
    # define EXTI_Line20 (( uint32_t ) 0x00100000 ) /*!< External interrupt line 20
    Connected to the USB OTG HS (configured in FS) Wakeup event */
    # define EXTI_Line21 (( uint32_t ) 0x00200000 ) /*!< External interrupt line 21
    Connected to the RTC Tamper and Time Stamp events */
    # define EXTI_Line22 (( uint32_t ) 0x00400000 ) /*!< External interrupt line 22
    Connected to the RTC Wakeup event */

 EXTI模式:

typedef enum
{
EXTI_Mode_Interrupt = 0x00 , // 产生中断
EXTI_Mode_Event = 0x04 // 产生事件
} EXTIMode_TypeDef ;

触发类型:

typedef enum
{
EXTI_Trigger_Rising = 0x08 , // 上升沿
EXTI_Trigger_Falling = 0x0C , // 下降沿
EXTI_Trigger_Rising_Falling = 0x10 // 上升沿和下降沿都触发
} EXTITrigger_TypeDef ;
EXTI 控制:
使能 EXTI ,一般都是使能, ENABLE
什么是优先级?
抢占优先级和响应优先级的区别:
高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行
什么是优先级分组?
        Cortex-M3 允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此 STM32
指定中断优先级的寄存器位减少到 4 位,这 4 个寄存器位的分组方式如下:
0 组:所有 4 位用于指定响应优先级
1 组:最高 1 位用于指定抢占式优先级,最低 3 位用于指定响应优先级
2 组:最高 2 位用于指定抢占式优先级,最低 2 位用于指定响应优先级
3 组:最高 3 位用于指定抢占式优先级,最低 1 位用于指定响应优先级
4 组:所有 4 位用于指定抢占式优先级
什么是 NVIC
        STM32 通过中断控制器 NVIC Nested Vectored Interrupt Controller )进行中断的管理 。
NVIC 是属于 Cortex 内核的器件,不可屏蔽中断( NMI )和外部中断都由它来处理,但是 SYSTICK
不是由 NVIC 控制的。
typedef struct
{
uint8_t NVIC_IRQChannel ;
uint8_t NVIC_IRQChannelPreemptionPriority ; // 抢断优先级
uint8_t NVIC_IRQChannelSubPriority ; // 响应优先级
FunctionalState NVIC_IRQChannelCmd ;
} NVIC_InitTypeDef ;
什么是中断向量表?
每个中断源都有对应的处理程序,这个处理程序称为中断服务程序,其入口地址称为中断向
量。所有中断的中断服务程序入口地址构成一个表,称为中断向量表;也有的机器把中断服务程
序入口的跳转指令构成一张表,称为中断向量跳转表。
按键点亮 LED 灯(中断法)
1. 配置时钟
1.1打开串口

 1.2打开外部时钟晶振

1.3 设置总线

2. 配置 GPIO
2.1LED灯         并拉高电平初始为灯灭

 2.2按键(配置按键为外部中断模式) 

3. 使能中断
4. 配置工程

相关文章:

STM32——05-按键、时钟控制、中断复位 点亮LED灯

如何点亮一颗LED灯 编程实现点灯 常用的 GPIO HAL 库函数&#xff1a; void HAL_GPIO_Init ( GPIO_TypeDef * GPIOx , GPIO_InitTypeDef * GPIO_Init ); void HAL_GPIO_WritePin ( GPIO_TypeDef * GPIOx , uint16_t GPIO_Pin , GPIO_PinState PinState ); void HAL_GPIO_Togg…...

VBA下载二进制文件,文本读写

这里使用了vba如下两个对象&#xff1a; Microsoft.XMLHTTP&#xff1a;文件读写&#xff0c;可读写二进制&#xff0c;可指定编码,对于utf-8编码文本文件使用FSO的TextStream对象打开&#xff0c;读取到的内容可能会出现乱码&#xff0c;可以使用该对象打开;前期绑定添加引用…...

MongoDB结合Robo 3T 1.4.3的简单操作

MongoDB的简单操作结合Robo 3T 1.4.3工具进行查询。 常用的正则表达式 /* 29 */ 正则表达式 /\* [0-9]* \*/ "_id" : ObjectId("5f3d05cdfd2aa9a8a7"), 正则表达式 \"([^\"]*_id)\".*, 使用方法&#xff1a;查询结果去掉注释和不需要…...

【学习笔记】[AGC048D] Pocky Game

这是一个非平等博弈。但是只要求你判断胜负&#xff0c;本身也不是一道结论题&#xff0c;所以可以用 D P DP DP来解决。 结论&#xff1a;第一堆石子剩的越多&#xff0c;先手玩家获胜的概率越大。这直接引出了一个非常感性的结论&#xff1a;每次取石子时要么取一堆&#xf…...

Qgis中进行Shp和Excel属性连接实现百强县公共预算空间分析

前言 在之前的博文中&#xff0c;将2022的全国百强县一般公共预算收入的数据下载到了本地&#xff0c;博客原文地址&#xff1a;一种使用Java的快速将Web中表格转换成Excel的方法。对于不关注时空位置关系的一般分析&#xff0c;到此也就基本够用了。但是&#xff0c;如果站在全…...

ES6 新增的循环方法

在 ES6&#xff08;ECMAScript 2015&#xff09;中&#xff0c;新增了一些循环方法&#xff0c;这些方法可以帮助我们更方便地遍历数组、字符串、Set、Map 等数据结构。本文将介绍一些常用的 ES6 循环方法。 for…of 循环 for…of 循环是一种遍历可迭代对象的方法&#xff0c…...

移动端事件300ms延迟解决

有移动端与PC端的项目开发&#xff0c;那么移动端和PC端开发上是存在差异的&#xff0c;比如 click 事件的300ms 延迟&#xff0c;即移动Web页面上的click事件响应都要慢上300ms&#xff0c;移动设备访问Web页面时往往需要 “双击” 或者 “捏开” 来放大页面看清页面的具体内容…...

NRF52832的DFU

开发环境&#xff1a; Winsodw&#xff1a;10 nRF5_SDK&#xff1a;17.1.0 1 工具安装 1.1 gcc-arm-none-eabi Downloads | GNU Arm Embedded Toolchain Downloads – Arm Developer 下载“gcc-arm-none-eabi-10.3-2021.10-win32.exe”&#xff0c;接提示安装。注意安装完…...

开源WebRTC库放大器模式在采集桌面图像时遇到的DPI缩放与内存泄漏问题排查

目录 1、在非100%的显示比例下放大器采集到的桌面图像不全问题 1.1、通过manifest文件禁止系统对软件进行缩放 1.2、调用SetThreadDpiAwarenessContext函数&#xff0c;禁止系统对目标线程中的窗口进行缩放 1.3、使用winver命令查看Windows的年月版本 2、使用放大器模式遇…...

敲黑板!java反射机制和原理

获取Class对象&#xff1a;首先&#xff0c;你需要获取表示要操作的类的Class对象。可以使用以下三种方式之一来获取Class对象&#xff1a; Class.forName()方法&#xff1a;使用类的全限定名获取Class对象&#xff0c;例如&#xff1a;Class<? Class<?> clazz MyC…...

【大数据工具】HBase 集群搭建与基本使用

HBase 集群搭建 HBase 安装包下载地址&#xff1a;https://archive.apache.org/dist/hbase/ 安装 HBase 的前提&#xff1a; ZooKeeper 集群 OKHadoop 集群 OK 1. HBase 集群安装 1. 将 HBase 软件包上传至 Hadoop0 解压并重命名 使用 FileZilla 将 hbase-1.3.1-bin.tar.g…...

【Java】数组详解

文章目录 一、数组的基本认识1.1 数组的概念1.2数组的创建与初始化1.3 数组的使用 二、数组的类型 — 引用类型2.1 JVM 内存分布2.2 什么是引用类型2.3 基本类型变量与引用类型变量的区别2.4 Java 中的 null 三、数组的应用3.1 保存数据3.2 函数参数3.3 函数返回值 一、数组的基…...

NumPy库的学习

本文主要记录的是笔者在B站自学Numpy库的学习笔记。 引入numpy库 import numpy as np矩阵的创建 创建一个二行三列的矩阵。 array np.array([[1,2,3],[2,3,4]])查看array的行数、形状、元素数量 print("number of dim:",array.ndim) print("shape:"…...

CentOS安装IRIS

最近电脑提搞了&#xff0c;可以无顾虑创建虚拟机了&#xff0c;试一下在Linux安装IRIS&#xff0c;适用CentOS7.6上安装Intersystem公司的IRIS数据库&#xff0c;资料基本是空白&#xff0c;分享一下。 首先安装解压软件unzip和libicu&#xff0c;最小化安装的缺&#xff0c;…...

华为OD机试真题 JavaScript 实现【最多几个直角三角形】【2023Q1 100分】

一、题目描述 有 N 条线段&#xff0c;长度分别为 a[1]-a[n]。 现要求你计算这 N 条线段最多可以组合成几个直角三角形&#xff0c;每条线段只能使用一次&#xff0c;每个三角形包含三条线段。 二、输入描述 第一行输入一个正整数 T (1< T< 100) &#xff0c;表示有…...

vue3中的reactive、ref、toRef和toRefs

目录 reactivereactive的实现原理使用reactive的注意事项 refref的实现原理使用ref的注意事项 toRef和toRefsref和reactive的使用比较 reactive reactive用于创建响应式对象&#xff0c;它返回一个对象的响应式代理。即&#xff1a;它返回的对象以及其中嵌套的对象都会通过 Pr…...

数字图像处理与Python实现-图像增强经典算法汇总

图像增强经典算法汇总 文章目录 图像增强经典算法汇总1、像素变换2、图像逆变换3、幂律变换4、对数变换5、图像均衡化6、对比度受限自适应直方图均衡(CLAHE)7、对比度拉伸8、Sigmoid校正9、局部对比度归一化10、总结本文将对图像增强经典算法做一个简单的汇总。图像增强的经典…...

tag提示词总结

顺序的权重 越靠前的tag权重越大&#xff0c;越靠后的tag权重越小经验来讲&#xff0c;将图像质量相关的tag放在前面&#xff0c;例如masterpiece&#xff0c;best quality等&#xff1b;接着添加主体画风等&#xff1b;最后添加一些不太重要的细节 权重增减 (tag)&#xff1a…...

微信小程序原生开发功能合集二十:导航栏、tabbar自定义及分包功能介绍

本章实现导航栏及tabbar的自定义处理的相关方法介绍及效果展示。   另外还提供小程序开发基础知识讲解课程,包括小程序开发基础知识、组件封装、常用接口组件使用及常用功能实现等内容,具体如下:    1. CSDN课程: https://edu.csdn.net/course/detail/37977    2. 5…...

高通 Camera HAL3:项目开发技术点总结

做高通 Camera HAL3开发的一些技术点的总结、整理。 做个记录&#xff0c;方便后续查阅。 1.目录、so、配置文件 productName是项目名 out Target路径&#xff1a;\out\target\product\productName\chi-cdk&#xff1a;\vendor\qcom\proprietary\chi-cdk\ldc node&#xff1…...

chatgpt赋能python:Python怎么删除列表中的最大值和最小值

Python怎么删除列表中的最大值和最小值 在Python中&#xff0c;一个列表&#xff08;List&#xff09;是一种非常常见的数据结构&#xff0c;它允许我们以有序的方式存储和访问数据。但是&#xff0c;有时候我们需要从列表中删除最大或最小的值&#xff0c;以满足我们的特定需…...

简述Vue的生命周期以及每个阶段做的事情

03_简述Vue的生命周期以及每个阶段做的事情 思路 给出概念 列举出生命周期各个阶段 阐述整体流程 结合实际 扩展&#xff1a;vue3变化 回答范例 每个vue组件实例被创建后都会经过一系列步骤。比如它需要数据观测、模板编译、挂载实例到dom、以及数据变化的时候更新dom、…...

LeetCode-C#-0004.寻找两个正序数组的中位数

0.声明 该题目来源于LeetCode 如有侵权&#xff0c;立马删除。 解法不唯一&#xff0c;如有新解法可一同讨论。 1.题目 0004寻找两个正序数组的中位数 给定两个大小分别为m和n的正序&#xff08;从小到大&#xff09;数组nums1和nums2。 请你找出并返回着两个正序数组的中位…...

Vue.js 中的 $emit 和 $on 方法有什么区别?

Vue.js 中的 $emit 和 $on 方法有什么区别&#xff1f; 在 Vue.js 中&#xff0c;$emit 和 $on 方法是两个常用的方法&#xff0c;用于实现组件间的通信。它们可以让我们在一个组件中触发一个自定义事件&#xff0c;并在另一个组件中监听这个事件&#xff0c;从而实现组件间的…...

LAZADA平台的商品评论Python封装API接口接入文档和参数说明

LAZADA是一个位于东南亚的电商平台&#xff0c;成立于2012年。该平台覆盖的国家包括新加坡、马来西亚、印尼、菲律宾、泰国和越南等地。它提供了一个多样化的产品选择&#xff0c;包括时尚、美容、数码、母婴等商品&#xff0c;并且拥有许多知名品牌的官方旗舰店。同时&#xf…...

云原生Docker镜像管理

docker是什么&#xff1f; docker是一个go语言开发的应用容器引擎。 docker的作用&#xff1f; ①运行容器里的应用&#xff1b; ②docker是用来管理容器和镜像的一种工具。 #容器 与 虚拟机 的区别&#xff1f; 容器虚拟机所有容器共享宿主机内核每个虚拟机都有独立的操…...

ChatGPT+小红书的8种高级玩法

掌握了这套万能命令&#xff0c;让你快速做出小红书爆款文案! 一、用ChatGPT做定位 我是一个大龄的普通人&#xff0c;没有什么特殊的技能&#xff0c;接下来&#xff0c;请你作为一位小红书的账号定位专家&#xff0c;通过与我对话的方式&#xff0c;为我找到我的小红书账号定…...

shell脚本学习记录1(运算符)

Shell 传递参数 我们可以在执行 Shell 脚本时&#xff0c;向脚本传递参数&#xff0c;脚本内获取参数的格式为&#xff1a;$n。n 代表一个数字&#xff0c;1 为执行脚本的第一个参数&#xff0c;2 为执行脚本的第二个参数&#xff0c;以此类推…… 以下实例我们向脚本传递三个…...

vector 迭代器失效问题

vector 迭代器失效 迭代器的主要作用就是让算法能够不用关心底层数据结构&#xff0c;其底层实际就是一个指针&#xff0c;或者是对指针进行了封装&#xff0c;比如&#xff1a;vector的迭代器就是原生态指针T* 。因此迭代器失效&#xff0c;实际就是迭代器底层对应指针所指向…...

docker使用与服务器上的可视化(ROS rviz等)

1.安装docker 安装docker&#xff1a;官网教程&#xff0c;按照官网命令一步步来即可。 添加当前用户到docker用户组&#xff1a; 【docker】添加用户到docker组&#xff0c;这样后面运行docker的时候前面不需要加sudo命令&#xff0c;否则运行docker的时候一直需要在前面加su…...

公司网站做优化/新浪舆情通官网

action是什么&#xff1f;action是获得form表单数据 再去处理的类为什么要有action&#xff1f;因为在servlet中往往会出现使用一个servlet处理多个功能&#xff0c;比如登陆功能&#xff0c;注册功能&#xff0c;浏览功能等&#xff0c;这样action就是必不可少的了怎么去使用a…...

南京做网站的网络公司排名/网站排名软件利搜

本文摘自深入理解 Java 虚拟机第三版 对象的创建 Java 是一门面向对象的语言&#xff0c;Java 程序运行过程中无时无刻都有对象被创建出来。从语言层面看&#xff0c;创建对象只是一个 new 关键字而已&#xff0c;而在虚拟机中&#xff0c;对象&#xff08;仅限于普通 Java 对…...

哪种语言的网站 做seo更好/百度百科入口

指针的偏移值是多少取决于指针的类型&#xff1a; int a 10; char c A;int *p; char *p2;p &a; p2 &c;//p &#xff08;自身运算&#xff09;之后再加1 printf("a的地址的打印:%p\n",p); //p &#xff08;自身加1运算&#xff09;之后再下一步 …...

炉火建站/整站优化seo

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者前言在上一篇文章中&#xff0c;壹哥给大家讲解了Java中的数据类型&#xff0c;从此大家就知道了基本类型和引用类型&#xff0c;尤…...

徐州鸿美网站建设/网站分析案例

说实话&#xff0c;还真有点紧张 毕竟刚毕业一年吗&#xff0c;上一家公司 主要是入门&#xff0c;而且是行业软件。然而这家公司有些不同&#xff0c;电子商务&#xff0c;互联网转载于:https://www.cnblogs.com/haihang/p/3498753.html...

网站建站的标准/重庆seo网页优化

1、Base64编码介绍Base64不能称为加解密算法&#xff0c;Base64编码可以把二进制数据转换为可打印的ASCII字符&#xff0c;常用于email消息中的二进制数据编码和HTTP协议中的basic认证。Base64编码之后的ASCII字符串包括64个可打印字符&#xff0c;如下&#xff1a;26个大写字母…...