04_瑞萨GUI(LVGL)移植实战教程之驱动LCD屏(SPI)

本系列教程配套出有视频教程,观看地址:https://www.bilibili.com/video/BV1gV4y1e7Sg

4. 驱动LCD屏(SPI)

本次实验我们在上一次实验的基础上驱动 LCD屏(SPI)。

上次实验我们已经能驱动触摸屏(I2C)并打印触摸点坐标,这次实验我们的目标是点亮LCD屏,向屏幕依次刷写红绿蓝三种不同的颜色,并在串口终端打印当前刷新的颜色文本信息。

4.1 复制工程

上次实验得出的工程我们可以通过复制在原有的基础上得到一个新的工程。

如果你不清楚复制工程的步骤,请参考阅读第2章实验的步骤教程。

本次实验我们的项目命名为:02_dshanmcu_ra6m5_spi_display

chapter-4_001

4.2 配置FSP

4.2.1 查看硬件资料

打开位于 03硬件资料\1_开发板原理图\ DshanMCU_RA6M5_V4.0.pdf 的开发板原理图,确认SPI引脚,电路图如下:

chapter-4_003

可以看到原理图并没有像之前那样直接就能确定使用的是哪一路spi,因此需要打开位于 03硬件资料\5_官方资料\RA6M5 Group User's Manual Hardware.pdf 的文档,跳转到下图所示的两个位置,确定使用的是 spi1:

chapter-4_003 chapter-4_003-0

03硬件资料\5_官方资料\RA6M5 Group User's Manual Hardware.pdf 的文档,跳转到下图所示的位置,确定SPI时钟频率计算公式:

chapter-4_003-1

打开 e2studio 如下窗口,确定当前的 PCLKA:
由下图可知 PCLKA 为 200MHz,因此可得出支持的SPI最大时钟频率为:100/ (2*(0+1) * 2^0) = 100 / 2 = 50Mbps

chapter-4_003-3

打开位于 4_模块资料\01_ST7796显示器芯片手册\ST7796U2_SPEC_V1.0.pdf 的文档,跳转到下图所示的位置:

chapter-4_003-3

通过换算可得出时钟频率: 1000000000 / 15= 66,666,666.66666667 ≈ 66.5Mhz

接下来我们根据这些信息对 r_spi 进行配置。

4.2.2 添加 Stacks(r_spi_master)

  1. 打开 FSP Configuration 视图:双击项目文件夹中的 configuration.xml 文件。
  2. 按照下图所示,添加 r_spi 模块:
chapter-4_005
  1. 点击刚刚添加的 r_spi 在底部窗口的 Properties 选项卡中对其进行配置,将其配置为与下图一致:

    • Name: g_spi1
    • Channel: 1
    • Callback: spi1_callback
    • Bitrate: 50000000
chapter-4_006

配置完成之后,如果马上编译会发现编译出错、可以根据错误信息进行解决,也可以在编译前参考下图解决:

chapter-4_007

点击刚刚添加的 r_dmac 在底部窗口的 Properties 选项卡中对其进行配置,将其配置为与下图一致:

  • Name: g_transfer1
  • Channel:1
chapter-4_008

4.2.3 配置RS、RESET、PWM引脚

这三个引脚,在上面的原理图中有标注,负责的功能分别是:

  • RS引脚(P104):低电平代表发送的是指令,高电平代表发送的是数据
  • RESET引脚(P105):控制LCD屏的复位
  • PWM引脚(P608):可以自由调节背光亮度调节,给高电平常亮

根据他们负责的功能特性,在FSP对其进行配置:

  1. 按下图所示操作,打开配置IO引脚页面:
chapter-4_009
  1. 按下图所示操作,配置RS引脚(P104)
chapter-4_010
  1. 按下图所示操作,配置RESET引脚(P105)
chapter-4_011
  1. 按下图所示操作,配置PWM引脚(P608)
chapter-4_012

最后检查确认无误,点击右上角的 “Generate Project Content” e2studio就会根据我们对FSP的配置自动配置项目、生成相应的代码。

chapter-4_012

4.3 编写LCD驱动代码

在e2studio中进入 02_dshanmcu_ra6m5_spi_display\dshanmcu_ra6m5\drivers 目录,新建如下两个文件 drv_spi_display.cdrv_spi_display.h

chapter-4_012

在e2studio中点击打开 02_dshanmcu_ra6m5_spi_display\dshanmcu_ra6m5\drivers\drv_spi_display.c 添加下面的代码:

/************************************************************************************************************************ Includes**********************************************************************************************************************/
#include "drv_spi_display.h"
#include <stdio.h>/*********************************************************************************************************************** Macro definitions**********************************************************************************************************************/
#define LCD_DC_PIN              BSP_IO_PORT_01_PIN_04
#define LCD_RESET_PIN           BSP_IO_PORT_01_PIN_05
#define LCD_PWM_PIN             BSP_IO_PORT_06_PIN_08#define SPI_SEND_DATA           BSP_IO_LEVEL_HIGH
#define SPI_SEND_CMD            BSP_IO_LEVEL_LOW/* ST7796S部分寄存器定义 */
#define LCD_DISPLAY_CMD_RAMCTRL           0xb0 // RAM Control
#define LCD_DISPLAY_CMD_CASET             0x2a // Column address set
#define LCD_DISPLAY_CMD_RASET             0x2b // Row address set
#define LCD_DISPLAY_CMD_RAMWR             0x2c // Memory write/*********************************************************************************************************************** Typedef definitions**********************************************************************************************************************//************************************************************************************************************************ Private function prototypes**********************************************************************************************************************/
static void spi1_wait_for_tx(void);
static void spi_display_init(void);static fsp_err_t spi_send_data_cmd(uint8_t * uc_data, bsp_io_level_t uc_cmd, uint32_t len);
static fsp_err_t spi_display_backlight_opt(bsp_io_level_t opt);
static fsp_err_t spi_display_reset(void);/************************************************************************************************************************ Private global variables**********************************************************************************************************************/
/* Event flags for master */
static volatile spi_event_t g_master_event_flag;    // Master Transfer Event completion flag/************************************************************************************************************************ Functions**********************************************************************************************************************/fsp_err_t drv_spi_display_init(void)
{fsp_err_t err;/* 初始化I2C驱动 */err = g_spi1.p_api->open(&g_spi1_ctrl, &g_spi1_cfg);if (FSP_SUCCESS != err){printf ("%s %d\r\n", __FUNCTION__, __LINE__);return err;}spi_display_init();return err;
}void spi_display_set_window(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)
{uint8_t caset[4];uint8_t raset[4];caset[0] = (uint8_t)(x1 >> 8) & 0xFF;caset[1] = (uint8_t)(x1 & 0xff);caset[2] = (uint8_t)(x2 >> 8) & 0xFF;caset[3] = (uint8_t)(x2 & 0xff) ;raset[0] = (uint8_t)(y1 >> 8) & 0xFF;raset[1] = (uint8_t)(y1 & 0xff);raset[2] = (uint8_t)(y2 >> 8) & 0xFF;raset[3] = (uint8_t)(y2 & 0xff);spi_send_data_cmd((uint8_t []){LCD_DISPLAY_CMD_CASET}, SPI_SEND_CMD, 1); // Horizspi_send_data_cmd(caset, SPI_SEND_DATA, 4);spi_send_data_cmd((uint8_t []){LCD_DISPLAY_CMD_RASET}, SPI_SEND_CMD, 1); // Vertspi_send_data_cmd(raset, SPI_SEND_DATA, 4);spi_send_data_cmd((uint8_t []){LCD_DISPLAY_CMD_RAMWR}, SPI_SEND_CMD, 1); // Memory write
}fsp_err_t drv_spi_display_flush_data(uint8_t * data, uint32_t len)
{fsp_err_t err;err = spi_send_data_cmd(data, SPI_SEND_DATA, len);if (FSP_SUCCESS != err){printf ("%s %d\r\n", __FUNCTION__, __LINE__);return err;}return err;
}void spi1_callback(spi_callback_args_t *p_args)
{/* 判断是否是发送完成触发的中断 *//* 如果是的话就将发送完成标志位置1 */if (SPI_EVENT_TRANSFER_COMPLETE == p_args->event){g_master_event_flag = SPI_EVENT_TRANSFER_COMPLETE;}else{g_master_event_flag = SPI_EVENT_TRANSFER_ABORTED;}
}/************************************************************************************************************************ Private Functions**********************************************************************************************************************/
static void spi1_wait_for_tx(void)
{while(!g_master_event_flag);g_master_event_flag = false;
}static void spi_display_init(void)
{spi_display_reset();spi_display_backlight_opt(BSP_IO_LEVEL_HIGH); // backlight on#if 1spi_send_data_cmd((uint8_t []){0x11}, SPI_SEND_CMD, 1);     // Sleep outspi_send_data_cmd((uint8_t []){0x20}, SPI_SEND_CMD, 1);     // 关闭显示反转spi_send_data_cmd((uint8_t []){0x36}, SPI_SEND_CMD, 1);     // 内存数据访问控制设置spi_send_data_cmd((uint8_t []){0x48}, SPI_SEND_DATA, 1);    // 显示方向:左->右,上->下(不旋转); BGRspi_send_data_cmd((uint8_t []){0x3a}, SPI_SEND_CMD, 1);     // 设置像素格式(bpp)spi_send_data_cmd((uint8_t []){0x55}, SPI_SEND_DATA, 1);    // RGB接口颜色格式:16bit/pixel;控制接口的颜色格式:16bit/pixelspi_send_data_cmd((uint8_t []){0x13}, SPI_SEND_CMD, 1);     // 普通显示模式spi_send_data_cmd((uint8_t []){0x29}, SPI_SEND_CMD, 1);     // 开启显示
#elifspi_send_data_cmd((uint8_t []){0x11}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x00}, SPI_SEND_DATA, 1);R_BSP_SoftwareDelay(120, BSP_DELAY_UNITS_MILLISECONDS);     //延时120msspi_send_data_cmd((uint8_t []){0xf0}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0xc3}, SPI_SEND_DATA, 1);spi_send_data_cmd((uint8_t []){0xf0}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x96}, SPI_SEND_DATA, 1);spi_send_data_cmd((uint8_t []){0x36}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x48}, SPI_SEND_DATA, 1);    // RGBspi_send_data_cmd((uint8_t []){0xb4}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x01}, SPI_SEND_DATA, 1);spi_send_data_cmd((uint8_t []){0xb7}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0xc6}, SPI_SEND_DATA, 1);spi_send_data_cmd((uint8_t []){0xe8}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x40, 0x8A, 0x00, 0x00, 0x29, 0x19, 0xA5, 0x33}, SPI_SEND_DATA, 8);spi_send_data_cmd((uint8_t []){0xc1}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x06}, SPI_SEND_DATA, 1);spi_send_data_cmd((uint8_t []){0xc2}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0xa7}, SPI_SEND_DATA, 1);spi_send_data_cmd((uint8_t []){0xc5}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x18}, SPI_SEND_DATA, 1);spi_send_data_cmd((uint8_t []){0xe0}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0xF0, 0x09, 0x0B, 0x06, 0x04, 0x15, 0x2F, 0x54, 0x42, 0x3C, 0x17, 0x14, 0x18, 0x1B}, SPI_SEND_DATA, 14);spi_send_data_cmd((uint8_t []){0xe1}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0xF0, 0x09, 0x0B, 0x06, 0x04, 0x03, 0x2D, 0x43, 0x42, 0x3B, 0x16, 0x14, 0x17, 0x1B}, SPI_SEND_DATA, 14);spi_send_data_cmd((uint8_t []){0xf0}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x3c}, SPI_SEND_DATA, 1);spi_send_data_cmd((uint8_t []){0xf0}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x69}, SPI_SEND_DATA, 1);spi_send_data_cmd((uint8_t []){0x3a}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x55}, SPI_SEND_DATA, 1);R_BSP_SoftwareDelay(120, BSP_DELAY_UNITS_MILLISECONDS);     //延时120msspi_send_data_cmd((uint8_t []){0x29}, SPI_SEND_CMD, 1);/*rotation*/spi_send_data_cmd((uint8_t []){0x36}, SPI_SEND_CMD, 1);spi_send_data_cmd((uint8_t []){0x48}, SPI_SEND_DATA, 1);    // 0
#endif}static fsp_err_t spi_send_data_cmd(uint8_t * uc_data, bsp_io_level_t uc_cmd, uint32_t len)
{fsp_err_t err = FSP_SUCCESS;     // Error status/* Master send data to device */err = g_ioport.p_api->pinWrite(g_ioport.p_ctrl, LCD_DC_PIN, uc_cmd);if(FSP_SUCCESS != err){printf ("%s %d\r\n", __FUNCTION__, __LINE__);return err;}err = g_spi1.p_api->write(g_spi1.p_ctrl, uc_data, len, SPI_BIT_WIDTH_8_BITS);if(FSP_SUCCESS != err){printf ("%s %d\r\n", __FUNCTION__, __LINE__);return err;}spi1_wait_for_tx();return err;
}static fsp_err_t spi_display_backlight_opt(bsp_io_level_t opt)
{fsp_err_t err = FSP_SUCCESS;     // Error statusg_ioport.p_api->pinWrite((ioport_ctrl_t * const )&g_ioport.p_ctrl, LCD_PWM_PIN, opt);return err;
}static fsp_err_t spi_display_reset(void)
{fsp_err_t err = FSP_SUCCESS;     // Error statusg_ioport.p_api->pinWrite((ioport_ctrl_t * const )&g_ioport.p_ctrl, LCD_RESET_PIN, BSP_IO_LEVEL_LOW);R_BSP_SoftwareDelay(120, BSP_DELAY_UNITS_MILLISECONDS); //延时120msg_ioport.p_api->pinWrite((ioport_ctrl_t * const )&g_ioport.p_ctrl, LCD_RESET_PIN, BSP_IO_LEVEL_HIGH);R_BSP_SoftwareDelay(120, BSP_DELAY_UNITS_MILLISECONDS); //延时120msreturn err;
}

在e2studio中点击打开 02_dshanmcu_ra6m5_spi_display\dshanmcu_ra6m5\drivers\drv_spi_display.h 添加下面的代码:

#ifndef DRV_SPI_DISPLAY_H
#define DRV_SPI_DISPLAY_H/************************************************************************************************************************ Includes**********************************************************************************************************************/
#include "hal_data.h"/*********************************************************************************************************************** Macro definitions**********************************************************************************************************************/
#define LCD_SCREEN_WIDTH        (320)
#define LCD_SCREEN_HEIGHT       (480)#define LCD_COLOR_RED           (0xF800)
#define LCD_COLOR_GREEN         (0x07E0)
#define LCD_COLOR_BLUE          (0x001F)/*********************************************************************************************************************** Typedef definitions**********************************************************************************************************************//************************************************************************************************************************ Exported global variables**********************************************************************************************************************//************************************************************************************************************************ Exported global functions (to be accessed by other files)**********************************************************************************************************************/fsp_err_t drv_spi_display_init(void);void spi_display_set_window(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);fsp_err_t drv_spi_display_flush_data(uint8_t * data, uint32_t len);#endif /*DRV_SPI_DISPLAY_H*/

4.4 编写app

02_dshanmcu_ra6m5_spi_display\dshanmcu_ra6m5\applications 目录下新建 app_spi_display_test.c 文件,如下图所示:

chapter-4_014

打开 app_spi_display_test.c 添加如下代码:

/************************************************************************************************************************ Includes**********************************************************************************************************************/
#include "app.h"
#include "drv_uart.h"
#include "drv_spi_display.h"
#include <stdio.h>/*********************************************************************************************************************** Macro definitions**********************************************************************************************************************//*********************************************************************************************************************** Typedef definitions**********************************************************************************************************************//************************************************************************************************************************ Private function prototypes**********************************************************************************************************************/
static void spi_display_show_color(uint16_t color_le);/************************************************************************************************************************ Private global variables**********************************************************************************************************************//************************************************************************************************************************ Functions**********************************************************************************************************************/
void app_spi_display_test(void)
{fsp_err_t err;err = drv_uart_init();if(FSP_SUCCESS != err) __BKPT();err = drv_spi_display_init();if(FSP_SUCCESS != err){printf ("%s %d\r\n", __FUNCTION__, __LINE__);__BKPT();}while(1){spi_display_show_color((uint16_t)LCD_COLOR_RED);printf ("Full screen display in red\r\n");R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); //延时500msspi_display_show_color((uint16_t)LCD_COLOR_GREEN);printf ("Full screen display in green\r\n");R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); //延时500msspi_display_show_color((uint16_t)LCD_COLOR_BLUE);printf ("Full screen display in blue\r\n");R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); //延时500ms}}static void spi_display_show_color(uint16_t color_le)
{uint8_t color_be[2];color_be [0] = (uint8_t)((color_le & 0xff00) >> 8);color_be [1] = (uint8_t)(color_le & 0xff);spi_display_set_window(0, 0, LCD_SCREEN_WIDTH, LCD_SCREEN_HEIGHT);for(uint16_t x = 0; x < LCD_SCREEN_WIDTH; x++)for(uint16_t y = 0; y < LCD_SCREEN_HEIGHT; y++)drv_spi_display_flush_data(color_be, 2);
}
/************************************************************************************************************************ Private Functions**********************************************************************************************************************/

app.h 改为如下代码:

#ifndef APP_TEST_H
#define APP_TEST_H/************************************************************************************************************************ Includes**********************************************************************************************************************/
#include "hal_data.h"/*********************************************************************************************************************** Macro definitions**********************************************************************************************************************//*********************************************************************************************************************** Typedef definitions**********************************************************************************************************************//************************************************************************************************************************ Exported global variables**********************************************************************************************************************//************************************************************************************************************************ Exported global functions (to be accessed by other files)**********************************************************************************************************************/void app_uart_test(void);void app_i2c_touchpad_test(void);void app_spi_display_test(void);#endif /*APP_TEST_H*/

4.5 调用app

打开 02_dshanmcu_ra6m5_spi_display\src\hal_entry.c ,按照如下步骤进行修改:

hal_entry 函数修改为如下所示的代码:

void hal_entry(void)
{/* TODO: add your own code here *///app_uart_test();//app_i2c_touchpad_test();app_spi_display_test();#if BSP_TZ_SECURE_BUILD/* Enter non-secure code */R_BSP_NonSecureEnter();
#endif
}

4.6 验证效果

点击编译按钮,再点击 debug 按钮,将程序烧写到开发板中。会看到屏幕依次循环刷红、绿、蓝三种颜色。

【拓展】为什么要交换RGB565颜色数据两个字节的顺序

chapter-4_015

本节完

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

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

相关文章

Pytorch intermediate(三) BiLSTM

Bi-directional Long Short-Term Memory&#xff0c;双向LSTM网络。 有些时候预测可能需要由前面若干输入和后面若干输入共同决定&#xff0c;这样会更加准确。因此提出了双向循环神经网络&#xff0c;网络结构如上图。 构建LSTM模型时&#xff0c;在参数中添加bidirectionalTr…

产品经理需要熟悉的网站

产品经理需要熟悉的网站 一、SAAS平台的聚合二、saas产品教程三、原型参考教程四、在线文档协作五、云笔记六、脑图&流程图 一、SAAS平台的聚合 作用&#xff1a;面试和工作的需要&#xff0c;方便各行业产品查找竞品。 网址&#xff1a;https://www.zhaosaas.com/&#x…

列表对象复制属性到另一个列表对象 从List<Object>另一个List<Object>

目录 事件起因环境和工具解决办法结束语 事件起因 在写一个市级的项目时&#xff0c;遇到了一个问题&#xff0c;这个项目涉及的数据内容非常大&#xff0c;光是数据库文件的大小就已经达到了12G&#xff0c;数据的规模大致是在百万级的&#xff0c;光是我这次参与处理的数据就…

21.5 CSS 网页布局方式

网页布局方式 网页布局方式: 是指浏览器对网页中的元素进行排版的方法.常见的网页布局方式包括: * 1. 标准流(文档流/普通流)布局: 这是浏览器默认的排版方式.元素按照其在文档中的位置依次排列, 可以使用CSS的盒模型属性进行水平和垂直布局.* 2. 浮动布局: 通过设置元素的fl…

VSCode搭建Django开发环境

文章目录 一、Django二、搭建步骤1. 安装python和VSCode&#xff0c;安装插件2. VSCode打开项目文件夹3. 终端中键入命令&#xff1a;建立虚拟环境4. 选择Python的解释器路径为虚拟环境5. 在虚拟环境中安装Django6.创建Django项目7. 创建app应用8. 运行应用9. 修改配置中文显示…

Sharding-Jdbc(2):Sharding-Jdbc入门案例

1 前置条件 搭建读写分离的数据库环境,搭建方法如下文,目标数据库test Mysql性能优化(5):主从同步原理与实现_mysql主从配置优化_不死鸟.亚历山大.狼崽子的博客-CSDN博客 2 新建maven项目 3 pom引入依赖 <?xml version="1.0" encoding="UTF-8"…

微服务高可用容灾架构设计

导语 相对于过去单体或 SOA 架构&#xff0c;建设微服务架构所依赖的组件发生了改变&#xff0c;因此分析与设计高可用容灾架构方案的思路也随之改变&#xff0c;本文对微服务架构落地过程中的几种常见容灾高可用方案展开分析。 作者介绍 刘冠军 腾讯云中间件中心架构组负责…

一起学数据结构(6)——栈和队列

上篇文章中&#xff0c;对栈的概念及特点进行了解释&#xff0c;并且给出了栈实现的具体代码。本篇文章将给出队列的基本概念及特点。并给出相应的代码。 1. 队列的概念及结构&#xff1a; 在给出队列的概念之前&#xff0c;先给出上篇文章中提到的栈的概念&#xff1a;一种只…

一文读懂java变量类型

前言 在学习和使用Java编程语言时&#xff0c;理解变量类型是至关重要的基础知识。Java是一种静态类型语言&#xff0c;强调变量必须先声明其类型&#xff0c;才能进行后续操作。因此&#xff0c;对于初学者来说&#xff0c;了解Java中不同的变量类型及其特性是迈向编程成功的…

创建vue3项目并引用elementui

1.创建vu3项目&#xff1a; vue3官网&#xff1a;简介 | Vue.js 执行命令 npm create vuelatest 2.终端会出现如下选项&#xff0c;不确定的直接enter键进入下一步&#xff1b; 3.然后再执行下方命令&#xff1a; cd <your-project-name> npm install4.安装依赖成功…

Java的XWPFTemplate工具类导出word.docx的使用

依赖 <!-- word导出 --><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.7.3</version></dependency><!-- 上面需要的依赖--><dependency><groupId>org.ap…

phpcmsV9.6.0sql注入漏洞分析

目录 前言 环境准备 漏洞点 看一看parse_str函数 看一看sys_auth函数 看一看get_one函数 全局搜索sys_auth($a_k, ENCODE) 查看哪里调用了 set_cookie 查看safe_replace函数 判断登录绕过 index的业务 加载modules/wap/index.php 加载modules/attachment/attachme…

【漏洞复现】广联达办公OAsql+文件上传+弱口令

漏洞描述 广联达办公OA是一款综合办公自动化解决方案,旨在提高组织内部的工作效率和协作能力。它提供了一系列功能和工具,帮助企业管理和处理日常办公任务、流程和文档。默认弱口令admin password,后面就不提了。 免责声明 技术文章仅供参考,任何个人和组织使用网络应当…

YOLOv5算法改进(16)— 增加小目标检测层

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。小目标检测层是指在目标检测任务中用于检测小尺寸目标的特定网络层。由于小目标具有较小的尺寸和低分辨率&#xff0c;它们往往更加难以检测和定位。YOLOv5算法的检测速度与精度较为平衡&#xff0c;但是对于小目标的检测效…

构建企业分支网络

构建企业分支网络 目录 1.1 项目背景 1.2 项目拓扑 1.3 项目需求 1.4 设备选型 1.5 技术选型 1.6 地址规划 1.6.1 交换设备地址规划表 1.6.2 路由设备地址规划表 1.6.3 ISP设备地址规划表 1.6.4 终端地址规划表 1.6.4.1 VLAN 规划 1.7 VLAN 规划 1.8 项目实施 1.…

时序分解 | MATLAB实现RIME-VMD霜冰优化算法优化VMD变分模态分解信号分量可视化

时序分解 | MATLAB实现RIME-VMD霜冰优化算法优化VMD变分模态分解信号分量可视化 目录 时序分解 | MATLAB实现RIME-VMD霜冰优化算法优化VMD变分模态分解信号分量可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 RIME-VMD【23年新算法】霜冰优化算法优化VMD变分模态分…

TinTin Web3 动态精选:以太坊基金会推出 EELS、Arbitrum Stylus 上线

TinTin 快讯由 TinTinLand 开发者技术社区打造&#xff0c;旨在为开发者提供最新的 Web3 新闻、市场时讯和技术更新。TinTin 快讯将以周为单位&#xff0c; 汇集当周内的行业热点并以快讯的形式排列成文。掌握一手的技术资讯和市场动态&#xff0c;将有助于 TinTinLand 社区的开…

如何获得一个Oracle 23c免费开发者版

获取23c开发者版 简单介绍可参考这里。 获取数据库可以参考这篇文章Introducing Oracle Database 23c Free – Developer Release或这里。 Docker Image 这是最快的方法。在OCI上创建一个计算实例&#xff0c;然后就可以拉取image使用了。 docker的安装和配置不赘述了。 …

html实现邮件模版布局-flex布局table布局-demo

邮件模版布局 flex - 布局简单方便 兼容性差 table - 优点 就是兼容性好&#xff0c;其他没有优点 注&#xff1a;使用图片需要png最好&#xff0c;使用svg图google邮箱会出现不能使用的情况 效果图 flex布局 <!DOCTYPE html> <html lang"en" xmlns:th&qu…

sql server事务隔离别 、 mysql 事务隔离级别、并发性问题

隔离级别和锁 SQL中 mysql 、Oracle 、sql server 等数据库 都是客户端和服务器架构的软件&#xff0c;对于同一个服务器来说&#xff0c;可以有若干个客户端与之连接&#xff0c;每个客户端与服务器连接上之后&#xff0c;就可以称为一个 【会话&#xff08;session&#xff0…