欢迎光临
我们一直在努力

在 ALIENTEK 阿波罗STM32F429开发板上使用 openvela 运行LVGL示例(一)

在 ALIENTEK 阿波罗STM32F429开发板上使用 openvela 运行LVGL示例(一)

文章目录

  • 在 ALIENTEK 阿波罗STM32F429开发板上使用 openvela 运行LVGL示例(一)
    • 一、概述
    • 二、准备工作
    • 三、运行 Demo
      • 1、添加关于ATK-7016的配置选项
      • 2、创建新的配置
      • 3、定义硬件宏
        • `apollo-disco.h`:板级私有定义
        • `include/board.h`:公共板级定义
      • 4、实现LCD驱动
        • `stm32_lcd.c`:lcd驱动
      • 5、更新stm32_bringup.c
      • 6、更新项目配置文件
      • 7、加载并配置项目
      • 8、编译代码
      • 9、烧录固件
      • 10、连接串口
      • 11、运行示例
    • 四、其他
      • 1、雪花屏
      • 2、屏幕闪烁

一、概述

本指南(参考在 STM32H750 上部署 openvela以及在 ALIENTEK 阿波罗STM32F429开发板上使用 openvela 实现按键功能(一))将引导您在 ALIENTEK 阿波罗STM32F429开发板上,基于 openvela 实时操作系统,运行 Light and Versatile Graphics Library(LVGL)图形库的演示程序(Demo)。

二、准备工作

在开始之前,请确保您已完成以下准备工作:

  • 获取源码:参考文档快速入门下载最新代码。
  • 了解 openvela 架构:建议您预先阅读 openvela 架构以理解其分层设计。
  • 查阅系统启动流程文档,获取更详细的启动时序和函数调用关系图。
  • 准备好硬件及配套软件。
  • 已完成前期的移植验证操作。
  • 三、运行 Demo

    本章节将指导您如何基于 openvela 源码,为 ALIENTEK 阿波罗STM32F429开发板编译并运行一个基础的按键示例。

    说明:本文使用的RGBLCD 模块型号为 ATK-7016(7 寸,1024*600)。

    1、添加关于ATK-7016的配置选项

    在 nuttx/boards/arm/stm32/apollo-disco/Kconfig 文件中可以添加关于ATK-7016的配置选项,更新后的文件如下所示:

    #
    # For a description of the syntax of this configuration file,
    # see the file kconfig-language.txt in the NuttX tools repository.
    #

    if ARCH_BOARD_APOLLO_DISCO

    config APOLLO_DISCO_FLASH
    bool "MTD driver for external 32Mbyte W25Q256 FLASH on SPI5"
    default n
    select MTD
    select MTD_W25QXXXJV
    select MTD_SMART
    select FS_SMARTFS
    select STM32_SPI5
    select MTD_BYTE_WRITE
    —help—
    Configures an MTD device for use with the onboard flash

    config APOLLO_DISCO_FLASH_MINOR
    int "Minor number for the FLASH /dev/smart entry"
    default 0
    depends on APOLLO_DISCO_FLASH
    —help—
    Sets the minor number for the FLASH MTD /dev entry

    config APOLLO_DISCO_FLASH_PART
    bool "Enable partition support on FLASH"
    default n
    depends on APOLLO_DISCO_FLASH
    —help—
    Enables creation of partitions on the FLASH

    config APOLLO_DISCO_FLASH_CONFIG_PART
    bool "Create application config data partition on FLASH"
    default y
    depends on APOLLO_DISCO_FLASH_PART
    depends on PLATFORM_CONFIGDATA
    —help—
    Enables creation of a /dev/config partition on the FLASH

    config APOLLO_DISCO_FLASH_CONFIG_PART_NUMBER
    int "Index number of config partition (in list below)"
    default 0
    depends on APOLLO_DISCO_FLASH_CONFIG_PART
    —help—
    Specifies the index number of the config data partition
    from the partition list.

    config APOLLO_DISCO_FLASH_PART_LIST
    string "Flash partition size list"
    default "4,8188"
    depends on APOLLO_DISCO_FLASH_PART
    —help—
    Comma separated list of partition sizes in KB.

    config APOLLO_DISCO_FLASH_PART_NAMES
    string "Flash partition name list"
    default "config,rfs"
    depends on APOLLO_DISCO_FLASH_PART
    depends on MTD_PARTITION_NAMES
    —help—
    Comma separated list of partition names.

    config APOLLO_DISCO_RAMMTD
    bool "MTD driver for SMARTFS RAM disk"
    default n
    select MTD
    select RAMMTD
    —help—
    Configures an MTD based RAM device for use with SMARTFS.

    config APOLLO_DISCO_RAMMTD_MINOR
    int "Minor number for RAM /dev/smart entry"
    default 1
    depends on APOLLO_DISCO_RAMMTD
    —help—
    Sets the minor number for the RAM MTD /dev entry

    config APOLLO_DISCO_RAMMTD_SIZE
    int "Size in KB of the RAM device to create"
    default 32
    depends on APOLLO_DISCO_RAMMTD
    —help—
    Sets the size of static RAM allocation for the SMART RAM device

    config APOLLODISCO_USBHOST_STACKSIZE
    int "USB host waiter stack size"
    default 1024
    depends on USBHOST

    config APOLLODISCO_USBHOST_PRIO
    int "USB host waiter task priority"
    default 100
    depends on USBHOST

    config PM_BUTTONS
    bool "PM Button support"
    default n
    depends on PM && ARCH_IRQBUTTONS
    —help—
    Enable PM button EXTI interrupts to support PM testing

    config PM_BUTTON_ACTIVITY
    int "Button PM activity weight"
    default 10
    depends on PM_BUTTONS
    —help—
    The activity weight to report to the power management subsystem when a button is pressed.

    config PM_ALARM_SEC
    int "PM_STANDBY delay (seconds)"
    default 15
    depends on PM && RTC_ALARM
    —help—
    Number of seconds to wait in PM_STANDBY before going to PM_STANDBY mode.

    config PM_ALARM_NSEC
    int "PM_STANDBY delay (nanoseconds)"
    default 0
    depends on PM && RTC_ALARM
    —help—
    Number of additional nanoseconds to wait in PM_STANDBY before going to PM_STANDBY mode.

    config PM_SLEEP_WAKEUP
    bool "PM_SLEEP wake-up alarm"
    default n
    depends on PM && RTC_ALARM
    —help—
    Wake-up of PM_SLEEP mode after a delay and resume normal operation.

    config PM_SLEEP_WAKEUP_SEC
    int "PM_SLEEP delay (seconds)"
    default 10
    depends on PM && RTC_ALARM
    —help—
    Number of seconds to wait in PM_SLEEP before going to PM_STANDBY mode.

    config PM_SLEEP_WAKEUP_NSEC
    int "PM_SLEEP delay (nanoseconds)"
    default 0
    depends on PM && RTC_ALARM
    —help—
    Number of additional nanoseconds to wait in PM_SLEEP before going to PM_STANDBY mode.

    config APOLLO_DISCO_HIGHPRI
    bool "High priority interrupt test"
    default n

    menuconfig APOLLO_DISCO_ATK7016
    bool "LCD driver for ATK7016 Liquid Crystal Display Controller"
    default n
    —help—
    Enables support for a connected display based on ATK7016 LCD Single Chip
    Driver. This sub driver supports only communication with the display driver
    connected via 4-wire serial (spi) mcu interface.

    if APOLLO_DISCO_ATK7016

    choice
    prompt "LCD Interface Type"
    default APOLLO_DISCO_ATK7016_FBIFACE if STM32_LTDC

    config APOLLO_DISCO_ATK7016_FBIFACE
    bool "Enable support for nuttx framebuffer interface"
    depends on STM32_LTDC
    —help—
    Enable lcd driver support for the nuttx framebuffer interface to displaying
    data via ltdc controller of the stm32f429i mcu.

    endchoice # LCD Interface Type

    if APOLLO_DISCO_ATK7016_FBIFACE

    choice
    prompt "LCD Orientation"
    default APOLLO_DISCO_ATK7016_FBIFACE_PORTRAIT
    —help—
    Configure display orientation.

    config APOLLO_DISCO_ATK7016_FBIFACE_LANDSCAPE
    bool "Landscape orientation"
    —help—
    Define for "landscape" orientation support.

    config APOLLO_DISCO_ATK7016_FBIFACE_PORTRAIT
    bool "Portrait orientation"
    —help—
    Define for "portrait" orientation support.

    config APOLLO_DISCO_ATK7016_FBIFACE_RLANDSCAPE
    bool "Reverse landscape orientation"
    —help—
    Define for "reverse landscape" orientation support.

    config APOLLO_DISCO_ATK7016_FBIFACE_RORTRAIT
    bool "Reverse portrait display"
    —help—
    Define for "reverse portrait" orientation support.

    endchoice # LCD Interface Orientation

    endif # APOLLO_DISCO_ATK7016_FBIFACE
    endif # APOLLO_DISCO_ATK7016

    endif # ARCH_BOARD_APOLLO_DISCO

    2、创建新的配置

    以为ALIENTEK 阿波罗STM32F429开发板移植openvela :: 二、代码实现步骤 :: 1.创建代码目录结构 为基础,

    • 在nuttx/boards/arm/stm32/apollo-disco/configs目录下,创建一个名为 lvgl的新目录,并在此目录中创建按键示例的默认配置文件deconfig;
    • 在 nuttx/boards/arm/stm32/apollo-disco/src目录下,创建stm32_lcd.c。

    更新后的nuttx/boards/arm/stm32/apollo-disco/代码目录结构如下:

    apollo-disco
    ├── CMakeLists.txt
    ├── configs # defconfig 配置路径
    │ └── nsh
    │ └── defconfig # NuttShell (NSH) 的默认配置
    │└── led
    │ └── defconfig # LED 示例的默认配置
    │└── btns
    │ └── defconfig # 按键示例的默认配置
    │└── lvgl
    │ └── defconfig # LVGL示例的默认配置
    ├── include
    │ └── board.h # 板级硬件配置头文件
    ├── Kconfig # 板级 Kconfig 配置文件
    ├── scripts # 链接脚本
    │ ├── ld.script # 链接器脚本
    │ └── Make.defs # 板级 Make 定义
    └── src
    ├── CMakeLists.txt
    ├── Make.defs
    ├── stm32_appinit.c # 实现 board_app_initialize
    ├── stm32_autoleds.c # 实现系统状态 LED 控制
    ├── stm32_boot.c # 实现 stm32_boardinitialize
    ├── stm32_bringup.c # 实现驱动初始化
    ├── apollo-disco.h # 板级私有头文件,定义 GPIO
    ├── stm32_userleds.c # 实现用户层 LED 驱动接口
    ├── stm32_extmem.c # 实现 stm32_sdram_initialize
    ├── stm32_buttons.c # 实现按键驱动接口
    └── stm32_lcd.c # 实现LCD驱动接口

    创建nuttx/boards/arm/stm32/apollo-disco/configs/lvgl/deconfig 如下:

    说明:本文使用的RGBLCD 模块型号为 ATK-7016(7 寸,1024*600),因此,即便启用全尺寸双缓冲,设置CONFIG_STM32_LTDC_FB_SIZE=1024*600*2*2=2457600即可。

    #
    # This file is autogenerated: PLEASE DO NOT EDIT IT.
    #
    # You can use "make menuconfig" to make any modifications to the installed .config file.
    # You can then do "make savedefconfig" to generate a new defconfig file that includes your
    # modifications.
    #
    CONFIG_APOLLO_DISCO_ATK7016=y
    CONFIG_APOLLO_DISCO_ATK7016_FBIFACE_LANDSCAPE=y
    CONFIG_ARCH="arm"
    CONFIG_ARCH_BOARD="apollo-disco"
    CONFIG_ARCH_BOARD_APOLLO_DISCO=y
    CONFIG_ARCH_BUTTONS=y
    CONFIG_ARCH_CHIP="stm32"
    CONFIG_ARCH_CHIP_STM32=y
    CONFIG_ARCH_CHIP_STM32F429I=y
    CONFIG_ARCH_STACKDUMP=y
    CONFIG_BOARD_LOOPSPERMSEC=13984
    CONFIG_BUILTIN=y
    CONFIG_DEBUG_CUSTOMOPT=y
    CONFIG_DEBUG_SYMBOLS=y
    CONFIG_DRIVERS_VIDEO=y
    CONFIG_EXAMPLES_FB=y
    CONFIG_EXAMPLES_LVGLDEMO=y
    CONFIG_FS_PROCFS=y
    CONFIG_GRAPHICS_LVGL=y
    CONFIG_HAVE_CXX=y
    CONFIG_HAVE_CXXINITIALIZE=y
    CONFIG_HEAP2_BASE=0xC0000000
    CONFIG_HEAP2_SIZE=33554432
    CONFIG_INIT_ENTRYPOINT="nsh_main"
    CONFIG_INPUT=y
    CONFIG_INTELHEX_BINARY=y
    CONFIG_LV_DEF_REFR_PERIOD=10
    CONFIG_LV_FONT_MONTSERRAT_12=y
    CONFIG_LV_FONT_MONTSERRAT_16=y
    CONFIG_LV_FONT_MONTSERRAT_24=y
    CONFIG_LV_USE_CLIB_MALLOC=y
    CONFIG_LV_USE_CLIB_SPRINTF=y
    CONFIG_LV_USE_CLIB_STRING=y
    CONFIG_LV_USE_DEMO_WIDGETS=y
    CONFIG_LV_USE_LOG=y
    CONFIG_LV_USE_NUTTX=y
    CONFIG_LV_USE_PERF_MONITOR=y
    CONFIG_LV_USE_SYSMON=y
    CONFIG_MM_REGIONS=2
    CONFIG_MQ_MAXMSGSIZE=64
    CONFIG_NSH_ARCHINIT=y
    CONFIG_NSH_BUILTIN_APPS=y
    CONFIG_NSH_FILEIOSIZE=512
    CONFIG_NSH_LINELEN=64
    CONFIG_NSH_READLINE=y
    CONFIG_PREALLOC_TIMERS=4
    CONFIG_RAM_SIZE=114688
    CONFIG_RAM_START=0x20000000
    CONFIG_RAW_BINARY=y
    CONFIG_RR_INTERVAL=200
    CONFIG_SCHED_HPWORK=y
    CONFIG_SCHED_WAITPID=y
    CONFIG_START_DAY=15
    CONFIG_START_MONTH=11
    CONFIG_START_YEAR=2017
    CONFIG_STM32_CCMEXCLUDE=y
    CONFIG_STM32_DISABLE_IDLE_SLEEP_DURING_DEBUG=y
    CONFIG_STM32_EXTERNAL_RAM=y
    CONFIG_STM32_FMC=y
    CONFIG_STM32_JTAG_SW_ENABLE=y
    CONFIG_STM32_LTDC=y
    CONFIG_STM32_LTDC_FB_BASE=0xC0000000
    CONFIG_STM32_LTDC_FB_SIZE=2457600
    CONFIG_STM32_PWR=y
    CONFIG_STM32_USART1=y
    CONFIG_SYSTEM_NSH=y
    CONFIG_TASK_NAME_SIZE=0
    CONFIG_USART1_SERIAL_CONSOLE=y
    CONFIG_VIDEO_FB=y

    3、定义硬件宏

    在src/apollo-disco.h和 include/board.h 中定义相关的硬件宏。

    apollo-disco.h:板级私有定义

    在nuttx/boards/arm/stm32/apollo-disco/src/apollo-disco.h中添加LCD背光控制IO口的宏定义如下:

    #define GPIO_LCD_BL (GPIO_OUTPUT|GPIO_PUSHPULL|GPIO_SPEED_50MHz|\\
    GPIO_OUTPUT_SET|GPIO_PORTB|GPIO_PIN5)

    include/board.h:公共板级定义

    配置LCD时钟和接口,在 nuttx/boards/arm/stm32/apollo-disco/include/board.h 中添加:

    /* Panel configuration
    *
    * PLLSAI settings
    * PLLSAIN : 360
    * PLLSAIR : 2
    * PLLSAIQ : 7
    * PLLSAIDIVR : 4
    *
    * Timings
    * Horizontal Front Porch : 160 (STM32_LTDC_HFP)
    * Horizontal Back Porch : 140 (STM32_LTDC_HBP)
    * Vertical Front Porch : 12 (STM32_LTDC_VFP)
    * Vertical Back Porch : 20 (STM32_LTDC_VBP)
    *
    * Horizontal Sync : 20 (STM32_LTDC_HSYNC)
    * Vertical Sync : 3 (STM32_LTDC_VSYNC)
    *
    * Active Width : 600 (STM32_LTDC_ACTIVEW)
    * Active Height : 1024 (STM32_LTDC_ACTIVEH)
    */

    /* LTDC PLL configuration
    *
    * PLLSAI_VCO = STM32_HSE_FREQUENCY / PLLM
    * = 25000000ul / 25
    * = 1,000,000
    *
    * PLL LCD clock output
    * = PLLSAI_VCO * PLLSAIN / PLLSAIR / PLLSAIDIVR
    * = 1,000,000 * 360 / 2 /4
    * = 45,000,000
    */

    #ifdef CONFIG_STM32_LTDC
    # ifdef CONFIG_APOLLO_DISCO_ATK7016_FBIFACE

    /* Defined panel settings */

    #if defined(CONFIG_APOLLO_DISCO_ATK7016_FBIFACE_LANDSCAPE) || \\
    defined(CONFIG_APOLLO_DISCO_ATK7016_FBIFACE_RLANDSCAPE)

    # define BOARD_LTDC_WIDTH 1024
    # define BOARD_LTDC_HEIGHT 600
    #else
    # define BOARD_LTDC_WIDTH 600
    # define BOARD_LTDC_HEIGHT 1024
    #endif

    #define BOARD_LTDC_OUTPUT_BPP 16
    #define BOARD_LTDC_HFP 160
    #define BOARD_LTDC_HBP 140
    #define BOARD_LTDC_VFP 12
    #define BOARD_LTDC_VBP 20
    #define BOARD_LTDC_HSYNC 20
    #define BOARD_LTDC_VSYNC 3

    #define BOARD_LTDC_PLLSAIN 360
    #define BOARD_LTDC_PLLSAIR 2
    #define BOARD_LTDC_PLLSAIQ 7

    /* Division factor for LCD clock */

    #define STM32_RCC_DCKCFGR_PLLSAIDIVR RCC_DCKCFGR_PLLSAIDIVR_DIV4

    /* Pixel Clock Polarity */

    #define BOARD_LTDC_GCR_PCPOL 0 /* !LTDC_GCR_PCPOL */

    /* Data Enable Polarity */

    #define BOARD_LTDC_GCR_DEPOL 0 /* !LTDC_GCR_DEPOL */

    /* Vertical Sync Polarity */

    #define BOARD_LTDC_GCR_VSPOL 0 /* !LTDC_GCR_VSPOL */

    /* Horizontal Sync Polarity */

    #define BOARD_LTDC_GCR_HSPOL 0 /* !LTDC_GCR_HSPOL */

    /* GPIO pinset */

    #define GPIO_LTDC_PINS 16 /* 16-bit display */

    #define GPIO_LTDC_R3 GPIO_LTDC_R3_2
    #define GPIO_LTDC_R4 GPIO_LTDC_R4_2
    #define GPIO_LTDC_R5 GPIO_LTDC_R5_2
    #define GPIO_LTDC_R6 GPIO_LTDC_R6_2
    #define GPIO_LTDC_R7 GPIO_LTDC_R7_1

    #define GPIO_LTDC_G2 GPIO_LTDC_G2_2
    #define GPIO_LTDC_G3 GPIO_LTDC_G3_2
    #define GPIO_LTDC_G4 GPIO_LTDC_G4_2
    #define GPIO_LTDC_G5 GPIO_LTDC_G5_2
    #define GPIO_LTDC_G6 GPIO_LTDC_G6_2
    #define GPIO_LTDC_G7 GPIO_LTDC_G7_2

    #define GPIO_LTDC_B3 GPIO_LTDC_B3_1
    #define GPIO_LTDC_B4 GPIO_LTDC_B4_3
    #define GPIO_LTDC_B5 GPIO_LTDC_B5_2
    #define GPIO_LTDC_B6 GPIO_LTDC_B6_2
    #define GPIO_LTDC_B7 GPIO_LTDC_B7_2

    #define GPIO_LTDC_VSYNC GPIO_LTDC_VSYNC_2
    #define GPIO_LTDC_HSYNC GPIO_LTDC_HSYNC_2
    #define GPIO_LTDC_DE GPIO_LTDC_DE_1
    #define GPIO_LTDC_CLK GPIO_LTDC_CLK_1

    #endif /* CONFIG_APOLLO_DISCO_ATK7016 display */

    /* Configure PLLSAI */

    #define STM32_RCC_PLLSAICFGR_PLLSAIN RCC_PLLSAICFGR_PLLSAIN(BOARD_LTDC_PLLSAIN)
    #define STM32_RCC_PLLSAICFGR_PLLSAIR RCC_PLLSAICFGR_PLLSAIR(BOARD_LTDC_PLLSAIR)
    #define STM32_RCC_PLLSAICFGR_PLLSAIQ RCC_PLLSAICFGR_PLLSAIQ(BOARD_LTDC_PLLSAIQ)

    #endif /* CONFIG_STM32_LTDC */

    4、实现LCD驱动

    stm32_lcd.c:lcd驱动

    /****************************************************************************
    * boards/arm/stm32h7/apollo-disco/src/stm32_lcd.c
    ****************************************************************************/

    /****************************************************************************
    * Included Files
    ****************************************************************************/

    #include <nuttx/config.h>

    #include <errno.h>
    #include <debug.h>

    #include <nuttx/arch.h>
    #include <nuttx/board.h>
    #include <nuttx/video/fb.h>
    #include <arch/board/board.h>

    #include "stm32_gpio.h"
    #include "stm32_ltdc.h"

    #include "apollo-disco.h"

    #ifdef CONFIG_STM32_LTDC
    /****************************************************************************
    * Public Functions
    ****************************************************************************/

    /****************************************************************************
    * Name: up_fbinitialize
    *
    * Description:
    * Initialize the framebuffer video hardware associated with the display.
    *
    * Input Parameters:
    * display – In the case of hardware with multiple displays, this
    * specifies the display. Normally this is zero.
    *
    * Returned Value:
    * Zero is returned on success; a negated errno value is returned on any
    * failure.
    *
    ****************************************************************************/

    int up_fbinitialize(int display)
    {
    /* Custom LCD display with RGB interface */

    stm32_configgpio(GPIO_LCD_BL);

    stm32_gpiowrite(GPIO_LCD_BL, true);

    return stm32_ltdcinitialize();
    }

    /****************************************************************************
    * Name: up_fbgetvplane
    *
    * Description:
    * Return a a reference to the framebuffer object for the specified video
    * plane of the specified plane.
    * Many OSDs support multiple planes of video.
    *
    * Input Parameters:
    * display – In the case of hardware with multiple displays, this
    * specifies the display. Normally this is zero.
    * vplane – Identifies the plane being queried.
    *
    * Returned Value:
    * A non-NULL pointer to the frame buffer access structure is returned on
    * success; NULL is returned on any failure.
    *
    ****************************************************************************/

    struct fb_vtable_s *up_fbgetvplane(int display, int vplane)
    {
    return stm32_ltdcgetvplane(vplane);
    }

    /****************************************************************************
    * Name: up_fbuninitialize
    *
    * Description:
    * Uninitialize the framebuffer support for the specified display.
    *
    * Input Parameters:
    * display – In the case of hardware with multiple displays, this
    * specifies the display. Normally this is zero.
    *
    * Returned Value:
    * None
    *
    ****************************************************************************/

    void up_fbuninitialize(int display)
    {

    stm32_gpiowrite(GPIO_LCD_BL, false);

    stm32_ltdcuninitialize();
    }
    #endif /* CONFIG_STM32_LTDC */

    5、更新stm32_bringup.c

    此文件中的 stm32_bringup() 函数负责初始化并注册所有板载设备的驱动程序。在本例中,我们在原有的基础上继续注册帧缓冲设备驱动。。

    /****************************************************************************
    * Included Files
    ****************************************************************************/

    #include <nuttx/config.h>

    #include <stdbool.h>
    #include <stdio.h>
    #include <debug.h>
    #include <errno.h>

    #include <nuttx/board.h>
    #include <nuttx/fs/fs.h>
    #include <nuttx/kmalloc.h>

    #include "stm32.h"
    #include "apollo-disco.h"

    #ifdef CONFIG_INPUT_BUTTONS_LOWER
    # include <nuttx/input/buttons.h>
    #endif

    #ifdef CONFIG_USERLED
    # include <nuttx/leds/userled.h>
    #endif

    #ifdef CONFIG_VIDEO_FB
    # include <nuttx/video/fb.h>
    #endif

    int stm32_bringup(void)
    {
    int ret = OK;

    ……
    #ifdef CONFIG_VIDEO_FB
    /* Initialize and register the framebuffer driver */

    ret = fb_register(0, 0);
    if (ret < 0)
    {
    syslog(LOG_ERR, "ERROR: fb_register() failed: %d\\n", ret);
    }
    #endif
    ……
    /* 在此添加其他驱动的初始化,例如 I2C, SPI, SDIO 等 */
    UNUSED(ret);
    return OK;
    }

    6、更新项目配置文件

    • 更新nuttx/boards/arm/stm32/apollo-disco/src/Make.def

      ############################################################################
      # boards/arm/stm32/apollo-disco/src/Make.defs
      ############################################################################

      include $(TOPDIR)/Make.defs

      CSRCS = stm32_boot.c stm32_bringup.c

      ifeq ($(CONFIG_ARCH_LEDS),y)
      CSRCS += stm32_autoleds.c
      else
      CSRCS += stm32_userleds.c
      endif

      ifeq ($(CONFIG_ARCH_BUTTONS),y)
      CSRCS += stm32_buttons.c
      endif

      ifeq ($(CONFIG_BOARDCTL),y)
      CSRCS += stm32_appinit.c
      endif

      ifeq ($(CONFIG_STM32_FMC),y)
      CSRCS += stm32_extmem.c
      endif

      ifeq ($(and \\
      $(CONFIG_APOLLO_DISCO_ATK7016_FBIFACE), \\
      $(CONFIG_STM32_LTDC)),y)
      CSRCS += stm32_lcd.c
      endif

      DEPPATH += –dep-path board
      VPATH += :board
      CFLAGS += ${INCDIR_PREFIX}$(TOPDIR)$(DELIM)arch$(DELIM)$(CONFIG_ARCH)$(DELIM)src$(DELIM)board$(DELIM)board

    • 更新nuttx/boards/arm/stm32/apollo-disco/src/CMakeList.txt

      # ##############################################################################
      # boards/arm/stm32/apollo-disco/src/CMakeLists.txt
      # ##############################################################################

      set(SRCS stm32_boot.c stm32_bringup.c)

      if(CONFIG_ARCH_LEDS)
      list(APPEND SRCS stm32_autoleds.c)
      else()
      list(APPEND SRCS stm32_userleds.c)
      endif()

      if(CONFIG_ARCH_BUTTONS)
      list(APPEND SRCS stm32_buttons.c)
      endif()

      if(CONFIG_BOARDCTL)
      list(APPEND SRCS stm32_appinit.c)
      endif()

      if(CONFIG_STM32_FMC)
      list(APPEND SRCS stm32_extmem.c)
      endif()

      if(CONFIG_APOLLO_DISCO_ATK7016_FBIFACE
      AND CONFIG_STM32_LTDC)
      list(APPEND SRCS stm32_lcd.c)
      endif()

      target_sources(board PRIVATE ${SRCS})

      set_property(GLOBAL PROPERTY LD_SCRIPT "${NUTTX_BOARD_DIR}/scripts/ld.script")

    7、加载并配置项目

  • 打开 menuconfig 配置界面:
  • # 进入 openvela 根目录
    # 进入menuconfig配置界面
    ./build.sh apollo-disco:lvgl menuconfig

  • 按 / 键搜索并禁用STM32_LTDC_L2
  • 说明:本文中的SDRAM时钟配置为84MHz,数据位宽16bit,那么理论上其最大带宽为84 MHz * 16 bits /8= 164MB/s。对于 ATK-7016,LCD时钟配置为45MHz较为合适(时钟配置过小会导致屏幕刷新率不够,从而出现屏幕会闪烁现象),因此不适合启用STM32_LTDC_L2(若启用,因数据带宽不够,会呈现雪花屏)。

    在这里插入图片描述

  • 保存配置,按 Q 键退出菜单,选择 Y 键保存配置。
  • 8、编译代码

    在完成上面的步骤后,按以下流程为 阿波罗STM32F429 开发板生成所需二进制文件:

    # 进入 openvela 根目录
    # 清除之前的构建产物
    ./build.sh apollo-disco:lvgl distclean
    # 基于新配置构建项目
    ./build.sh apollo-disco:lvgl -j8

    编译完成后,生成的文件位于 nuttx 目录下,包括:

    • nuttx.bin
    • nuttx.hex

    9、烧录固件

    参考在 STM32F411 上使用 openvela 点亮 LED: : 四、运行Demo::5、烧录固件

    10、连接串口

    参考在 STM32F411 上使用 openvela 点亮 LED: : 四、运行Demo::6、连接串口

    11、运行示例

  • 重新打开 minicom,连接成功后,在 Minicom 终端中按回车,您会看到 nsh> 提示符。

  • 运行按键示例,请输入以下命令:

    lvgldemo

  • 串口终端会输出相应的提示。 在这里插入图片描述 ATK-7016显示效果如下

    LVGL_WIDGET_NORMAL

    说明:由于手机拍摄问题,视频中的屏幕在闪烁,但现场用肉眼看时,并不存在屏幕闪烁问题。

  • 四、其他

    1、雪花屏

    在nuttx/boards/arm/stm32/Kconfig中,STM32_LTDC_L2是默认启用的:

    在这里插入图片描述 在STM32_LTDC_L2启用且LTDC时钟为45MHz的情况下,ATK-7016的会出现雪花屏:

    LVGL_SNOW

    2、屏幕闪烁

    在 nuttx/boards/arm/stm32/apollo-disco/include/board.h 中配置PLLSAIDIVR为8分频时:

    #define STM32_RCC_DCKCFGR_PLLSAIDIVR RCC_DCKCFGR_PLLSAIDIVR_DIV8

    LCD时钟降为22MHz,ATK-7016的会出现明显的屏幕闪烁:

    LVGL_WIDGET_SF

    赞(0)
    未经允许不得转载:171主机测评 » 在 ALIENTEK 阿波罗STM32F429开发板上使用 openvela 运行LVGL示例(一)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址