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

嵌入式学习笔记——使用寄存器编程操作GPIO

使用寄存器编程操作GPIO

  • 前言
  • GPIO相关的寄存器
    • GPIO 端口模式寄存器 (GPIOx_MODER) (x = A..I)
      • 位操作
    • GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x = A..I)
    • GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) (x = A..I/)
    • GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR) (x = A..I/)
    • GPIO 端口输入数据寄存器 (GPIOx_IDR) (x = A..I)
    • GPIO 端口输出数据寄存器 (GPIOx_ODR) (x = A..I)
    • GPIO 端口置位/复位寄存器 (GPIOx_BSRR) (x = A..I)
    • GPIO 端口配置锁定寄存器 (GPIOx_LCKR) (x = A..I)
    • GPIO 复用功能低位寄存器 (GPIOx_AFRL) (x = A..I)
    • GPIO 复用功能高位寄存器 (GPIOx_AFRH) (x = A..I)
    • 小结
  • 使用寄存器编程控制LED灯的亮灭
    • 原理图分析
    • MDK代码编程
  • 总结

前言

上一篇重点介绍了STM32 GPIO的输入输出模式,在整个框图中我们发现需要我们使用代码来控制GPIO的模式,本文的重点就是使用寄存器的编程方式,实现对于GPIO口的操作。
在这里首先需要做一个区分,我们常见的STM32的开发方式有两种,也就是寄存器开发与库函数开发。寄存器开发就是直接操作底层的寄存器来实现功能,而库函数,则是使用ST的官方库函数来实现功能,目前常用的库有基础库、HAL库、LL库。此系列都会采用直接操作寄存器的方式来实现功能。

GPIO相关的寄存器

既然是操作寄存器实现功能,就要知道与GPIO相关的寄存器有哪些,根据昨天的GPIO口模式以及框图我们可以大致猜出几个寄存器。
1.输入输出模式选择的寄存器;用来确定GPIO是输入模式还是输出模式;
2.输出类型选择的寄存器;用来选择是推挽还是开漏;
3.输出数据寄存器,暂存MCU输出的数字量;
4.输入数据寄存器,暂存外设输入的数字量;
5.上拉下拉寄存器,设置GPIO的上下拉模式;

没看手册之前,我们根据GPIO的功能以及结构猜测的有上面这五个寄存器,下面我们来看看编程手册关于GPIO的寄存器到底有哪些,又该怎么使用。
官方编程手册关于GPIO的寄存器介绍如下:
在这里插入图片描述
每个通用IO都有十个寄存器与之对应,在中文编程手册的第七章有关于这些寄存器的详细描述。
在这里插入图片描述
接下来我们来一一看一下这些寄存器的具体作用以及配置方式。

GPIO 端口模式寄存器 (GPIOx_MODER) (x = A…I)

端口模式寄存器,就是控制整个端口的模式,通过写入不同的高低电平来区分对应管脚是输入还是输出,(GPIOx_MODER) 这个中间的x就代表从A—I的端口号(x = A…I),也就是说一块STM32最多只有9个端口模式寄存器。
它是一个32位的寄存器,前面我们提当过,STM32的一个端口有0-15共16个管脚,而这个端口模式寄存器又是32位的,这就说明每个管脚的模式控制有
32/16=2位二进制数来实现。如下图所示就是端口模式的寄存器(中文编程手册第七章7.4 节 GPIO 寄存器):
在这里插入图片描述
整个寄存器一共是0-31共32位,其中第0位与第1位下面写着MODER0[1:0],这个MODER0就代表是该端口对应的0号管脚模式控制,其中00表示输入模式(复位状态也是此模式),01表示通用输出模式,10表示复用功能,11表示模拟功能。依次类推,此寄存器的第2位第三位表示该端口的1号管脚的模式控制,剩下的也都是依次类推,直至第30位与31位代表第16号管脚的模式控制。细心的同学肯定已经发现了,这个寄存器实现的功能就是我们根据结构图分析出来的第一个寄存器所需的功能啊,它就解决了GPIO口的模式问题。
举个栗子:假设我们要将GPIOA的10号管脚配置为复用功能模式,这时候我们就需要找到MODER10[1:0],,然后将复用输出模式的10写进这个寄存器。
这里就会产生一个新问题,要怎么将数据写入寄存器呢,首先能够想到的肯定是需要赋值,那么怎么赋值呢,我们来分析一下。

位操作

首先这个寄存器的命名ST公司已经给我们做好了,就在我们之前搭建工程时使用的使用的stm32f4xx.h中,这里给大家截图在下面:
在这里插入图片描述
而且ST公司还利用宏定义给出了每个端口对应结构体的指针名。
在这里插入图片描述
可以看出所有的寄存器都是用的一个结构体给封装起来了,我们要调用赋值的话就可以按照下面的语句来实现操作,这里使用的是结构体指针名->成员名的方式来操作各个寄存器的。
还是以GPIOA端口的10号管脚配置为复用输出为例:

GPIOA ->MODER |= (1<<21); //GPIOA_MODER寄存器配置为复用模式
//经过此步骤,MODER10[1:0]的数据就被覆盖成为了10,也就是手册中的复用模式。
//这里的1左移21位就是依据移位操作来实现的,由于MODER10对应的寄存器位数就是20位与21位,其中,第21位需要写1,所以我们就需要将1左移21位到此位置。

换做其他管脚也是类似的操作,再举个例子,我们将GPIOC的4号管脚配置为通用输出模式,此时需要的操作如下:

GPIOC->MODER |= (1<<8); //GPIOA_MODER寄存器配置为通用输出模式
//经过此步骤,MODER4[1:0]的数据就被覆盖成为了01,也就是手册中的通用输出模式。
//这里的1左移8位就是依据移位操作来实现的,由于MODER4对应的寄存器位数就是8位与9位,其中,第8位需要写1,所以我们就需要将1左移8位到此位置。

上面都是写1操作,用的是|,我们再举一个清零操作的例子,将GPIOA0配置为输入模式,此时就需要对MODER0进行清零操作,具体写法如下:

	GPIOA ->MODER &=~(3<<0);//清0  GPIOA_MODER寄存器为00通用输入模式这里我们使用的是&=~的操作,3转换为二进制就是11,11左移0位,还是11,然后对11进行取反,变成00,再将00赋值给MODER,这样GPIOA_MODER0就被赋值成为了00,也就是将GPIOA0配置为了输入模式。

好了,到这里整个寄存器操作的赋值语句就学完了,就是一个赋值为一一个赋值为0的操作,两条语句,后面所有需要置一与清零的操作都是用的这个方法来实现的。

GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x = A…I)

我们再来看看GPIO的第二个寄存器,端口输出类型寄存器,既然是输出类型寄存器,说明我们如果再上一个寄存器中将GPIO口配置为输入模式后,这个寄存器就可以不用操作了。
这个寄存器就是用来实现对输出模式的控制的,我们根据结构图分析出来的第二个寄存器的功能是不是与这个寄存器不谋而合呢,我们来看看手册中的描述,如下图所示:
在这里插入图片描述
在这里插入图片描述
有了上一个寄存器的经验,再看这个是不是就很清晰了,首先这个寄存器的高16位是保留的没有使用,后面的0-15共16位是不是刚好一位对应一个管脚号,也就是说OT0对应的就是0号管脚,OT15对应的就是15号管脚,然后注意下面的描述,配置为0的时候是推挽模式,而1的时候是开漏模式。
还是举个栗子吧,假设我们需要将GPIOC的4号脚配置为推挽模式,此时就该向OTC4写入0;参照上面的代码操作,就是如下代码:

	GPIOC->OTC &=~(1<<4);//清0  GPIOA_OTC4寄存器为0推挽输出模式

GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) (x = A…I/)

然后是GPIO的第三个寄存器,GPIOx_OSPEEDR,端口输出速度寄存器,同理,由于是输出寄存器,所以如果在第一个寄存器中已经将端口配置为输入则再后续配置过程中不再需要操作本寄存器。
同样的,这个寄存器也是一个32位的寄存器,而且也是和第一个端口模式寄存器一样的,使用的是两个二进制位来控制一个管脚。这个寄存器是我们之前通过结构图所没能分析出来的,他主要作用就是控制IO的电平翻转速度。
在这里插入图片描述
根据手册的描述,我们还是举例将GPIOC端口的4号管脚配置为中速输出,首先在上图中找到OSPEEDR4[1:0],它对应的二进制位是第八位和第九位,配置为中速也就是25MHZ的输出速度,需要对这两位写入01,具体操作如下:

	GPIOC->OSPEEDR |= (1<<8);//25MHZ中速

GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR) (x = A…I/)

再然后就是第四个寄存器了,端口上拉下拉寄存器GPIOx_PUPDR,他的作用就是我们前面分析结构图提到的可以通过软件编程来实现IO内部上下拉功能的控制寄存器,通过配置它可以实现GPIO口的内部上下拉。此寄存器也是每两位二进制数控制一个管脚。
在这里插入图片描述
在这里插入图片描述
如上图所示,根据数据手册的描述,我们将GPIOA0设置为无上下拉模式,操作如下:找到对应0端口的控制位是第0位和第1位,要配置为无上下拉模式,就需要对这两位写入00。代码操作如下:

GPIOA ->PUPDR &=~(3<<0);//清0  GPIOA_PUPDR寄存器为00 浮空

GPIO 端口输入数据寄存器 (GPIOx_IDR) (x = A…I)

然后再来看个稍微不一样一点的,输入数据寄存器,说它不一样主要是因为他是一个只读寄存器,也就是说,我们对它的操作只有读取,没有上面的赋值操作了,至于怎么读,我们放到明天的按键操作进行描述;根据编程手册可以看出,它也是一个一位代表一个端口号的寄存器。另外就是他是输入寄存器,说明我们在配置GPIO为输出模式时,是不需要操作此寄存器的,在这里我们只需要了解这么多,至于怎么编程控制我们后面再说。
在这里插入图片描述

GPIO 端口输出数据寄存器 (GPIOx_ODR) (x = A…I)

可以看出这个寄存器的名字和上一个输入寄存器的名字刚好对应,它的作用就是将对应位上的值输出到GPIO口上,直白说就是对它写1对应管脚就是输出高电平,对它写0对应管脚就会输出低电平,同样的,它的命名是输出,说明配置输入时跟与它就没有关系了;它也是单个二进制位控制一个管脚。此寄存器在昨天的框图中也有提到过,属于输出框图里面的,他对应的有两个输入,一个是直接和内核通信,另外一个输入方式内核需要经过置位复位控制器来间接控制端口输出寄存器。
在这里插入图片描述
这里举个栗子,假设我们需要GPIOC4输出高电平,我们就需要对GPIO->ODR的第 4 位写1;具体编程操作如下:

GPIOC->ODR |= (1<<4);

GPIO 端口置位/复位寄存器 (GPIOx_BSRR) (x = A…I)

再上一个寄存器中我们提到了这个端口置位复位寄存器,从名称中我们可以看出他的作用是对对应的管脚的ODR寄存器进行置零和置一操作。
手册中关于这个寄存器的描述如下,它也是一个32位寄存器,但是区分了高16位和低16位,其中高16位表示BR0-----BR15也就是管脚0-15的复位操作,对对应管脚写1,其ODR寄存器就会进行复位,写0就不操作。
而第十六位是BS0-----BS15控制的是0–15号管脚的置位功能,同样写入1就对对应的ODR寄存器置1,写0就不操作。
可以发现这个寄存器的作用与上面的ODR寄存器其实功能一致,只是内核通过操作此寄存器间接操作ODR,所以在正常使用过程中很少用到这个寄存器,一般都是使用内核直接操作ODR寄存器来实现。
在这里插入图片描述

GPIO 端口配置锁定寄存器 (GPIOx_LCKR) (x = A…I)

关于此寄存器,其作用是配置后锁定后,我们后面所有的对对应GPIO口的操作都无效了,但是实际使用过程中,关于GPIO口的配置经常是需要操作的,所以这个寄存器也很少使用到。想要了解的同学去手册自己瞄一眼就可以了。
在这里插入图片描述
然后是最后两个寄存器,他们是配置GPIO口的复用功能的,由于GPIO口的复用功能非常丰富,为了实现更多的功能,ST公司设计了两个复用功能寄存器,一个是复用功能低位寄存器另一个是复用功能高位寄存器它们两个寄存器都是32位寄存器,每个寄存器分管8个IO口的复用模式,复用功能低位寄存器 (GPIOx_AFRL) 控制0-----7管脚的复用功能;复用功能高位寄存器 (GPIOx_AFRH) 控制8----15管脚的复用功能;也就是说在复用功能配置这里,每个管脚有四个二进制位进行控制,一共有AF0-----AF15共16中复用模式,在配置具体的复用模式时,需要根据引脚映射表来查询具体的是AFX,然后根据下面的AFX对应的数据写入即可,具体的使用我们在后面的片上外设复用使用中再做具体介绍。由于是复用功能,所以在通用模式时我们用不上这个寄存器,只有需要使用复用功能时才需要用到。

GPIO 复用功能低位寄存器 (GPIOx_AFRL) (x = A…I)

在这里插入图片描述

GPIO 复用功能高位寄存器 (GPIOx_AFRH) (x = A…I)

在这里插入图片描述

小结

至此,我们已经看完了所有的GPIO寄存器,一共是10个,但是在实际使用中,我们需要用到寄存器并没有那么多,需要对应模式进行选择,最终关于对应模式的GPIO寄存器配置可以总结为下表:
在这里插入图片描述
在这里插入图片描述
表中打X的表示不用配置,举个栗子,配置通用推挽输出(不带上下拉),这时候的配置步骤:

伪代码:
配置某一个IO口为通用推挽输出模式所需要的GPIO寄存器
{1.对应位的MODER配置为01——————————通用输出2.对应位的OTYPER配置为0——————————推挽输出3.对应位的OSPEEDR配置为(01)—————25Mhz中速(这个不一定,按照自己的需求)4.对应位的PUPDR配置为00——————————无上下拉5.对应位的ODR    配置为0——————————输出低电平; 配置为1——————————输出高电平
}

使用寄存器编程控制LED灯的亮灭

看完上面的寄存器介绍,我们对于整个配置流程已经有了一个了解,接下里就是使用MDK编写代码实现我们想要的功能,今天我们先控制一个LED灯。

原理图分析

首先笔者这里用的板子的LED小灯电路图如下图所示,根据原理图可以得出,我们给PA6低电平LED1就点亮,给PA6高电平,LED1就熄灭。
在这里插入图片描述

MDK代码编程

打开我们在嵌入式学习笔记——STM32单片机开发前的准备http://t.csdn.cn/PF8Y9中搭建好的工程,(没有搭好的可以私信获取);
1.打开后新建一个Led.c文件到USER下的src的文件夹下;
2.新建一个Led.h文件到USER下的inc文件夹下;
在这里插入图片描述
3.添加Led.c进入工程,双击1所示的USER,在弹出的框内2的位置打开src文件夹,选中Led.c电机Add即可。
在这里插入图片描述
4.编写Led.h头文件,注意头文件的分区,保持一个好的格式风格。
在这里插入图片描述

#ifndef _LED_H__
#define _LED_H__
//包含头文件区
#include "stm32f4xx.h"//此头文件每个子模块的.h都必须包含
/*----------------------------------------------------------*/
//宏定义区
/*----------------------------------------------------------*/
//函数声明区
/*----------------------------------------------------------*/
#endif

5.编写Led.c文件,首先第一步添加"Led.h",使头文件与源文件联系起来,然后就是编写初始化函数,具体的初始化过程我们参考上面的伪代码来进行配置。
在这里还需要特别注意的一步是,在编写上面的伪代码之前还需要开启对应GPIOA挂接的时钟使能。
查询步骤:
1.看片内外设的结构框图,找GPIOA对应的时钟线,数据手册第二章,如下图所示,GPIOA对应的就是AHB1总线;
在这里插入图片描述
2.在编程手册查找AHB1对应的使能寄存器,如下图所示:
在编程手册第六章,最后一节,可以看见这个寄存器的第0位就是GPIOA的时钟,将他配置为1即可打开GPIOA的时钟,具体代码实现如下:

//打开GPIOA端口对应的AHB1时钟
RCC->AHB1ENR |= (1<<0);

在这里插入图片描述

#include "Led.h"/*******************************************
*函数名    :Led_Init
*函数功能  :LED灯所用的管脚的初始化配置
*函数参数  :无
*函数返回值:无
*函数描述  :
LED1--------PA6--------低电平亮,通用输出模式
*********************************************/
void Led_Init(void)
{//打开GPIOA端口对应的AHB1时钟RCC->AHB1ENR |= (1<<0);/*端口模式清零*/GPIOA->MODER &= ~(3<<12);/*端口通用输出模式*/GPIOA->MODER |= (1<<12);/*端口输出推挽模式*/GPIOA->OTYPER &= ~(1<<6);/*端口输出速度2MHz*/GPIOA->OSPEEDR &= ~(3<<12);//清零OSPEEDRGPIOA->OSPEEDR |= (1<<12);//25MHZ中速GPIOA->PUPDR   &= ~(3<<12);//默认无上下拉/* 端口输出寄存器*/
//	GPIOA->ODR|=(0xf<<6);//置1拉高对应端口,灯灭
}

在这里插入图片描述
6.然后在main.c首先包含Led.h到main.h中:添加一句#include"Led.h";
在这里插入图片描述
再在main.c中调用Led_Init()初始化函数,并对ODR寄存器写0点亮LED1;
在这里插入图片描述

代码:

#include "main.h"int main(void)
{
/*------------------变量定义区--------------------------*//*------------------初始化外设区------------------------*/Led_Init();GPIOA->ODR&=~(0xf<<6);//置零拉低对应端口,灯亮
/*------------------单次运行区--------------------------*/	while(1)//防止程序跑飞{
/*------------------主循环区--------------------------*/			}}

7.点击1全编译,如果出现2所示的0errors0warings,表示代码没问题了,
8.选择下载器:笔者使用的是ST-LINK,操作如下:选择3所示的魔法棒,选择4Debug,选择ST-LINK,然后点击确定。
在这里插入图片描述
9.点击烧录,等待下方进度条为百分百,表示烧录完毕。
在这里插入图片描述
10.点击板子上的复位或者重新上电,小灯已经被点亮。
在这里插入图片描述

总结

至此,关于GPIO的寄存器配置以及一个简单的代码编程已经完成了,后面一篇我们再来尝试配置输入模式的编程过程,本文篇幅也很长,如有不足,希望大家指出,寄存器的详细介绍,大家可以去编程手册查看。

相关文章:

嵌入式学习笔记——使用寄存器编程操作GPIO

使用寄存器编程操作GPIO前言GPIO相关的寄存器GPIO 端口模式寄存器 (GPIOx_MODER) (x A..I)位操作GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x A..I)GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) (x A..I/)GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR) (x A..I/)GPIO 端口输入数据寄…...

图像的读取与保存

图像是由一个个像素点组成&#xff0c;像素点就是颜色点&#xff0c;而颜色最简单的方式就是用RGB或RGBA表示图像保存图像将像素信息按照 一定格式&#xff0c;一定顺序&#xff08;即编码&#xff09; 存在硬盘上的 二进制文件 中保存图像需要以下必要信息&#xff1a;1. 文件…...

【蓝桥杯集训·每日一题】AcWing 4074. 铁路与公路

文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴Floyd 算法Spfa 算法一、题目 1、原题链接 4074. 铁路与公路 2、题目描述 某国家有 n 个城市&#xff08;编号 1∼n&#xff09;和 m 条双向铁路。 每条铁路连接两个不同的…...

网络:TCP与UDP相关知识(详细)

目录&#xff1a;1、UDP 和 TCP 的特点与区别2、UDP 、TCP 首部格式3、TCP 的三次握手和四次挥手4、TCP 的三次握手&#xff08;为什么三次&#xff1f;&#xff09;5、TCP 的四次挥手&#xff08;为什么四次&#xff1f;&#xff09;6、TCP 长连接和短连接的区别7、TCP粘包、拆…...

不好!有敌情,遭到XSS攻击【网络安全篇】

XSS&#xff1a;当一个目标的站点&#xff0c;被我们用户去访问&#xff0c;在渲染HTMl的过程中&#xff0c;出现了没有预期到的脚本指令&#xff0c;然后就会执行攻击者用各种方法注入并执行的恶意脚本&#xff0c;这个时候就会产生XSS。 涉及方&#xff1a; 用户&#xff0…...

Mysql中Explain详解及索引的最佳实践

Mysql中Explain详解及索引的最佳实践1.Explan工具的介绍1.1 Explan 分析示例1.2 Explain中的列1.2.1 id1.2.2 select_type1.2.3 table1.2.4 partitions1.2.5 type1.2.6 possible_keys1.2.7 key1.2.8 key_len1.2.9 ref1.2.10 rows1.2.11 filtered1.2.12 Extra1.Explan工具的介绍…...

JavaScript 内的 this 指向

在 javascript 语言中, 有一个奇奇怪怪的 “关键字” 叫做 this为什么说它是 奇奇怪怪 呢, 是因为你写出 100 个 this, 可能有 100 个解释, 完全不挨边&#xff0c;但是, 在你的学习过程中, 搞清楚了 this 这个玩意, 那么会对你的开发生涯有很大帮助的&#xff0c;接下来咱们就…...

Java多种方法实现等待所有子线程完成再继续执行

简介 在现实世界中&#xff0c;我们常常需要等待其它任务完成&#xff0c;才能继续执行下一步。Java实现等待子线程完成再继续执行的方式很多。我们来一一查看一下。 Thread的join方法 该方法是Thread提供的方法&#xff0c;调用join()时&#xff0c;会阻塞主线程&#xff0…...

制造企业数字化工厂建设步骤的建议

随着工业4.0、中国制造2025的深度推进&#xff0c;越来越多的制造企业开始迈入智能制造的领域&#xff0c;那数字工厂要从何入手呢&#xff1f; 数字工厂规划的核心&#xff0c;也正是信息域和物理域这两个维度&#xff0c;那就从这两个维度来进行分析&#xff0c;看如何进行数…...

网上鲜花交易平台,可运行

文章目录项目介绍一、项目功能介绍1、用户模块主要功能包括&#xff1a;2、商家模块主要功能包括&#xff1a;3、管理员模块主要功能包括&#xff1a;二、部分页面展示1、用户模块部分功能页面展示2、商家模块部分功能页面展示3、管理员模块部分功能页面展示三、部分源码四、底…...

【实战】用 Custom Hook + TS泛型实现 useArray

文章目录一、题目二、答案&#xff08;非标准&#xff09;三、关键知识点1.Custom Hook关键点案例useMountuseDebounce2.TS 泛型关键点一、题目 完善自定义 Hook —— useArray &#xff0c;使其能够完成 tryUseArray 组件中测试的功能&#xff1a; 入参&#xff1a;数组返回…...

【LeetCode】剑指 Offer(18)

目录 题目&#xff1a;剑指 Offer 35. 复杂链表的复制 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;剑指 Offer 35. 复杂链…...

Kubernetes节点运行时从Docker切换到Containerd

由于k8s将于1.24版本弃用dockershim&#xff0c;所以最近在升级前把本地的k8s切换到了Containerd运行时&#xff0c;目前我的k8s版本是1.22.5&#xff0c;一个master&#xff0c;二个Node的配置&#xff0c;以下做为一个操作记录日志整理&#xff0c;其它可以参考官网文档。 在…...

【编程基础之Python】12、Python中的语句

【编程基础之Python】12、Python中的语句Python中的语句赋值语句条件语句循环语句for循环while循环continue语句break语句continue与break的区别函数语句pass语句异常处理语句结论Python中的语句 Python是一种高级编程语言&#xff0c;具有简单易学的语法&#xff0c;适用于各…...

android h5餐饮管理系统myeclipse开发mysql数据库编程服务端java计算机程序设计

一、源码特点 android h5餐饮管理系统是一套完善的WEBandroid设计系统&#xff0c;对理解JSP java&#xff0c;安卓app编程开发语言有帮助&#xff08;系统采用web服务端APP端 综合模式进行设计开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要…...

容易混淆的嵌入式(Embedded)术语

因为做嵌入式开发工作虽然跳不出电子行业&#xff0c;但还是能接触到跨度较大的不同行当&#xff0c;身处不同的圈子。诸如医疗&#xff0c;银行&#xff0c;车载&#xff0c;工业&#xff1b;亦或者手机&#xff0c;PC&#xff0c;专用芯片&#xff1b;甚至可能横跨系统开发、…...

Nodejs 中 JSON 和 YAML 互相转换

JSON 转换成 YAML 1. 安装 js-yaml 库: npm install js-yaml2. 在程序中引入依赖库 const yaml require(js-yaml);3. 创建一个 js 对象, 代表 json 数据 const jsonData {name: John,age: 30,city: New York };4. 使用 yaml.dump() 把 js 对象转换成 YAML, 返回 YAML 字符…...

C++入门教程||C++ 修饰符类型||C++ 存储类

C 修饰符类型 C 允许在 char、int 和 double 数据类型前放置修饰符。修饰符用于改变基本类型的含义&#xff0c;所以它更能满足各种情境的需求。 下面列出了数据类型修饰符&#xff1a; signedunsignedlongshort 修饰符 signed、unsigned、long 和 short 可应用于整型&#…...

Android开发面试:Java知识答案精解

目录 Java 集合 集合概述 HashMap ConcurrentHashMap 泛型 反射 注解 IO流 异常、深浅拷贝与Java8新特性 Java异常 深浅拷贝 Java8新特性 并发 线程 线程池 锁 volatile JVM 内存区域 内存模型 类加载机制 垃圾回收机制 如何判断对象已死 Java 集合 …...

Windows上一款特别好用的画图软件

安装 废话不多说&#xff0c;打开windows的应用商店&#xff0c;搜索draw.io&#xff0c;点击获取即可。 画图 draw.io的布局左边是各种图形组件&#xff0c;中间是画布&#xff0c;右边是属性设置&#xff0c;文件扩展名是.drawio。 点击左边列表中的图形可以将它添加到画…...

html--学习

javascrapt交互&#xff0c;网页控制JavaScript&#xff1a;改变 HTML 图像本例会动态地改变 HTML <image> 的来源&#xff08;src&#xff09;&#xff1a;点亮灯泡<script>function changeImage() {elementdocument.getElementById(myimage) #内存变量&#xff0…...

关于递归处理,应该怎么处理,思路是什么?

其实问题很简单&#xff0c;就是想要循环遍历整个data对象&#xff0c;来实现所有name转成label&#xff0c;但是想到里面还有children属性&#xff0c;整个children里面可能还会嵌套很多很多的name&#xff0c;如此循环&#xff0c;很难搞&#xff0c;知道使用递归&#xff0c…...

重磅!牛客笔试客户端可防ChatGPT作弊

上线俩月&#xff0c;月活过亿。爆火的ChatGPT能代写文&#xff0c;撕代码&#xff0c;善玩梗&#xff0c;秒答题&#xff0c;几乎“无所不能”&#xff0c;争议也随之而来。调查显示&#xff0c;截至2023年1月&#xff0c;美国89%的大学生利用ChatGPT应付作业&#xff0c;53%的…...

春季训练营 | 前端+验证直通车-全实操项目实践,履历加成就业无忧

“芯动的offer”是2023年E课网联合企业全新推出集训培优班&#xff08;线下&#xff09;&#xff0c;针对有一定基础&#xff08;linux、verilog、uvm等&#xff09;在校学生以及想要通过短时间的学习进入到IC行业中的转行人士&#xff0c;由资深IC设计工程师带教&#xff0c;通…...

2.详解URL

文章目录视图函数1.1endpoint简介1.2 装饰器注册路由源码浅析1.3 另一种注册路由的方式---app.add_url_rule()1.4 视图函数中添加自定义装饰器2 视图类2.1 视图类的基本写法3 详细讲解注册路由的参数3.1常用的参数3.2不常用的参数(了解)视图函数 1.1endpoint简介 endpint参数…...

Android特别的数据结构(二)ArrayMap源码解析

1. 数据结构 public final class ArrayMap<K,V> implements Map<K,V> 由两个数组组成&#xff0c;一个int[] mHashes用来存放Key的hash值&#xff0c;一个Object[] mArrays用来连续存放成对的Key和ValuemHashes数组按非严格升序排列初始默认容量为0减容&#xff…...

减少if else

1. 三目运算符 可以理解为条件 ?结果1 : 结果2 里面的?号是格式要求。也可以理解为条件是否成立&#xff0c;条件成立为结果1&#xff0c;否则为结果2。 实例&#xff1a; public String handle(int code) {if (code 1) {return "success";} else {return &quo…...

硕士毕业论文常见的排版小技巧

word排版陆续更新吧&#xff0c;更具我所遇到的一些小问题&#xff0c;总结上来 文章目录1.避免题注&#xff08;图或者表的标题&#xff09;与图或表格分不用页注意点&#xff1a;光标移动到表的题注后面2.设置论文的页眉关键点&#xff1a;需要将每一章节末尾&#xff0c;都要…...

JAVA开发(数据类型String和HasMap的实现原理)

在JAVA开发中&#xff0c;使用最多的数据类型恐怕是String 和 HasMap两种数据类型。在开发的过程中我们每天都使用的不亦乐乎。但是相信很多人都没有考虑过String数据类型的实现原理或者说是在数据结构中的存储原理&#xff0c;还有一个就是是HashMap&#xff0c;也很少有人去了…...

Hbase 映射到Hive

目录 一、环境配置修改 关闭掉hbase&#xff0c;zookeeper和hive服务 进入hive312/conf 修改hive-site.xml配置&#xff0c; 在代码最后添加配置 将hbase235的jar包全部拷贝到hive312的lib目录&#xff0c;并且所有的是否覆盖信息全部输入n&#xff0c;不覆盖 查看hive312下…...

做网站企业经营范围/专门的网页制作工具有

开始之前先明白两个概念&#xff1a; 进程之间是天然数据隔离的 线程之间是资源数据共享的 这时候问题来了&#xff0c;如果想要进程之间数据共享&#xff0c;我们就必须借助队列Queue&#xff0c;queue相当于管道和锁的结合。 现在开始硬菜来了&#xff0c;线程既然是数据共享…...

廊坊网站建设廊坊/个人网页制作教程

点击上方蓝色字体&#xff0c;选择“标星公众号”优质文章&#xff0c;第一时间送达译者&#xff1a;为之漫笔来源&#xff1a;http://suo.im/6dMqup提升Web应用的性能从未像今天这样刻不容缓。在线经济活动的比例日益提高&#xff0c;就连发展中国家和地区的经济活动都已经有5…...

营销网站建设的原则/搜索引擎调词平台

廉价交换机走俏的原因以及使用中的风险 http://network.51cto.com 2010-11-25 09:20 杨亚男 译 TechTarget中国 我要评论(0) 捉襟见肘的预算&#xff0c;使得网络专业人士在设计LAN的接入层时&#xff0c;不得不选择廉价的网络交换机硬件。这些廉价网络交换机在支持、质量、…...

开网店视频教程/四川seo哪里有

定向推广在给客户提供谷歌优化服务时&#xff0c;曾经碰到过这样的问题&#xff0c;网站优化的基础工作都做好了&#xff0c;但搜索引擎就是不肯搜索。一开始还真是不了解问题到底出在哪里了&#xff0c;后来仔细一想&#xff0c;该不会是有人动了robots文件吧。一查果然如此&a…...

建设网站的工作/收录情况有几种

开发环境&#xff1a;Ubuntu 18.04 LTS ROS Melodic ViSP 3.3.1 文章内容主要参考ViSP官方教学文档&#xff1a;https://visp-doc.inria.fr/doxygen/visp-daily/tutorial_mainpage.html 本文主要介绍了如何使用ViSP实现关键点跟踪&#xff0c;实现过程使用了OpenCV中的KLT跟踪…...

wordpress用户中心商城/实时热搜榜

很多人在搜索下载过PDF转换器的小伙伴都会有一个灵魂拷问&#xff1a;难道就没有免费还没页数限制的PDF转Word的工具吗&#xff1f;小编经过不断的对比和试用&#xff0c;找到以下两款好用免费的工具&#xff0c;相信总有一个你能用上。一、PDF转换器相信了解PDF这种文档格式设…...