STM32寄存器开发基础-点亮LED灯(讲解GPIO口输出)

news2024/9/21 1:20:46

文章目录

  • 一、前言
  • 二、系列文章
  • 三、如何学习?
  • 四、STM32编程-控制LED灯
    • 4.1 STM32开发板
    • 4.2 原理图
    • 4.3 STM32的GPIO口
    • 4.4 开时钟
    • 4.5 配置GPIO模式的寄存器
    • 4.6 编写LED灯的初始化代码
    • 4.7 GPIO口控制输出寄存器
    • 4.8 一个完整的闪光灯程序代码
  • 五、关于寄存器是问题

一、前言

这篇文章学习STM32F103单片机,以寄存器方式,点亮LED灯。以控制LED灯为例,学习如何配置STM32的寄存器,实现输出高低电平的控制。

所以,重点不是LED灯如何控制,重点是教会大家如何写代码配置STM32的GPIO口,实现对LED这种外设模块进行控制。

学会如何配置GPIO口,不管是多少LED灯,还是其他的外设模块,比如:继电器、电机、各种传感器,控制办法都是一样的,都是高低电平进行控制。

image-20240711154519129

二、系列文章

在本专栏里,除了有很多完整的项目案例之外,剩下的大部分文章是讲解STM32的基础编程,方便没有基础的同学可以从0开始学习STM32编程,我的所有STM32项目,都是采用寄存器风格编程,整体代码简洁,工程文件少,工程构造简单,这样写出的代码也很方便移植到其他系列单片机使用。

下面是物联网项目开发专栏里的一部分STM32基础开发系列文章,大家可以打开专栏看目录学习。

00 STM32基础开发-安装keil软件、新建keil工程、搭建基础开发环境---初学者必看
01 STM32寄存器开发基础-位段操作(以控制LED灯为例)
02 STM32寄存器开发基础-按键检测(讲解GPIO口输入)---初学者必看
03 STM32寄存器开发基础-点亮LED灯(讲解GPIO口输出)---初学者必看
04 STM32寄存器开发基础-位段操作(以检测按键为例)
05 STM32寄存器开发基础-串口编程
06 STM32寄存器开发基础-定时器编程 
07 STM32寄存器开发基础-中断编程 
08 STM32编程-基础模块开发-ESP8266串口WIFI
09 STM32编程-基础模块开发-HC05串口蓝牙
10 STM32编程-基础模块开发-EEPROM编程(IIC总线讲解)
11 STM32编程-基础模块开发-W25Q64-FLASH编程(SPI总线讲解)
12 STM32编程-基础模块开发-DS18B20温度传感器编程(单总线协议讲解)
13 STM32编程-基础模块开发-DHT11温湿度传感器编程(单线协议讲解)
14 STM32编程-基础模块开发-SHTxx温湿度传感器编程(IIC总线讲解)
15 STM32编程-基础模块开发-Air724UG-4G模块编程(串口AT指令)
16 STM32编程-基础模块开发-NBIOT-BC26模块编程(串口AT指令)
17 STM32编程-基础模块开发-SIM800C-2G模块编程(串口AT指令)
18 STM32编程-基础模块开发-0.96-OLED显示屏(4)编程(IIC协议)
19 STM32编程-基础模块开发-0.96-OLED显示屏(7)编程(SPI协议)
20 STM32编程-基础模块开发-1.44-LCD显示屏编程(SPI协议)
21 STM32编程-基础模块开发-RC522-RFID刷卡模块编程(SPI协议)
22 STM32寄存器开发基础-ADC编程(采集MQ2烟雾传感器的模拟量数据)
23 STM32编程-基础模块开发-继电器模块编程(高低电平控制)
24 STM32编程-基础模块开发-蜂鸣器模块编程(高低电平控制)
25 STM32编程-基础模块开发-水质、浑浊度模块编程(ADC采集)
26 STM32编程-基础模块开发-土壤湿度模块编程(ADC采集)
27 STM32寄存器开发基础-RTC实时时钟编程(设计电子钟)
28 STM32编程-基础模块开发-MPU6050陀螺仪模块编程(IIC协议)
29 STM32编程-基础模块开发-(LU)MX90614红外测温模块编程(串口协议)
30 STM32编程-基础模块开发-SG90舵机模块编程(PWM控制)
31 STM32编程-基础模块开发-ULN2003+28BYJ4步进电机模块编程(4线)
32 STM32编程-基础模块开发-防水型DS18B20水温测量模块编程
34 STM32编程-基础模块开发-ESP8266-AT指令连接华为云物联网平台
35 STM32编程-基础模块开发-ESP8266-AT指令连接OneNet物联网平台
36 STM32编程-基础模块开发-ESP8266-AT指令连接腾讯云物联网平台
37 STM32编程-基础模块开发-MQ3酒精浓度检测模块编程(ADC采集)
38 STM32编程-基础模块开发-GPS定位模块编程(串口采集数据)
39 STM32编程-基础模块开发-MAX30102模块编程(串口采集数据)
40 STM32编程-基础模块开发-PulseSensor心率模块编程(ADC采集数据)

....会继续持续更新

三、如何学习?

在学习STM32单片机编程之前,肯定得有点基础的准备。

(1)先保证自己的C语言基础过关,不需要太高深的C语言基础,最起码C语言的基本语法要能够看懂。

(2)C语言的位运算必须必须要会,我的STM32教程里都是采用寄存器编程,寄存器编程都是采用位运算操作STM32的寄存器,如果你不懂位运算,那么可能就看不懂如何操作硬件寄存器。

(3)要先自己安装好keil软件,要会keil软件的基本使用:比如,如何新建工程? 如何添加.c文件?如何添加.h头文件?如何设置.h头文件的搜索路径?

如果不会C语言怎么办?

你可以关注我的微信公众号:《DS小龙哥嵌入式技术资讯》进行学习。 在公众号里,有完全免费的C语言教程可以学习,在菜单栏里,可以找到C语言的菜单。

也可以去网盘里下载文档学习: https://pan.quark.cn/s/aa9abc2979c4

image-20240710154556436

如果STM32文章看起来有难度怎么办?

【1】可以看视频辅助学习(这是网盘下载): https://pan.quark.cn/s/aa9abc2979c4

【2】后面也会在B站发布更新STM32基础学习视频,会重新录制整套STM32的视频(可以关注动态): https://space.bilibili.com/68130189

【3】教程里用到的各种文档资料、工具,软件,在哪里下载? (网盘下载):
https://pan.quark.cn/s/7b2aacb3be24

【4】学会STM32之后有哪些项目可以练手?(网盘下载)
https://pan.quark.cn/s/b9e518ea5beb

四、STM32编程-控制LED灯

4.1 STM32开发板

学习之前,那肯定得准备一块STM32的开发板。只要是STM32F103的芯片都可以,本系列教程都适用。

4.2 原理图

控制LED灯,首先需要知道LED灯的原理图,知道LED是连接到STM32板子的那一个IO口才可以编程。

image-20240710165343877

image-20240710165416909

从原理图上得知,LED0接在PD2,LED1接在PA8上面的。

4.3 STM32的GPIO口

STM32的GPIO口是分组管理的,它的命名规则是这样的: GPIOAGPIOBGPIOCGPIOD

每个组里面有16个口,比如(简称):

PA0、PA1、PA2 … PA15

PB0、PB1、PB2 … PB15

在寄存器里管理这些IO口的时候,每个组分为了高和低两个部分。

L表示低,IO口的编号范围是: 0 ~ 7

H表示高,IO口的编号范围是: 8 ~ 15

4.4 开时钟

STM32的每个组的GPIO口要能使用,需要打开对应组的时钟。其实就是相当于打开开关,表示允许这个组的GPIO口可以配置。

控制时钟开关的寄存器是,RCC_APB1RCC_APB2

在数据手册第6章节有说明这个时钟如何开。

image-20240710171212823

从下面图标出来的寄存器位置可以知道,要开启时钟,只需要把对应的寄存器位设置为1就可以了。

image-20240711144619791

如果我要把GPIOA的时钟打开,代码里如何写呢? 可以这样写

RCC->APB2ENR|=1<<2;//PA

如果我要把GPIOB的时钟打开,代码里如何写呢? 可以这样写

RCC->APB2ENR|=1<<3;//PB

如果我要把GPIOC的时钟打开,代码里如何写呢? 可以这样写

RCC->APB2ENR|=1<<4;//PC

如果我要把GPIOD的时钟打开,代码里如何写呢? 可以这样写

RCC->APB2ENR|=1<<5;//PD

如果要继续开其他外设的时钟,按这个规律写就行。

在第6.2章还有一张图,时钟树。 这个是用来描述STM32芯片内部的时钟的情况(看不懂也没有关系,这不影响下面的编程)。

image-20240711142204454

4.5 配置GPIO模式的寄存器

在数据手册的第8章,是专门配置GPIO口的章节。可以配置模式、输出控制、输入检测等等。

下面是GPIO口端口模式配置对应的寄存器,名字叫:GPIOX_CRLGPIOX_CRH

image-20240710171522360

端口配置低寄存器 (GPIOx_CRL) (x=A…E)

端口配置高寄存器 (GPIOx_CRH) (x=A…E)

这个寄存器为什么分GPIOX_CRLGPIOX_CRH

前面已经说过,STM32的IO口为了高、低两个部分进行管理。 0~7的IO口编号属于低位,8 ~ 15 的IO口属于高位。

其中的X是代号,实际使用可以替换为:A、B、C、D、… 也就是实际IO口的分组名字。

那么这个GPIOx_CRLGPIOx_CRH寄存器如何使用呢?

从下面的寄存器截图里可以看出,这个寄存器是32位,有32个位。 每4个位表示一个GPIO口的模式。

image-20240711143057700

这4个位如何填,从上面截图里的2个红色框框可以看到的很清楚,这个4个位可以有很多种组合,每个组合都表示了一直模式。

CNFy:端口配置位

在输入模式(MODE)00:模拟输入模式
01:浮空输入模式(复位后的状态) 
10:上拉/下拉输入模式
11:保留
    
在输出模式(MODE)00:通用推挽输出模式
01:通用开漏输出模式
10:复用功能推挽输出模式
11:复用功能开漏输出模式

MODEy端口模式位:

00:输入模式(复位后的状态) 
01:输出模式,最大速度10MHz 
10:输出模式,最大速度2MHz 
11:输出模式,最大速度50MHz

如果现在的GPIO口是要控制LED灯、控制继电器、或者控制其他外设,需要强大的驱动力气,对速度没有要求,那就需要配置为推挽输出模式。

对的4个位就应该填:0011 ,前面的00表示 通用推挽输出模式; 后面的11表示输出模式,最大速度50MHz。

如果你需要配置为其他模式,那么就按这个规律进行组合即可。

**【1】如果我要将PB6配置为推挽输出模式,应该怎么写代码? ** 说明:这里的PB6表示GPIOB这个组的第6个IO口。

GPIOB->CRL&=0xF0FFFFFF;  //这一步是位运算操作,特别注意这个& , 意思是先将之前的配置清除为0.
GPIOB->CRL|=0x03000000;  //这一步是位运算操作,特别注释这个|,意思是将新的配置赋值进去。

如果大家对这个位运算的  &|  理解不了。 可以先看看C语言的位运算,然后写写例子验证下&|的功能。这样再回来看就明白了。
    
这份代码里的 0xF0FFFFFF。  大家要数位置,要从右向左数。一个位置表示一个IO口。 数的时候从0开始数。

**【2】如果我要将PB6和PB7同时配置为推挽输出模式,应该怎么写代码? ** 看下面的代码学习。

GPIOB->CRL&=0x00FFFFFF;  //这一步是位运算操作,特别注意这个& , 意思是先将之前的配置清除为0.
GPIOB->CRL|=0x33000000;  //这一步是位运算操作,特别注释这个|,意思是将新的配置赋值进去。 

**【3】如果我要将PC2配置为推挽输出模式,应该怎么写代码? ** 看下面的代码学习。

GPIOC->CRL&=0xFFFFF0FF;  //这一步是位运算操作,特别注意这个& , 意思是先将之前的配置清除为0.
GPIOC->CRL|=0x00000300;  //这一步是位运算操作,特别注释这个|,意思是将新的配置赋值进去。 

**【4】如果我要将PA8配置为推挽输出模式,应该怎么写代码? ** 看下面的代码学习。

细心的同学可能发现,PA8的代码写法与前面的几个例子不一样了。 不再是CRL,而是CRH了。 因为PA8是属于高位,属于8~15的范围,对应的寄存器是CRH

GPIOA->CRH&=0xFFFFFFF0;  //这一步是位运算操作,特别注意这个& , 意思是先将之前的配置清除为0.
GPIOA->CRH|=0x00000003;  //这一步是位运算操作,特别注释这个|,意思是将新的配置赋值进去。

通过以上几个例子,相信大家已经看懂了吧? 如果你要继续配置其他的IO口,照着这个规律配置就行了。

4.6 编写LED灯的初始化代码

下面就来实操一下,学一个完整的代码,初始化LED灯链接的GPIO口。

/*
函数功能: LED初始化
硬件连接: PA8 PD2
特性: 低电平点亮
*/
void LED_Init(void)
{
    //开时钟
    RCC->APB2ENR|=1<<2;
    RCC->APB2ENR|=1<<5;
    
    //配置GPIO口
    GPIOA->CRH&=0xFFFFFFF0;
    GPIOA->CRH|=0x00000003;
    GPIOD->CRL&=0xFFFFF0FF;
    GPIOD->CRL|=0x00000300;
    
    //上拉
    GPIOA->ODR|=1<<8;
    GPIOD->ODR|=1<<2;
}

4.7 GPIO口控制输出寄存器

上面已经将模式配置好了,配置为输出模式。 那如何控制GPIO口输出?

看下面的寄存器GPIOx_ODRGPIOx_ODR 这个寄存器就是用来控制GPIO口每个位输出01的。

image-20240711150716282

那么这个GPIOx_ODR寄存器如何使用呢? 下面举几个例子,大家就明白了。

【1】如果想控制PB6这个口输出1,应该怎么写?

GPIOB->ODR|=1<<6;    

【2】如果想控制PB6这个口输出0,应该怎么写?

GPIOB->ODR&=~(1<<6);  

【3】如果想控制PC2这个口输出0,应该怎么写?

GPIOC->ODR&=~(1<<2);  

【4】如果想控制PA13这个口输出1,应该怎么写?

GPIOA->ODR|=1<<13;   

通过以上几个例子,相信大家已经看懂了吧? 如果你要继续配置其他的IO口输出,照着这个规律写就行了。

4.8 一个完整的闪光灯程序代码

这个也就是控制LED灯,一亮,一灭的效果代码。让大家看看如何在主函数里调用写好的函数。

#include "stm32f10x.h"

/*
函数功能: LED初始化
硬件连接: PA8 PD2
特性: 低电平点亮
*/
void LED_Init(void)
{
    //开时钟
    RCC->APB2ENR|=1<<2;
    RCC->APB2ENR|=1<<5;
    
    //配置GPIO口
    GPIOA->CRH&=0xFFFFFFF0;
    GPIOA->CRH|=0x00000003;
    GPIOD->CRL&=0xFFFFF0FF;
    GPIOD->CRL|=0x00000300;
    
    //上拉
    GPIOA->ODR|=1<<8;
    GPIOD->ODR|=1<<2;
}

/*
函数功能: 延时ms单位
*/
void DelayMs(int ms)
{
	int i,j,n;
	for(i=0;i<ms;i++)
		for(j=0;j<100;j++)
			for(n=0;n<100;n++);
}


int main(void)
{
	LED_Init();  //初始化LED
	while(1)
	{
		GPIOA->ODR&=~(1<<8);
        GPIOD->ODR&=~(1<<2);
	    DelayMs(100);
        
        GPIOA->ODR|=1<<8;
        GPIOD->ODR|=1<<2;
        DelayMs(100);
	}	
}

下面是工程代码截图:

image-20240711152028617

五、关于寄存器是问题

喜欢深究代码 探寻真理 的同学,看了上面内容之后,可能还有疑问。

比如 下面的代码:

GPIOB->CRL&=0x00FFFFFF;
GPIOB->CRL|=0x33000000;

我们写了这个代码之后,就可以配置PB6和PB7为推挽输出模式。

从C语言的语法上我们可以看出GPIOB->CRL是一个结构体的类型, 那么这个GPIOB是怎么来的? 在哪里定义的?

我们建立工程的时候,是会添加一个stm32f10x.h 头文件。 并在代码里最前面引用了。

#include "stm32f10x.h"

这个头文件是ST官方提供的,里面已经定义了全部寄存器,设置好了地址偏移,我们只要在代码里包含了#include "stm32f10x.h" 头文件。就可以直接使用已经定义好的寄存器进行配置。

image-20240711152734650

image-20240711152755222

那我们可不可以自己定义寄存器名字,不要官方的stm32f10x.h头文件呢? 那当然是可以的。

如果你为了能更加清晰的搞懂底层,是可以自己写的头文件的。

我们注意看数据手册,在每个寄存器上,都写了这个寄存器的地址偏移的。

image-20240711152951156

image-20240711153026215

在得知偏移地址之后,还需要知道基地址,也就是基于什么地址偏移的,这样就可以找到寄存器的真实地址了。

翻到数据手册的2章就可以看到每个寄存器的起始地址。

image-20240711153511011

比如:时钟寄存器RCC的起始地址。

image-20240711153614135

比如:GPIO配置寄存器A B C D … 的起始地址。

image-20240711153704627

根据前面的说明的偏移量。起始地址加上偏移量就是这个寄存器的实际地址。 我们只要用C语言的指针,定义指针类型指向这个地址,我们就可以对这个地址进行操作进行配置寄存器。 从这里大家应该理解了。

学指针的时候,各种资料都说C语言指针是C语言的灵魂,还可以操作硬件,这不,活生生的实际例子就来了。

下面给出完整的代码: 下面这个代码例子,就是完全自己定义寄存器,配置寄存器,完成LED灯的控制的例子。 大家可以琢磨琢磨。

//RCC时钟寄存器
#define RCC_APB2ENR *((volatile u32 *)(0x40021000+0x18))
#define GPIOB_CRL *((volatile u32 *)(0x40010C00+0x00))
#define GPIOB_CRH *((volatile u32 *)(0x40010C00+0x04))
#define GPIOA_CRL *((volatile u32 *)(0x40010800+0x00))
#define GPIOA_CRH *((volatile u32 *)(0x40010800+0x04))

#define GPIOB_IDR *((volatile u32 *)(0x40010C00+0x08))
#define GPIOB_ODR *((volatile u32 *)(0x40010C00+0x0C))
    
#define GPIOA_IDR *((volatile u32 *)(0x40010800+0x08))
#define GPIOA_ODR *((volatile u32 *)(0x40010800+0x0C))
	

//结构体定义方式
struct STM32_GPIO
{
    u32 CRL;  //0x00
	u32 CRH;  //0x04
	u32 IDR;  //0x08
	u32 ODR;  //0x0C
};

#define MY_GPIOA ((struct STM32_GPIO*)(0x40010800))
#define MY_GPIOB ((struct STM32_GPIO*)(0x40010C00))



/*
函数功能: LED初始化
硬件特性: 低电平亮
硬件接线:
		LED1--PB6
		LED2--PB7
		LED3--PB8
		LED4--PB9
*/
void LED_Init(void)
{
	/*1. 开时钟--第6章RCC*/
	RCC_APB2ENR|=1<<3;//PB
	
	/*2. 配置GPIO模式--第8章GPIOx*/
	GPIOB_CRL&=0x00FFFFFF;
	GPIOB_CRL|=0x33000000;
	
	GPIOB_CRH&=0xFFFFFF00;
	GPIOB_CRH|=0x00000033;
	
	/*3. 上拉: 关闭LED灯*/
	GPIOB_ODR|=1<<6;
	GPIOB_ODR|=1<<7;
	GPIOB_ODR|=1<<8;
	GPIOB_ODR|=1<<9;
}



/*
函数功能: 延时ms单位
*/
void DelayMs(int ms)
{
	int i,j,n;
	for(i=0;i<ms;i++)
		for(j=0;j<100;j++)
			for(n=0;n<100;n++);
}


int main(void)
{
	LED_Init();  //初始化LED
	while(1)
	{
		GPIOB_ODR&=~(1<<6);
	    GPIOB_ODR&=~(1<<7);
	    GPIOB_ODR&=~(1<<8);
	    GPIOB_ODR&=~(1<<9);
	    DelayMs(100);
        
        GPIOB_ODR|=1<<6;
	    GPIOB_ODR|=1<<7;
	    GPIOB_ODR|=1<<8;
	    GPIOB_ODR|=1<<9;
        DelayMs(100);
	}	
}

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

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

相关文章

Vue中实现在线画流程图实现

概述 最近在调研一些在线文档的实现&#xff0c;包括文档编辑器、在线思维导图、在线流程图等&#xff0c;前面的文章基于语雀编辑器的在线文档编辑与查看实现了文档编辑器。在本文&#xff0c;分享在Vue框架下基于metaeditor-mxgraph实现在线流程图。 实现效果 实现 1. 添加…

iPhone 16 Pro系列将标配潜望镜头:已开始生产,支持5倍变焦

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 更多资源欢迎关注 7月6日消息&#xff0c;据DigiTimes最新报道&#xff0c;苹果将在iPhone 16 Pro中引入iPhone 15 Pro Max同款5倍光学变焦四棱镜潜望镜头。 报道称&#xff0c;目前苹果已经将模组订单交至大立光电和玉…

MC0246王国傀儡师

目录 题目描述 格式 样例 备注 运行限制 原题链接 代码思路 题目描述 在一个奇幻的王国中&#xff0c;存在着一个名叫小码哥的魔法师。小码哥手下收藏着 n 个傀儡&#xff0c;他靠着手下的傀儡演出赖以生存。因此&#xff0c;傀儡的魅力度与他的生存息息相关。他为每个…

(CVPR-2024)SwiftBrush:具有变分分数蒸馏的单步文本到图像扩散模型

SwiftBrush&#xff1a;具有变分分数蒸馏的单步文本到图像扩散模型 Paper Title&#xff1a;SwiftBrush: One-Step Text-to-Image Diffusion Model with Variational Score Distillation Paper 是 VinAI Research 发表在 CVPR 24 的工作 Paper地址 Code:地址 Abstract 尽管文本…

EXSI 实用指南 2024 -编译环境 Mac OS 安装篇(一)

1. 引言 在现代虚拟化技术的快速发展中&#xff0c;VMware ESXi 作为领先的虚拟化平台&#xff0c;凭借其高性能、稳定性和丰富的功能&#xff0c;广泛应用于企业和个人用户。ESXi 能有效地提高硬件资源利用率&#xff0c;并简化 IT 基础设施的管理。然而&#xff0c;如何在 V…

一个便捷的web截图库~【送源码】

随着时间的发展&#xff0c;前端开发的范围越来越广&#xff0c;能够实现的功能也越来越多&#xff0c;要实现的功能也五花八门&#xff0c;今天就给大家介绍一个web截图库,让前端也能实现截图功能—— js-web-screen-shot js-web-screen-shot js-web-screen-shot 是一个基于 …

8627 数独

为了判断数独解是否合法&#xff0c;我们需要遵循以下步骤&#xff1a; 1. **检查每一行**&#xff1a;确保1到9每个数字在每一行中只出现一次。 2. **检查每一列**&#xff1a;确保1到9每个数字在每一列中只出现一次。 3. **检查每个3x3的宫**&#xff1a;确保1到9每个数字在…

跨域解决方案处理

文章目录 首先了解什么是跨域1. 什么是跨域&#xff1f;2. 源是什么&#xff1f;3. 同源策略又是什么&#xff1f;4. 同源请求与非同源请求5. 浏览器对跨域请求的限制有哪些&#xff1f; 解决跨域方案1. JSONP&#xff08;此解决方式已过时&#xff09;2. CORS&#xff08;此方…

jstat命令介绍

jstat&#xff1a;查看JVM统计信息 一 基本情况二 基本语法2.1 option参数1. 类装载相关的&#xff1a;2. 垃圾回收相关的-gc&#xff1a;显示与GC相关的堆信息。包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息。-gccapacity&#xff1a;显示…

【C】Structure

参考摘抄学习来自&#xff1a; C 结构体C语言必学知识点 "结构体"详细解析&#xff01;C 语言之结构体最全面总结C typedef 文章目录 1 定义2 初始化3 结构体大小的计算4 访问结构成员5 结构作为函数参数6 指向结构的指针7 结构体数组8 动态申请结构体 1 定义 它允…

构造函数的初始化列表,static成员,友元,内部类【类和对象(下)】

P. S.&#xff1a;以下代码均在VS2022环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;LiUEEEEE                        …

【C++:默认成员函数】

构造函数 特点 没有返回值支持函数重载对象实例化时&#xff0c;编译器自动调用作用不是构造&#xff0c;而是初始化函数名与类名相同无参函数和全缺省的函数&#xff0c;不用传参就能调用的函数叫做默认构造函数 构造函数是一个特殊的成员函数 注&#xff1a;无参构造函数在实…

一场夏测杀出个“双冠王”,极越01成为纯电SUV标杆

文 | AUTO芯球 作者 | 雷慢 万万没想到&#xff0c;懂车帝夏测运动会杀出一匹最大的黑马&#xff0c;竟然是极越01。 当前正在进行的懂车帝夏测运动会&#xff0c;在“纯电SUV/MPV续航达成率”赛事中&#xff0c;极越01以85.8%的续航达成率获得第一名。并且由于赛制规则限制…

Go泛型详解

官网文档&#xff1a;https://go.dev/blog/intro-generics 泛型为该语言添加了三个新的重要功能&#xff1a; 函数和类型的类型参数。将接口类型定义为类型集&#xff0c;包括没有方法的类型。类型推断&#xff0c;在许多情况下允许在调用函数时省略类型参数。 类型参数&…

Java高级重点知识点-22-缓冲流、转换流、序列化流、打印流

文章目录 缓冲流字节缓冲流字符缓冲流 转换流InputStreamReader类OutputStreamWriter类 序列化ObjectOutputStream类ObjectInputStream类 打印流 缓冲流 缓冲流,也叫高效流&#xff0c;是对4个基本的 FileXxx 流的增强&#xff0c;所以也是4个流 基本原理&#xff1a; 缓冲流的…

SpringBoot集成Sentinel 实现QPS限流

Spring Cloud Alibaba 的 Sentinel 组件提供了丰富的“流量控制“规则&#xff0c; 单体SpringBoot应用中也可以集成 Sentinel 来实现流量控制&#xff0c;本文主要讲 QPS流量控制。 SpringBoot集成Sentinel有两种方式&#xff1a; 一种是 dashboard控制面板的方式&#xff0…

virturalBox+K8S部署jaeger-all-in-one

pod的yaml如下&#xff1a;这里使用的是主机host模式 apiVersion: apps/v1 kind: Deployment metadata:name: jaegerlabels:app: jaeger spec:replicas: 1selector:matchLabels:app: jaegertemplate:metadata:labels:app: jaegerspec:hostNetwork: truecontainers:- name: jae…

【js面试题】深入理解浏览器对象模型(BOM)

面试题&#xff1a;请你说说对bom的理解&#xff0c;常见的bom对象你了解哪些 引言&#xff1a; 浏览器对象模型&#xff08;BOM&#xff09;是JavaScript中用于与浏览器窗口及其内容进行交互的一组对象和方法。 BOM的核心是window对象&#xff0c;它代表了浏览器窗口本身&…

tableau人口金字塔,漏斗图,箱线图绘制 - 13

人口金字塔&#xff0c;漏斗图&#xff0c;箱线图 1. 金字塔1.1 定义1.2 金字塔创建1.2.1 数据导入1.2.2 数据异常排查1.2.3 创建度量字段1.2.4 转换属性1.2.5 创建数据桶1.2.6 选择相关属性1.2.7 年龄排序1.2.8 创建计算字段1.2.9 选择相关字段1.2.10 设置轴排序1.2.11 设置颜…

Python编程学习笔记(4)--- 字典

目录 1 什么是字典 2 使用字典 2.1 访问字典中的值 2.2 添加键值对 2.3 创建空字典 2.4 修改字典中的值 2.5 删除键值对 2.6 类似键值对组成的字典 2.7 使用get&#xff08;&#xff09;来访问值 3 遍历字典 3.1 遍历所有键值对 3.2 遍历字典中的所有键 3.3 按照特…