NT35510的LCD函数详解01(洋桃电子-触摸屏开发者笔记)

news2024/11/16 13:44:08

NT35510的LCD函数详解01(洋桃电子-触摸屏开发者笔记)

资料下载:

洋桃电子 YoungTalk 探索最好的 STM32 教学 (doyoung.net)

接口类型

NT35510 数据手册(英文).pdf

NT35510 应用手册(英文).pdf

根据 NT35510 数据手册,支持的屏幕接口类型包括:

  1. RGB 接口:支持 16 位、18 位和 24 位的 RGB 数据接口,用于接收红绿蓝(RGB)颜色数据。
  2. MIPI 接口:支持 MIPI Display Serial Interface(DSI),这是一种用于移动设备的显示标准,支持高速度的数据传输。
  3. MDDI 接口:支持 Mobile Display Digital Interface(MDDI),这是另一种用于移动设备的显示接口,也支持高速数据传输。
  4. SPI 接口:支持 16 位串行外围设备接口(SPI),用于微控制器和显示驱动器之间的通信。
  5. I2C 接口:支持 I2C 接口,用于低速设备通信,如 EEPROM 或某些类型的传感器。
  6. 80 系列 MPU 接口:支持 8 位、16 位和 24 位的并行微处理器(MPU)接口,用于与微处理器单元进行数据交换。

这些接口类型使得 NT35510 能够适用于多种不同的显示面板和系统设计,包括智能手机、平板电脑、便携式媒体播放器、数码相机等设备。

基础函数

读取指令/寄存器

LCD_COM 和 LCD_DAT 取决于 FSMC 的地址。

FSMC 地址计算方法:

image

所以 FSMC 的数据操作地址是算法是按上面的方法来算,洋桃电子视频里面讲的就是 A18:

image

#define LCD_COM				(uint32_t *)0X60000000  //将A18地址端口置0后的地址(表示向LCD发送指令)
#define LCD_DAT				(uint32_t *)0X60080000  //将A18地址端口置1后的地址(表示向LCD发送数据)
void LCD_Write_COM(uint16_t R){//向LCD写指令COM
	__NOP();__NOP();
	HAL_SRAM_Write_16b(&hsram1,LCD_COM,&R,1);//向LCD写16位数据(句柄,指令COM/数据DAT,存放寄存器,数量)
}
void LCD_Write_DAT(uint16_t D){//向LCD写数据DAT
	__NOP();__NOP();
	HAL_SRAM_Write_16b(&hsram1,LCD_DAT,&D,1);//向LCD写16位数据(句柄,指令COM/数据DAT,存放寄存器,数量)
}
uint16_t LCD_Read_DAT(void){//读LCD的RAM空间
	uint16_t RAM;
	HAL_SRAM_Read_16b(&hsram1,LCD_DAT,&RAM,1);//向LCD读16位数据(句柄,指令COM/数据DAT,存放寄存器,数量)
	return RAM;
}					   
void LCD_Write_REG(uint16_t R,uint16_t D){//写LCD寄存器(参数:地址,数据)
	HAL_SRAM_Write_16b(&hsram1,LCD_COM,&R,1);//向LCD写16位数据(句柄,指令COM/数据DAT,存放寄存器,数量)
	HAL_SRAM_Write_16b(&hsram1,LCD_DAT,&D,1);//向LCD写16位数据(句柄,指令COM/数据DAT,存放寄存器,数量)
}	   
uint16_t LCD_Read_REG(uint16_t R){//读LCD寄存器(参数:LCD寄存器地址,返回:读出数据)
	LCD_Write_COM(R);//写入要读的寄存器序号
	delay_us(5);		  
	return LCD_Read_DAT();//返回读到的值
}

这段代码是用于向 LCD(液晶显示器)写入指令和数据,以及从 LCD 读取数据的函数。它使用了 HAL 库(硬件抽象层库)来操作 SRAM(静态随机存取存储器),这是 LCD 控制器通常使用的存储器接口。下面是每个函数的详细解释:

  1. LCD_Write_COM(uint16_t R) ​:

    • 功能:向 LCD 写入指令(Command)。
    • 实现原理:通过调用 HAL_SRAM_Write_16b ​函数,将 16 位指令写入 LCD 的指令寄存器。
    • 注意事项:在写入指令之前,使用 __NOP();__NOP(); ​进行两次空操作,可能是为了确保之前的操作完成。
  2. LCD_Write_DAT(uint16_t D) ​:

    • 功能:向 LCD 写入数据(Data)。
    • 实现原理:通过调用 HAL_SRAM_Write_16b ​函数,将 16 位数据写入 LCD 的数据寄存器。
    • 注意事项:与 LCD_Write_COM ​类似,在写入数据之前,使用 __NOP();__NOP(); ​进行两次空操作。
  3. uint16_t LCD_Read_DAT(void) ​:

    • 功能:从 LCD 的 RAM 空间读取数据。
    • 实现原理:通过调用 HAL_SRAM_Read_16b ​函数,从 LCD 的数据寄存器读取 16 位数据。
    • 注意事项:读取的数据存储在变量 RAM ​中,并作为函数的返回值。
  4. LCD_Write_REG(uint16_t R, uint16_t D) ​:

    • 功能:向 LCD 写入寄存器(Register)。
    • 实现原理:首先通过调用 HAL_SRAM_Write_16b ​函数,将 16 位寄存器地址写入指令寄存器,然后再次调用 HAL_SRAM_Write_16b ​函数,将 16 位数据写入数据寄存器。
    • 注意事项:这个函数实际上是先写地址,再写数据,符合许多 LCD 控制器的寄存器写入顺序。
  5. uint16_t LCD_Read_REG(uint16_t R) ​:

    • 功能:从 LCD 读取寄存器数据。
    • 实现原理:首先调用 LCD_Write_COM ​函数,将寄存器地址写入指令寄存器,然后延时 5 微秒,最后调用 LCD_Read_DAT ​函数读取数据寄存器中的数据。
    • 注意事项:延时是为了确保寄存器地址写入后,LCD 有足够的时间处理。

用途: 这些函数主要用于与 LCD 控制器通信,包括发送指令、写入数据、读取数据以及读写寄存器。这些操作是显示和控制 LCD 的基础,例如设置显示模式、调整对比度、读取显示数据等。

设置光标位置

void LCD_Write_Cursor(uint16_t x,uint16_t y){//设置光标位置(参数:X坐标,Y坐标)
	if(LCD_ID==LCD_ID_OTM8009){//判断LCD ID OTM8009A(不同型号的指令有差异)
		LCD_Write_REG(SET_X,x>>8);
		LCD_Write_REG(SET_X+1,x&0xFF);
		LCD_Write_REG(SET_X+2,(SET_Width-1)>>8);
		LCD_Write_REG(SET_X+3,(SET_Width-1)&0xFF);
		LCD_Write_REG(SET_Y,y>>8);
		LCD_Write_REG(SET_Y+1,y&0xFF);
		LCD_Write_REG(SET_Y+2,(SET_Height-1)>>8);
		LCD_Write_REG(SET_Y+3,(SET_Height-1)&0xFF);
	}else{ //判断LCD ID NT35510/RM68120
		LCD_Write_REG(SET_X,x>>8);
		LCD_Write_REG(SET_X+1,x&0xFF);
		LCD_Write_REG(SET_Y,y>>8);
		LCD_Write_REG(SET_Y+1,y&0xFF);
	}
}

这段代码的实现原理是将给定的坐标值拆分为高 8 位和低 8 位,然后分别写入到 LCD 的 X 坐标寄存器和 Y 坐标寄存器中,从而控制 LCD 的显示位置。

将一个 16 位的坐标值(x 和 y)拆分为两个 8 位的数据,并分别写入到 LCD 的寄存器中。具体原因如下:

  1. LCD 寄存器要求:许多 LCD 控制器要求坐标值(如 X 和 Y 坐标)以 8 位为单位进行设置。这意味着,即使坐标值是一个 16 位的整数,也需要将其拆分为两个 8 位的数据分别写入寄存器。
  2. 数据传输效率:将一个 16 位的坐标值拆分为两个 8 位的数据,可以减少数据传输的次数。因为大多数 LCD 控制器一次只能处理一个 8 位的数据,所以将 16 位的数据拆分为两个 8 位的数据可以更高效地传输数据。
  3. 避免数据溢出:将 16 位的坐标值拆分为两个 8 位的数据,可以避免数据溢出的问题。因为每个 8 位的数据范围是 0 到 255,所以将 16 位的坐标值拆分为两个 8 位的数据可以确保数据不会超出范围。
  4. 兼容性:这种拆分方式可以确保代码在不同型号的 LCD 控制器上具有较好的兼容性。因为大多数 LCD 控制器都要求坐标值以 8 位为单位进行设置,所以这种拆分方式可以确保代码在不同型号的 LCD 控制器上都能正常工作。

综上所述,这段代码之所以这样写,主要是为了满足 LCD 寄存器的要求,提高数据传输效率,避免数据溢出,并确保代码在不同型号的 LCD 控制器上具有较好的兼容性。

LCD 初始化


uint8_t LCD_Init(void){ //LCD彩屏初始化(其中参数参考LCD模块数据手册)(返回值1:初始化成功,0:初始化失败)
	uint16_t a,i;
	uint8_t buf[52]= //Gamma设置的参数
	{0x00,0x33,0x00,0x34,0x00,0x3A,0x00,0x4A,0x00,0x5C,0x00,0x81,0x00,0xA6,0x00,0xE5,
	0x01,0x13,0x01,0x54,0x01,0x82,0x01,0xCA,0x02,0x00,0x02,0x01,0x02,0x34,0x02,0x67,
	0x02,0x84,0x02,0xA4,0x02,0xB7,0x02,0xCF,0x02,0xDE,0x02,0xF2,0x02,0xFE,0x03,0x10,
	0x03,0x33,0x03,0x6D};
	LCD_ID = LCD_Read_REG(0XDA00);//读取LCD ID指令(24位ID顺序D3,D2,D1)参考LCD数据手册
	LCD_ID<<=8;//将数据左移8位
	LCD_ID |= LCD_Read_REG(0XDB00);
	LCD_ID<<=8;//将数据左移8位
	LCD_ID |= LCD_Read_REG(0XDC00);
	a=0;//初始化失败的值预先赋值
	if(LCD_ID==LCD_ID_NT35510){ //判断LCD ID是否读取正确
		LCD_Write_REG(0xF000,0x55);LCD_Write_REG(0xF001,0xAA);LCD_Write_REG(0xF002,0x52);
		LCD_Write_REG(0xF003,0x08);LCD_Write_REG(0xF004,0x01);
		//AVDD Set AVDD 5.2V
		LCD_Write_REG(0xB000,0x0D);LCD_Write_REG(0xB001,0x0D);LCD_Write_REG(0xB002,0x0D);
		//AVDD ratio
		LCD_Write_REG(0xB600,0x34);LCD_Write_REG(0xB601,0x34);LCD_Write_REG(0xB602,0x34);
		//AVEE -5.2V
		LCD_Write_REG(0xB100,0x0D);LCD_Write_REG(0xB101,0x0D);LCD_Write_REG(0xB102,0x0D);
		//AVEE ratio
		LCD_Write_REG(0xB700,0x34);LCD_Write_REG(0xB701,0x34);LCD_Write_REG(0xB702,0x34);
		//VCL -2.5V
		LCD_Write_REG(0xB200,0x00);LCD_Write_REG(0xB201,0x00);LCD_Write_REG(0xB202,0x00);
		//VCL ratio
		LCD_Write_REG(0xB800,0x24);LCD_Write_REG(0xB801,0x24);LCD_Write_REG(0xB802,0x24);
		//VGH 15V (Free pump)
		LCD_Write_REG(0xBF00,0x01);LCD_Write_REG(0xB300,0x0F);LCD_Write_REG(0xB301,0x0F);
		LCD_Write_REG(0xB302,0x0F);
		//VGH ratio
		LCD_Write_REG(0xB900,0x34);LCD_Write_REG(0xB901,0x34);LCD_Write_REG(0xB902,0x34);
		//VGL_REG -10V
		LCD_Write_REG(0xB500,0x08);LCD_Write_REG(0xB501,0x08);LCD_Write_REG(0xB502,0x08);
		LCD_Write_REG(0xC200,0x03);
		//VGLX ratio
		LCD_Write_REG(0xBA00,0x24);LCD_Write_REG(0xBA01,0x24);LCD_Write_REG(0xBA02,0x24);
		//VGMP/VGSP 4.5V/0V
		LCD_Write_REG(0xBC00,0x00);LCD_Write_REG(0xBC01,0x78);LCD_Write_REG(0xBC02,0x00);
		//VGMN/VGSN -4.5V/0V
		LCD_Write_REG(0xBD00,0x00);LCD_Write_REG(0xBD01,0x78);LCD_Write_REG(0xBD02,0x00);
		//VCOM
		LCD_Write_REG(0xBE00,0x00);LCD_Write_REG(0xBE01,0x64);
		//Gamma Setting
		for(i=0xD1;i<=0xD6;i++){ //循环写入buf数组值
			for(a=0;a<52;a++){
				LCD_Write_REG(i*0x100+a,buf[a]);
			}
		}
		//LV2 Page 0 enable
		LCD_Write_REG(0xF000,0x55);LCD_Write_REG(0xF001,0xAA);LCD_Write_REG(0xF002,0x52);
		LCD_Write_REG(0xF003,0x08);LCD_Write_REG(0xF004,0x00);
		//Display control
		LCD_Write_REG(0xB100, 0xCC);LCD_Write_REG(0xB101, 0x00);
		//Source hold time
		LCD_Write_REG(0xB600,0x05);
		//Gate EQ control
		LCD_Write_REG(0xB700,0x70);LCD_Write_REG(0xB701,0x70);
		//Source EQ control (Mode 2)
		LCD_Write_REG(0xB800,0x01);LCD_Write_REG(0xB801,0x03);LCD_Write_REG(0xB802,0x03);
		LCD_Write_REG(0xB803,0x03);
		//Inversion mode (2-dot)
		LCD_Write_REG(0xBC00,0x02);LCD_Write_REG(0xBC01,0x00);LCD_Write_REG(0xBC02,0x00);
		//Timing control 4H w/ 4-delay
		LCD_Write_REG(0xC900,0xD0);LCD_Write_REG(0xC901,0x02);LCD_Write_REG(0xC902,0x50);
		LCD_Write_REG(0xC903,0x50);LCD_Write_REG(0xC904,0x50);LCD_Write_REG(0x3500,0x00);
		LCD_Write_REG(0x3A00,0x55);  //16-bit/pixel
		LCD_Write_COM(0x1100);
		delay_us(120);//设置后必要的延时
		LCD_OFF();//初始化设置之前关显示(防止显示出乱码)
		LCD_Direction(UDRL);//设置显示方向
		LCD_CLEAR(White);//清屏
		LCD_ON();//初始化完成后打开显示和背光
		a=1;//写入初始化成功的值1
	}
return a;
}

这段参考应用手册:

NT35510应用手册(英文).pdf - p8 - 2.2.2 Software Setting

image

LCD 显示方向

void LCD_Direction(uint8_t dir){//设置LCD显示方向
	SET_GRAM=0X2C00;//设置写入GRAM的指令
	SET_X=0X2A00;//设置写X坐标指令
	SET_Y=0X2B00; //设置写Y坐标指令
	if(dir==LRUD || dir==LRDU || dir==RLUD || dir==RLDU){	//竖屏
		SET_Width=LCD_Width;//设置宽度
		SET_Height=LCD_Height;//设置高度
	}else{ //横屏
		SET_Width=LCD_Height;//设置宽度
		SET_Height=LCD_Width;//设置高度
	}
	LCD_Write_REG(0X3600,dir);//写入显示方向
	LCD_Write_COM(SET_X);LCD_Write_DAT(0);//x轴起始位置的高8位
	LCD_Write_COM(SET_X+1);LCD_Write_DAT(0);//X轴起始位置的低8位
	LCD_Write_COM(SET_X+2);LCD_Write_DAT((SET_Width-1)>>8);//X轴结束位置的高8位
	LCD_Write_COM(SET_X+3);LCD_Write_DAT((SET_Width-1)&0XFF);//X轴结束位置的低8位
	LCD_Write_COM(SET_Y);LCD_Write_DAT(0);//Y轴起始位置的高8位
	LCD_Write_COM(SET_Y+1);LCD_Write_DAT(0);//Y轴起始位置的低8位
	LCD_Write_COM(SET_Y+2);LCD_Write_DAT((SET_Height-1)>>8);//Y轴结束位置的高8位
	LCD_Write_COM(SET_Y+3);LCD_Write_DAT((SET_Height-1)&0XFF);//Y轴结束位置的低8位
}

NT35510数据手册(英文).pdf - p284 - CASET: Column Address Set (2A00h~2A03h)

x 轴坐标寄存器:

image

  • XS[15:0] :代表列地址的起始值,是一个 16 位的值。
  • XE[15:0] :代表列地址的结束值,也是一个 16 位的值。

NT35510数据手册(英文).pdf - p295 - MADCTL: Memory Data Access Control (3600h)

这里对 0X3600 寄存器做一下详细解释:

image

  1. MY Row Address Order

    • 这个寄存器用于控制行地址的顺序。在显示内存中写入或读取数据时,可以指定是按照从上到下的顺序(递增)还是从下到上的顺序(递减)来处理行地址。
  2. MX Column Address Order

    • 这个寄存器用于控制列地址的顺序。类似于行地址,它可以指定在一行中数据是按照从左到右(递增)还是从右到左(递减)的顺序来处理。
  3. MV Row/Column Exchange

    • 这个寄存器用于交换行和列的顺序。当启用时,可以改变数据写入或读取的优先级,使得先处理列地址,然后再处理行地址。这可以影响数据在显示内存中的布局。
  4. ML Vertical Refresh Order

    • 这个寄存器用于控制 TFT LCD 的垂直刷新方向。它可以决定屏幕刷新是从上到下开始,还是从下到上开始。

这些寄存器共同控制着数据在显示内存中的组织方式和屏幕刷新的行为。改变这些设置可能会影响显示图案的布局和刷新顺序,从而影响显示效果。

所以宏定义方向:

#define LRUD  0x00 		//从左到右,从上到下
#define LRDU  0x80 		//从左到右,从下到上
#define RLUD  0x40 		//从右到左,从上到下
#define RLDU  0xC0 		//从右到左,从下到上
#define UDLR  0x20 		//从上到下,从左到右
#define UDRL  0x60 		//从上到下,从右到左
#define DULR  0xA0 		//从下到上,从左到右
#define DURL  0xE0		//从下到上,从右到左

0x00

  • MY = 0x0:可能表示行地址顺序为正常(从上到下递增)。
  • MX = 0x0:可能表示列地址顺序为正常(从左到右递增)。
  • MV = 0x0:可能表示没有行/列交换,即正常顺序(先行后列)

MV 决定了屏幕是横屏还是竖屏,就要根据设置调整屏幕的宽度和高度:

image

图中第三位都是 1,代表横屏。

LCD 控制背光


void LCD_ON(void){//LCD开启显示和背光
	LCD_Write_COM(0X2900);	//开启显示
	HAL_GPIO_WritePin(GPIOB,LCD_BL_Pin,GPIO_PIN_SET);
}

void LCD_OFF(void){//LCD关闭显示和背光
	HAL_GPIO_WritePin(GPIOB,LCD_BL_Pin,GPIO_PIN_RESET);
	LCD_Write_COM(0X2800);	//关闭显示
}

开关引脚。

LCD 清屏

void LCD_CLEAR(uint16_t COLOR){//清屏函数(参数:背景的单色值)
	uint32_t index=0;
	uint32_t totalpoint=LCD_Width;
	totalpoint*=LCD_Height;//得到总点数
	LCD_Write_Cursor(0x00,0x0000);//设置光标位置
	LCD_Write_COM(SET_GRAM);//开始写入GRAM
	for(index=0;index<totalpoint;index++){
		HAL_SRAM_Write_16b(&hsram1,LCD_DAT,&COLOR,1);//向LCD写16位数据(句柄,指令COM/数据DAT,存放寄存器,数量)
	}
	BackColor = COLOR; //将清屏后的颜色值作为字符显示的背景颜色
	ForeColor = ~COLOR;//将清屏后的颜色值的“补色”作为字符颜色
}
#define LCD_Height			800 //洋桃LCD彩屏模块 固定分辨率800x480
#define LCD_Width			480 //(以竖屏为原始方位,长边是上下高度LCD_Height,短边是左右宽度LCD_Width)
	SET_GRAM=0X2C00;//设置写入GRAM的指令

该函数是一个清屏函数,功能是将 LCD 屏幕上的所有点设置为指定的颜色值。参数 COLOR ​表示背景的单色值。函数首先计算出 LCD 屏幕的总点数,然后设置光标位置,并开始写入 GRAM。接下来,使用 HAL_SRAM_Write_16b ​函数向 LCD 写入 16 位数据,数据内容为 COLOR​,写入次数为总点数。最后,将 COLOR ​值作为背景颜色,其补色作为字符颜色。

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

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

相关文章

Jenkins持续集成工具学习

一、从装修厨房看项目开发效率优化 二、持续集成工具 三、JavaEE项目部署方式对比 四、Jenkins+SVN持续集成环境搭建

WebGoC题解(18) 630.电线杆(2019NHOI小乙)

题目描述 小C在农场的附近看到有n颗电线杆排成一行&#xff0c;相邻之间距离为20。它们高度可能不一样&#xff0c;但高度相同的电线杆顶端有电线连接。如下面示意图中&#xff0c;电线杆用粗细为6的垂直直线画&#xff0c;电线用粗细为2的水平直线画。给定每个电线杆的高度&am…

Linux-Haproxy搭建Web群集

LVS在企业应用中抗负载能力强 不支持正则处理&#xff0c;不能实现动静分离对于大型网格&#xff0c;LVS的实施配置复杂&#xff0c;维护成本较高 Haproxy是一款可提供高可用性、负载均衡、及基于TCP和HTTP应用的代理的软件 适用于负载大的Web站点运行在硬件上可支持数以万计的…

AI大模型开发——4.transformer模型(0基础也可懂)(1)

无论是想怎样学习大模型&#xff0c;transformer都是一个绕不开的话题。transformer的出现彻底改变了nlp领域&#xff0c;进一步推动了大模型的产生&#xff0c;可以说&#xff0c;transformer就是大模型开发的鼻祖。 可能只通过说大家会有些不理解。大家可以看下方的大语言模型…

打卡第四十四天:最长公共子序列、不相交的线、最大子序和、判断子序列

一、最长公共子序列 题目 文章 视频 本题和最长重复子数组区别在于这里不要求是连续的了&#xff0c;但要有相对顺序&#xff0c;即&#xff1a;"ace" 是 "abcde" 的子序列&#xff0c;但 "aec" 不是 "abcde" 的子序列。 确定dp数…

4个快捷高效的ai在线写作工具推荐。

ai在线写作因其快速的创作方式&#xff0c;高效的写作效率以及能够为我们带来无限的灵感而被广泛应用。如果你还不会使用ai进行写作的话&#xff0c;就看看下面这4款AI写作工具吧。 1、笔灵在线创作 直通车 :https://ibiling.cn 这是个在线的AI工具网站&#xff0c;在内容创作…

个人可识别信息(PII) AI 去除 API 数据接口

个人可识别信息(PII) AI 去除 API 数据接口 ai / 隐私保护 基于 AI 模型自动去除个人识别信息&#xff08;PII&#xff09; 个人信息保护 / AI 模型 。 1. 产品功能 基于自有专业模型进行 PII 自动去除高效处理敏感信息全接口支持 HTTPS&#xff08;TLS v1.0 / v1.1 / v1.2 /…

地质灾害评估和治理工程勘查设计资质乙级资质办理标准

地质灾害评估和治理工程勘查设计资质乙级资质的办理标准主要包括单位条件、专业技术人员条件、仪器设备要求以及申请材料等方面。以下是详细的办理标准&#xff1a; 一、单位条件 **1、法人资格&#xff1a;**申请单位应具有企业法人或者事业单位法人资格。 **2、管理体系&a…

龙良曲pytorch课时1-课时13

前言 这篇是个人学习龙曲良老师的pytorch课程的笔记&#xff0c;疑惑地方自己加的内容 一、pytorch引入 1. 自动求导 在深度学习中&#xff0c;我们通常需要训练一个模型来最小化损失函数。这个过程可以通过梯度下降等优化算法来实现。梯度是函数在某一点上的变化率&#x…

Linux基础入门--目录结构之基本目录操作及注意事项

&#x1f600;前言 本篇博文是关于Linux基础入门–目录结构的基本介绍、基本目录和操作命令&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&…

滴答定时器笔记

SysTick介绍 1.1 什么是SysTick&#xff1f; Systick&#xff0c;即滴答定时器&#xff0c;是内核中的一个特殊定时器&#xff0c;用于提供系统级的定时服务。该定时器是一个24位的 递减计数器&#xff0c;具有自动重载值寄存器的功能。当计数器到达自动重载值时&#xff0c;它…

无人机中的温度/湿度/气压传感器详解!!!

一、温度传感器 温度传感器是一种用来测量物体或环境的温度变化的传感器。在无人机中&#xff0c;温度传感器通常采用红外线热成像技术&#xff0c;通过红外线相机获取物体表面的温度数据&#xff0c;实现对环境和物体温度的监测和测量。该技术具有响应速度快、无需接触、测量…

100个练习学习Rust!构文・整数・变量

前一篇文章 【0】准备 【1】构文・整数・变量 ← 本次全部文章列表 《100 Exercise To Learn Rust》第2回&#xff0c;也就是实际演习的第1回&#xff01;从这次开始&#xff0c;我们会适度减少前置说明&#xff0c;直接进入问题的解决&#xff01; 本次的相关页面 1.1. Syn…

SpringBoot入门第一篇

目录 SpringBootSpring Boot核心特性Spring Boot应用结构目录结构样例目录结构讲解 Spring Boot版本更新概览升级建议总结 常见使用场景社区和资源常见疑问**Spring Boot的自动配置机制是如何工作的&#xff1f;****Spring Boot支持哪些常见的配置文件格式&#xff1f;****为什…

硬件设计-1/f噪声、均方根(RMS)噪声与等效噪声带宽

简介&#xff1a; 学习下噪声的知识&#xff0c;为什么写这个呢&#xff0c;因为前几年有次面试和别人谈到这个问题。 定义解释&#xff1a; 1/F噪声 高频下的噪声为白噪声(即其频谱密度不会随频率而变化)。这种情况适用于运算放大器的大 部分频率范围&#xff0c;但在低频率…

C语言问答进阶--2、C语言简介及基本的输入输出函数

C语言简介 Q&#xff1a;您好&#xff0c;能大体介绍下C语言吗&#xff1f; A&#xff1a;当然可以。C语言是一种计算机语言&#xff0c;它主要被用在系统编程里&#xff0c;可以说&#xff0c;C语言的产生就和操作系统的编写密不可分。 【C语言简要历史】 1978年由美国电话电报…

Redis7.0.15 主从复制、哨兵模式搭建

主从复制&#xff1a;master以写为主&#xff0c;slave以读为主&#xff0c;当master数据变化的时候&#xff0c;自动将新的数据异步同步到其他的slave数据库 1. Redis复制介绍&#xff1a; https://redis.io/docs/latest/operate/oss_and_stack/management/replication/ 读写…

Unity游戏开发001

Unity游戏开发 系列文章的目录&#xff1a; 第一章&#xff1a;Hello&#xff0c;Unity&#xff01; “好读书&#xff0c;不求甚解&#xff1b;每有会意&#xff0c;便欣然忘食。” 本文目录&#xff1a; Unity游戏开发 Unity游戏开发前言今天我们来体验一下unity开发创建第一…

基于MMIO的Virtio流程分析——QEMU平台

目录 一、相关概念 1、Virtio 2、QEMU 3、KVM 4、MMIO 5、小结 二、QEMU中Virtio的实现方法 1、virtio_blk 2、virtio_net 三、Virtio Driver和Virtio Device 的初始化流程 1、Virtio Driver Init 2、Virtio Mmio Driver Init 3、Virtio Device Init (1) get dev…

培训第二十九天(python脚本使数据库读写分离,mysql主从开机自动同步,python操作数据库,MyCat插件的学习)

上午 1、python脚本实现数据库主从分离 # 引入模块 python链接mysql工具&#xff0c;驱动包&#xff0c;连接器import pymysql# python 类 类名 rwsplit,名字可以和文件名不一致# 三个函数&#xff0c;函数的标识 def 函数名 (self,参数列表):# __init__ 初始化函数&#xff…