1、简介
ARM-2D 是 Arm 公司推出的一款专为嵌入式系统优化的 2D 图形加速库,旨在提高微控制器(MCU)和嵌入式处理器的 2D 图形处理性能。它提供了一套轻量级、高效的 API,可用于 UI 渲染、图像操作和动画加速,特别适用于资源受限的嵌入式设备,如智能手表、工业显示屏和车载仪表盘等。
ARM-2D 主要特点
可见,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屏幕-电子产品世界论坛

将LTDC驱动色彩模式为RGB565

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

#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库相关选项

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

展开Acceleration,滑动至底部找到以下两个配置文件
![1742306180958842.png $W}4BVZ7W[}~[7X5X]1R)0Q.png](http://uphotos.eepw.com.cn/1709346044/pics/1742306180958842.png)
arm_2d_cfg.h文件参数设置,支持由代码编辑转为面板编辑模式

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

main.c文件添加头文件
/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "string.h" #include "arm_2d_helper.h" /* USER CODE END Includes */
此时编译工程,会报错缺少Disp0_DrawBitmap函数的定义,这个函数声明来自arm-2d库,需要用户手动实现它的定义
![1742306727335661.png %76E0)1B]V4(8%$587KRQ58.png](http://uphotos.eepw.com.cn/1709346044/pics/1742306727335661.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刷新

这款开发板主控支持I/D Cache加速,在程序中开启
/* USER CODE BEGIN 1 */ SCB_EnableICache(); //Enable ICache SCB_EnableDCache(); //Enable DCache /* USER CODE END 1 */
刷新速率改善显著,尝试增大PFB大小

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

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

4、arm-2d性能评测应用
arm-2d内置了两个性能评测应用,用于评估当前主控芯片的GUI渲染性能,勾选第一个评测应用
![1742308926638720.png Z2$IB[_8T55OL$%_L]9]]T3.png](http://uphotos.eepw.com.cn/1709346044/pics/1742308926638720.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

我要赚赏金
