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

一、概述

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

二、准备工作

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

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

三、运行 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.hinclude/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、加载并配置项目

  1. 打开 menuconfig 配置界面:
# 进入 openvela 根目录  
# 进入menuconfig配置界面
./build.sh apollo-disco:lvgl menuconfig
  1. 按 / 键搜索并禁用STM32_LTDC_L2

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

在这里插入图片描述

  1. 保存配置,按 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、运行示例

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

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

    lvgldemo
    
  3. 串口终端会输出相应的提示。
    在这里插入图片描述
    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

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐