arm-2d简介
Arm-2D是一个由ARM公司 开源 的2D图形处理软件,它被设计为一个轻量级的“显卡驱动”,专门针对资源受限的微控制器系统,如那些具有有限的内存和处理能力的嵌入式设备。 Arm-2D提供了一系列的2D图形操作,包括位图处理、颜色转换、旋转、缩放、混合和透明度处理等。
他的开源地址如下: https://github.com/ARM-software/Arm-2D
arm-2d移植前的准备
那Arm-2D的移植简单吗?
答案是相当简单,你只需要提前准备一个在屏幕任意位置绘图的函数就可以了。
其函数原型如下
void Disp0_DrawBitmap ( uint32_t x, uint32_t y, uint32_t width, uint32_t height, const uint8_t *bitmap){}
这里,5个参数之间的关系如下图所示:
我们只要调用一下OLED_DrawBitmap(此函数在上一篇文章中已经介绍)函数即可,如下所示
void Disp0_DrawBitmap ( uint32_t x, uint32_t y, uint32_t width, uint32_t height, const uint8_t *bitmap){ OLED_DrawBitmap(x, y, width , height , bitmap); }
arm-2d移植
Arm-2D是有一个pack安装包的,他的获取路径如下
https://github.com/ARM-software/Arm-2D/tree/main/cmsis-pack
安装好这个之后, 在mdk的rte中进行勾选就可以了(是不是很简单~~~///(^v^)\\\~~~)
首先,在mdk中点击rte图标,如下
接着勾选就可以了,如下图
此时,勾选完成如果出现一个黄色警告,也不要紧
接着勾选cmsis中的dsp就可以了
到这里就选择完了,不过为了方便后续的开发,强烈推荐下载并安装 perf_counter 模块,
大家安装最新的pack包就可以了,他的勾选如下
配置编译环境
接下来就该配置编译环境了
我用的ac6编译器,所以要在"Language C"中选择gnu11.
哈哈,到这里,我们就可以编译成功了!!
模块配置
然后我们在对arm-2d进行配置,找到
在 Acceleration中找到新加入的 文件 arm_2d_disp_adapter_0.h,双击它,配置如下
主要的地方都标记了红色框。
这时,可能有小伙伴发现了
Select the screen colour depth为什么选择8bits呢?
我们的oled是单色屏幕,应该选1bit才对啊。。。。。。
哈哈哈,这时因为就没有1bit这个选项
那他是怎么支持单色屏幕的呢??
这时我们就需要在Disp0_DrawBitmap函数中进行转换,把8bit转换成1bit(即8个字节转成1个字节)
为了方便说明,我们在把程序贴一下
void OLED_DrawBitmap(int16_t iX, int16_t iY, int16_t iWidth, int16_t iHeight, const uint8_t *pchBuffer){ //unsigned char j=0; unsigned char x,y; int16_t y0 = iY/8; int16_t y1 = iY + iHeight; if(y1%8==0) y1=y1/8; else y1 = y1/8+1; for(y = y0;y < y1; y++){ //OLED_Set_Pos(iX,y); OLED_WR_Byte(0xb0+y,OLED_CMD); OLED_WR_Byte((((iX+0)&0xf0)>>4)|0x10,OLED_CMD); OLED_WR_Byte(((iX+0)&0x0f),OLED_CMD); uint16_t offect = (y-y0)*8*iWidth;//uint16_t offect = 128*8*i; for(x = 0;x < iWidth;x++){ u8 data_ram = 0x00; for(uint16_t j = 0; j < 8; j++){ if(pchBuffer[offect + x + iWidth *j] >= 0x80){ //data_ram &= ~(0x01<<j); data_ram |= (0x01<<j); } } OLED_WR_Byte(data_ram,OLED_DATA); } } }
程序19~24行就是把8个字节转换成一个字节输出到oled屏幕的。
哈哈,你是不是觉得有点浪费啊,直接用单色不好吗?
这是因为直接处理单色需要各种移位操作, 在运算时非常不方便,所以就采取了用8bit计算,计算完成后在转换成1bit。
不过arm-2d还支持pfb,这样还是可以节约内存的,设置pfb如下
我们甚至可以把pfb设置成8*8的小块,这样才用了64个字节。
pfb的大小和形状可以任意设置,不过最小也的是8个字节哦。
这时,你好像又发现问题了
那我设置成7*7可以吗?
答案是肯定的,此时你还需要设置一个地方,如下
如果你的屏幕是纵向刷新的,需要把Height Alignment of generated PFBs设置成8(也就是竖着8像素对齐)
同样的,如果你的屏幕是横向刷新的,需要把Width Alignment of generated PFBs设置成8
arm-2d会为我们自动调整形状的(是不是很贴心)
最后,我们在设置一下arm_2d_cfg.h,如下
只要把这一处设置成8bits就可以了,到这里我们就配置好了。
接下来就该使用arm-2d了。
使用arm-2d
arm-2d的使用也很简单,先添加几个头文件如下
#include "arm_2d.h" #include "arm_2d_disp_adapter_0.h" #include "arm_2d_scenes.h"
然后在main函数中添加几行代码,如下
int main(void) { ...//硬件初始化函数 arm_irq_safe { arm_2d_init(); // 初始化 arm-2d } // 初始化 Display Adapter 0 disp_adapter0_init(); __arm_2d_scene0_init( &DISP0_ADAPTER ,NULL); while (true) { disp_adapter0_task(); } }
这样,编译下载就可以了,运行后的效果如下
屏幕上会出现一个Scene 0的字符串,这样我们就运行成功了。
此时,如果你运行卡死了,没有出现这个界面,那可能是你的Heap_Size设置太小了,修改他的大小如下
如果你还遇到其他问题,可以参考下这篇文章
https://mp.weixin.qq.com/s/1qqMA_BWrbN4urVMM_Ynaw
运行单色屏demo
移植成功后,我们就可以运行官方的demo了。
首先,添加demo程序,在rte中勾选如下,
选好点击确定,此时就会出现很多demo了,如下
我们运行第一个demo试试,
首先添加头文件
#include "arm_2d_scene_mono_clock.h"
在main函数中初始化这个demo,如下
//__arm_2d_scene0_init( &DISP0_ADAPTER ,NULL); __arm_2d_scene_mono_clock_init( &DISP0_ADAPTER ,NULL);
也就是把scene0的初始化替换成这个demo的初始化据可以了,运行效果如下
好了,其他demo大家自己运行就可以了。
下一篇:介绍如何使用arm-2d制作电子书界面