在 ALIENTEK 阿波罗STM32F429开发板上使用 openvela 运行LVGL示例(一)
在 ALIENTEK 阿波罗STM32F429开发板上使用 openvela 运行LVGL示例(一)
文章目录
一、概述
本指南(参考在 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
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐



所有评论(0)