你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【STM32U3 评测】Zephyr驱动st7789

[复制链接]
lugl 发布时间:2026-5-28 10:23

【前言】

前面在使用stm32cubeide来创建st7789的驱动,需要自己写很多东西,但是使用zephyr就超级简单了。本篇将详细介绍如何操作。

【基础环境】

需要在wsl下面创建zephyr基础环境。

【工程创建】

在zephyrproject/app下面创建工程stm32u3c5_lcd

工程文件目录如下:

├── CMakeLists.txt
├── prj.conf
├── boards/
│   └── nucleo_u3c5zi_q.overlay   # device tree overlay
└── src/
└── main.c

1、首先创建prj.conf,需要打开gpio display st7789 等,源码如下:

CONFIG_GPIO=y
CONFIG_DISPLAY=y
CONFIG_ST7789V=y
CONFIG_VIDEO_DEVICE=y

2、根据st7789接线,纺写ovley文件如下:

#include <zephyr/dt-bindings/display/panel.h>

/ {
    chosen {
        zephyr,display = &st7789v;
    };

    mipi_dbi {
        compatible = "zephyr,mipi-dbi-spi";
        spi-dev = <&spi1>;
        dc-gpios = <&gpioc 7 GPIO_ACTIVE_HIGH>;
        reset-gpios = <&gpiod 0 GPIO_ACTIVE_HIGH>;
        write-only;
        #address-cells = <1>;
        #size-cells = <0>;

        st7789v: st7789v@0 {
            compatible = "sitronix,st7789v";
            reg = <0>;
            mipi-max-frequency = <40000000>;

            width = <240>;
            height = <320>;
            x-offset = <0>;
            y-offset = <0>;

            vcom = <0x28>;
            gctrl = <0x35>;
            vrhs = <0x10>;
            vdvs = <0x20>;
            mdac = <0x00>;
            gamma = <0x01>;
            pixel-format = <PANEL_PIXEL_FORMAT_RGB_565>;
            lcm = <0x2c>;
            porch-param = [0c 0c 00 33 33];
            cmd2en-param = [5a 69 02 00];
            pwctrl1-param = [a4 a1];
            pvgam-param = [d0 00 02 07 0a 28 32 44 42 06 0e 12 14 17];
            nvgam-param = [d0 00 02 07 0a 28 31 54 47 0e 1c 17 1b 1e];
            ram-param = [00 f0];
            rgb-param = [40 02 14];
            mipi-mode = "MIPI_DBI_MODE_SPI_4WIRE";
        };
    };
};

&spi1 {
    pinctrl-0 = <&spi1_sck_pa5 &spi1_miso_pa6 &spi1_mosi_pa7>;
    pinctrl-names = "default";
    cs-gpios = <&gpioa 4 GPIO_ACTIVE_LOW>;
    status = "okay";
};

3、最后在Main.c中添加测试代码

#include <zephyr/device.h>
#include <zephyr/devicetree.h>
#include <zephyr/drivers/display.h>
#include <zephyr/drivers/gpio.h>
#include <zephyr/kernel.h>

#define LOG_LEVEL CONFIG_LOG_DEFAULT_LEVEL
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(app);

/* BLK (backlight) on PE11 */
#define BLK_GPIO_NODE   DT_NODELABEL(gpioe)
#define BLK_PIN     11

int main(void)
{
    const struct device *display_dev;
    const struct device *blk_gpio;
    int ret;

    LOG_INF("STM32U3C5 ST7789V LCD demo");

    display_dev = DEVICE_DT_GET(DT_CHOSEN(zephyr_display));
    if (!device_is_ready(display_dev)) {
        LOG_ERR("Display device not ready");
        return 0;
    }

    blk_gpio = DEVICE_DT_GET(BLK_GPIO_NODE);
    if (!device_is_ready(blk_gpio)) {
        LOG_ERR("BLK GPIO not ready");
        return 0;
    }

    ret = gpio_pin_configure(blk_gpio, BLK_PIN, GPIO_OUTPUT_HIGH);
    if (ret < 0) {
        LOG_ERR("BLK pin config failed: %d", ret);
        return 0;
    }

    LOG_INF("Display ready, backlight enabled");

    /* Wake display */
    display_blanking_off(display_dev);

    /* RGB565 color definitions */
    const uint16_t colors[3] = { 0xF800, 0x07E0, 0x001F }; /* R, G, B */
    const char *names[3] = { "RED", "GREEN", "BLUE" };

    struct display_buffer_descriptor desc = {
        .buf_size = 240 * 2,
        .width = 240,
        .height = 1,
        .pitch = 240,
    };

    uint16_t row[240];

    while (1) {
        for (int c = 0; c < 3; c++) {
            for (int i = 0; i < 240; i++) {
                row[i] = colors[c];
            }
            for (int y = 0; y < 320; y++) {
                ret = display_write(display_dev, 0, y, &desc, row);
                if (ret < 0) {
                    LOG_ERR("display_write failed: %d", ret);
                }
            }
            LOG_INF("Displaying %s", names[c]);
            k_sleep(K_SECONDS(2));
        }

        /* Blink backlight */
        gpio_pin_set(blk_gpio, BLK_PIN, 0);
        k_sleep(K_SECONDS(1));
        gpio_pin_set(blk_gpio, BLK_PIN, 1);
        k_sleep(K_SECONDS(1));
    }

    return 0;
}

CmakeList常规的代码。

【接线】

image.png

【编译】

执行:west build --build-dir build -b nucleo_u3c5zi_q

【烧录】

使用stm32cubeprogrammer烧到开发板,即可实现点亮lcd屏。

收藏 评论0 发布时间:2026-5-28 10:23

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版