nRF52笔记(26)QSPI接口液晶显示屏

news2024/11/25 14:25:41

1 平台条件

硬件:nrf52840
软件:sdk17.0

2 QSPI概述

QSPI 外设支持使用 SPI 与外部闪存设备进行通信

此处列出了 QSPI 外设的主要特性:
• 单/双/四通道 SPI 输入/输出
• 2–32 MHz 可配置时钟频率
• 从/到外部闪存的单字读/写访问
• 用于块读写传输的 EasyDMA
• 高达 16 MB/秒的 EasyDMA 读取速率
• 就地执行 (XIP),用于直接从外部闪存执行程序
在这里插入图片描述
在 Nordic nRF52/nRF53 系列上,QSPI 可以支持两种不同的模式。

Flash / XIP操作(需要遵循flash协议)
发送自定义指令(限制使用QSPI上的1-wire发送数据)。

在指令集上,它支持与外部闪存设备的操作码。

在这里插入图片描述

1.1 用于 LCD 的 QSPI 接口

基本上,QSPI 接口有 6 个 GPIO 引脚。
在这里插入图片描述
使用屏幕: hannstar 360×360 with GalaxyCore Controller resolution for testing.

2 代码设置

2.1 初始化

初始化 QSPI 模块
将所有 6 个 GPIO 引脚配置为高驱动输出。

#define LCD_QSPI_RESET_PIN NRF_GPIO_PIN_MAP(0,27)
#define LCD_QSPI_CSN_PIN   NRF_GPIO_PIN_MAP(0,26)
#define LCD_QSPI_SCK_PIN   NRF_GPIO_PIN_MAP(0,02)
#define LCD_QSPI_IO0_PIN   NRF_GPIO_PIN_MAP(1,15)
#define LCD_QSPI_IO1_PIN   NRF_GPIO_PIN_MAP(1,14)
#define LCD_QSPI_IO2_PIN   NRF_GPIO_PIN_MAP(1,13)
#define LCD_QSPI_IO3_PIN   NRF_GPIO_PIN_MAP(1,12)

static void config_qspi_pin_high_drive(void)
{
        nrf_gpio_cfg(
                LCD_QSPI_SCK_PIN,
                NRF_GPIO_PIN_DIR_INPUT,
                NRF_GPIO_PIN_INPUT_CONNECT,
                NRF_GPIO_PIN_PULLDOWN,
                NRF_GPIO_PIN_H0H1,
                NRF_GPIO_PIN_SENSE_HIGH);
        nrf_gpio_cfg(
                LCD_QSPI_CSN_PIN,
                NRF_GPIO_PIN_DIR_INPUT,
                NRF_GPIO_PIN_INPUT_DISCONNECT,
                NRF_GPIO_PIN_NOPULL,
                NRF_GPIO_PIN_H0H1,
                NRF_GPIO_PIN_NOSENSE);

        nrf_gpio_cfg(
                LCD_QSPI_IO0_PIN,
                NRF_GPIO_PIN_DIR_INPUT,
                NRF_GPIO_PIN_INPUT_DISCONNECT,
                NRF_GPIO_PIN_PULLDOWN,
                NRF_GPIO_PIN_H0H1,
                NRF_GPIO_PIN_NOSENSE);

        nrf_gpio_cfg(
                LCD_QSPI_IO1_PIN,
                NRF_GPIO_PIN_DIR_INPUT,
                NRF_GPIO_PIN_INPUT_DISCONNECT,
                NRF_GPIO_PIN_PULLDOWN,
                NRF_GPIO_PIN_H0H1,
                NRF_GPIO_PIN_NOSENSE);

        nrf_gpio_cfg(
                LCD_QSPI_IO2_PIN,
                NRF_GPIO_PIN_DIR_INPUT,
                NRF_GPIO_PIN_INPUT_DISCONNECT,
                NRF_GPIO_PIN_PULLDOWN,
                NRF_GPIO_PIN_H0H1,
                NRF_GPIO_PIN_NOSENSE);

        nrf_gpio_cfg(
                LCD_QSPI_IO3_PIN,
                NRF_GPIO_PIN_DIR_INPUT,
                NRF_GPIO_PIN_INPUT_DISCONNECT,
                NRF_GPIO_PIN_PULLDOWN,
                NRF_GPIO_PIN_H0H1,
                NRF_GPIO_PIN_NOSENSE);
}

LCD demo 320×240 @ nRF52840 之后,我想描述如何使用 QSPI 接口驱动更大的 LCD 显示器,例如 360 x 360 分辨率 @ nRF52840。

QSPI 四路串行外设接口
QSPI 外设支持使用 SPI 与外部闪存设备进行通信。

此处列出了 QSPI 外设的主要特性:
• 单/双/四通道 SPI 输入/输出
• 2–32 MHz 可配置时钟频率
• 从/到外部闪存的单字读/写访问
• 用于块读写传输的 EasyDMA
• 高达 16 MB/秒的 EasyDMA 读取速率
• 就地执行 (XIP),用于直接从外部闪存执行程序

在 Nordic nRF52/nRF53 系列上,QSPI 可以支持两种不同的模式。

Flash / XIP操作(需要遵循flash协议)
发送自定义指令(限制使用QSPI上的1-wire发送数据)。
在指令集上,它支持与外部闪存设备的操作码。

用于 LCD 的 QSPI 接口
基本上,QSPI 接口有 6 个 GPIO 引脚。

在这篇博客中,我将使用显示器制造商的瀚宇360×360 和GalaxyCore Controller 分辨率进行测试。

初始化 QSPI 模块
将所有 6 个 GPIO 引脚配置为高驱动输出。

#define LCD_QSPI_RESET_PIN NRF_GPIO_PIN_MAP(0,27)
#define LCD_QSPI_CSN_PIN NRF_GPIO_PIN_MAP(0,26)
#define LCD_QSPI_SCK_PIN NRF_GPIO_PIN_MAP(0,02)
#define LCD_QSPI_IO0_PIN NRF_GPIO_PIN_MAP(1,15)
#define LCD_QSPI_IO1_PIN NRF_GPIO_PIN_MAP(1,14)
#define LCD_QSPI_IO2_PIN NRF_GPIO_PIN_MAP(1,13)
#define LCD_QSPI_IO3_PIN NRF_GPIO_PIN_MAP(1,12)

static void config_qspi_pin_high_drive(void)
{
nrf_gpio_cfg(
LCD_QSPI_SCK_PIN,
NRF_GPIO_PIN_DIR_INPUT,
NRF_GPIO_PIN_INPUT_CONNECT,
NRF_GPIO_PIN_PULLDOWN,
NRF_GPIO_PIN_H0H1,
NRF_GPIO_PIN_SENSE_HIGH);
nrf_gpio_cfg(
LCD_QSPI_CSN_PIN,
NRF_GPIO_PIN_DIR_INPUT,
NRF_GPIO_PIN_INPUT_DISCONNECT,
NRF_GPIO_PIN_NOPULL,
NRF_GPIO_PIN_H0H1,
NRF_GPIO_PIN_NOSENSE);

    nrf_gpio_cfg(
            LCD_QSPI_IO0_PIN,
            NRF_GPIO_PIN_DIR_INPUT,
            NRF_GPIO_PIN_INPUT_DISCONNECT,
            NRF_GPIO_PIN_PULLDOWN,
            NRF_GPIO_PIN_H0H1,
            NRF_GPIO_PIN_NOSENSE);

    nrf_gpio_cfg(
            LCD_QSPI_IO1_PIN,
            NRF_GPIO_PIN_DIR_INPUT,
            NRF_GPIO_PIN_INPUT_DISCONNECT,
            NRF_GPIO_PIN_PULLDOWN,
            NRF_GPIO_PIN_H0H1,
            NRF_GPIO_PIN_NOSENSE);

    nrf_gpio_cfg(
            LCD_QSPI_IO2_PIN,
            NRF_GPIO_PIN_DIR_INPUT,
            NRF_GPIO_PIN_INPUT_DISCONNECT,
            NRF_GPIO_PIN_PULLDOWN,
            NRF_GPIO_PIN_H0H1,
            NRF_GPIO_PIN_NOSENSE);

    nrf_gpio_cfg(
            LCD_QSPI_IO3_PIN,
            NRF_GPIO_PIN_DIR_INPUT,
            NRF_GPIO_PIN_INPUT_DISCONNECT,
            NRF_GPIO_PIN_PULLDOWN,
            NRF_GPIO_PIN_H0H1,
            NRF_GPIO_PIN_NOSENSE);

}

初始化 QSPI 模块并将其配置为 24 位地址/32MHz 时钟。

void qspi_lcd_GC9c01_init(void)
{
        if (!m_is_qspi_init)
        {
                uint32_t err_code;
                nrf_drv_qspi_config_t qspi_lcd_config = NRF_DRV_QSPI_DEFAULT_CONFIG;
                //config.phy_if.sck_freq  = NRF_QSPI_FREQ_32MDIV1;        //NRF_QSPI_FREQ_32MDIV8; //32MHz
                qspi_lcd_config.phy_if.sck_freq  = NRF_QSPI_FREQ_32MDIV1;        //NRF_QSPI_FREQ_32MDIV8; //32MHz
                //qspi_lcd_config.phy_if.sck_freq  = NRF_QSPI_FREQ_32MDIV8;//NRF_QSPI_FREQ_32MDIV8; //8MHz

                qspi_lcd_config.pins.csn_pin     = LCD_QSPI_CSN_PIN;
                qspi_lcd_config.pins.sck_pin     = LCD_QSPI_SCK_PIN;
                qspi_lcd_config.pins.io0_pin     = LCD_QSPI_IO0_PIN;
                qspi_lcd_config.pins.io1_pin     = LCD_QSPI_IO1_PIN;
                qspi_lcd_config.pins.io2_pin     = LCD_QSPI_IO2_PIN;
                qspi_lcd_config.pins.io3_pin     = LCD_QSPI_IO3_PIN;

                err_code = nrf_drv_qspi_init(&qspi_lcd_config, qspi_lcd_handler, NULL);
                APP_ERROR_CHECK(err_code);

                NRF_LOG_INFO("QSPI LCD Init");
                NRF_QSPI->IFCONFIG0 |= (QSPI_IFCONFIG0_PPSIZE_512Bytes << QSPI_IFCONFIG0_PPSIZE_Pos);

                m_is_qspi_init = true;
        }
        else
        {
                NRF_LOG_ERROR("QSPI LCD has already initialized!");
                APP_ERROR_CHECK(-1);
        }
}

2.2 读写操作

基本上,LCD 上有 2 个操作。

LCD 命令代码(例如 LCD 初始化代码)。
LCD Data write(将数据写入LCD屏)。

(1)LCD命令模式
在这里插入图片描述
(2)LCD写命令

static uint32_t drv_GC9c01_bus_writeCmd(const uint8_t cmd)
{
        return send_qspi_cinstr_w0d(cmd);
}
static uint32_t drv_GC9c01_bus_writeCmdByte(const uint8_t cmd, const uint8_t data)
{
        uint32_t err_code = NRF_SUCCESS;
        err_code  = send_qspi_cinstr_w1d(cmd, data);
        return err_code;
}

(3)LCD初始化代码

static void configure_lcd()
{
        drv_GC9c01_bus_writeCmd(0xfe);
        drv_GC9c01_bus_writeCmd(0xef);

        drv_GC9c01_bus_writeCmdByte(0x80, 0x11);
        drv_GC9c01_bus_writeCmdByte(0x81, 0x70);

        drv_GC9c01_bus_writeCmdByte(0x82, 0x09);
        drv_GC9c01_bus_writeCmdByte(0x83, 0x03);
        
        drv_GC9c01_bus_writeCmdByte(0x84, 0x20);
        drv_GC9c01_bus_writeCmdByte(0x85, 0x42);

        drv_GC9c01_bus_writeCmdByte(0x86, 0xfc);
        drv_GC9c01_bus_writeCmdByte(0x87, 0x09);

        drv_GC9c01_bus_writeCmdByte(0x89, 0x10);
        drv_GC9c01_bus_writeCmdByte(0x8a, 0x4f);

        drv_GC9c01_bus_writeCmdByte(0x8c, 0x59);
        drv_GC9c01_bus_writeCmdByte(0x8d, 0x51);
        
        drv_GC9c01_bus_writeCmdByte(0x8e, 0xae);
        drv_GC9c01_bus_writeCmdByte(0x8f, 0xf3);

        drv_GC9c01_bus_writeCmdByte(0x36, 0x00);
        drv_GC9c01_bus_writeCmdByte(0x3a, 0x05);
        drv_GC9c01_bus_writeCmdByte(0xec, 0x77);

        uint8_t parmater1_buffer[] = {0x01, 0x80, 0x00, 0x00, 0x00, 0x00};
        send_qspi_cinstr_long_frame_word(0x74, parmater1_buffer, 6);
        drv_GC9c01_bus_writeCmdByte(0x98, 0x3e);
        drv_GC9c01_bus_writeCmdByte(0x99, 0x3e);
        drv_GC9c01_bus_writeCmdByte(0xc3, 0x2A);
        drv_GC9c01_bus_writeCmdByte(0xc4, 0x18);
        send_qspi_cinstr_w1d_2data(0xa1,0x01,0x04);
        send_qspi_cinstr_w1d_2data(0xa2,0x01,0x04);
        drv_GC9c01_bus_writeCmdByte(0xa9, 0x1c);

        send_qspi_cinstr_w1d_2data(0xa5,0x11,0x09);
        drv_GC9c01_bus_writeCmdByte(0xb9, 0x8a);
        drv_GC9c01_bus_writeCmdByte(0xa8, 0x5e);
        drv_GC9c01_bus_writeCmdByte(0xa7, 0x40);
        drv_GC9c01_bus_writeCmdByte(0xaf, 0x73);
        drv_GC9c01_bus_writeCmdByte(0xae, 0x44);
        drv_GC9c01_bus_writeCmdByte(0xad, 0x38);

        drv_GC9c01_bus_writeCmdByte(0xa3, 0x5d);

        drv_GC9c01_bus_writeCmdByte(0xc2, 0x02);

        drv_GC9c01_bus_writeCmdByte(0xc5, 0x11);


        drv_GC9c01_bus_writeCmdByte(0xc6, 0x0e);

        drv_GC9c01_bus_writeCmdByte(0xc7, 0x13);
        drv_GC9c01_bus_writeCmdByte(0xc8, 0x0d);
        drv_GC9c01_bus_writeCmdByte(0xcb, 0x02);

        send_qspi_cinstr_w1d_2data(0x7c,0xb6,0x26);
        drv_GC9c01_bus_writeCmdByte(0xac, 0x24);
        drv_GC9c01_bus_writeCmdByte(0xf6, 0x80);



        send_qspi_cinstr_w1d_2data(0xb5,0x09,0x09);
        send_qspi_cinstr_w1d_4data(0x60, 0x38,0x0b,0x5b,0x56);
        send_qspi_cinstr_w1d_4data(0x63, 0x3a,0xe0,0x5b,0x56);

        uint8_t parmater2_buffer[] = {0x38, 0x0d, 0x72, 0xdd, 0x5b, 0x56};
        send_qspi_cinstr_long_frame_word(0x64, parmater2_buffer, 6);
        uint8_t parmater3_buffer[] = {0x38, 0x11, 0x72, 0xe1, 0x5b, 0x56};
        send_qspi_cinstr_long_frame_word(0x66, parmater3_buffer, 6);
        uint8_t parmater4_buffer[] = {0x3b, 0x08, 0x08, 0x00, 0x08, 0x29,0x5b};
        send_qspi_cinstr_long_frame_word(0x68, parmater4_buffer, 7);
        uint8_t parmater5_buffer[] = {0x00,0x00,0x00,0x07,0x01,0x13,0x11,0x0b, \
                                      0x09,0x16,0x15,0x1d,0x1e,0x00,0x00,0x00, \
                                      0x00,0x00,0x00,0x1e,0x1d,0x15,0x16,0x0a, \
                                      0x0c,0x12,0x14,0x02,0x08,0x00,0x00,0x00};
        send_qspi_cinstr_long_frame_word(0x6e, parmater5_buffer, 32);

        drv_GC9c01_bus_writeCmdByte(0xbe, 0x11);
        uint8_t parmater6_buffer[] = {0xcc, 0x0c, 0xcc, 0x84, 0xcc, 0x04,0x50};
        send_qspi_cinstr_long_frame_word(0x6c, parmater6_buffer, 7);
        drv_GC9c01_bus_writeCmdByte(0x7d, 0x72);
        drv_GC9c01_bus_writeCmdByte(0x7e, 0x38);
        uint8_t parmater7_buffer[] = {0x02,0x03,0x09,0x05,0x0c,0x06,0x09,0x05,0x0c,0x06};
        send_qspi_cinstr_long_frame_word(0x70, parmater7_buffer, 10);
        send_qspi_cinstr_w1d_4data(0x90, 0x06,0x06,0x05,0x06);
        send_qspi_cinstr_w1d_3data(0x93, 0x45,0xff,0x00);

        uint8_t parmater8_buffer[] = {0x45, 0x09, 0x08, 0x08, 0x26, 0x2a};
        send_qspi_cinstr_long_frame_word(0xf0, parmater8_buffer, 6);
        uint8_t parmater9_buffer[] = {0x43, 0x70, 0x72, 0x36, 0x37, 0x6f};
        send_qspi_cinstr_long_frame_word(0xf1, parmater9_buffer, 6);
        uint8_t parmater10_buffer[] = {0x45, 0x09, 0x08, 0x08, 0x26, 0x2a};
        send_qspi_cinstr_long_frame_word(0xf2, parmater10_buffer, 6);
        uint8_t parmater11_buffer[] = {0x43, 0x70, 0x72, 0x36, 0x37, 0x6f};
        send_qspi_cinstr_long_frame_word(0xf3, parmater11_buffer, 6);
        drv_GC9c01_bus_writeCmd(0xfe);
        drv_GC9c01_bus_writeCmd(0xee);


        // User Command Set (UCS = CMD1)------------------------------------------
        //       drv_GC9c01_bus_writeCmdByte(GC9c01_CMD_WRITE_CMD_MODE_PAGE, 0x00);

        //tearing effect line on--------------------------------------------------
        //       drv_GC9c01_bus_writeCmdByte(GC9c01_CMD_TEARING_EFFECT_ON, 0x00);

        // Interface Pixel Format-------------------------------------------------
        //       drv_GC9c01_bus_writeCmdByte(GC9c01_CMD_INTERFACE_PIXEL_FORMAT, 0x55);// 0x55 -> 565

        // Set_DSPI Mode----------------------------------------------------------
        //       drv_GC9c01_bus_writeCmdByte(GC9c01_CMD_SET_DSPI_MODE, 0x80);

        // Write display brightness-----------------------------------------------
        //GC9c01_drv_SetBrightness(0xCC);


        // Sleep-out and Display on-----------------------------------------------
        GC9c01_DRV_SLEEP_OUT();

        nrf_delay_ms(120);

        GC9c01_DRV_DISPLAY_ON();

        nrf_delay_ms(20);

        GC9c01_drv_setColRowPosition(0, 0);

        NRF_LOG_INFO("After %s", __func__);
}

2.3 写入 LCD 数据

它使用 Opcode = 0x32 PP4O 来写入 LCD 数据。
在这里插入图片描述

static uint32_t gc9c01_bus_lcd_write_buffer(uint8_t *p_tx_buffer, uint32_t len, uint32_t addr)
{
        uint32_t err_code = 0;
        m_finished = false;
        err_code = nrf_drv_qspi_write(p_tx_buffer, len, addr);
        if(err_code != NRFX_SUCCESS)
        {
                // NRF_LOG_INFO("error code= 0x%x",err_code);
        }
        WAIT_FOR_PERIPH();
        return err_code;
}

static void BMP_picture_show(uint32_t delay, const uint16_t *p_data)
{
        uint32_t err_code;
        uint32_t * p_color;
        uint32_t i,k;
        uint32_t tran_size,now_size=0;
        uint32_t remain_size = GC9c01_DRV_ALL_SIZE;

        //NRF_LOG_INFO("%s block_dx = %d, Color=%04x", __func__, a block_dx, color);
        //static uint8_t __ALIGN(4) bank_buf[QSPI_PAG_SIZE];

        tran_size = QSPI_PAG_SIZE;
        memcpy(&m_buffer_tx[0], (uint8_t *)&p_data[0]+tran_size, tran_size);
        err_code = gc9c01_bus_lcd_write_buffer(m_buffer_tx, QSPI_PAG_SIZE, 0x002C00);

        remain_size -= tran_size;
        now_size=tran_size;
        while (remain_size)
        {
                if (remain_size > QSPI_PAG_SIZE)
                {
                        tran_size = QSPI_PAG_SIZE;
                }
                else
                {
                        tran_size = remain_size;
                }

                memcpy(m_buffer_tx, (uint8_t *)&p_data[0]+now_size, tran_size);

                now_size += tran_size;
                err_code = gc9c01_bus_lcd_write_buffer(&m_buffer_tx[0], tran_size, 0x003C00);

                remain_size -= tran_size;
        }

        nrf_delay_ms(delay);
}

效果展示
在这里插入图片描述

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

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

相关文章

亚马逊哪些因素会影响转化率,如何才能做得更好(测评)

作为亚马逊卖家和运营&#xff0c;你有没考虑过亚马逊的转化率是由哪些因素影响的呢&#xff1f;要怎么去做改变&#xff1f; 下面我总结了七个能影响亚马逊转化率因素给大家做参考。 第一点&#xff1a;图片 首先要求像素不低于1000才能有放大镜功能。从数据来看主图和第二…

Batocera(巴托塞拉)技巧记录集合

目录指引技巧&#xff1a; 直接在虚拟机插上你的BatoceraU盘&#xff08;硬盘&#xff09;玩&#xff0c;不用重启引导。1&#xff0c;安装虚拟机2&#xff0c;设置游戏盘启动a&#xff0c;查看磁盘的物理编号。b&#xff0c;创建usb的引导文件c&#xff0c;添加游戏盘USB盘3&a…

[附源码]Python计算机毕业设计Django的小区宠物管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

设计模式 之 创建型模式

设计模式 之 创建型模式 模式 & 描述包括创建型模式 这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式&#xff0c;而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。工厂模式&#xff08;Factory Pattern&a…

H2N-Gly-Gly-Pro-COOH,14379-76-1

H-Gly-Gly-Pro-OH 是由 3 个氨基酸构成的多肽。H-Gly-Gly-Pro-OH is a peptide with 3 amino acid. 编号: 116909中文名称: 三肽Gly-Gly-Pro英文名: Gly-Gly-Pro英文同义词: Glycyl-glycyl-L-prolineCAS号: 14379-76-1单字母: H2N-GGP-OH三字母: H2N-Gly-Gly-Pro-COOH氨基酸个数…

今年十八,喜欢ctf-web

前言 &#x1f340;作者简介&#xff1a;被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 &#x1f341;个人主页&#xff1a;红中 &#x1fad2;每日emo&#xff1a;等我把脸皮磨厚 &#x1f342;专栏地址&#xff1a;网安专栏 本来想早点睡&…

Kotlin高仿微信-第26篇-朋友圈-选择图片、小视频对话框

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

定时执行专家 —— 使用网络唤醒功能实现远程开机

目录 ◆ 关于网络唤醒 ◆ 定时执行专家 - 远程开机功能 - 设置方法 ◆ 使用网络唤醒实现远程开机的一些前提条件 ◆ 关于网络唤醒 Wake-on-LAN简称WOL或WoL&#xff0c;中文多译为“网上唤醒”、“远程唤醒”技术。WOL是一种技术&#xff0c;同时也是该技术的规范标准&…

Express 2 快速入门 - HelloWorld

Express Express 中文网 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录Express2 快速入门 - HelloWorld2.1 演示2.2 更多解释2 快速入门 - HelloWorld 2.1 演示 创建名为app.js 的文件 键入以下代码&#xff1a; const express require(ex…

SAP ABAP——数据类型(三)【TYPE-POOL和INCLUDE嵌套定义类型】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

威尔士和英格兰同属英国,但为啥还要在世界杯上进行PK?

聊到威尔士VS英格兰队的比赛&#xff0c;那就不得不普及一个足球常识啊。当我们打开英国的地图&#xff0c;你会发现有四个地区英格兰&#xff0c;苏格兰&#xff0c;威尔士和北爱尔兰都是属于英国的。我们还会常常看到英格兰&#xff0c;苏格兰&#xff0c;威尔士和北爱尔兰四…

JavaSE项目练习:图书管理系统

1.简介 通过前面知识&#xff1a;类&#xff0c;抽象类&#xff0c;封装&#xff0c;继承&#xff0c;多态&#xff0c;接口的学习&#xff0c;这篇文章将会通过对学习的知识点的整合运用&#xff0c;写一个小项目——图书管理系统&#xff0c;来帮助大家更好的掌握前面学习的…

物联网企业争抢「两轮车换电」赛道

两轮电动车正在攻占中国的大街小巷。 甚至无需过多的数据佐证&#xff0c;大家都可以清晰的感受到&#xff0c;“小电驴”正在加速“驰骋”。售价在千余元至万元不等的两轮电动车不仅是居民解决中距离通勤的“好帮手”&#xff0c;更是外卖员、快递员风里来雨里去的“好战友”。…

RabbitMQ镜像队列机制

镜像queue有master节点和slave节点。master和slave是针对⼀个queue而⾔的&#xff0c;⽽不是⼀个node作为所有queue的master&#xff0c;其它node作为slave。⼀个queue第⼀次创建的node为它的master节点&#xff0c;其它node为slave节点。⽆论客户端的请求打到master还是slave最…

JavaEE Bean作用域与生命周期

Bean的作用域 作用域是用来限制程序中变量的可用范围&#xff0c;Bean的作用域是Bean在Spring整个框架中的行为模式。 默认情况下&#xff0c;Spring应用上下文所有的bean都是以单例的形式创建的&#xff0c;不管给定的一个bean被注入到其他bean 多少次&#xff0c;每次所注入的…

Spring 异步@Async注解用法 Spring @Async注解用法总结 Spring @Async基本用法示例

Spring 异步Async注解用法 Spring Async注解用法总结 Spring Async基本用法示例 一、概述 在日常开发的工作中&#xff0c;经常会使用异步进行开发。Spring 提供一个简单的注解 Async &#xff0c;即可实现异步的开发&#xff0c;无需创建线程池&#xff0c;简单明了。 本文将整…

盘点 GitHub 上的神级指南

盘点 GitHub 上那些神级指南&#xff01;本次盘点都是 GitHub 上标星 10K 的开源指南。都是由中国的开发者开源&#xff0c;除了技术、教程类的指南&#xff0c;还有一些花里胡哨的东西。本期推荐开源项目目录&#xff1a;1. 计算机自学指南2. 大数据入门指南3. 程序员延寿指南…

[附源码]计算机毕业设计springboot企业人事管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MASA Framework 事件总线 - 跨进程事件总线

概述 跨进程事件总线允许发布和订阅跨服务传输的消息, 服务的发布与订阅不在同一个进程中 在Masa Framework中, 跨进程总线事件提供了一个可以被开箱即用的程序 IntegrationEvents: 提供了发件箱模式 IntegrationEvents.Dapr: 借助Dapr实现了消息的发布EventLogs.EFCore: 基…

企业想要做好数据分析,可以试试瓴羊Quick BI

企业的数字化发展已经成为了一个发展的方向&#xff0c;可是各个企业如何才可以实现数字化发展确实成为了难题。从很多企业的内部发展中来讲&#xff0c;每一个部分的数据化的分析都已经成为了行业的难点&#xff0c;如何做好这些分析工作确实是很关键的内容。 而在具体数字化…