这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » 【STM32WBA55CG开发板】移植arm-2d驱动单色oled屏幕

共1条 1/1 1 跳转至

【STM32WBA55CG开发板】移植arm-2d驱动单色oled屏幕

菜鸟
2024-12-26 10:55:35     打赏

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个参数之间的关系如下图所示:

08.png

 我们只要调用一下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图标,如下

09.png

接着勾选就可以了,如下图

10.png

此时,勾选完成如果出现一个黄色警告,也不要紧

接着勾选cmsis中的dsp就可以了

11.png

到这里就选择完了,不过为了方便后续的开发,强烈推荐下载并安装 perf_counter 模块,

大家安装最新的pack包就可以了,他的勾选如下

12.png

配置编译环境

接下来就该配置编译环境了

13.png

我用的ac6编译器,所以要在"Language C"中选择gnu11.

哈哈,到这里,我们就可以编译成功了!!


模块配置

然后我们在对arm-2d进行配置,找到

14.png

在  Acceleration中找到新加入的 文件 arm_2d_disp_adapter_0.h,双击它,配置如下

15.png

主要的地方都标记了红色框。

这时,可能有小伙伴发现了

 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如下

16.png

我们甚至可以把pfb设置成8*8的小块,这样才用了64个字节。

pfb的大小和形状可以任意设置,不过最小也的是8个字节哦。

这时,你好像又发现问题了

那我设置成7*7可以吗?

答案是肯定的,此时你还需要设置一个地方,如下

17.png

如果你的屏幕是纵向刷新的,需要把Height Alignment of generated PFBs设置成8(也就是竖着8像素对齐)

同样的,如果你的屏幕是横向刷新的,需要把Width Alignment of generated PFBs设置成8

arm-2d会为我们自动调整形状的(是不是很贴心)

最后,我们在设置一下arm_2d_cfg.h,如下

18.png

只要把这一处设置成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();
    }
    
}

这样,编译下载就可以了,运行后的效果如下

19.png

屏幕上会出现一个Scene 0的字符串,这样我们就运行成功了。

此时,如果你运行卡死了,没有出现这个界面,那可能是你的Heap_Size设置太小了,修改他的大小如下

20.png如果你还遇到其他问题,可以参考下这篇文章

https://mp.weixin.qq.com/s/1qqMA_BWrbN4urVMM_Ynaw


运行单色屏demo

移植成功后,我们就可以运行官方的demo了。

首先,添加demo程序,在rte中勾选如下,

21.png

选好点击确定,此时就会出现很多demo了,如下

22.png

我们运行第一个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的初始化据可以了,运行效果如下

23.png

好了,其他demo大家自己运行就可以了。

下一篇:介绍如何使用arm-2d制作电子书界面





关键词: oled     iic     arm-2d    

共1条 1/1 1 跳转至

回复

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