STM32驱动ST7789屏幕操作指南

文章目录

  • 前言
  • 一、ST7789是什么?
  • 二、使用步骤
  • 1.GPIO 初始化
  • 2. SPI 初始化
  • 3. 写入 SPI 数据
  • 4. 写入 SPI 数据
  • 5. 初始化 ST7789 显示器
  • 6. 设置显示窗口
  • 7. 清除屏幕
  • 总结

  • 前言

    在这篇文章中,我们将示范如何使用 STM32 微控制器驱动ST7789 显示器。我们会逐步介绍如何初始化 GPIO 和 SPI 接口,发送命令和数据,并完成显示器的基本操作,如清屏和窗口设置。


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、ST7789是什么?

    ST7789 是一种常用的图形 LCD 驱动芯片,广泛用于嵌入式系统中的显示器。

    二、使用步骤

    1.GPIO 初始化

    首先,我们需要初始化 GPIO 引脚,以便与 ST7789 显示器进行通信。

    // GPIO 初始化函数
    void ST7789_GPIO_Init(void) {
        GPIO_InitTypeDef GPIO_InitStructure;
    
        // 使能 GPIOA 时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    
        // 配置 SPI 引脚
        GPIO_InitStructure.GPIO_Pin = SPI1_SCK_PIN | SPI1_MOSI_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
    
        // 配置控制引脚
        GPIO_InitStructure.GPIO_Pin = SPI1_CS_PIN | SPI1_RES_PIN | SPI1_DC_PIN | SPI1_BLK_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
    
        // 置位引脚
        GPIO_SetBits(GPIOA, SPI1_CS_PIN | SPI1_RES_PIN | SPI1_DC_PIN | SPI1_BLK_PIN);
    }
    
    

    2. SPI 初始化

    接下来,配置 SPI 接口以便数据传输。

    // SPI 初始化函数
    void ST7789_SPI_Init(void) {
        SPI_InitTypeDef SPI_InitStructure;
    
        // 使能 SPI1 时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
    
        // 配置 SPI 参数
        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
        SPI_InitStructure.SPI_CRCPolynomial = 10;
        SPI_Init(SPI1, &SPI_InitStructure);
    
        // 使能 SPI
        SPI_Cmd(SPI1, ENABLE);
    }
    
    

    3. 写入 SPI 数据

    我们需要函数来通过 SPI 发送数据。

    // 写入 SPI 数据函数
    void SPI_Write(uint8_t data) {
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
        SPI_I2S_SendData(SPI1, data);
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
        (void)SPI_I2S_ReceiveData(SPI1);
    }
    
    

    4. 写入 SPI 数据

    // ST7789 写入命令函数
    void ST7789_WriteCommand(uint8_t cmd) {
        GPIO_ResetBits(GPIOA, SPI1_DC_PIN); // 选择命令模式
        GPIO_ResetBits(GPIOA, SPI1_CS_PIN); // 选择显示器
        SPI_Write(cmd); // 发送命令
        GPIO_SetBits(GPIOA, SPI1_CS_PIN); // 取消选择显示器
    }
    
    // ST7789 写入数据函数
    void ST7789_WriteData(uint8_t data) {
        GPIO_SetBits(GPIOA, SPI1_DC_PIN); // 选择数据模式
        GPIO_ResetBits(GPIOA, SPI1_CS_PIN); // 选择显示器
        SPI_Write(data); // 发送数据
        GPIO_SetBits(GPIOA, SPI1_CS_PIN); // 取消选择显示器
    }
    
    

    5. 初始化 ST7789 显示器

    // ST7789 初始化函数
    void ST7789_Init(void) {
        // 复位显示器
        GPIO_ResetBits(GPIOA, SPI1_RES_PIN);
        Delay(100); // 延时100ms
        GPIO_SetBits(GPIOA, SPI1_RES_PIN);
        Delay(100); // 延时100ms
    
        // 发送初始化命令
        ST7789_WriteCommand(0x01); // 软件复位
        Delay(150); // 延时150ms
        ST7789_WriteCommand(0x11); // 退出睡眠模式
        Delay(255); // 延时255ms
    
        ST7789_WriteCommand(0x36); // 内存数据访问控制
        ST7789_WriteData(0x00);    // 设置显示方向为0度(横屏)
    
        ST7789_WriteCommand(0x3A); // 设置颜色格式
        ST7789_WriteData(0x05);    // 8位颜色格式
    
        ST7789_WriteCommand(0xB2); // 设置帧率控制
        ST7789_WriteData(0x0C);
        ST7789_WriteData(0x0C);
        ST7789_WriteData(0x00);
        ST7789_WriteData(0x33);
        ST7789_WriteData(0x33);
    
        ST7789_WriteCommand(0xB7); // 设置电源控制
        ST7789_WriteData(0x35);
    
        ST7789_WriteCommand(0xBB); // 电量控制
        ST7789_WriteData(0x1A);
    
        ST7789_WriteCommand(0xC0); // 电源控制
        ST7789_WriteData(0x2C);
    
        ST7789_WriteCommand(0xC2); // VDV 和 VRH 设置
        ST7789_WriteData(0x01);
    
        ST7789_WriteCommand(0xC3); // VRH 设置
        ST7789_WriteData(0x12);    // 设置VRH
    
        ST7789_WriteCommand(0xC4); // VDV 设置
        ST7789_WriteData(0x20);
    
        ST7789_WriteCommand(0xC6); // 帧率控制
        ST7789_WriteData(0x0F);
    
        ST7789_WriteCommand(0xD0); // 电源控制
        ST7789_WriteData(0xA4);
        ST7789_WriteData(0xA1);
    
        ST7789_WriteCommand(0xE0); // 正极伽玛校正
        ST7789_WriteData(0xD0);
        ST7789_WriteData(0x04);
        ST7789_WriteData(0x0D);
        ST7789_WriteData(0x11);
        ST7789_WriteData(0x13);
        ST7789_WriteData(0x2B);
        ST7789_WriteData(0x3F);
        ST7789_WriteData(0x54);
        ST7789_WriteData(0x4C);
        ST7789_WriteData(0x18);
        ST7789_WriteData(0x0D);
        ST7789_WriteData(0x0B);
        ST7789_WriteData(0x1F);
        ST7789_WriteData(0x23);
    
        ST7789_WriteCommand(0xE1); // 负极伽玛校正
        ST7789_WriteData(0xD0);
        ST7789_WriteData(0x04);
        ST7789_WriteData(0x0C);
        ST7789_WriteData(0x11);
        ST7789_WriteData(0x13);
        ST7789_WriteData(0x2C);
        ST7789_WriteData(0x3F);
        ST7789_WriteData(0x44);
        ST7789_WriteData(0x51);
        ST7789_WriteData(0x2F);
        ST7789_WriteData(0x1F);
        ST7789_WriteData(0x1F);
        ST7789_WriteData(0x20);
        ST7789_WriteData(0x23);
    
        ST7789_WriteCommand(0x21); // 打开反显
    
        ST7789_WriteCommand(0x29); // 打开显示
        Delay(100);
    
        // 设置列地址
        ST7789_WriteCommand(0x2A); // 列地址设置
        ST7789_WriteData(0x00); // 起始列地址高位
        ST7789_WriteData(0x00); // 起始列地址低位
        ST7789_WriteData(0x00); // 结束列地址高位
        ST7789_WriteData(0xEF); // 结束列地址低位(240 列)
    
        // 设置行地址
        ST7789_WriteCommand(0x2B); // 行地址设置
        ST7789_WriteData(0x00); // 起始行地址高位
        ST7789_WriteData(0x00); // 起始行地址低位
        ST7789_WriteData(0x00); // 结束行地址高位
        ST7789_WriteData(0xC5); // 结束行地址低位(198 行)
    
        ST7789_WriteCommand(0x2C); // 内存写入
    }
    

    6. 设置显示窗口

    // 设置显示窗口函数
    void ST7789_SetWindows(uint16_t xStar, uint16_t yStar, uint16_t xEnd, uint16_t yEnd) {
        ST7789_WriteCommand(0x2A); // 列地址设置
        ST7789_WriteData(xStar >> 8); // 起始列地址高位
        ST7789_WriteData(xStar & 0xFF); // 起始列地址低位
        ST7789_WriteData(xEnd >> 8); // 结束列地址高位
        ST7789_WriteData(xEnd & 0xFF); // 结束列地址低位
    
        ST7789_WriteCommand(0x2B); // 行地址设置
        ST7789_WriteData(yStar >> 8); // 起始行地址高位
        ST7789_WriteData(yStar & 0xFF); // 起始行地址低位
        ST7789_WriteData(yEnd >> 8); // 结束行地址高位
        ST7789_WriteData(yEnd & 0xFF); // 结束行地址低位
    
        ST7789_WriteCommand(0x2C); // 内存写入
    }
    
    

    7. 清除屏幕

    // 清除屏幕函数
    void ST7789_Clear(uint16_t color) {
        uint32_t i;
        ST7789_SetWindows(0, 0, 239, 197); // 设置窗口为整个屏幕
    
        GPIO_SetBits(GPIOA, SPI1_DC_PIN); // 选择数据模式
        GPIO_ResetBits(GPIOA, SPI1_CS_PIN); // 选择显示器
    
        // 使用块写入的方法来提高效率
        for (i = 0; i < 240 * 198; i++) {
            SPI_Write(color >> 8); // 写入高字节
            SPI_Write(color & 0xFF); // 写入低字节
        }
    
        GPIO_SetBits(GPIOA, SPI1_CS_PIN); // 取消选择显示器
    }
    
    

    总结

    通过上述步骤,我们实现了 STM32 对 ST7789 显示屏的初始化与基本控制。掌握这些基本操作后,可以进一步实现更复杂的图形显示功能,如绘制图像、文字显示等。在实际开发中,还需要根据具体应用调整显示参数和优化代码性能。

    作者:阿源吖

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32驱动ST7789屏幕操作指南

    发表回复