锂离子电池模型参数辨识全流程:从等效电路到SOC/SOH估计
2026/10/29 6:16:09
LCD(液晶显示器)作为嵌入式系统中最常用的显示技术,已广泛应用于各种设备中。无论您是刚接触电子开发的新手,还是经验丰富的工程师,掌握LCD开发都是必备技能。本文将全面介绍LCD开发的基础知识,并深入对比在Linux和STM32平台上的开发流程,带您从小白走向大神。
LCD显示器通过控制液晶分子的排列来调节光线通过量,实现图像显示:
| 参数 | 描述 | 典型值 |
|---|---|---|
| 分辨率 | 屏幕像素数量 | 800×480, 1024×768 |
| 色彩深度 | 每个像素的颜色位数 | 16-bit (RGB565), 24-bit (RGB888) |
| 刷新率 | 屏幕每秒刷新次数 | 60Hz, 120Hz |
| 接口类型 | 与控制器连接方式 | RGB, MCU, SPI, MIPI-DSI |
| 视角 | 可清晰观看的角度 | 170°/160° (IPS面板) |
| 类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| TN | 响应快(1ms), 成本低 | 视角窄, 色彩差 | 简单显示 |
| IPS | 视角广(178°), 色彩准 | 功耗高, 成本高 | 工业控制, 医疗设备 |
| VA | 对比度高(3000:1) | 响应慢 | 视频播放 |
| OLED | 自发光, 对比度无限 | 烧屏风险 | 高端设备 |
// 典型信号线LCD_CS// 片选LCD_RS// 命令/数据选择LCD_WR// 写使能LCD_RD// 读使能LCD_DB[15:0]// 16位数据总线特点:控制器内置GRAM,直接发送像素数据
LCD_CLK// 像素时钟LCD_HSYNC// 水平同步LCD_VSYNC// 垂直同步LCD_DE// 数据使能LCD_DATA[23:0]// 24位RGB数据特点:需要外部帧缓冲,时序驱动
LCD_SCK// 时钟LCD_MOSI// 主出从入LCD_MISO// 主入从出(可选)LCD_CS// 片选LCD_DC// 数据/命令特点:引脚少,速度慢,适合小屏
CLK_P/N// 差分时钟DATA0_P/N// 差分数据0DATA1_P/N// 差分数据1...特点:高速串行,低功耗,手机平板常用
| 应用场景 | 推荐接口 | 原因 |
|---|---|---|
| 简单显示(小尺寸) | SPI | 引脚少,驱动简单 |
| 中等分辨率 | MCU | 成本低,无需外部RAM |
| 高分辨率视频 | RGB | 带宽大,刷新率高 |
| 移动设备 | MIPI-DSI | 低功耗,抗干扰 |
典型连接图(以MCU接口为例):
STM32F4/F7 ----------- || |FSMC |----DB[15:0]---> LCD ||----RS---------> LCD ||----WR---------> LCD ||----RD---------> LCD ||----CS---------> LCD || -----------// 使用STM32CubeMX配置FSMCvoidMX_FSMC_Init(void){FSMC_NORSRAM_TimingTypeDef Timing={0};hnsram1.Instance=FSMC_NORSRAM_DEVICE;hnsram1.Extended=FSMC_NORSRAM_EXTENDED_DEVICE;// 配置时序参数...HAL_SRAM_Init(&hsram1,&Timing,&Timing);}voidLCD_Init(void){// 硬件复位HAL_GPIO_WritePin(LCD_RESET_GPIO_Port,LCD_RESET_Pin,GPIO_PIN_RESET);HAL_Delay(20);HAL_GPIO_WritePin(LCD_RESET_GPIO_Port,LCD_RESET_Pin,GPIO_PIN_SET);HAL_Delay(50);// 发送初始化命令LCD_WriteCommand(0x11);// 退出睡眠HAL_Delay(120);LCD_WriteCommand(0x3A);// 设置颜色格式LCD_WriteData(0x55);// RGB565// ...更多初始化命令}// 设置绘制区域voidLCD_SetWindow(uint16_tx0,uint16_ty0,uint16_tx1,uint16_ty1){LCD_WriteCommand(0x2A);// 列地址设置LCD_WriteData(x0>>8);LCD_WriteData(x0&0xFF);LCD_WriteData(x1>>8);LCD_WriteData(x1&0xFF);LCD_WriteCommand(0x2B);// 行地址设置LCD_WriteData(y0>>8);LCD_WriteData(y0&0xFF);LCD_WriteData(y1>>8);LCD_WriteData(y1&0xFF);LCD_WriteCommand(0x2C);// 写入GRAM}// 填充颜色voidLCD_Fill(uint16_tx0,uint16_ty0,uint16_tx1,uint16_ty1,uint16_tcolor){LCD_SetWindow(x0,y0,x1,y1);uint32_tpixels=(x1-x0+1)*(y1-y0+1);for(uint32_ti=0;i<pixels;i++){LCD_WriteData(color);}}// 配置DMA传输voidLCD_DMA_Write(uint16_t*data,uint32_tsize){HAL_DMA_Start(&hdma_memtomem_dma2_stream0,(uint32_t)data,(uint32_t)&LCD->RAM,size);while(__HAL_DMA_GET_FLAG(&hdma_memtomem_dma2_stream0,__HAL_DMA_GET_TC_FLAG(0))==0);}uint16_tframe_buffer[2][SCREEN_WIDTH*SCREEN_HEIGHT];volatileuint8_tactive_buffer=0;// 渲染到非活动缓冲区voidrender_frame(void){uint8_trender_buffer=!active_buffer;// ...绘制操作// 切换缓冲区LCD_DMA_Write(frame_buffer[render_buffer],SCREEN_SIZE);active_buffer=render_buffer;}/ { lcd_panel: panel { compatible = "innolux,at070tn92"; backlight = <&backlight>; port { panel_in: endpoint { remote-endpoint = <&lcdc_out>; }; }; }; lcdc: lcd-controller { status = "okay"; port { lcdc_out: endpoint { remote-endpoint = <&panel_in>; }; }; }; };intmain(){intfb=open("/dev/fb0",O_RDWR);structfb_var_screeninfovinfo;ioctl(fb,FBIOGET_VSCREENINFO,&vinfo);// 计算帧缓冲大小longscreensize=vinfo.yres_virtual*vinfo.xres_virtual*vinfo.bits_per_pixel/8;// 内存映射char*fbp=mmap(0,screensize,PROT_READ|PROT_WRITE,MAP_SHARED,fb,0);// 绘制红色像素intlocation=(x+vinfo.xoffset)*(vinfo.bits_per_pixel/8)+(y+vinfo.yoffset)*vinfo.line_length;*(fbp+location)=0;// 蓝色*(fbp+location+1)=0;// 绿色*(fbp+location+2)=255;// 红色*(fbp+location+3)=0;// 透明度}// 初始化DRMintinit_drm(){drm_fd=open("/dev/dri/card0",O_RDWR);drmModeRes*res=drmModeGetResources(drm_fd);// 查找连接器for(inti=0;i<res->count_connectors;i++){drmModeConnector*conn=drmModeGetConnector(drm_fd,res->connectors[i]);if(conn->connection==DRM_MODE_CONNECTED&&conn->count_modes>0){connector_id=conn->connector_id;mode=conn->modes[0];break;}}// 创建帧缓冲structdrm_mode_create_dumbcreate={0};create.width=mode.hdisplay;create.height=mode.vdisplay;create.bpp=32;ioctl(drm_fd,DRM_IOCTL_MODE_CREATE_DUMB,&create);// 映射缓冲区structdrm_mode_map_dumbmap={0};map.handle=create.handle;ioctl(drm_fd,DRM_IOCTL_MODE_MAP_DUMB,&map);fb_data=mmap(0,create.size,PROT_READ|PROT_WRITE,MAP_SHARED,drm_fd,map.offset);}# 配置Qt./configure -embedded linux -qt-gfx-linuxfb -no-largefile\-qt-kbd-linuxinput -qt-mouse-linuxinput -prefix /opt/qt-embedded# 示例应用QApplication app(argc, argv);QLabel label("Hello Embedded LCD!");label.show();returnapp.exec();structwl_display*display=wl_display_create();structwl_compositor*compositor=bind_compositor(display);structwl_surface*surface=wl_compositor_create_surface(compositor);structwl_shell_surface*shell_surface=wl_shell_get_shell_surface(shell,surface);wl_shell_surface_set_toplevel(shell_surface);| 特性 | STM32开发 | Linux开发 |
|---|---|---|
| 硬件要求 | Cortex-M3/M4/M7 (≥100MHz) | Cortex-A (≥500MHz) |
| 开发复杂度 | 中等 | 高 |
| 启动时间 | <100ms | >1s |
| 实时性 | 硬实时 | 软实时 |
| 图形能力 | 基础2D图形 | 支持OpenGL ES 3D加速 |
| 内存需求 | 64KB+ | 512MB+ |
| 开发工具 | STM32CubeIDE, Keil | Yocto, Buildroot, Qt Creator |
| 成本 | $2-$10 | $10-$50 |
| 适用场景 | 工业控制、家电、车载仪表 | 医疗设备、POS机、智能家居中心 |
# 启用GPU加速exportQT_QPA_PLATFORM=eglfsexportQT_QPA_EGLFS_INTEGRATION=eglfs_kms// 使用双LTDC控制器(STM32H7)LTDC_HandleTypeDef hltdc1,hltdc2;MX_LTDC_Init(&hltdc1);// 主屏MX_LTDC2_Init(&hltdc2);// 副屏# 配置多显示drm --output HDMI-1 --mode 1920x1080 --pos 0x0\--output LVDS-1 --mode 1366x768 --right-of HDMI-1// STM32 ADC采样HAL_ADC_Start(&hadc1);uint16_tx=HAL_ADC_GetValue(&hadc1);uint16_ty=HAL_ADC_GetValue(&hadc2);&i2c1 { touchscreen: ft5336@38 { compatible = "focaltech,ft5336"; reg = <0x38>; interrupt-parent = <&gpio>; interrupts = <5 IRQ_TYPE_EDGE_FALLING>; }; };# Linux DRM调试modetest -M rockchip -a# FrameBuffer测试fbset -xres800-yres480-vxres800-vyres480-depth16随着技术的发展,LCD开发正朝着以下方向发展:
无论您选择STM32还是Linux平台,掌握LCD开发技术都将为您打开嵌入式系统开发的大门。从点亮第一个像素开始,逐步构建复杂的图形界面,最终实现引人入胜的用户体验。