正点原子开拓者 Nios II资料连载第十四uC/GUI显示线/点实验
1)实验平台:正点原子开拓者FPGA 开发板
2)摘自《开拓者 Nios II开发指南》关注官方微信号公众号,获取更多资料:正点原子
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/index.html
第十四uC/GUI显示线/点实验
我们在使用 Nios II 的时候会移植 uC/GUI 来制作精美的 UI,所谓 UI 就是 User Interface 的
缩写、GUI 就是 Graphical User Interface 的缩写,即图形用户接口。uC/GUI 是 Micrium 公司研
发的通用的嵌入式用户图像界面软件,可以给任何使用图像 LCD 的应用程序提供单独于处理
器和 LCD 控制器之外的有效的图形用户接口,能够应用于单一任务环境,也能够应用于多任
务环境中。本章我们将向大家介绍如何在 Qsys 中移植 uC/GUI,并以 RGB 接口的 4.3 寸、
480*272 分辨率的 LCD 屏幕为例实现基本的打点画线功能,本章包括以下几个部分:
14.1 简介
14.2 实验任务
14.3 硬件设计
14.4 软件设计
14.5 下载验证
简介
当前主流的小型嵌入式 GUI 主要有:emWin(uC/GUI)、TouchGFX、Embedded Wizard
GUI、uGFX 和 MicroChip GUI。当然,还有其它的 GUI,以上所列的 GUI 基本上都是收费的,
但由于 ST 公司购买了 emWin 的版权,得到了定制版的 emWin,然后改了名字叫 StemWin,
所以当用户在 STM32 芯片上使用 emWin 软件库时,是不需要向 emWin 或 ST 公司付费的。也
正因为 STM32 在工商业的大范围使用,使得 emWin 的使用场合更广、学习资料也更多。另外
uC/GUI 和 emWin 还是有区别的。uC/GUI 的核心代码并不是 Micrium 公司开发的,而是 Segger
公司为 Micrium 公司定制的图形软件库,当然也是基于 Segger 公司的 emWin 图形软件库开发
的。在以前较早的版本程序中 uC/GUI 的源代码是开源的(可以在网上能够找到),但是新版
本的程序 emWin 和 uC/GUI 只对用户提供库文件,是不开源的。这里为了方便对 GUI 感兴趣
的读者可以查看 uC/GUI 的底层,我们采用开源的 uC/GUI3.90 版本进行移植。那么 uC/GUI 有
什么特点呢?
µC/GUI 是一种用于嵌入式应用的图形支持软件,一种用于为任何使用一个图形 LCD 的
应用提供一个高效率的,与处理器和 LCD 控制器无关的图形用户界面。它适合于单一任务和
多任务环境,专用的操作系统或者任何商业的实时操作系统(RTOS)。µC/GUI 以 C 源代码形
式提供。它可以适用于任何尺寸的物理和虚拟显示,任何 LCD 控制器和 CPU。
µC/GUI 很适合大多数的使用黑色/白色和彩色 LCD 的应用程序。它有一个很好的颜色管
理器,允许它处理灰阶。µC/GUI 也提供一个可扩展的 2D 图形库和一个视窗管理器,在使用
一个最小的 RAM 时能支持显示窗口。它的架构基于模块化设计,由不同的模块中的不同层组
成,主要包括:液晶驱动模块,内存设备模块,窗口系统模块,窗口控件模块,反锯齿模块和
触摸屏及外围模块。其主要特性包括丰富图形库,多窗口、多任务机制,窗口管理及丰富窗口
控件类(按钮、检验框、单/多行编辑框、列表框、进度条、菜单等),多字符集和多字体支持,
多种常见图像文件支持,鼠标、触摸屏支持,灵活自由配制等。另外 µC/GUI 可以在嵌入式系
统上运行也可以裸机运行。
µC/GUI 对内存的需求如下:
小的系统(没有视窗管理器)
• RAM:100 字节
• 堆栈:500 字节
• ROM:10~25KB(取决于使用的功能)
大的系统(包括视窗管理器和控件)
• RAM:2~6KB(取决于所需窗口的数量)
• 堆栈:1200 字节
• ROM:30~60KB(取决于使用的功能)
注意,如果应用程序使用许多字体的话,ROM 的需求将增加。以上所有的数值都是粗略
的估计,根据实际的应用有所区别。
另外我们需要说明的一点是对于 µC/GUI 而言屏幕坐标如下:
图 14.1.1 屏幕坐标
显示平面由二维坐标 X 轴和 Y 轴表示,即值(X,Y)。水平刻度被称作 X 轴,而垂直刻度被
称作 Y 轴。在程序中需要用到 X 和 Y 坐标时,X 坐标总在前面。显示屏(或者一个窗口)的
左上角为一默认的坐标(0,0)。正的 X 值方向总是向右;正的 Y 值方向总是向下。上图说明
该坐标系和 X 轴和 Y 轴的方向。另外所有传递到一个 API 函数的坐标总是以像素(屏幕由能
够被单独控制的许多点组成,这些点被称作像素)为单位所指定。大部分 µC/GUI 在它的 API
中向用户程序提供的文本和绘图函数能够在任何指定像素上写或绘制。
实验任务
本章我们首先将 µC/GUI 移植到 Nios II 上运行,然后实现基本的打点画线功能。
硬件设计
本章实验工程可基于《lcd_all_Colorbar》实验上搭建,所以这里我们直接在该实验工程
上进行移植效果显示。硬件设计部分不变,只需修改软件设计部分。
软件设计
我们打开软件工程后,关闭原先的工程,新建一个工程,命名为 qsys_gui,然后将原先工
程的源代码文件添加进来(APP 目录),并将之前的 main.c 替换现在的 hello_world.c。现在我
们开始移植 uC/GUI。
在开始移植 uC/GUI 之前,我们建议大家最好先浏览一下《uC/GUI 中文手册》,该手册可
以在网上下载,也可在我们提供的软件资料中找到,《uC/GUI 中文手册》里面详细的介绍了
uC/GUI 的所有 API 函数及相关例程,并提供了配置说明。通过阅读《uC/GUI 中文手册》,我
们可以进一步了解 uC/GUI,加快移植的速度,减少移植的弯路。下面我们就开始进行移植。
第一步:添加需要的功能文件。
首先我们新建一个名为 uCGUI 的文件夹,用来存放我们需要的 uCGUI 源码,新建好文件
夹以后,我们将光盘中的 uCGUI3.90 源码复制出来并解压,解压完成以后,我们可以看到该源
码中有三个文件夹分别为:Sample 文件夹、Start 文件夹和 Tool 文件夹。首先,我们将 Start 文
件夹中的 Config 文件夹复制到 uCGUI 中,然后我们将 Start 文件夹下的 GUI 文件夹中的所有
文件夹都复制到 uCGUI 中,最后我们再将 Sample 文件夹下的 GUI_X 和 GUIDemo 这两个文
件夹复制到 uCGUI 中,至此我们就完成了移植第一步,最终我们 uCGUI 文件夹中的内容,如
下图所示。
图 14.4.1 uCGUI文件夹中的内容
上图各个文件夹的内容如下:
图 14.4.2 文件夹内容详解
其中 AntiAlias、JPEG、Mendev、Widget、WM 和 GUIDemo 为可选项,前四项可以依据
项目的需要而增删,GUIDemo 是 uC/GUI 自带的 Demo,如果不需要演示该 Demo,则可以不
添加。
第二步:修改相应的配置文件。
首先我们修改 Config 文件夹下的 GUIConf.h 文件,该文件修改后代码如下所示。
1 #ifndef GUICONF_H
2 #define GUICONF_H
3
4 #define GUI_OS (0) /* 支持多任务处理 */
5 #define GUI_SUPPORT_TOUCH (0) /* 支持触摸 */
6 #define GUI_SUPPORT_UNICODE (1) /* 支持 Unicode */
7
8 #define GUI_DEFAULT_FONT &GUI_Font6x8 /* GUI 默认字体 */
9 #define GUI_ALLOC_SIZE 12500 /* 动态内存的大小*/
10 //#define GUI_ALLOC_SIZE 1024*1024
11
12 #define GUI_WINSUPPORT 1 /* 支持窗口管理 */
13 #define GUI_SUPPORT_MEMDEV 1 /* 支持内存设备 */
14 #define GUI_SUPPORT_AA 1 /* 支持抗锯齿显示 */
15
16 #endif /* Avoid multiple inclusion */
该文件是GUI的基本属性配置文件,它有一些开关可以配置,比如是否支持系统(GUI_OS),
是否支持触摸(GUI_SUPPORT_TOUCH)等。如果我们需要支持系统,可将相应的值设为 1,
如果不需要就设为 0,此处我们不需要系统,所以将其设置为 0,其余以次类推。动态内存大
小 GUI_ALLOC_SIZE 可根据需求设置,这里我们设置为 12500,修改好该文件后,我们修改
Config 文件夹下的 GUITouchConf.h 文件,即 GUI 的触摸配置文件,因为在 GUIConf.h 文件中
我们将触摸的宏设置为 0,即不使用触摸功能,所以无需配置该文件,但还是可以看一下该文
件的内容,如下所示。
1 #ifndef GUITOUCH_CONF_H
2 #define GUITOUCH_CONF_H
3
4
5 #define GUI_TOUCH_AD_LEFT 3750
6 #define GUI_TOUCH_AD_RIGHT 300
7 #define GUI_TOUCH_AD_TOP 420
8 #define GUI_TOUCH_AD_BOTTOM 3850
9 #define GUI_TOUCH_SWAP_XY 0
10 #define GUI_TOUCH_MIRROR_X 0
11 #define GUI_TOUCH_MIRROR_Y 1
12
13 #endif /* GUITOUCH_CONF_H */
该文件用来配置触摸屏的一些参数,可根据实际需求来配置。接下来我们修改 Config 文
件夹下的 LCDConf.h 文件,该文件修改后代码如下所示。
1 #ifndef LCDCONF_H
2 #define LCDCONF_H
3
4 /*********************************************************************
5 *
6 * General configuration of LCD
7 *
8 **********************************************************************
9 */
10
11 #define LCD_XSIZE (272) /* 配置 TFT 的水平分辨率 */
12 #define LCD_YSIZE (480) /* 配置 TFT 的垂直分辨率 */
13
14 #define LCD_BITSPERPIXEL (16) /* 每个像素的位数 */
15
16 #define LCD_CONTROLLER (666) /* TFT 控制器的名称 */
17 #define LCD_FIXEDPALETTE (565) /* 调色板格式 */
18 #define LCD_SWAP_RB (1) /* 红蓝反色交换 */
19 // #define LCD_SWAP_XY (1)
20 #define LCD_INIT_CONTROLLER() LCD_L0_Init(); /* TFT 初始化函数 */
21
22 #endif /* LCDCONF_H */
该文件用来设置 TFT LCD 相关的参数,比如 TFT LCD 的分辨率、像素位数等,另外还可
以配置 TFT LCD 的寄存器(若有)和 TFT LCD 初始化入口等,这个文件与硬件直接相关,一
般是根据使用的 TFT LCD 来配置。
第三步:与硬件底层对接
TFT LCD 的对接:uC/GUI 自带了很多驱动,支持很多屏幕,由于我们使用的 4.3 寸 RGB
TFT LCD 屏幕,uC/GUI 自带的驱动中并没有该屏幕的驱动,所以这里先将 uCGUI/LCDDriver
目录下的文件先全部删除,然后添加修改好的屏幕驱动文件 LCD_driver 文件,如下图所示:
图 14.4.3 与硬件底层对接文件
对该文件我们简单的介绍下如果需要修改需要注意的事项。首先 TFT 控制器的名称需要
对应。下图 53 行的 LCD_CONTROLLER 应与我们上面修改的 LCDConf.h 里的#define
LCD_CONTROLLER 相对应。
图 14.4.4 修改参数
其次对于不同的屏幕需要相应修改下面的函数。
图 14.4.5 修改函数
另外如果需要触摸支持的话,还需要触摸的对接,因为这里我们不使用触摸,就不做介绍。
第四步:添加到工程
现在,我们进行最后一步,将 uC/GUI 添加到工程中,实验一下可行性。添加的方法很简
单,将 uCGUI 文件夹复制到该工程目录下,即 qsys/software/qsys_gui 文件夹下,然后我们在
Eclipse 软件工程中刷新该工程(在左边的工程栏按快捷键 F5,或右键点击应用工程文件夹
qsys_gui 后点击 fresh),当然了,我们也可以直接将我们的 uCGUI 文件夹粘贴至我们 Eclipse
软件工程中的结构下。添加完成后,如下图:
图 14.4.6 添加uC/GUI
此时我们还不能使用 uCGUI,还需要将该文件夹的路径添加到我们的工程中。添加方法如
下:我们右键点击应用工程文件夹 qsys_gui,在弹出的菜单栏中点击【Properties】菜单,弹出
属性页面如下图,点击 Nios IIApplication Properties 下的 Nios IIApplication Paths,在 Applicatuin
include directories 栏下点击 Add…按钮,将工程下的 uCGUI文件目录下的子目录除了 GUIDemo
外一个个添加进来(也可只添加我们需要的功能目录)。
图 14.4.7 添加子目录
添加完成后,点击“OK”按钮即可。现在我们 ucgui 的移植基本完成。试一下基本的打点
画线功能。
我们修改 qsys_gui.c 的代码如下:
1 #include <stdio.h>
2 #include "system.h"
3 #include "io.h"
4 #include "alt_types.h"
5 #include "altera_avalon_pio_regs.h"
6 #include "sys/alt_irq.h"
7 #include "unistd.h"
8 #include <string.h>
9 #include "mculcd.h"
10 #include "GUI.h"
11
12 _lcd_gui lcdgui;
13 extern _lcd_dev lcddev; //管理 LCD 重要参数
14
15 //SDRAM 显存的地址
16 alt_u16 *ram = (alt_u16 *)(SDRAM_BASE + SDRAM_SPAN - 2049000);
17
18 int main()
19 {
20 printf("Hello from NiosII!\n");
21
22 MY_LCD_Init(); //LCD 初始化
23 GUI_Init(); //uC/GUI 初始化
24
25 lcdgui.width = lcddev.height;
26 lcdgui.height = lcddev.width;
27
28 GUI_SetBkColor(GUI_VERYLIGHTCYAN); //设置 GUI 背景色
29 GUI_Clear(); //GUI 清屏
30
31 GUI_SetPenSize(10); //设置点的大小
32 GUI_SetColor(GUI_RED); //设置 GUI 前景色
33 GUI_DrawPoint(lcdgui.width/2,lcdgui.height/2); //画点
34 GUI_DrawLine(0,lcdgui.height/2 + 11,lcdgui.width,lcdgui.height/2 + 11); //画线
35
36 alt_dcache_flush_all();
37
38 return 0;
39 }
这里我们先设置了 GUI 背景色,然后清屏,此时清屏会以当前的背景色清屏。使用的带
GUI 的函数都可从《uC/GUI 中文手册》中找到,这里我们就不再做详细的介绍。该代码实现的
功能是在屏幕的正中间画了一个点,然后在点的下面画了一条横线。
软件部分就介绍到这里,接下来我们进行下载验证。
下载验证
讲完了软件工程,接下来我们就将该实验下载至我们的开拓者开发板进行验证。
首先我们将 4.3 寸的 ATK-4.3’RGBLCD 与开发板上的 RGB LCD 接口连接。再将下载器
一端连电脑,另一端与开发板上对应端口连接,最后连接电源线并打开电源开关。
我们在 Quartus II 软件中将 lcd_all_colorbar.sof 文件下载至我们的开拓者开发板,下载完
成后,我们还需要在 Nios II SBT for Eclipse 软件中将 qsys_gui.elf 文件下载至我们的开拓者开
发板,qsys_gui.elf 下载完成以后,我们的 C 程序将会执行在我们的开拓者开发板上。显示的
效果如下图所示。
图 14.5.1 实验结果图
至此,我们的 uC/GUI 移植和实现打点画线实验就完成了。
请先 后发表评论~