STM322完全学习——FSMC控制LCD显示屏

一、GPIO初始化

首先这个功能只有大容量的STM32系列有,C8T6是没有的。再就是FSMC这个使用的是GPIO的复用功能,下面先完成我们需要使用的GPIO的初始化

void TFTLCD_GPIO_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);//使能PD,PE,PF,PG时钟 GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);  //FSMC_D0-FSMC_D15GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC);  GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC); GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC);GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC);     //FSMC_NOEGPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC);     //FSMC_NWEGPIO_PinAFConfig(GPIOF,GPIO_PinSource12,GPIO_AF_FSMC);    //FSMC_A6GPIO_PinAFConfig(GPIOG,GPIO_PinSource12,GPIO_AF_FSMC);    //FSMC_NE4GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14| GPIO_Pin_15;//PD0,1,4,5,8,9,10,14,15 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;              //复用输出GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;            //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;              //上拉GPIO_Init(GPIOD, &GPIO_InitStructure);                    //初始化 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15;//PE7~15GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;              //复用输出GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;            //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;              //上拉GPIO_Init(GPIOE, &GPIO_InitStructure);                    //初始化  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;           //PF12,FSMC_A6GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;         //复用输出GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;       //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;   //100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;         //上拉GPIO_Init(GPIOF, &GPIO_InitStructure);               //初始化  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;             //PG12,FSMC_NE4GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;           //复用输出GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;         //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;     //100MHzGPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;           //上拉GPIO_Init(GPIOG, &GPIO_InitStructure);                 //初始化 
}

主要看的是你的这些接口接的是哪里,这个每个开发板的设置可能都不太一一样但是也大差不差,仔细核对好。

二、FSMC初始化

void TFTLCD_FSMC_Init(void)
{FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;FSMC_NORSRAMTimingInitTypeDef  FSMC_ReadNORSRAMTiming; FSMC_NORSRAMTimingInitTypeDef  FSMC_WriteNORSRAMTiming;RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);//使能FSMC时钟FSMC_ReadNORSRAMTiming.FSMC_AddressSetupTime = 0X01;	 //地址建立时间(ADDSET)为2个HCLK 1/168M=6ns*2=12ns	FSMC_ReadNORSRAMTiming.FSMC_AddressHoldTime = 0x00;	 //地址保持时间(ADDHLD)模式A未用到	FSMC_ReadNORSRAMTiming.FSMC_DataSetupTime = 0x0f;			//数据保存时间为16个HCLK	因为液晶驱动IC的读数据的时候,速度不能太快FSMC_ReadNORSRAMTiming.FSMC_BusTurnAroundDuration = 0x00;FSMC_ReadNORSRAMTiming.FSMC_CLKDivision = 0x00;FSMC_ReadNORSRAMTiming.FSMC_DataLatency = 0x00;FSMC_ReadNORSRAMTiming.FSMC_AccessMode = FSMC_AccessMode_A;	 //模式A FSMC_WriteNORSRAMTiming.FSMC_AddressSetupTime =0x03;	      //地址建立时间(ADDSET)为1个HCLK  FSMC_WriteNORSRAMTiming.FSMC_AddressHoldTime = 0x00;	 //地址保持时间(A		FSMC_WriteNORSRAMTiming.FSMC_DataSetupTime = 0x02;		 //数据保存时间为6ns*9个HCLK=54nsFSMC_WriteNORSRAMTiming.FSMC_BusTurnAroundDuration = 0x00;FSMC_WriteNORSRAMTiming.FSMC_CLKDivision = 0x00;FSMC_WriteNORSRAMTiming.FSMC_DataLatency = 0x00;FSMC_WriteNORSRAMTiming.FSMC_AccessMode = FSMC_AccessMode_A;	 //模式A FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;//  这里我们使用NE4 ,也就对应BTCR[6],[7]。FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不复用数据地址FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM;  //SRAM   FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为16bit   FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable; FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;   FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;  FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;	//  存储器写使能FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;   FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable; // 读写使用不同的时序FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_ReadNORSRAMTiming; //读写时序FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &FSMC_WriteNORSRAMTiming;  //写时序FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //初始化FSMC配置FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);  // 使能BANK1  
}

上面初始化赋值的这些参数也不是一成不变,自己可以不断地尝试一些不同的设置,你会发现他还是可以正常工作。

三、实现TFT写命令和数据的函数

我们使用FSMC的方法来控制LCD,那你就要忘记我们使用IO模拟时序许的方法,因为在这里我们只能控制FSMC然后通过他去控制LCD,而不是还要想着控制GPIO怎样去发送数据,因为FSMC不是专门被设计用来控制LCD的因此我们只是用到这个模块其中的一些功能我们是将他控制SRAM的方法修改了一下。

既然我们使用的是SRAM这个模块的控制器,那么我们到时候控制的地址就在上面这个范围里面 ,但是这个块里面还有四个小块。这个主要看你的开发板是怎么接的,NE4就是使用的里面的第四个小块那么他的地址范围就是0x6C00 0000-0x6FFF FFFF这个地址很重要一定要记得。还需要注意那个FSMC_A6这个引脚,每个开发板也会不一样,这个也很很重要,关系到写指令和写数据的时候需要写的地址。

下面关于一些地址偏移进行一些说明,主要是将数据手册的下面这一部分说清楚:

第一种8位的我们就不说了,地址就是一一对应的。对于我们这种数据总线16的来说,我们来看下面这个情况,这个说法也不太严谨,简单的来说,就是他们两个之间有一个1比2的关系。在STM32内部每4个地址构成1个32位数据位,而外部存储器每两个地址构成一个16位的数据。注意每个地址都只有1个字节。

会存在上面的对应关系,因为左边的地址只有偶数,而右边的地址是连续的因此你会发现将左边的地址右移一位便可以得到右边的地址上面我这个移位只考虑了,后面几位。你懂这个意思就可以啦。因此当我们想要操作的右边的地址假如是0x1002 那么当你在STM32中控制FSMC里面的地址的时候一定要先将这个地址左移一位,然后在和我们FSMC里面的基地址在进行位或,这样的话到时候FSMC会将这个地址右移一位,就刚好是我们想要操作的那个地址了。正如上面所说的,我们呢使用的是块1里面的第四个小块,他的起始地址是0X6C00 0000 而我们用来选择写数据还是写命令的那个线接到了,FSMC里面的第10根地址线,我们还知道RS线上0是写命令,1是写数据,因此这边将RS信号线接到了A10这根地址线上面,因此我们在写命令的是时候,需要给0x6c00 0000这个地址里面写就相当于写命令,给0x6c00 0800里面写入东西就相当于写数据,这个地址里面第11位是1,也就是到时候FSMC会右移一下,这样这个地址的第10位就是1,就相当于RS=1。这样就达到了目的。

#define LCD_CMD             (*(uint32_t *) 0X6C000000)
#define LCD_DATA            (*(uint32_t *) 0X6C000800)

你只需要将自己要写的入的命令或数据直接赋值给上面的宏定义即可。当然这样处理是可以的但是不是唯一的地址,这样只是看起来好看一点,通俗的来讲只要是第11位地址是0其他位无论什么都可以当作写命令的地址,第11位是1其他位无论是什么都可以当作写数据的地址。下面这个使用的是结构体的方式,这里的RS连接的是A6也就是第6根数据线,这里需要注意一下。

//TFTLCD地址结构体
typedef struct
{u16 LCD_CMD;u16 LCD_DATA;
}TFTLCD_TypeDef;//使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A6作为数据命令区分线 
//注意设置时STM32内部会右移一位对齐! 111 1110=0X7E		
//当结构体内部的地址进行对齐的时候,0x6c00 007e首先会加2 也就是0x6c00 0080
//这样你就会发现两个地址在第7位分别是0和1.	 
#define TFTLCD_BASE        ((u32)(0x6C000000 | 0x0000007E))
#define TFTLCD             ((TFTLCD_TypeDef *) TFTLCD_BASE)//当然这样的处理也不是唯一的 例如你将结构体里面的两个数据颠倒写一下,也就是数据写到第一位,命令写到第二位,就会有下面的这个
/*//TFTLCD地址结构体typedef struct{u16 LCD_DATA;u16 LCD_CMD;}TFTLCD_TypeDef;//注意这里还是A6作为数据命令区分线//首先数据写在前面也就是A7必须先为1,然后通过地址对齐在为0//这样地址就是1111 1110 = 0XFE#define TFTLCD_BASE        ((u32)(0x6C000000 | 0x000000FE))#define TFTLCD             ((TFTLCD_TypeDef *) TFTLCD_BASE)
*/  //写寄存器函数
//cmd:寄存器值
void LCD_WriteCmd(u16 cmd)
{TFTLCD->LCD_CMD=cmd;
}//写数据
//data:要写入的值
void LCD_WriteData(u16 data)
{TFTLCD->LCD_DATA=data;
}void LCD_WriteData_Color(u16 color)
{TFTLCD->LCD_DATA=color;
}

当然我上面结构体的这种方法使用的是A6地址线,下面我修改一下使用A10地址线,同样也是两种方法;

//TFTLCD地址结构体
typedef struct
{u16 LCD_CMD;u16 LCD_DATA;
}TFTLCD_TypeDef;
//使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A10作为数据命令区分线 
//注意设置时STM32内部会右移一位对齐! 111 1111 1110=0X7FE	
//当结构体内部的地址进行对齐的时候,0x6c00 07FE首先会加2 也就是0x6c00 0800
//这样你就会发现两个地址在第11位分别是0和1.	
#define TFTLCD_BASE        ((u32)(0x6C000000 | 0x000007FE))
#define TFTLCD             ((TFTLCD_TypeDef *) TFTLCD_BASE)//当然这样的处理也不是唯一的 例如你将结构体里面的两个数据颠倒写一下,也就是数据写到第一位,命令写到第二位,就会有下面的这个
/*//TFTLCD地址结构体typedef struct{u16 LCD_DATA;u16 LCD_CMD;}TFTLCD_TypeDef;//注意这里还是A10作为数据命令区分线//首先数据写在前面也就是A11必须先为1,然后通过地址对齐在为0//这样地址就是1111 1111 1110 = 0XFFE#define TFTLCD_BASE        ((u32)(0x6C000000 | 0x00000FFE))#define TFTLCD             ((TFTLCD_TypeDef *) TFTLCD_BASE)
*/  //写寄存器函数
//cmd:寄存器值
void LCD_WriteCmd(u16 cmd)
{TFTLCD->LCD_CMD=cmd;
}//写数据
//data:要写入的值
void LCD_WriteData(u16 data)
{TFTLCD->LCD_DATA=data;
}void LCD_WriteData_Color(u16 color)
{TFTLCD->LCD_DATA=color;
}

四、TFTLCD的初始化

每个开发板使用的LCD显示屏是不同的,因此每个芯片的初始化序列可能有些不一样,我这里的LCD驱动芯片型号是ILI9481,下面是初始化代码这些如果想详细了解需要看数据手册,我这里直接将别人写好的移植过来直接使用,我主要是用,因此只要能工作就行。


void TFTLCD_Init(void)
{TFTLCD_GPIO_Init();TFTLCD_FSMC_Init();delay_ms(10);/*****************省略掉了50毫秒的延时**************/LCD_WriteCmd(0xFF);LCD_WriteCmd(0xFF);/*****************省略掉了5毫秒的延时**************/delay_ms(5);LCD_WriteCmd(0xFF);LCD_WriteCmd(0xFF);LCD_WriteCmd(0xFF);LCD_WriteCmd(0xFF);/*****************省略掉了10毫秒的延时**************/delay_ms(10);LCD_WriteCmd(0xB0);LCD_WriteData(0x00);LCD_WriteCmd(0xB3);LCD_WriteData(0x02);LCD_WriteData(0x00);LCD_WriteData(0x00);LCD_WriteData(0x00);LCD_WriteCmd(0xC0);LCD_WriteData(0x13);LCD_WriteData(0x3B);//480LCD_WriteData(0x00);LCD_WriteData(0x00);LCD_WriteData(0x00);LCD_WriteData(0x01);LCD_WriteData(0x00);//NWLCD_WriteData(0x43);LCD_WriteCmd(0xC1);LCD_WriteData(0x08);LCD_WriteData(0x1B);//CLOCKLCD_WriteData(0x08);LCD_WriteData(0x08);LCD_WriteCmd(0xC4);LCD_WriteData(0x11);LCD_WriteData(0x01);LCD_WriteData(0x73);LCD_WriteData(0x01);LCD_WriteCmd(0xC6);LCD_WriteData(0x00);LCD_WriteCmd(0xC8);LCD_WriteData(0x0F);LCD_WriteData(0x05);LCD_WriteData(0x14);LCD_WriteData(0x5C);LCD_WriteData(0x03);LCD_WriteData(0x07);LCD_WriteData(0x07);LCD_WriteData(0x10);LCD_WriteData(0x00);LCD_WriteData(0x23);LCD_WriteData(0x10);LCD_WriteData(0x07);LCD_WriteData(0x07);LCD_WriteData(0x53);LCD_WriteData(0x0C);LCD_WriteData(0x14);LCD_WriteData(0x05);LCD_WriteData(0x0F);LCD_WriteData(0x23);LCD_WriteData(0x00);LCD_WriteCmd(0x35);LCD_WriteData(0x00);LCD_WriteCmd(0x44);LCD_WriteData(0x00);LCD_WriteData(0x01);LCD_WriteCmd(0xD0);LCD_WriteData(0x07);LCD_WriteData(0x07);//VCI1LCD_WriteData(0x1D);//VRHLCD_WriteData(0x03);//BTLCD_WriteCmd(0xD1);LCD_WriteData(0x03);LCD_WriteData(0x5B);//VCMLCD_WriteData(0x10);//VDVLCD_WriteCmd(0xD2);LCD_WriteData(0x03);LCD_WriteData(0x24);LCD_WriteData(0x04);LCD_WriteCmd(0x2A);LCD_WriteData(0x00);LCD_WriteData(0x00);LCD_WriteData(0x01);LCD_WriteData(0x3F);//320LCD_WriteCmd(0x2B);LCD_WriteData(0x00);LCD_WriteData(0x00);LCD_WriteData(0x01);LCD_WriteData(0xDF);//480LCD_WriteCmd(0x36);LCD_WriteData(0x00);LCD_WriteCmd(0xC0);LCD_WriteData(0x13);LCD_WriteCmd(0x3A);LCD_WriteData(0x55);LCD_WriteCmd(0x11);/*****************省略掉了150毫秒的延时**************/delay_ms(10);LCD_WriteCmd(0x29);/*****************省略掉了30毫秒的延时**************/delay_ms(10);	LCD_WriteCmd(0x2C);LCD_Display_Dir(TFTLCD_DIR);		//0:竖屏  1:横屏  默认竖屏LCD_Clear(WHITE);
}//清屏函数
//color:要清屏的填充色
void LCD_Clear(u16 color)
{uint16_t i, j ;LCD_Set_Window(0, 0, tftlcd_data.width-1, tftlcd_data.height-1);	 //作用区域for(i=0; i<tftlcd_data.width; i++){for (j=0; j<tftlcd_data.height; j++){LCD_WriteData_Color(color);}} 
}//设置LCD显示方向
//dir:0,竖屏;1,横屏
void LCD_Display_Dir(u8 dir)
{if (dir==0)  //默认竖屏方向{		LCD_WriteCmd(0x36);   //设置彩屏显示方向的寄存器LCD_WriteData(0x00);  tftlcd_data.height=480;tftlcd_data.width=320;tftlcd_data.dir=0;}else { LCD_WriteCmd(0x36);   //设置彩屏显示方向的寄存器LCD_WriteData(0x60);  tftlcd_data.height=320;tftlcd_data.width=480;			tftlcd_data.dir=1;} }//设置窗口,并自动设置画点坐标到窗口左上角(sx,sy).
//sx,sy:窗口起始坐标(左上角)
//width,height:窗口宽度和高度,必须大于0!!
//窗体大小:width*height. 
void LCD_Set_Window(u16 sx,u16 sy,u16 width,u16 height)
{  LCD_WriteCmd(0x2A);LCD_WriteData(sx/256);   LCD_WriteData(sx%256); 	 LCD_WriteData(width/256); LCD_WriteData(width%256);LCD_WriteCmd(0x2B);LCD_WriteData(sy/256);  LCD_WriteData(sy%256);LCD_WriteData(height/256); LCD_WriteData(height%256); 	LCD_WriteCmd(0x2C);
}//在指定区域内填充单个颜色
//(sx,sy),(ex,ey):填充矩形对角坐标,区域大小为:(ex-sx+1)*(ey-sy+1)   
//color:要填充的颜色
void LCD_Fill(u16 xState,u16 yState,u16 xEnd,u16 yEnd,u16 color)
{          uint16_t temp;if((xState > xEnd) || (yState > yEnd)){return;}   LCD_Set_Window(xState, yState, xEnd, yEnd); xState = xEnd - xState + 1;yState = yEnd - yState + 1;while(xState--){temp = yState;while (temp--){			LCD_WriteData_Color(color);	}}	
} //快速画点
//x,y:坐标
//color:颜色
void LCD_DrawFRONT_COLOR(u16 x,u16 y,u16 color)
{	   LCD_Set_Window(x, y, x, y);LCD_WriteData_Color(color);	
}

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

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

相关文章

MongoDB数据备份与恢复(内含工具下载、数据处理以及常见问题解决方法)

一、工具准备 对MongoDB进行导入导出、备份恢复等操作时需要用到命令工具&#xff0c;我们要先检查一下MongoDB安装目录下是否有这些工具&#xff0c;正常情况下是没有的:)&#xff0c;因为新版本的MongoDB安装时不包含这些工具&#xff0c;需要我们手动下载安装。下载成功之后…

【C语言】volatile 防止编译的时候被优化

volatile 易变的 volatile是 C 和 C 中的一个类型修饰符&#xff0c;用于指示编译器该变量可能在程序之外被更改&#xff0c;因此不应对其进行优化。这在涉及硬件寄存器、信号处理或多线程编程时非常有用。 如果你做过单片机开发&#xff0c;你肯定写过这样的代码&#xff1a;…

el-table实现最后一行合计功能并合并指定单元格

效果图如下&#xff1a; 表格代码如下&#xff1a; <el-table width"100%"ref"tableRef" style"margin-bottom: 15px;":data"jlData"class"tableHeader6"header-row-class-name"headerStyleTr6":row-class-n…

【JavaSE】【网络编程】UDP数据报套接字编程

目录 一、网络编程简介二、Socket套接字三、TCP/UDP简介3.1 有连接 vs 无连接3.2 可靠传输 vs 不可靠传输3.3 面向字节流 vs 面向数据报3.4 双向工 vs 单行工 四、UDP数据报套接字编程4.1 API介绍4.1.1 DatagramSocket类4.1.1.1 构造方法4.1.1.2 主要方法 4.1.2 DatagramPocket…

web——sqliabs靶场——第十二关——(基于错误的双引号 POST 型字符型变形的注入)

判断注入类型 a OR 1 1# 发现没有报错 &#xff0c;说明单引号不是闭合类型 测试别的注入条件 a) OR 1 1# a)) OR 1 1# a" OR 11 发现可以用双引号闭合 发现是")闭合 之后的流程还是与11关一样 爆破显示位 先抓包 是post传参&#xff0c;用hackbar来传参 unam…

【Linux】开发工具make/Makefile、进度条小程序

Linux 1.make/Makefile1.什么是make和Makefile&#xff1f;2.stat命令3.Makefile单个文件的写法4.Makefile多个文件的写法 2.进度条1.回车\r、换行\n2.缓冲区3.进度条1.倒计时程序2.进度条程序 1.make/Makefile 1.什么是make和Makefile&#xff1f; 一个工程中的源文件不计其…

Ubuntu22.04配置强化学习环境及运行相关Demo

什么是强化学习 强化学习&#xff08;Reinforcement Learning&#xff0c;简称 RL&#xff09;是机器学习中的一个重要分支&#xff0c;属于一种基于试错机制的学习方法。它通过让智能体&#xff08;Agent&#xff09;与环境&#xff08;Environment&#xff09;进行交互&…

GitHub 开源项目 Puter :云端互联操作系统

每天面对着各种云盘和在线应用&#xff0c;我们常常会遇到这样的困扰。 文件分散在不同平台很难统一管理&#xff0c;付费订阅的软件越来越多&#xff0c;更不用说那些烦人的存储空间限制了。 最近在 GitHub 上发现的一个开源项目 Puter 彻底改变了我的在线办公方式。 让人惊…

深入解析小程序组件:view 和 scroll-view 的基本用法

深入解析小程序组件:view 和 scroll-view 的基本用法 引言 在微信小程序的开发中,组件是构建用户界面的基本单元。两个常用的组件是 view 和 scroll-view。这两个组件不仅功能强大,而且使用灵活,是开发者实现复杂布局和交互的基础。本文将深入探讨这两个组件的基本用法,…

河道水位流量一体化自动监测系统:航运安全的护航使者

在广袤的水域世界中&#xff0c;航运安全始终是至关重要的课题。而河道水位流量一体化自动监测系统的出现&#xff0c;如同一位强大的护航使者&#xff0c;为航运事业的稳定发展提供了坚实的保障。 水位传感器&#xff1a;负责实时监测河道的水位变化。这些传感器通常采用先进的…

开源可视化工具对比:JimuReport VS DataEase

在当今数据驱动的时代&#xff0c;高效的数据可视化工具成为企业洞察业务、做出决策的关键利器。那对于企业来讲如何选择BI产品呢&#xff1f; 在开源可视化工具的领域中&#xff0c;JimuReport和DataEase 以其独特的优势脱颖而出&#xff0c;究竟谁更胜一筹呢&#xff1f;让我…

jquery还有其应用场景,智慧慢慢地被边缘化,但不会消亡

一、jQuery 的辉煌过往 jQuery 的诞生与崛起 在前端开发的漫长历史中&#xff0c;2006 年诞生的 jQuery 犹如一颗耀眼的新星划破天际。它由 John Resig 创造&#xff0c;一出现便以其独特的魅力迅速吸引了广大开发者的目光。在那个前端技术发展相对缓慢的时期&#xff0c;jQue…

TSmaster 专栏索引

文章目录 软件下载官方中文手册和视频教程窗口对齐关闭窗体报文格式转换TSmaster 硬件配置及连接TSmaster Measurement setup&#xff08;测量设置&#xff09; 软件下载 下载路径&#xff1a;https://www.tosunai.com/downloads/ 官方中文手册和视频教程 窗口对齐 一个工作…

Java小白成长记(创作笔记一)

目录 序言 思维导图 开发流程 新建SpringBoot并整合MybatisPlus 新建SpringBoot 整合MybatisPlus 统一结果封装 全局异常处理 引入数据库 序言 在一个充满阳光的早晨&#xff0c;一位对编程世界充满好奇的年轻人小小白&#xff0c;怀揣着梦想与激情&#xff0c;踏上了学习…

SpringBoot+Vue 2 多方法实现(图片/视频/报表)文件上传下载,示例超详细 !

目录 一、主流方法介绍 1. Base 64 2. 二进制流传输 3. multipart/form-data 4. FTP/SFTP 5. 云存储服务API 二、multipart/form-data 方式上传单个文件 1、前端部分 2、后端部分 三、multipart/form-data 方式上传多个文件 1、前端部分 2、后端部分 四、Base 64 方…

小米顾此失彼:汽车毛利大增,手机却跌至低谷

科技新知 原创作者丨依蔓 编辑丨蕨影 三年磨一剑的小米汽车毛利率大增&#xff0c;手机业务毛利率却出现下滑景象。 11月18日&#xff0c;小米集团发布 2024年第三季度财报&#xff0c;公司实现营收925.1亿元&#xff0c;同比增长30.5%&#xff0c;预估902.8亿元&#xff1b;…

unity中:超低入门级显卡、集显(功耗30W以下)运行unity URP管线输出的webgl程序有那些地方可以大幅优化帧率

删除Global Volume&#xff1a; 删除Global Volume是一项简单且高效的优化措施。实测表明&#xff0c;这一改动可以显著提升帧率&#xff0c;甚至能够将原本无法流畅运行的场景变得可用。 更改前的效果&#xff1a; 更改后的效果&#xff1a; 优化阴影和材质&#xff1a; …

webgl threejs 云渲染(服务器渲染、后端渲染)解决方案

云渲染和流式传输共享三维模型场景 1、本地无需高端GPU设备即可提供三维项目渲染 云渲染和云流化媒体都可以让3D模型共享变得简单便捷。配备强大GPU的远程服务器早就可以处理密集的处理工作&#xff0c;而专有应用程序&#xff0c;用户也可以从任何个人设备查看全保真模型并与…

React Native 基础

React 的核心概念 定义函数式组件 import组件 要定义一个Cat组件,第一步要使用 import 语句来引入React以及React Native的 Text 组件: import React from react; import { Text } from react-native; 定义函数作为组件 const CatApp = () => {}; 渲染Text组件

【专题】中国企业出海洞察报告暨解码全球制胜之道报告汇总PDF洞察(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p38314 在当今全球化的浪潮中&#xff0c;中国企业的出海行动正以前所未有的规模和速度展开&#xff0c;成为全球经济舞台上的重要力量。本报告旨在对 2024 年中国企业出海情况进行深度洞察&#xff0c;涵盖多个领域和视角。 从对外投…