【Linux-IMX6ULL-DDR3简介测试-RGBLCD控制原理】
目录
- 1. DDR3 简介
- 1.1 前要基本概念RAM & ROM
- 2. DDR3测试及初始化
- 3. RGBLCD简介及控制原理
- 3.1 RGBLCD简介
- 3.2.1 RGB LCD时序
- 3.2.2 像素时钟(800*400分辨率)
- 3.2.2 显存(800*400分辨率)
- 3.3 RGBLCD的控制
- 3.3.1 DOTCLK 硬件接口的时序控制
- 3.4 RGBLCD的控制代码实现
个人学习记录
1. DDR3 简介
1.1 前要基本概念RAM & ROM
首先进行简要的记录一些:
RAM:
掉电啊
(A)的一声,表示内容不在了,这个是内存,类比手机运行内存,对其使用是随用随取,不用申请;RAM:
掉电哦
(o)的一声,表示无所谓,这个是存储,类比硬盘,芯片内部flash,对其读写要进行地址和空间的申请后才能使用,速度比RAM慢
RAM发展路线:RAM->SRAM->SDRAM
;
首先说明DDR3是RAM类型的,一般而言,芯片自身内部就带有RAM,但是都比较小,而对于运行大型的操作系统或者软件就需要较大的内存,因此衍生了外置RAM,其中DDR3就是这些外置RAM中性价比比较高的RAM;
SDRAM(Synchronous Dynamic Random Access Memory) 适合用来做内存条,其中DDR1,2,3,4,5都属于SDRAM这一块,SRAM(Static Random-Access Memory) 适合做高速缓存或 MCU内部的 RAM,大量的 STM32 单片机开发板都使用到了 SRAM,比如 F103、F407 等;
2. DDR3测试及初始化
由于对于IMX6ULL而言外置的DDR3是外置的RAM,那么我怎么才能确定这个DDR3是正常工作的呢?这个测试不是通过程序来测试的,是通过外部软件检测来进行检测的,检测需要的关键数据如下:可通过NXP的DR检测软件来进行检测,如果自己要焊接板子的话要详细了解板子的启动方式这一章节;

DDR3这里的测试可以通过超频压力测试,一般超过其时钟频率的15%就代表这个芯片是工作正常的,注意再进行压力超频测试前要进行校准的设置;
注意测试前要进行校准测试

3. RGBLCD简介及控制原理
3.1 RGBLCD简介
首先就是要掌握的基本概念:
RGB
:(RED、GREEN、BLUE)三原色,分辨率
:例如1920*1080是什么含义,就是有这么多像素点像素格式
:例如蓝色有很多种,如何对这些进行度量呢?因此可以分别采用一个字节位也就是8bit来表示Red,Green,Blue,而一个字节表示0-255,因此可以通过数字的大小来表示颜色的种类或深度,称为RGB888,同理如果再加上一个字节表示透明度,也就是
ARGB888,这也是我们常用的像素格式;

- 一些较为重要的寄存器表示的含义:一帧图像显示就是一行一行的显示完毕,出来就是一幅图片;

3.2.1 RGB LCD时序
这里的时序指的是再进行LCD通信时采用的约定,这里进行行时序和帧时序的分别介绍:如下图:行显示对应的时序图;

其中关于DATA,DE,CLK,HSYNC写寄存器在RGBLCD的简介中已经介绍:下面对HSPW,HBP,HOZVAL,HFP进行一个简要的介绍:
HSPW
:有些地方也叫thp,根据时序图可以看出是确定HSYNC的低电平的持续时间的,单位是CLK,这里注意,必须要持续一段时间才能有效;HBP
:有些地方称为thb,行同步信号后肩
,一般也叫反步信号,单位是CLK;HOZVAL
:显示一行所用的时间,有些地方也称thd,单位是CLK;HFP
:有些地方也称为thf, 也称位行同步信号前肩
,单位是CLK;- 因此对于一行信号所用的时间为:
H=HSPW+HBP+HOZVAL+HFP
;
一帧图像就是由很多个行组成的,RGB LCD 的帧显示时序如图 所示:

同理这里对一些重要的术语进行介绍一下:
VSYNC
:帧同步信号,低电平有效,单位是CLK;VSPW
:也称为tvp,确定VSYNC的有效长度,单位是CLK;VBP
:也称为tvb,同步信号后肩,单位是CLK;LINE
:也称为tvd,显示一帧的有效时间,假如分辨率是800*400的话,那么LINE就是显示400行所用的时间;VFB
:也称为tvf,同步信号的前肩,单位是CLK;- 因此显示一帧所用的时间就是:有
VSPW+VBP+LINE+VFB
个行时间,也就是总的时间是: - Total=
(VSPW+VBP+LINE+VFB)*(HSPW+HBP+HOZVAL+HFP)
;
3.2.2 像素时钟(800*400分辨率)
屏幕的具体参数如下:像素时钟就是显示RGBLCD的时钟信号,这里拿显示一帧所用的时间来说明:上述已经得到了显示一帧所用的时间公示如下:
- Total=
(VSPW+VBP+LINE+VFB)*(HSPW+HBP+HOZVAL+HFP)
;
而我们屏幕的具体信息如下,因此可以算得显示60帧所用的时间:
Total=(VSPW+VBP+LINE+VFB)*(HSPW+HBP+HOZVAL+HFP)=(3+32+13+480)*(800+48+88+40)*60=30,919,680
;
也就是将近:31MHZ,这和官方标定的基本一致;

3.2.2 显存(800*400分辨率)
因为我们采用的是ARG888的像素格式,因此一个像素点的信息是4字节,因此要在内存中开辟出一段空间对这些像素内容进行存储,这个空间是多大呢,很简单。计算公式为:
800*400*4=1,280,000=1.28MB,也就是开辟1.3MB的空间就行
3.3 RGBLCD的控制
上面已经将RGBLCD基本信息介绍完毕,剩下的就是对RGBLCD的控制,这里控制有两种,一种是软件模拟控制,另外一种就是硬件接口的配置控制,由于IMX6ULL芯片带有RGBLCD的硬件控制接口DOTCLK 接口 ,因此我们可以通过配置IMX6ULL的寄存器来实现相关信号的产生;本质就是要实现与时序图一样的控制流程
;
3.3.1 DOTCLK 硬件接口的时序控制
由于不同的RGB屏幕的有些时间值是不确定的,例如行同步信号后肩的时间长度就不一致,因此在硬件接口中这些都是可以选择性的控制,所以硬件接口的时序和RGB屏幕的时序只是有些许兼容性的差别
,其他的都是一样的,其时序图如下:

所以到目前为止关于RGBLCD配置的前期原理相关知识储备已经完毕,剩下的就是配置IMX6ULL的相关寄存器产生上述的时序,重点就是关于VSPW,VBP,LINE,VFB,HSPW,HBP,HOZVAL,HFP这八个时间的配置
,而且还有模式选择、时钟信号、分辨率、像素格式等待,因此牵扯的寄存器较多,有兴趣的可以根据程序揣摩;这部分的内容可以单开一个系类了;但是其大体上的配置思路如下:
初始化相关的GPIO
LCD复位及停止复位
打开LCD的时钟
LCD的参数写入和控制命令寄存器的配置
LCD使能
清理屏幕
3.4 RGBLCD的控制代码实现
/*屏幕参数结构体变量*/
tftlcd_typedef_t tftlcd_dev;
/*初始化LCD函数*/
void lcd_init(void)
{/*初始化屏幕IO*/lcdgpio_init();lcd_reset();delay_ms(10);lcd_noreset(); /*停止复位*//*根据不同的屏幕ID设置不同的屏幕参数*/tftlcd_dev.height = 480; tftlcd_dev.width = 800;tftlcd_dev.vspw = 3;tftlcd_dev.vbpd = 32;tftlcd_dev.vfpd = 13;tftlcd_dev.hspw = 48;tftlcd_dev.hbpd = 88;tftlcd_dev.hfpd = 40;lcdclk_init(42, 4, 8); /* 初始化LCD时钟 31.5MHz */tftlcd_dev.pixsize=4;/*每个像素4个字节*/tftlcd_dev.framebuffer=LCD_FRAMEBUFFER;tftlcd_dev.forecolor=LCD_BLACK; /*前景色,自己进行计算,这里先用为红色*/tftlcd_dev.backcolor=LCD_WHITE; /*背景色设置为白色*//*配置LCD接口控值器接口*/LCDIF->CTRL = 0;/*清零*/LCDIF->CTRL |= (1 << 19) | (1 << 17) | (0 << 14) | (0 << 12) |(3 << 10) | (3 << 8) | (1 << 5) | (0 << 1);/*设置CTR1寄存器*/LCDIF->CTRL1=0;LCDIF->CTRL1 = (7<<16);LCDIF->TRANSFER_COUNT = 0;LCDIF->TRANSFER_COUNT = (tftlcd_dev.height<<16)|(tftlcd_dev.width<<0);/*有多少行,低16位*/LCDIF->VDCTRL0=0;LCDIF->VDCTRL0 = (tftlcd_dev.vspw<<0)|(1<<20)|(1<<21)|(1<<24)|(0<<25)|(0<<26)|(0<<27)|(1<<28)|(0<<29);LCDIF->VDCTRL1 = tftlcd_dev.vspw+tftlcd_dev.vbpd+tftlcd_dev.height+tftlcd_dev.vfpd;LCDIF->VDCTRL2 = (tftlcd_dev.hspw<<18)|(tftlcd_dev.hspw+tftlcd_dev.hbpd+tftlcd_dev.width+tftlcd_dev.hfpd);LCDIF->VDCTRL3 = (tftlcd_dev.vspw+tftlcd_dev.vbpd) | ((tftlcd_dev.hspw+tftlcd_dev.hbpd)<<16);LCDIF->VDCTRL4 = (tftlcd_dev.width)|(1<<18);LCDIF->CUR_BUF = (unsigned int)tftlcd_dev.framebuffer; LCDIF->NEXT_BUF = (unsigned int)tftlcd_dev.framebuffer;/*使能LCD ENABLE*/lcd_enable();delay_ms(10);lcd_clear(LCD_WHITE);
}/*复位LCD控制器*/
void lcd_reset(void)
{LCDIF->CTRL = (1<<31);
}
/*停止屏幕复位*/
void lcd_noreset(void)
{LCDIF->CTRL = (0<<31);
}
/*使能LCD控制器*/
void lcd_enable(void)
{LCDIF->CTRL |= (1<<0);
}
/*屏幕IO初始化*/
void lcdgpio_init(void)
{gpio_pin_config_t gpio_config;/* 1、IO初始化复用功能 */IOMUXC_SetPinMux(IOMUXC_LCD_DATA00_LCDIF_DATA00,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA01_LCDIF_DATA01,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA02_LCDIF_DATA02,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA03_LCDIF_DATA03,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA04_LCDIF_DATA04,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA05_LCDIF_DATA05,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA06_LCDIF_DATA06,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA07_LCDIF_DATA07,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA08_LCDIF_DATA08,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA09_LCDIF_DATA09,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA10_LCDIF_DATA10,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA11_LCDIF_DATA11,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA12_LCDIF_DATA12,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA13_LCDIF_DATA13,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA14_LCDIF_DATA14,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA15_LCDIF_DATA15,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA16_LCDIF_DATA16,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA17_LCDIF_DATA17,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA18_LCDIF_DATA18,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA19_LCDIF_DATA19,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA20_LCDIF_DATA20,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA21_LCDIF_DATA21,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA22_LCDIF_DATA22,0);IOMUXC_SetPinMux(IOMUXC_LCD_DATA23_LCDIF_DATA23,0);IOMUXC_SetPinMux(IOMUXC_LCD_CLK_LCDIF_CLK,0); IOMUXC_SetPinMux(IOMUXC_LCD_ENABLE_LCDIF_ENABLE,0); IOMUXC_SetPinMux(IOMUXC_LCD_HSYNC_LCDIF_HSYNC,0);IOMUXC_SetPinMux(IOMUXC_LCD_VSYNC_LCDIF_VSYNC,0);IOMUXC_SetPinMux(IOMUXC_GPIO1_IO08_GPIO1_IO08,0); /* 背光BL引脚 */IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18,0xF080); IOMUXC_SetPinConfig(IOMUXC_LCD_DATA00_LCDIF_DATA00,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA01_LCDIF_DATA01,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA02_LCDIF_DATA02,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA03_LCDIF_DATA03,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA04_LCDIF_DATA04,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA05_LCDIF_DATA05,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA06_LCDIF_DATA06,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA07_LCDIF_DATA07,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA08_LCDIF_DATA08,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA09_LCDIF_DATA09,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA10_LCDIF_DATA10,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA11_LCDIF_DATA11,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA12_LCDIF_DATA12,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA13_LCDIF_DATA13,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA14_LCDIF_DATA14,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA15_LCDIF_DATA15,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA16_LCDIF_DATA16,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA17_LCDIF_DATA17,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA18_LCDIF_DATA18,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA19_LCDIF_DATA19,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA20_LCDIF_DATA20,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA21_LCDIF_DATA21,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA22_LCDIF_DATA22,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_DATA23_LCDIF_DATA23,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_CLK_LCDIF_CLK,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_ENABLE_LCDIF_ENABLE,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_HSYNC_LCDIF_HSYNC,0xB9);IOMUXC_SetPinConfig(IOMUXC_LCD_VSYNC_LCDIF_VSYNC,0xB9);IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO08_GPIO1_IO08,0xB9); /* 背光BL引脚 *//* GPIO初始化 */gpio_config.direction = kGPIO_DigitalOutput; /* 输出 */gpio_config.outputLogic = 1; /* 默认关闭背光 */gpio_init(GPIO1, 8, &gpio_config); /* 背光默认打开 */gpio_pinwrite(GPIO1, 8, 1); /* 打开背光 */
}/*像素时钟初始化*/
/*不使用分子和分母,即小数分频器设置为0
loopdiv:27-54可选范围,即DIV_SECLECT寄存器
prediv:设置为1-8分频:实际的值为-1;便于理解
div:设置1-8分频:实际的值为-1,应为0代表的是1分频;
LCD_CLK=24*loopdiv/prediv/prediv
*/
void lcdclk_init(unsigned char loopdiv,unsigned char prediv,unsigned char div)
{/*不使用小数分频器*/CCM_ANALOG->PLL_VIDEO_NUM = 0;CCM_ANALOG->PLL_VIDEO_DENOM=0;/*设置DIV寄存器*/CCM_ANALOG->PLL_VIDEO = (1<<13)|(2<<19)|(loopdiv<<0);CCM_ANALOG->MISC2 &= ~(3<<30);/*这里的目的是把bit17-15变为011,是我只把最高位清零,把中间的置1,但是bit15如果原来是1的话,就不能选择正确的时钟*/CCM->CSCDR2 &= ~(1<<17);CCM->CSCDR2 |= (2<<15); /*四路时钟选择器*/ CCM->CSCDR2 &= ~(1<<15);CCM->CSCDR2 &=~(7<<12);CCM->CSCDR2 |= ((prediv-1)<<12);CCM->CBCMR &= ~(7<<23);CCM->CBCMR |= ((div-1)<<23);CCM->CSCDR2 &= ~(7<<9);/*选择时钟源*/CCM->CSCDR2 |= (0 << 9); /* LCDIF_PRE时钟源选择LCDIF_PRE时钟 */
}
/* 打点函数*/
inline void lcd_drawpoint(unsigned short x,unsigned short y,unsigned int color)
{ *(unsigned int*)((unsigned int)tftlcd_dev.framebuffer + tftlcd_dev.pixsize * (tftlcd_dev.width * y+x))=color;
}
/*读点函数*/
inline unsigned int lcd_readpoint(unsigned short x,unsigned short y)
{return *(unsigned int*)((unsigned int )tftlcd_dev.framebuffer+tftlcd_dev.pixsize*(tftlcd_dev.width*y+x));
}
/*清理屏幕内容,清屏函数*/
void lcd_clear(unsigned int color)
{unsigned int num;unsigned int i=0;unsigned int *startaddr=(unsigned int *)tftlcd_dev.framebuffer;num = (unsigned int)tftlcd_dev.width*tftlcd_dev.height;for(i=0;i<num;i++){startaddr[i]=color;}
}
相关文章:

【Linux-IMX6ULL-DDR3简介测试-RGBLCD控制原理】
目录 1. DDR3 简介1.1 前要基本概念RAM & ROM 2. DDR3测试及初始化3. RGBLCD简介及控制原理3.1 RGBLCD简介3.2.1 RGB LCD时序3.2.2 像素时钟(800*400分辨率)3.2.2 显存(800*400分辨率) 3.3 RGBLCD的控制3.3.1 DOTCLK 硬件接口…...

贪心算法-----柠檬水找零
今日题目:leetcode860 题目链接:点击跳转题目 分析: 顾客只会给三种面值:5、10、20,先分类讨论 当收到5美元时:不用找零,面值5张数1当收到10美元时:找零5美元,面值5张数…...

MySQL技能树学习
在MySQL中,DDL(数据定义语言)用于定义数据库对象(如表、索引、视图等),DML(数据操纵语言)用于操作数据库中的数据(如插入、更新、删除数据),DQL&a…...
java 动态代理详解
cglib 动态代理 介绍 CGLIB是一个功能强大,高性能的代码生成包。它为没有实现接口的类提供代理,为JDK的动态代理提供了很好的补充。通常可以使用Java的动态代理创建代理,但当要代理的类没有实现接口或者为了更好的性能,CGLIB 是一…...
Web路径专题
文章目录 Web路径专题什么是路径?绝对路径相对路径 如何使用路径?使用base标签 注意事项小结 Web路径专题 在Web开发中,路径是一个非常重要的概念。路径用来定位资源的位置,包括文件、目录、网页等。在本文中,我们将介…...

解决vue3项目打包后部署后某些静态资源图片不加载问题
目录 问题 原因 解决方案 问题 开发完项目打包并部署 然后访问时发现导航栏背景图片没加载 打开浏览器控制台发现这张图片报错404 原因 可能是因为在部署后的服务器环境中对中文文件名的支持不完善。服务器在解析 URL 时可能无法正确识别或编码中文字符,导致无…...

传感网应用开发教程--AT指令访问新大陆云平台(ESP8266模块+物联网云+TCP)
实现目标 1、熟悉AT指令 2、熟悉新大陆云平台新建项目 3、具体目标:(1)注册新大陆云平台;(2)新建一个联网方案为WIFI的项目;(3)ESP8266模块,通过AT指令访问…...
项目提交到空的git仓库流程
流程: # 初始化 Git 仓库 git init # 如果遇到 "detected dubious ownership" 的错误,可以添加 safe.directory 配置以解决 git config --global --add safe.directory T:/project/xxx # 将当前目录下的所有文件添加到 Git 暂存区 git add . …...

【Python】在Windows Server上部署Flask后端服务器
想要在Windows Server上部署flask应用,当然不能只下一个anaconda配完环境之后直接启动py文件,这样的话后台会有一段警告: * Serving Flask app app* Debug mode: off WARNING: This is a development server. Do not use it in a production …...

机器学习作业4——朴素贝叶斯分类器
目录 一、理论 一个例子: 二、代码 对于代码的解释: 1.fit函数: 2.predict函数: 三、实验结果 原因分析: 一、理论 朴素贝叶斯分类器基于贝叶斯定理进行分类,通过后验概率来判断将新数据归为哪一类。通过利用贝…...

BUU-[GXYCTF2019]Ping Ping Ping
考察点 命令执行 题目 解题 简单测试 ?ip应该是一个提示,那么就测试一下?ip127.0.0.1 http://0c02a46a-5ac2-45f5-99da-3d1b0b951307.node4.buuoj.cn:81/?ip127.0.0.1发现正常回显 列出文件 那么猜测一下可能会有命令执行漏洞,测试?ip127.0.…...

代码随想录Day 41|Leetcode|Python|198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III
198.打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个…...

【吴恩达机器学习-week2】多个变量的特征缩放和学习率问题
特征缩放和学习率(多变量) 目标 利用上一个实验中开发的多变量例程在具有多个特征的数据集上运行梯度下降探索学习率对梯度下降的影响通过 Z 分数归一化进行特征缩放,提高梯度下降的性能 import numpy as np np.set_printoptions(precisio…...
C#字符串的拼接
在C#中有多种拼接字符串的方式,今天小编就分享一些比较常用的。 方法1 string str "123"; str str "456"; 运行结果: "123456" 方法2 字符串与数字拼接 会将数字默认为字符串进行拼接 string str "123"; str str 1;…...

哈希表Hash table
哈希表是根据关键码的值而直接进行访问的数据结构。 数组就是⼀张哈希表。 哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素,如下图所示: 那么哈希表能解决什么问题呢,一般哈希表都是用来快速判断⼀个元素是…...
jdk8新特性----Lambda表达式
一、介绍 1、简介 Java的Lambda表达式是Java 8引入的一个特性,它支持函数式编程,允许将函数作为方法的参数或返回值,从而简化了匿名内部类的使用,并提供了对并行编程的更好支持。 2、语法 Lambda表达式的使用前提是存在一…...

在STM32中用寄存器方式点亮流水灯
文章目录 实验资料一、对寄存器的理解1.通俗认识寄存器2.深入了解寄存器(1)端口配置低寄存器(配置0到7引脚的寄存器)(2)端口配置高寄存器(配置8到15引脚) 3.GPIO口的功能描述 二、配…...

TCP(TCP客户端、服务器如何通信)
一、TCP介绍 TCP的特点: 面向连接的协议:TCP是一种可靠的、面向连接的协议,在通信之前需要建立连接,以确保数据的可靠传输。这意味着在传输数据之前,发送方和接收方之间需要建立一条可靠的连接通道。流式协议&#x…...
pdf 文件版面分析--PyMuPDF (python 文档解析提取)
1.介绍 PyMuPDF 和Fitz 是用于Python中处理PDF文件的相关模块。Fitz是P有MuPDF的字模块。提供一个简化和封装版本的P有MuPDF功能。 关系: PyMuPDF: 提供广泛的功能,用于操作PDF文档, 包括方便的高级函数与底层操作Fitz &#x…...
sql update 多表关联 inner join
当您需要更新一个表或者多个表中的数据,而多个表又存在关联时,可以使用 INNER JOIN 子句将多个表关联起来,并使用 SET更新。 格式如下: UPDATE table1 INNER JOIN table2 ON table1.column1 table2.column1 SET table1.column2…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...

mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...