查看: 1742|回复: 0

【STM32F746试用】跟着小狂玩F7之体验Stemwin

[复制链接]
  • TA的每日心情
    无聊
    2017-3-12 00:04
  • 签到天数: 62 天

    连续签到: 1 天

    [LV.6]常住居民II

    发表于 2016-9-23 08:33:57 | 显示全部楼层 |阅读模式
    分享到:
    到目前为止跟着小狂玩F7已经出到第六篇了,小狂的目的和意义很简单,就是希望能出点高质量的帖子,然后让更多的人在需要的时候能在黑暗中遇到一点光亮,也就相当欣慰了。因为是发在爱板网经验频道,所以可能回复少了点那也无所谓了,坚持把自己想玩的东西玩完,我感觉就是一种胜利,今天的这一篇可能会长一点,希望大家看着不累。今天这一篇会带着大家玩耍STemwin,这个也不算是新东西了,老东西长谈,就是耍一耍。这一篇会有以下三大内容。
    1、移植STemwin到我们建立的工程模板中。
    2、生成中文字库并调用
    3、生成bmp的c文件并调用。
    在这首先介绍以下emwin,emwin是SEGGER公司开发的GUI图形软件库,大家可能有用过μCGUI,就是Micrium公司提供的GUI但是,可能很少有人知道CGUI并不是Micrium公司自己开发的,其实是SEGGER提供的,包括NXP使用的图形库也都是SEGGER公司开发的,SEGGER公司是生产jlink的那个公司,哈哈,是不是感觉很有感觉。STemwin是SEGGER专门为ST公司定制的图形软件库,这里有一个重要的概念,就是版权的概念,就是如果你要使用emwin的软件库做商业用途的话是需要授权费的,个人的东西人家不搭理你,一般免费提供给个人使用,但是要是公司那就是侵权了,是要有侵权费的,但是STemwin不一样啊,ST已经付过授权费用给SEGGER啦,也就是说你要是使用ST的东西,就可以免费使用STemwin。这样说大家应该很明白吧。好了题外话说到这,直接进入正题。
    一、STemwin的移植
    STemwin因为不提供源代码,只有库文件,给搞底层的人带来了麻烦,但是确实方便了移植。首先我们在工程模板下新建名为GUI的文件夹然后拷贝库文件夹下如下目录的X:..\STM32Cube_FW_F7_Vx.x.x\Middlewares\ST\STemWin下的inc文件夹的所有内容到GUI目录下,然后拷贝Lib目录下的STemWin528_CM7_Keil.lib到GUI目录下,Config目录下的[url=]GUIConf.C[/url]和GUIConf.h,和OS目录下的GUI_X.c到GUI目录下,下边还有一个更重要的文件,就是LCDConf.c和LCDConf.h文件这个是主要的配置文件,这个在Config文件夹下有模板,但是要改的东西太多,我就直接拷贝ST历程中的文件了,文件在这个目录下的Src和Inc中X:..\STM32Cube_FW_F7_Vx.x.x\Projects\STM32746G-Discovery\Applications\STemWin\STemWin_HelloWorld\文件拷贝完成后,然后修改工程。见下图。在工程中新建一个文件分组


    然后把如下的几个文件加到工程中


    然后添加搜寻目录


    这样所有的准备工作都做完了,剩下的我们就要更改我们移植的三个文件。
    [url=]GUIConf.c[/url]配置有效内存
    [url=]LCDConf.C[/url]配置显示尺寸,屏幕驱动和颜色转换规则
    GUI_X.c  时钟配置,主要是系统延时的配置
    其实最重要的文件就是LCDConf.C的配置,里边的东西会在慢慢讲。
    ①GUIConf.c
    这个文件中主要的函数是GUI_X_Config(),里边调用了GUI_ALLOC_AssignMemory()。这个函数的目的是分配一个内存块供emwin内部的内存管理系统使用,其实就是给emwin分配内存空间,这里我们分配150K。这个文件里就需要配置这一个函数就行


    ②LCDConf.C这个文件是整个移植的核心文件,但是我们直接拷贝st的啦,其实也不需要做神马修改,但是为了理解这个过程,我们就把LCDConf.C里的内容扒一扒,以后也好移植到其他的板子中,是不是。
    [url=]⑴[/url]LCD_X_Config()
    这个函数主要实现的功能是配置显示驱动,设置颜色转换规则和配置物理显示尺寸。显示屏幕的驱动配置在LCD_LL_Init()函数中,看如下代码


    然后引脚的配置和中断的配置在HAL_LTDC_Init函数中,这个在建工程模板的时候就说过HAL_LTDC_MspInit(hltdc)这个就是时钟、引脚和中断的初始化函数,见下图


    具体为什么这么配置,我没有拿到屏幕的资料,就懒得过问了,直接套用配置了,其实只要拿到屏幕资料驱动起来不麻烦,要不是让你写驱动代码,只是配置接口而已,要是用FPGA自己写,那就呵呵喽。
    给指定的层设定缓存区



    设置驱动方式和颜色转换方式


    这个就可以理解为配置驱动器,当你把mcu的LCD控制接口配置好后,你要配置自己的写,读函数啦,之类的,这个一般根据驱动器的手册来写,但是emwin提供了几乎所有市面上的驱动器类型, 只需要输入相应的参数,就能把基础的底层接口全部配置完成。
    设置屏幕的物理尺寸


    设置RAM缓存地址


    设置常用的copy函数。这些函数小狂也没有怎么看,时间关系就直接copy了。


    ⑵LCD_X_DisplayDriver()
    其次重要的就是这个函数啦,按照官网的说明文档来讲,这就是一个驱动器的回答函数,用来操控这个驱动器的,包括层初始化,设置VIDEO的RAM地址,这只一个层的起点,转入到指定的缓存等等….,具体代码就不贴了挺费劲的,也不是自己写的NB代码,有兴趣玩耍的应该不难找到。
    ③GUI_X.c,对于没有OS的系统来说这个函数中唯一有用的就是精确的定时器演示了,定时器用的还是系统滴答定时器


    在滴答定时器的服务函数中应该增加如下



    还要增加LTDC错误处理中断服务程序,直接抄一下就搞定,至此我们所有的工作已经完成,现在让我们检验一下我们得成果,调用初始化函数


    检验一下效果


    二、生成中文字库
    现在我们能显示英文了,但是中文字体不支持啊,但是不要紧,让小狂来教你慢慢生成c语言中文字库,我们可以使用emwin自带的生成工具,


    这个要安装一下,嘿嘿。打开如下图所示
    我们选择这个选项


    定义我们选择的字库名字和字体大小,然后就会看到如下图所示的界面


    由于保存所有的文字信息会非常之大,放在ram中不够空间,只能放在flash中,然后调用,但是不是在我们今天的内容中,我就说一下怎么生成我们先要的字库。由于软件只支持unicode编码,我们得keil不支持unicode编码所以,实现起来比较复杂,听小狂一一道来
    先关闭所有的字


    生成空白文件


    取名为song16


    然后打开刚才生成的文件,在里边写入我们想要的字,然后另存为unicode编码的文本


    然后读取刚才保存的文件


    接着生成字库文件



    到此我们得库文件也生成完毕了,现在我们把他加入到我们的工程中,然后按照下列的方式调用,先把变量外扩出来


    然后设置字体,设置颜色,因为在keil中没有unicode编码,我们只能把unicode转换为utf8,然后更改keil中的设置才能使用中文。

    Keil中设置如下

    然后程序如此写


    把程序下进去看看效果


    三、显示bmp图片
    Emwin是直接可以读取bmp文件的,但是要先存入ram中和外部存储器中,这个,就不搞了,为了测试功能,随便刷一刷,我们就生成bmp的c文件,显示一下,这里要用到一个工具。


    我们先把论坛的logo下载下来,然后转换成bmp文件后,直接拖到转换器中,转换成RGB图像格式的。


    另存为logo.C



    然后把其拷贝到工程目录下,编译后,按照下图所示调用

    外扩变量


    然后画图


    看效果


    到这里这篇文章就写完了,由于事情比较多,写这篇文章写了2天多,可能写的哆嗦了点,希望对刚接触的人有帮助把,下边一篇还会写emwin,不过这个东西只是基础的东西,没有什么实在的价值,小狂下一节将会讲解如何快速建立自己的GUI,对话框按钮……不要吝啬各位的赞哦,不枉我大半夜在这发帖子打汉字,母代码,哈哈。
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 14:23 , Processed in 0.125179 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.