这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【换取手持示波器】RGB屏幕移植ARM-2D库

共4条 1/1 1 跳转至

【换取手持示波器】RGB屏幕移植ARM-2D库

助工
2025-03-18 22:57:56     打赏

1、简介

    ARM-2D 是 Arm 公司推出的一款专为嵌入式系统优化的 2D 图形加速库,旨在提高微控制器(MCU)和嵌入式处理器的 2D 图形处理性能。它提供了一套轻量级、高效的 API,可用于 UI 渲染、图像操作和动画加速,特别适用于资源受限的嵌入式设备,如智能手表、工业显示屏和车载仪表盘等。

ARM-2D 主要特点
  1. 高效的 2D 渲染

    • 提供硬件加速的 2D 图形操作,如填充、旋转、缩放和混合等。

    • 支持 Alpha 混合(透明度)、颜色转换、像素格式转换等。

  2. 轻量级 & 低资源占用

    • 代码体积小,适用于 RAM/ROM 资源受限的设备。

    • 可与裸机(bare-metal)系统或 RTOS(如 FreeRTOS)配合使用。

  3. 硬件无关

    • 适用于各种 Cortex-M 处理器,如 Cortex-M0、M3、M4、M7、M33、M55 等。

    • 即使没有专用 GPU,也可以利用 ARM CPU 的 SIMD 指令(如 MVE、Helium)进行加速。

  4. 易于集成

    • 提供标准化 API,兼容不同的嵌入式 GUI 框架(如 LVGL)。

    • 支持 DMA、缓存优化等特性,提升图形处理效率。

        可见,ARM-2D基本支持在所有的Cortex-M处理器上运行,即便是最入门级的M0处理器。ARM-2D是图形加速渲染库,不是一个专门用于GUI设计的,但它仍然提供有基本的GUI设计选项(对用户是真爱啊,点赞o( ̄▽ ̄))。它的巨大作用在于将能够统一LCD屏幕的驱动接口,为不同类型的处理器之间移植GUI应用提供便捷。同时提供软硬件渲染加速,在没有图形硬件加速外设的情况下,依旧能够提供优异的软件加速效果。

2、ARM-2D移植

以开发板STM32H7S78-DK为例,IDE工具为MDK Keil,介绍ARM-2D的移植过程。

STM32H7S78-DK板载的屏幕接口为RGB并口,内部不含GRAM,因此需要使用到外部RAM。这篇文章介绍了这款屏幕的驱动过程,完成LTDC驱动后,就能够直接向屏幕写入图像数据了

【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕-电子产品世界论坛

e45ce793dd8ca0d8bf347dd9cc48f164.jpg

将LTDC驱动色彩模式为RGB565

41R[)MO1E3A0}H63[~N34QO.png

定义显存地址,屏幕尺寸为800*480

image.png

#define GLCD_WIDTH     800
#define GLCD_HEIGHT    480

#define LCD_DB_ADDR   0x90000000
#define LCD_DB_PTR    ((volatile uint16_t *)LCD_DB_ADDR)

打开Keil的RTE配置窗口,勾选以下的ARM-2D库相关选项

8N([%K6UZ9Q2VIXXMKEA](N.png

如果提示缺少其他组件,则勾选左下角的Resolve,自动完成缺少组件的勾选

image.png

展开Acceleration,滑动至底部找到以下两个配置文件

$W}4BVZ7W[}~[7X5X]1R)0Q.png

arm_2d_cfg.h文件参数设置,支持由代码编辑转为面板编辑模式

(9G%IUX~88K`X13(BAMNAUW.png

arm_2d屏幕适配器文件设置,如果仅做简单移植只需关注方框内的参数设置即可,屏幕宽度、高度设置,PFB是屏幕缓存块大小设置,缓存块越大意味着屏幕刷新率会有所提升,但RAM占有量会提高,如果编译提示内存不足可以尝试减小PFB大小。

RJS@2)GZMWNR@TV~B8YPZVA.png

main.c文件添加头文件

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "string.h"
#include "arm_2d_helper.h"
/* USER CODE END Includes */

此时编译工程,会报错缺少Disp0_DrawBitmap函数的定义,这个函数声明来自arm-2d库,需要用户手动实现它的定义

%76E0)1B]V4(8%$587KRQ58.png

int32_t Disp0_DrawBitmap (uint32_t x, 
                         uint32_t y, 
                         uint32_t width, 
                         uint32_t height, 
                         const uint8_t *bitmap) 
{
    volatile uint16_t *phwDes = LCD_DB_PTR + y * GLCD_WIDTH + x;//RGB屏幕显存基地址+坐标偏移
    const uint16_t *phwSrc = (const uint16_t *)bitmap;
    for (int_fast16_t i = 0; i < height; i++) {
        memcpy ((uint16_t *)phwDes, phwSrc, width * 2);         //逐行显示
        phwSrc += width;
        phwDes += GLCD_WIDTH;
    }
		return 0;
}

LTDC初始化、运行arm-2d自带Demo

  /* USER CODE BEGIN 2 */
	HAL_LTDC_SetAddress(&hltdc,(uint32_t)LCD_DB_ADDR,0);//将LCD显存地址更改为LCD_DB_ADDR
	HAL_LTDC_Reload(&hltdc,LTDC_RELOAD_IMMEDIATE);      //重新加载LCD数据
	arm_irq_safe {
	     arm_2d_init();         //初始化arm-2d(安全模式)
	}
	disp_adapter0_init();       //初始化屏幕适配器
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    disp_adapter0_task();       //运行arm_2d显示应用
  }
  /* USER CODE END 3 */

3、实验结果

默认的Demo如下图所示,同时显示当前帧率、Cpu占用、lcd刷新

image.png

这款开发板主控支持I/D Cache加速,在程序中开启

  /* USER CODE BEGIN 1 */
  SCB_EnableICache();    //Enable ICache  
 
  SCB_EnableDCache();    //Enable DCache  
  /* USER CODE END 1 */

刷新速率改善显著,尝试增大PFB大小

image.png

更改PFB大小,高度PFB由48改为240

`K8WL9`DEUTZ7H2(X8US6MW.png

帧率大幅提高,并且cpu占有率由50%降至37%

image.png

4、arm-2d性能评测应用

arm-2d内置了两个性能评测应用,用于评估当前主控芯片的GUI渲染性能,勾选第一个评测应用

Z2$IB[_8T55OL$%_L]9]]T3.png

main.c文件修改,导入评测应用头文件

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "string.h"
#include "arm_2d_helper.h"
#include "arm_2d_disp_adapters.h"
#include "arm_2d_scenes.h"
#include "arm_2d_benchmark.h"
/* USER CODE END Includes */

运行性能评测应用

  /* USER CODE BEGIN 2 */
	HAL_LTDC_SetAddress(&hltdc,(uint32_t)LCD_DB_ADDR,0);//将LCD显存地址更改为LCD_DB_ADDR
	HAL_LTDC_Reload(&hltdc,LTDC_RELOAD_IMMEDIATE);      //重新加载LCD数据
	arm_irq_safe {
	     arm_2d_init();         //初始化arm-2d(安全模式)
	}
	disp_adapter0_init();       //初始化屏幕适配器
	arm_2d_run_benchmark();     //开启性能评测
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    disp_adapter0_task();          //运行arm_2d显示应用
  }
  /* USER CODE END 3 */

实验效果,当前动画demo的刷新率为42fps

screenshots.gif






关键词: ARM-2D移植    

菜鸟
2025-03-19 10:39:50     打赏
2楼

感谢分享


工程师
2025-03-19 19:16:36     打赏
3楼

大佬对这个研究比较有意义。


专家
2025-03-20 20:45:52     打赏
4楼

这个2D应用的开发对资源要求挺高吧?


共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]