把GuiLite移植到STM32上

发布者:Yuexiang最新更新时间:2024-01-17 来源: elecfans关键字:移植  STM32 手机看文章 扫描二维码
随时随地手机看文章

1 Gui移植结果

一些演示效果:

5936caa4-b43f-11ed-bfe3-dac502259ad0.gif5a766672-b43f-11ed-bfe3-dac502259ad0.gif
5cfd92b2-b43f-11ed-bfe3-dac502259ad0.gif5d6a0dd4-b43f-11ed-bfe3-dac502259ad0.gif
5d89e69a-b43f-11ed-bfe3-dac502259ad0.gif5ea8292e-b43f-11ed-bfe3-dac502259ad0.gif

5fb0f396-b43f-11ed-bfe3-dac502259ad0.gif
611d9a2c-b43f-11ed-bfe3-dac502259ad0.gif

2 GuiLite介绍

GuiLite是一个开源的图形用户界面框架,只依赖于一个单一的头文件库(GuiLite.h),不需要很复杂的文件管理,代码量平易近人。 GuiLite由4千行C++代码编写,单片机上也能流畅运行,其最低的硬件运行要求如下:

61334944-b43f-11ed-bfe3-dac502259ad0.png

GuiLite具有很强的跨平台特性:

支持的操作系统:iOS/macOS/WatchOS,Android,Linux(ARM/x86-64),Windows(包含VR),RTOS… 甚至无操作系统的单片机

支持的开发语言:C/C++, Swift, Java, Javascript, C#, Golang…

支持的第3方库:Qt, MFC, Winforms, CoCoa…

GuiLite 提供一系列辅助开发工具:

完美的“云” + “物联网”解决方案:让你轻松驾驭全球IoT业务

支持多语言,采用 UTF-8 编码;支持视频播放

资源制作工具为你定制自己的字体/图片资源

所见即所得的GUI布局工具

编译活跃度统计,及实时分析

支持3D & Web

支持Docker,一条命令启动。

3GuiLite移植

2.1所需硬件

6145bf2a-b43f-11ed-bfe3-dac502259ad0.png

STM32F407开发板

61bab1b8-b43f-11ed-bfe3-dac502259ad0.png

OLED屏幕

2.2 驱动准备

这里我使用STM32CubeMX 对开发板进行外设配置,开启STM32的硬件IIC,这里我用CubeMX开启后如下:61f28836-b43f-11ed-bfe3-dac502259ad0.png

配置完成生成代码,同时将分配的堆空间增大:

620f45a2-b43f-11ed-bfe3-dac502259ad0.png

代码生成后,我们复制正点原子的OLED驱动工程代码到Hardware硬件目录下,自己创建一个该目录。

624c8bec-b43f-11ed-bfe3-dac502259ad0.png

在MDK里面添加文件,然后我们进行修改,注释掉头文件里面关于端口的定义,同时添加三个类型宏定义。

628b33a6-b43f-11ed-bfe3-dac502259ad0.png

然后我们进入oled.c文件,将void OLED_WR_Byte(u8 dat,u8 cmd)和 void OLED_Init(void)函数分别替换为下面的内容:


OLED_WR_Byte:


void OLED_WR_Byte(u8 dat,u8 cmd)

 if(cmd)

  HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x40,I2C_MEMADD_SIZE_8BIT,&dat,1,0x100);

 else

  HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x00,I2C_MEMADD_SIZE_8BIT,&dat,1,0x100); 

}

OLED_Init:

//初始化SSD1306         

void OLED_Init(void)

{        

 OLED_WR_Byte(0xAE,OLED_CMD); //关闭显示

 OLED_WR_Byte(0xD5,OLED_CMD); //设置时钟分频因子,震荡频率

 OLED_WR_Byte(80,OLED_CMD);   //[3:0],分频因子;[7:4],震荡频率

 OLED_WR_Byte(0xA8,OLED_CMD); //设置驱动路数

 OLED_WR_Byte(0X3F,OLED_CMD); //默认0X3F(1/64) 

 OLED_WR_Byte(0xD3,OLED_CMD); //设置显示偏移

 OLED_WR_Byte(0X00,OLED_CMD); //默认为0



 OLED_WR_Byte(0x40,OLED_CMD); //设置显示开始行 [5:0],行数.



 OLED_WR_Byte(0x8D,OLED_CMD); //电荷泵设置

 OLED_WR_Byte(0x14,OLED_CMD); //bit2,开启/关闭

 OLED_WR_Byte(0x20,OLED_CMD); //设置内存地址模式

 OLED_WR_Byte(0x02,OLED_CMD); //[1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;

 OLED_WR_Byte(0xA1,OLED_CMD); //段重定义设置,bit0:0,0->0;1,0->127;

 OLED_WR_Byte(0xC0,OLED_CMD); //设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数

 OLED_WR_Byte(0xDA,OLED_CMD); //设置COM硬件引脚配置

 OLED_WR_Byte(0x12,OLED_CMD); //[5:4]配置



 OLED_WR_Byte(0x81,OLED_CMD); //对比度设置

 OLED_WR_Byte(0xEF,OLED_CMD); //1~255;默认0X7F (亮度设置,越大越亮)

 OLED_WR_Byte(0xD9,OLED_CMD); //设置预充电周期

 OLED_WR_Byte(0xf1,OLED_CMD); //[3:0],PHASE 1;[7:4],PHASE 2;

 OLED_WR_Byte(0xDB,OLED_CMD); //设置VCOMH 电压倍率

 OLED_WR_Byte(0x30,OLED_CMD); //[6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;



 OLED_WR_Byte(0xA4,OLED_CMD); //全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)

 OLED_WR_Byte(0xA6,OLED_CMD); //设置显示方式;bit0:1,反相显示;0,正常显示              

 OLED_WR_Byte(0xAF,OLED_CMD); //开启显示  

 OLED_Clear();

}

然后在main.c文件如下位置添加oled测试代码,记得添加头文件和头文件路径。


62e53928-b43f-11ed-bfe3-dac502259ad0.png


下载程序,观看现象:

6300f280-b43f-11ed-bfe3-dac502259ad0.png

此 OLED 驱动的准备已经完成,下一步就是移植 GuiLite。

2.3 例程移植

首先,我们上GuiLite的例程展示官网:GuiLiteDemo,选择Hello例程,将其中的 UI_Code文件夹复制到 Hardware 下:634cb04e-b43f-11ed-bfe3-dac502259ad0.png

在 MDK 工程里面导入UICode下的GuiLite.h和UIcode.cpp文件。

639317fa-b43f-11ed-bfe3-dac502259ad0.png

我们在 main.c 文件开头添加 GuiLite 接口代码,接口代码如下:


//画点函数接口

void gfx_draw_pixel(int x, int y, unsigned int rgb)

{

    OLED_DrawPoint(x,y,rgb);

}

//画面函数(未使用)

void gfx_draw_fill(int x, int y,int w, int q, unsigned int rgb)

}

//创建一个函数指针结构体

struct EXTERNAL_GFX_OP

{

 void (*draw_pixel)(int x, int y, unsigned int rgb);

 void (*fill_rect)(int x0, int y0, int x1, int y1, unsigned int rgb);

} my_gfx_op;

extern void startHelloCircle(void* phy_fb, int width, int height, int color_bytes, struct EXTERNAL_GFX_OP* gfx_op);



//设定延时函数接口

void delay_ms(int milli_seconds)

{

 HAL_Delay(milli_seconds);

}

之后在main函数中添加如下代码:

//传递函数指针

my_gfx_op.draw_pixel = gfx_draw_pixel;

my_gfx_op.fill_rect = NULL;//gfx_fill_rect;

//启动画圆

startHelloCircle(NULL, 128, 64, 1, &my_gfx_op);

然后我们修改UIcode.cpp文件中的代码,添加OLED头文件,以及在UI执行函数界面处添加OLED刷新函数。

63b4bdd8-b43f-11ed-bfe3-dac502259ad0.png


之后在UIcode的第8行修改3D圆的参数,因为OLED大小128x64 ,所以我的配置如下:

63d7db56-b43f-11ed-bfe3-dac502259ad0.png

配置完成后,我们关闭Use MicroLIB选项,编译代码:

64512542-b43f-11ed-bfe3-dac502259ad0.png

编译成功,下载代码。

646b2ab4-b43f-11ed-bfe3-dac502259ad0.png    

下载完成后程序复位,可以在OLED上看到Demo的示例动画。

64d296fe-b43f-11ed-bfe3-dac502259ad0.png


关键字:移植  STM32 引用地址:把GuiLite移植到STM32上

上一篇:STM32串口通信的原理
下一篇:STM32的待机唤醒实验

推荐阅读最新更新时间:2024-11-09 14:17

s3c2410移植MPlayer到linux2.6
我使用的linux内核为2.6.14.1 MPlayer版本为MPlayer-1.0pre7try2.bz2 目前虽然已经添加了mad的mp3库,但播放声音文件回导致mplayer错误,放视频还得禁掉声音,怪了,madplay放mp3就很好 下面介绍下整个移植过程,也是参考了网上很多文章综合而来的 ================================================================= 1)编译器最好选择3.3.2 ,我使用3.4.1会出现snow.c编译错误,找不到解决办法 解压3.3.2到/usr/local/arm/下 并export PATH=http://www.eda-chin
[单片机]
STM32的USART窗口通讯程序
一、准备工作 硬件原理图: 所用器件:核心版、下载线ST–Link、usb转TTL线 所用编程软件:MDK5.33 二、操作目的 设置波特率为115200,1位停止位,无校验位。 STM32系统给上位机(win10)连续发送“hello windows!”,上位机接收程序可以使用“串口调试助手“,也可自己编程。 当上位机给stm32发送“Stop,stm32”后,stm32停止发送。 三、实验操作 1.实验所需代码 #include led.h #include delay.h #include key.h #include sys.h #include usart.h #include stdl
[单片机]
<font color='red'>STM32</font>的USART窗口通讯程序
基于STM32无人超市消费系统设计
一、前言 针对传统超市购物车结账排队时间长、付款效率低的问题,提出了一种更符合现代社会人们购物方式-基于RFID的自助收银系统。习惯了快节奏生活的人们都会选择自助收银机结账,理由显而易见:自助收银机结账很方便,几乎不用排队,也不用近距离和收银员接触,在防疫时期特别感觉安心。而且自助结账对每件物品的售价更是一次清晰地核对,最终需支付合计购物支出自己也更加清晰明了;这两年来,越来越多的智能设备应用在我们的生活领域里,为我们的生活提供了很多智能和便利。自助收银机从几年前就陆续涌入到各地商场、超市、便利店,自去年疫情发生后自助收银的需求比例更是呈直线上升趋势。自助收银机的启用,不仅节约了超市的人力开支成本,也从根本上提升了超市的购物支付效
[单片机]
基于<font color='red'>STM32</font>无人超市消费系统设计
u-boot-2016.09移植(7)-nandflash
一、uboot中增加NANDFLASH 由第二节分析得知,硬件初始化在board_init_r中,我们到这里找到nand的初始化: u-boot-2016.09$ vim common/board_r.c 看这里知道首先我们需要定义宏CONFIG_CMD_NAND,屏蔽CONFIG_CMD_ONENAND,才可以调用nand的初始化函数,在include/conifgs/tq210.h中定义宏: #define CONFIG_CMD_NAND 编译,发现没有定义CONFIG_SYS_MAX_NAND_DEVICE,由于我们的板子上只有一个nandflash,所以在tq210.h中定义宏: #define C
[单片机]
u-boot-2016.09<font color='red'>移植</font>(7)-nandflash
STM32笔记——GPIO
GPIO简介 GPIO是通用输出输入端口的简称,简单来说就是STM32可控制的引脚,STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集功能。 GPIO的基本结构 1、保护二极管与上下拉电阻 当外部输入电压高于VDD的电压时,上方的保护二极管导通,当外部输入电压底于Vss的电压时,上方的保护二极管导通,防止不正常电压引入芯片导致芯片烧毁。 2、P-MOS管和N-MOS管 在输出模式部分,线路经过一个由 P-MOS 和 N-MOS 组成的结构,这个结构使其拥有 推挽输出 和 开漏输出 的功能。 3、TTL肖特基触发器 4、IO耐压 STM32是一款3.3V电压的芯片,I
[单片机]
<font color='red'>STM32</font>笔记——GPIO
STM32芯片简介以及功能特点和其优异性
STM32与单片机 单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统。由于8位单片机由于内部构造简单,体积小,成本低廉,在一些较简单的控制器中应用很广。常见的8位单片机主要有:Intel的51系列,Atmel的AVR系统,Microchip公司的PIC系列,TI的MSP430系列等。而STM32是一种功能比较强大的32位的单片机。它和8位单片机最大的不
[单片机]
stm32 嵌入式开发 中ADC独立多通道DMA传输数据实验总结
主要知识点: DMA 数据传输 串口传输 通道引脚初始化 (一)、DMA 数据传输            1、外设到存储器传输            2、存储器到外设传输            3、存储器到存储器传输     外设一般为:ADC、SPI、I2C等。 存储器一般为:片内SRAM、外部存储器、片内FLASH等   DMA功能框图:8个流通道(DMA_SxCR ),每个流通到对应8个外设请求(CHSEL )     DMA 请求映射:分两种 DMA1请求映射、DMA2请求映射    特点:每一个外设请求只占用一个数据流通道,相同的外设请求可以占用不同的通道请求。       当该数据流通道
[单片机]
<font color='red'>stm32</font> 嵌入式开发 中ADC独立多通道DMA传输数据实验总结
STM32单片机对TFTLCD的驱动设计
看了TFTLCD和FSMC(灵活的静态存储控制器)的简介,还是一知半解,不知所云。 TFTLCD使用80并口,80 并口有如下一些信号线: CS: TFTLCD 片选信号。 WR:向 TFTLCD 写入数据。 RD:从 TFTLCD 读取数据。 D[15: 0]: 16 位双向数据线。 RST:硬复位 TFTLCD。 RS:命令/数据标志( 0,读写命令; 1,读写数据)。 只是记住FSMC在使用的时候要初始化和使能就行了。 关于lcd.c这个文件竟然接近3000行,好吧,我是写不出来,只能在主函数里调用了。 main.c: intmain(void) { u8x=0; u8lcd_id[12];//存放LCDID字符串
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved