STM32F429中的EMWIN怎么加触摸板功能功能

请完成以下验证码
查看: 1335|回复: 0
初学emWin的准备工作及其快速上手
下载分13723 分
原创币1 点
下载166 次
上传1609 次
金币5665 ¥
主题帖子积分
会员等级:
笔记本维修
俗话说万事开头难,学习一门新的知识,难的往往不是知识本身,而是如何快速上手,需要什么资料和开发环境。一旦上手后,深入的学习就相对容易些了。
& & 本章节就起到这样的作用,主要说明初学emWin需要做的准备工作。
2.1 初学者重要提示
2.2 开发环境
2.3 emWin参考资料
2.4. emWin的调试工具emWinSPY
2.1& &初学者重要提示
& & 我们的第一版emWin教程已经发布2年多了,经常有初学者会反映学习emWin很长时间了,一直还没有入门,最主要的原因在于学习方法上,对于初学者来说,要优先掌握以下三点:
1、学会emWin相关资源的获取方法,做到心中有数,要不心里老是没底。
2、学习emWin模拟器的使用。利用模拟器做前期的界面调试非常方便,可以大大降低界面的设计时间。另外就是学习模拟器中配套的大量参考例子的运行方法,这些参考例子极具参考价值。
3、学习GUIBuilder和uCGUIBuilder两款界面创建小工具的使用。通过这两个小工具,使得界面创建和排版布局变得很容易,一定程度上加快了界面的创建。
& & 掌握了这三点后,一定要做大量实例的练习,因为实战才是学好emWin的最佳捷径,待有一定基础后,使用中只需查阅手册即可。另外,初学时不要一上来就研究emWin的底层驱动接口,比较影响初学的积极性,搞得后面越来越没有兴趣去研究了。
2.2& &开发环境
1、模拟器开发环境推荐使用VC6.0,其它的VS2008,VS2010,VS2013也可以,其余的VS版本未做测试。
2、IDE:支持两种IDE开发环境,MDK和IAR
& && &&&(1)MDK4.7X或者MDK5.XX均可,MDK4.7X以下的版本不行,因为低版本不支持STM32F429。
& && &&&(2)IAR固定使用IAR7.5版本,由于IAR向下兼容性稍差,其它版本未做支持。
3、调试器使用JLINK,ULINK或者STLINK均可
4、配套开发板是安富莱的:STM32-V6开发板,MCU是STM32F429BIT6。
2.3&&emWin参考资料
2.3.1&&SEGGER官方的英文版emWin用户手册
& & emWin用户手册下载地址:,当前版本是emWin5.34(如果官方升级了新版本,大家使用最新版本即可,手册都是向下兼容的)。
2.3.2&&周立功翻译的emWin5.12中文版用户手册
& & 虽然中文版的版本有些低,但是对于初学者来说,这个版本已经够用了。大家可以在我们的电子论坛进行下载: 。待emWin入门后,要逐渐的适应英文版的手册,5.12版本的中文版已经不够用了,很多新发布的控件都没有介绍。
2.3&&emWin参考资料
2.3.1&&SEGGER官方的英文版emWin用户手册
& & emWin用户手册下载地址:https://www.segger.com/downloads/emwin,当前版本是emWin5.34(如果官方升级了新版本,大家使用最新版本即可,手册都是向下兼容的)。
2.3.2&&周立功翻译的emWin5.12中文版用户手册
& & 虽然中文版的版本有些低,但是对于初学者来说,这个版本已经够用了。大家可以在我们的电子论坛进行下载:http://bbs.armfly.com/read.php?tid=377 。待emWin入门后,要逐渐的适应英文版的手册,5.12版本的中文版已经不够用了,很多新发布的控件都没有介绍。
2.3.3&&emWin模拟器的下载
& & emWin模拟器下载地址:https://www.segger.com/downloads/emwin,当前版本是emWin5.32。另外注意,下载模拟器是需要用户注册了SEGGER官网的账号后才可以下载。
细心的读者会发现手册是5.34版本,但是模拟器怎么是5.32版本?这是没有问题的,因为官网没有及时更新。另外本教程模拟器的使用是以5.32版本为基础的,如果官方升级了新版,并且模拟器做了修改,我们论坛进行了备份,下载地址:http://bbs.armfly.com/read.php?tid=23481 。
2.3.4&&用于STM32的emWin软件包下载
& & 用于STM32系列芯片的emWin软件包主要存放于STM32CubeF里面,所以要下载emWin软件包就需要下载STM32CubeF(ST官网资料需要用户注册账号才可以下载)。
1、用于STM32F1xx系列的的emWin软件包存放在STM32CubeF1里面
ST官网地址链接(这是个超链接)
2、用于STM32F4xx系列的的emWin软件包存放在STM32CubeF4里面
ST官网地址链接(这是个超链接)
3、用于STM32F7xx系列的的emWin软件包存放在STM32CubeF7里面
ST官方地址链接(这是个超链接)
对于上面的三个链接地址来说,STM32CubeF都是位于相应网页的最末端:
下面以STM32CubeF4 V1.13.0为例,打开路径:STM32Cube_FW_F4_V1.13.0\Middlewares\ST\StemWin可以看到如下文件,这些文件就是emWin软件包的内容:2.4& & emWin的调试工具emWinSPY
& & emWinSPY是一款比较实用的emWin调试软件。
& & emWinSPY是从5.2x版本才开始有的,但这个版本仅支持网口调试。网口调试有些麻烦,我们不考虑这种调试方式。到了emWin5.32版本开始支持JLINK调试了,但是测试发现emWin5.32版本无法使用emWinSPY,缺少函数定义,编译后会出现如下问题:
根据以往的经验(比如emWin多点触摸功能首次发布时也是缺少函数定义,待升级了几个版本后,可以正常使用了),估计会在后面的emWin版本中将这个功能开放出来,下面是emWinSPY的显示效果:
2.5& & 总结
& & 本章节就为大家讲解这么多,建议初学者花些时间对emWin的用户手册了解一下,随着以后的学习最好可以达到熟练查看这个手册的程度。
承接:青岛地区笔记本维修业务,有意者站内信或留言。
Powered by Discuz! X3.4 -ALicensed
& 2017 Comsenz Inc.他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)查看: 2115|回复: 13
如何将我的7寸屏程序入移植EMWIN
主题帖子精华
初级会员, 积分 81, 距离下一级还需 119 积分
在线时间9 小时
我上传的代码是我的程序,程序的功能就是从SD卡中读取图片到7寸屏中,屏幕的型号MD070SD,我想把EMWIN移植进入我的程序,我有UCGUI移植好的程序,但是UCGUI貌似不支持从SD卡中直接读取位图,而EMWIM却有GUI_BMP_DrawEx()这个函数可以从SD卡中直接读取位图显示到7寸屏上,移植中我参考了八度空间老师的帖子http://www.openedv.com/posts/list/28316.htm ,但是我还是没学会,感觉这种移植很费劲,很茫然,希望得到大神的帮助,我上传的程序功能就是从SD卡根目录下读取图片,谢谢了
22:25 上传
点击文件名下载附件
2.85 MB, 下载次数: 107
主题帖子精华
金钱121956
在线时间995 小时
主题帖子精华
初级会员, 积分 81, 距离下一级还需 119 积分
在线时间9 小时
回复【2楼】正点原子:
---------------------------------
能得到原子哥帮顶,真是增加了我学习的动力啊,其实我的最终目的就是利用显示的位图来做成一个个按钮,或者说是纯位图用按键控制也行,当我用左右按键操作时,屏幕上的小位图能相应的左右切换,然后按下确定键,我就能进入小位图对应的二级子菜单,其实就是做个二级菜单,用位图当按钮,但是我还没外接RAM,所以我想都从SD卡中把位图读出来,有一个函数是UCGUI中的,GUI_DrawStreamedBirmap,该函数从一个位图数据流的数据绘制一副位图,如果这个函数好使,那我也可以不必非得移植EMWIN了,但是我也不会使用这个函数,利用BmpCVT将一个位图软换成“C”stream(*.dta)格式以后,我也不知道接下来应该继续怎么用,我还是没有认真看看咱们开源电子网,可能这个问题早就解决了,接着研究吧
主题帖子精华
在线时间1321 小时
回复【3楼】liliang129129:
---------------------------------
关于EMWIN的移植,我们有详细的教程,你既然会ucgui的移植那么肯定就能完成emwin的移植,还有你说的就是EMWIN的绘制位图流文件功能,我们的教程虽然没有绘制位图流文件的例程,但是有绘制位图的例程,两者用法几乎无差异你可以参考一下。
开往春天的手扶拖拉机
主题帖子精华
初级会员, 积分 81, 距离下一级还需 119 积分
在线时间9 小时
回复【4楼】zuozhongkai:
---------------------------------
我就是看见您的教程,你在教程里面也是这么说的两者基本无差异,但是我还是不会,普通显示一张位图的话,把位图转化成C数组放在程序中,这在您的教程中都讲了,我自己用我的板子也实现了,但是您视频中没有绘制位图流文件的例程,我真是教点会点,不教就不会啊,您的视频非常好,谢谢您带我入门EMWIN
主题帖子精华
在线时间1321 小时
回复【5楼】liliang129129:
---------------------------------
绘制绘图流文件和绘制绘图文件最大的一个区别就是从SD卡获取位图文件,这是一个函数。你可以看我们的JPEG,BMP等图片显示实验,那个里面也有个从SD卡读取JPEG文件的函数,基本上可以用到绘制位图流文件中。
开往春天的手扶拖拉机
主题帖子精华
初级会员, 积分 81, 距离下一级还需 119 积分
在线时间9 小时
回复【6楼】zuozhongkai:
---------------------------------
现在我最大的疑惑就是利用BmpCVT将一个位图软换成“C”stream(*.dta)格式以后,我也不知道接下来应该怎么办,这个格式的文件应该是放在SD卡里吧,我再研究研究再有了深刻一些的理解以后再向您提问吧,谢谢您
主题帖子精华
金牌会员, 积分 1063, 距离下一级还需 1937 积分
在线时间102 小时
两种方式:
1、动态加载至内存,直接绘制;
2、提供pfGetData回调函数,由emWin调用。
前者速度较快、高效,后者节省空间。
I See Fire.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.
主题帖子精华
初级会员, 积分 81, 距离下一级还需 119 积分
在线时间9 小时
回复【6楼】zuozhongkai:
---------------------------------
左老师您好,我是用的芯片是STM32F103VET6,我没有外接SRAM,我使用内部RAM做内存控制管理,我在malloc.h中
#define&SRAMIN&0&&//内部内存池&&???&1.&&请问这个定义,在不用外部内存池的情况下,是否要做这样的修改#define&SRAMIN&1
#define&SRAMEX&1&&//外部内存池
#define&MEM1_BLOCK_SIZE&&32&//内存块大小为&32&字节
#define&MEM1_MAX_SIZE&25*1024&//最大管理内存&40K&&&&???&2.&&我这里调到25*1024的情况下编译不出错
#define&GUI_NUMBYTES&&(16*1024)&&//&&&???&&3.&在GUIConf.h中我这个定义为16K
#define&GUI_BLOCKSIZE&0X80&&//&&&
关于内存管理方面的知识我不是特别懂,我这样修改程序在我的板子上是不是能直接用呢,或者说我怎么能验证一下关于内存管理这部分的移植成不成功呢?有我没认真看的地方请老师见谅我还在继续学习
主题帖子精华
初级会员, 积分 81, 距离下一级还需 119 积分
在线时间9 小时
回复【9楼】liliang129129:
---------------------------------
/*********************************************************************
打点函数
*/
static&void&_SetPixelIndex(GUI_DEVICE&*&pDevice,&int&x,&int&y,&int&nbspixelIndex)&
{&
//void&lcd_SetPoint(int&x,int&y,int&point);&&函数原型,经过调试好使
lcd_SetPoint(&x,&y,PixelIndex);
/*********************************************************************
*
读点函数
*/
static&unsigned&int&_GetPixelIndex(GUI_DEVICE&*&pDevice,&int&x,&int&y)&{
unsigned&int&nbspixelI
&&&&#if&(LCD_MIRROR_X&==&1)&||&(LCD_MIRROR_Y&==&1)&||&(LCD_SWAP_XY&==&1)
&&&&&&int&xPhys,&yP
&&&&&&xPhys&=&LOG2PHYS_X(x,&y);
&&&&&&yPhys&=&LOG2PHYS_Y(x,&y);
&&&&#else
&&&&&&#define&xPhys&x
&&&&&&#define&yPhys&y
&&&&#endif
&&&&GUI_USE_PARA(pDevice);
&&&&GUI_USE_PARA(x);
&&&&GUI_USE_PARA(y);
&&&&{
//int&lcd_GetPoint(int&x,int&y)&&&读点函数原型,经过调试好使
PixelIndex&=&lcd_GetPoint(x,y);
&&&&}
&&&&#if&(LCD_MIRROR_X&==&0)&&&&(LCD_MIRROR_Y&==&0)&&&&(LCD_SWAP_XY&==&0)
&&&&&&#undef&xPhys
&&&&&&#undef&yPhys
&&&&#endif
&&return&nbspixelI
static&void&_FillRect(GUI_DEVICE&*&pDevice,&int&x0,&int&y0,&int&x1,&int&y1)&
{
// void&LCD_Fill(int&sx,int&sy,int&ex,int&ey,int&color)&&&填充矩形区域颜色函数,经过调试好使
LCD_Fill(x0,y0,x1,y1,LCD_COLORINDEX);
/*********************************************************************
*
*&&&&&&&Draw&Bitmap&16&BPP,&not&optimized
*
*&nbspurpose:
*&&&Drawing&of&16bpp&high&color&bitmaps.
*&&&Only&required&for&16bpp&color&depth&of&target.&Should&be&removed&otherwise.
*/
static&void&_DrawBitLine16BPP(GUI_DEVICE&*&pDevice,&int&x,&int&y,&U16&const&GUI_UNI_PTR&*&p,&int&xsize)&{
LCD_PIXELINDEX&
lcd_SetCursor(x,y);
*(__IO&uint16_t&*)(UCGUI_LCD_CMD)&&=&lcddev.&&//&&u32&UCGUI_LCD_CMD&&=&0X;&
for&(;xsize&&&0;&xsize--,&x++,&p++)&
pixel&=&*p;
&&&&&&&&*(__IO&uint16_t&*)(UCGUI_LCD_DATA)&=&&//u32&UCGUI_LCD_DATA&=&0X;&&我使用的是FSMC_NE1可以成功
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//将七寸初始化,应该好使,
&&&&}
}
左老师我按您出的教程在GUIDRV_Template.c中修改了这四个函数,您看看有没有什么问题,现在我还是没有一直成功,还在继续寻找问题
主题帖子精华
在线时间1321 小时
回复【9楼】liliang129129:
---------------------------------
1、内存管理这里,宏:SRAMIN定义为1,MEM1_MAX_SIZE调整到编译不出错就可以了,&内存管理是可以直接用的VET6上的
2、16bpp优化这里你先不要改,使用默认的,其他的基本没什么问题
开往春天的手扶拖拉机
主题帖子精华
初级会员, 积分 81, 距离下一级还需 119 积分
在线时间9 小时
回复【11楼】zuozhongkai:
---------------------------------
#include&&GUI.h&
#include&&ff.h&
#include&&ffconf.h&
#include&&diskio.h&
#include&&lcd.h&
//&#define&DISP_XS&480
//&#define&DISP_YS&272&
#define&DISP_XS&800
#define&DISP_YS&480&
FATFS&fs3;&&&&&&&&&&&&&&&&&&&&&
#define&BMPMEMORYSIZE 500*1024
#define&BMPPERLINESIZE 2*1024
#define&u8&&unsigned&char
#define&u16&unsigned&short
#define&u32&unsigned&long
static&FIL&BMPF
static&char&bmpBuffer[BMPPERLINESIZE];
/*******************************************************************
*
*&&&&&&&Static&functions
*
********************************************************************
*/
/*********************************************************************
*
*&&&&&&&BmpGetData
*
*&Function&description
*&&&This&routine&is&called&by&GUI_BMP_DrawEx().&The&routine&is&responsible
*&&&for&setting&the&data&pointer&to&a&valid&data&location&with&at&least
*&&&one&valid&byte.
*
*&nbsparameters:
*&&&p&&&&&&&&&&&-&nbspointer&to&application&defined&data.
*&&&NumBytesReq&-&Number&of&bytes&requested.
*&&&ppData&&&&&&-&nbspointer&to&data&pointer.&This&pointer&should&be&set&to
*&&&&&&&&&&&&&&&&&a&valid&location.
*&&&StartOfFile&-&If&this&flag&is&1,&the&data&pointer&should&be&set&to&the
*&&&&&&&&&&&&&&&&&beginning&of&the&data&stream.
*
*&Return&value:
*&&&Number&of&data&bytes&available.
*/
static&int&BmpGetData(void&*&p,&const&U8&**&ppData,&unsigned&NumBytesReq,&U32&Off)&
{
static&int&readaddress=0;
UINT&NumBytesR
#if&SYSTEM_SUPPORT_UCOS
OS_CPU_SR&cpu_
phFile&=&(FIL&*)p;
if&(NumBytesReq&&&sizeof(bmpBuffer))&
NumBytesReq&=&sizeof(bmpBuffer);
if(Off&==&1)&readaddress&=&0;
else&readaddress=O
#if&SYSTEM_SUPPORT_UCOS
OS_ENTER_CRITICAL();
f_lseek(phFile,readaddress);&
f_read(phFile,bmpBuffer,NumBytesReq,&NumBytesRead);
#if&SYSTEM_SUPPORT_UCOS
OS_EXIT_CRITICAL();
*ppData&=&(U8&*)bmpB
return&NumBytesR
}
int&dispbmpex(u8&*BMPFileName,u8&mode,u32&x,u32&y,int&member,int&denom)
{
int&XSize,YS
float&Xflag,Y
//& GUI_COLOR&forecolor,
//& forecolor=GUI_GetColor();
//& bkcolor=GUI_GetBkColor();
disk_initialize(0);
&&&
&&Disp_Mask(0,&DISP_XS-1,&0,&DISP_YS-1&);
&
&&f_mount(0,&&fs3);
result&=&f_open(&BMPFile,(const&TCHAR*)BMPFileName,FA_OPEN_EXISTING&|&FA_READ);
& if(result&!=&FR_OK)& return&1;
switch(mode)
if((member&==&1)&&&&(denom&==&1))&
GUI_BMP_DrawEx(BmpGetData,&BMPFile,x,y);
GUI_BMP_DrawScaledEx(BmpGetData,&BMPFile,x,y,member,denom);
XSize&=&GUI_BMP_GetXSizeEx(BmpGetData,&BMPFile);
YSize&=&GUI_BMP_GetYSizeEx(BmpGetData,&BMPFile);
if((member&==&1)&&&&(denom&==&1))
GUI_BMP_DrawEx(BmpGetData,&BMPFile,(lcddev.width-XSize)/2-1,(lcddev.height-YSize)/2-1);
GUI_BMP_DrawEx(BmpGetData,&BMPFile,(800-XSize)/2-1,(480-YSize)/2-1);
Xflag&=&(float)XSize*((float)member/(float)denom);
Yflag&=&(float)YSize*((float)member/(float)denom);
//&
XSize&=&(lcddev.width-(int)Xflag)/2-1;&
//&
YSize&=&(lcddev.height-(int)Yflag)/2-1;
XSize&=&(800-(int)Xflag)/2-1;
&
&YSize&=&(480-(int)Yflag)/2-1;
GUI_BMP_DrawScaledEx(BmpGetData,&BMPFile,XSize,YSize,member,denom);
f_close(&BMPFile);
//??±?BMPFile????
//& GUI_SetColor(forecolor);
//?????°?°??
//& GUI_SetBkColor(bkcolor);
//????±??°??
return&0;
}
主题帖子精华
初级会员, 积分 81, 距离下一级还需 119 积分
在线时间9 小时
回复【12楼】liliang129129:
---------------------------------
#include&&jpegdisplay.h&
#include&&GUI.h&
#include&&ff.h&
#include&&ffconf.h&
#include&&diskio.h&
#include&&lcd.h&
#define&DISP_XS&800
#define&DISP_YS&480&
FATFS&fs4;&&&&&&&&&&&&&&&&&&&&&&//&?????????÷??±ê??
static&FIL&JPEGF
static&unsigned&char&jpegBuffer[JPEGPERLINESIZE]&__attribute__&((aligned(4)));
extern&void&Disp_Mask&(
/*&Left&end&of&active&window&(0&to&DISP_XS-1)&*/
int&right,
/*&Right&end&of&active&window&(0&to&DISP_XS-1,&&=left)&*/
/*&Top&end&of&active&window&(0&to&DISP_YS-1)&*/
int&bottom
/*&Bottom&end&of&active&window&(0&to&DISP_YS-1,&&=top)&*/
);
extern&void&Delay(volatile&unsigned&int&nCount);
/*******************************************************************
*
*&&&&&&&Static&functions
*
********************************************************************
*/
/*********************************************************************
*
*&&&&&&&_GetData
*
*&Function&description
*&&&This&routine&is&called&by&GUI_JPEG_DrawEx().&The&routine&is&responsible
*&&&for&setting&the&data&pointer&to&a&valid&data&location&with&at&least
*&&&one&valid&byte.
*
*&nbsparameters:
*&&&p&&&&&&&&&&&-&nbspointer&to&application&defined&data.
*&&&NumBytesReq&-&Number&of&bytes&requested.
*&&&ppData&&&&&&-&nbspointer&to&data&pointer.&This&pointer&should&be&set&to
*&&&&&&&&&&&&&&&&&a&valid&location.
*&&&StartOfFile&-&If&this&flag&is&1,&the&data&pointer&should&be&set&to&the
*&&&&&&&&&&&&&&&&&beginning&of&the&data&stream.
*
*&Return&value:
*&&&Number&of&data&bytes&available.
*/
static&int&JpegGetData(void&*&p,&const&U8&**&ppData,&unsigned&NumBytesReq,&U32&Off)&
{
static&int&readaddress=0;
UINT&NumBytesR
#if&SYSTEM_SUPPORT_UCOS
OS_CPU_SR&cpu_
phFile&=&(FIL&*)p;
if&(NumBytesReq&&&sizeof(jpegBuffer))&
NumBytesReq&=&sizeof(jpegBuffer);
if(Off&==&1)&readaddress&=&0;
else&readaddress=O
#if&SYSTEM_SUPPORT_UCOS
OS_ENTER_CRITICAL();
f_lseek(phFile,readaddress);&
f_read(phFile,jpegBuffer,NumBytesReq,&NumBytesRead);
#if&SYSTEM_SUPPORT_UCOS
OS_EXIT_CRITICAL();
*ppData&=&(U8&*)jpegB
return&NumBytesR
}
int&displayjpegex(u8&*JPEGFileName,u8&mode,u32&x,u32&y,int&member,int&denom)
{
int&xSize,yS
float&Xflag,Y
GUI_JPEG_INFO&JpegI
char&path1[50]={&&};& &&
disk_initialize(0);
&&&
&&Disp_Mask(0,&800-1,&0,&480-1&);
&&f_mount(0,&&fs4);
if&(f_opendir(&dirs,&path1)&==&FR_OK)&&&&&&&&&&&&
&&{
result&=&f_open(&JPEGFile,(const&TCHAR*)JPEGFileName,FA_OPEN_EXISTING&|&FA_READ);
if(result&!=&FR_OK)& return&1;
GUI_JPEG_GetInfoEx(JpegGetData,&JPEGFile,&JpegInfo);
xSize&=&JpegInfo.XS //JPEG????X?ó??
ySize&=&JpegInfo.YS //JPEG????Y?ó??
switch(mode)
if((member&==&1)&&&&(denom&==&1))&
GUI_JPEG_DrawEx(JpegGetData,&JPEGFile,x,y);
GUI_JPEG_DrawScaledEx(JpegGetData,&JPEGFile,x,y,member,denom);
if((member&==&1)&&&&(denom&==&1))&//???è??·????±??????
GUI_JPEG_DrawEx(JpegGetData,&JPEGFile,(lcddev.width-XSize)/2-1,(lcddev.height-YSize)/2-1);
GUI_JPEG_DrawEx(JpegGetData,&JPEGFile,(800-xSize)/2-1,(480-ySize)/2-1);
Xflag&=&(float)xSize*((float)member/(float)denom);
Yflag&=&(float)ySize*((float)member/(float)denom);
xSize&=&(800-(int)Xflag)/2-1;
ySize&=&(480-(int)Yflag)/2-1;
GUI_JPEG_DrawScaledEx(JpegGetData,&JPEGFile,xSize,ySize,member,denom);
f_close(&JPEGFile);
return&0;
}
主题帖子精华
初级会员, 积分 81, 距离下一级还需 119 积分
在线时间9 小时
回复【13楼】liliang129129:
---------------------------------
左老师,麻烦您帮我看一下,第一个程序是存在SD卡中的BMP格式图片,显示没错,第二个程序是存在SD卡中的JPG格式图片,就显示不出来,我都是利用emWIN的函数直接调用的,这两个代码我也核对了半天,找不出原因来,网上有说是将#define&SDIO_TRANSFER_CLK_DIV&&&&&&&&&&&&&&((uint8_t)0x04)这样设置,并且Status_1&=&SD_SetDeviceMode(SD_POLLING_MODE);再这样设置可以显示JPG文件,我都试了,麻烦您指点迷津
Powered by[单片机经验] 【mk_欣驰】emWin移植笔记——STemWin5.22在STM32F103上的移植步骤(带触摸,无操作系统)
一、硬件要求小系统
(无窗口管理器)&&
& & oRAM:100字节&
& & o 堆栈:600字节&
& & oROM:10-25 kb(取决于所使用的功能)&
大系统 (包含窗口管理器和小工具)&&
& & oRAM:2-6 kb(取决于所需的窗口数)&
& & o 堆栈:字节 (取决于所使用的功能)&
& & oROM:30-60 kb(取决于所使用的功能)&
请注意,如果应用程序使用了很多字体,则对ROM的要求会提高。上述所有值都是粗略估算值,不&
保证能正常使用。
重要说明:&
(0)由于这个移植教程是去年过年的时候做的,用的是5.16,这就不再做个5.20的移植了,方法是一样的。&
(1)emWin手册里面有这样一句话:“驱动接口的改变始于emWin V5。不再支持针对emWin V4 或更早版本开发的老显示驱动”。&&
(2)尽管emWin提供了大部分屏的驱动,但是不能包含所有,这篇移植文档就因此而生。不管是emWin已经支持的,还是没有提供支持的,均可采用这种方法。
二、移植前的准备工作
1、固件库的获取
首先, emWin 库来源有两个:
(a).在MDK(KEIL)软件目录下获取
路径:MDK5.XX&D:\Program
Files (x86)\Keil_5\\Pack\Keil\MDK-Middleware\5.1.4\emWin
& && && &MDK4.XX&C:\Keil4.73\\Segger\emWin
(b).在ST官网下载
下载地址:http://www.st.com/web/en/catalog/tools/PF259225#
& & 这里我们用第二个,因为 MDK 目录下的 emWin 最新版本对于大家不是好获得(MDK5.0 才 是5.22 , MDK4.7 下 是 5.16 的 ) , 而 ST 公 司 的 那 个 好 下 载 。目前最新的是 5.22的版本,打开页面,登陆后点击下的 Download, 即可下载。http://bbs.elecfans.com/forum.php?mod=attachment&aid=MzQ4NTY4fGYzMjA0YTcwMmUzOWM4YTRhYzgyYjNiZDhhMjM1ZThmfDE0NzgzMTEwNzk%3D&request=yes&_f=.rar解
压 缩 下 载 的 压 缩 包 , 打 开 文 件 夹 , 我 们 看 到:&
Libraries:
里面就有我们需要的&STemWin&库
Project:这个是&ST&的工程文件,以官方的&eval&板子建的工程
这个是文件系统和 eval 板子的硬件驱动程序
打开Libraries,就会看到我们需要的STemWinLibrary522文件夹。
内容如下图:
2、注册RL_ARM&
其过程和使用*注*册*机*注册MDK过程一样,如下图:
三、开始移植
1、液晶驱动程序
& & 这里借用正点原子的液晶屏驱动程序,复制原子的lcd.c和lcd.h文件到工程里(或直接使用原子例程里的 “实验11 TFT液晶显示实验”)。
& &&同时,记得在主函数里调用LCDx_Init();进行液晶屏初始化。&
& &&工程里的
lcd.c 和 lcd.h 改为 ili93xx.c 和 ili93xx.h 后重新加入到工程里, LCD_Init()也改为 LCDx_Init()。
&&&&因为这里和emWin固件库里的有同名了,防止冲突所以在这里要修改。
下面的程序由&ili93xx.h 中剪切到 ili93xx.c 中,至于为什么做以上工作,移植过
ucGUI 的再知
道不过了,这里就不多说了,不知道的可以百度哦。
typedef struct
u16 LCD_REG;
u16 LCD_RAM;
} LCD_TypeD
#define LCD_BASE ((u32)(0x6C000000 | 0x000007FE))
#define LCD ((LCD_TypeDef *) LCD_BASE)2、加入STemWin5.22固件库文件
加入后的工程截图如下:
(a). GUIConf.c和LCDConf_FlexColor_Template.c两个文件路径如下:
(b).GUI_X.C文件路径如下:(灵活选择。因为这里是无操作系统的,所以使用GUI_X.c文件)
(c).lib文件路径如下:(灵活选择。因为这里使用Keil开发工具,stm32f103为CM3内核)
3、修改程序,制作emWin与液晶屏驱动程序接口函数
(a).修改GUIConf.c 文件
GUI_NUMBYTES 为 1024*50, 50 可以小点,不要太大,太大编译器会编译会错误的。
(b).修改 LCDConf_FlexColor_Template.c 这个文件
先将我们的 ili93xx.h 头文件包含进来,接下来加入以下两行程序,至于后面的地址为什么会这样,这是 LCD 显示里的哦。
#define LCD_REG_ADDRESS *(__IO uint16_t *)(0x6C000000)
#define LCD_DATA_ADDRESS *(__IO uint16_t *)(0x6C000800)
再就是下面的几个程序,添加红色部分程序
static void LcdWriteReg(U16 Data) {
// ... TBD by user
LCD_REG_ADDRESS=D
static void LcdWriteData(U16 Data) {
// ... TBD by user
LCD_DATA_ADDRESS=D
static void LcdWriteDataMultiple(U16 * pData, int NumItems) {
while (NumItems--) {
// ... TBD by user
LCD_DATA_ADDRESS=*pData++;
static void LcdReadDataMultiple(U16 * pData, int NumItems) {
*pData = LCD_DATA_ADDRESS;
while (NumItems--) {
// ... TBD by user
*pData++=LCD_DATA_ADDRESS;
此时重要的函数来喽 void LCD_X_Config(void)Config.Orientation = GUI_SWAP_XY | GUI_MIRROR_Y;
这句是显示方向的,默认的是这个,弄好后,下进去板子,看是否正常显示,不正常显示可以试试修改这里哦。
GUIDRV_FlexColor_SetFunc(pDevice, &PortAPI,&GUIDRV_FLEXCOLOR_F66709,
GUIDRV_FLEXCOLOR_M16C0B16);
GUIDRV_FLEXCOLOR_F66709&这个东西很重要,移植的时候我就栽在这里啦,这是对控制芯
片的支持,具体请看最新手册 5.22 的( P991),也有中文的 5.12,不过 5.22 支持的很多。
最后就是 main 函数喽
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
GUI_Init();
GUI_DispString(&Hello STemWin!&);
记住这句一定要加上 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE);
demo,让 emWin 炫起来
1、加入demo文件
& 在main.c里加入头文件&guidemo.h&然后在主函数里加入&GUIDEMO_Main();&好,编译程序,下进去,就可以看到经典的开始画面了,但是没有动,右下角没有像别人的视频里的滚动!这是因为我们还没有启动
emWin 的心跳哦!
2、启动emWin心跳
&&在HARDWARE&里加入&gui_time.c&和&gui_time.h&文件,
具体源码见下图:
其实就是循环调用OS_TimeMS++;让
emWin 跳动起来。 别忘了,主函数要调用定时器的初始化哦! 我们再编译, 程序跑起, 哈哈, 是不是动了。但是我们只看到只有一个示例在循环显示。
OS_TimeMS在emWin的这里进行了调用:
3、打开多个demo示例开关&
& 打开&GUIDEMO.h&文件, 配置如下图,将后面括号里的“0”改为“1”即为打开此示例,记住后面每个项目的开关要关掉很多的,不然会有错误的。 我开了&8 个。
& &&编译后下载进去,就可以看到有8个画面在循环显示。
五、加入触摸屏
1、触摸驱动程序
& 这里借用正点原子的液晶屏驱动程序,复制原子的touch.c和touch.h文件到工程里(或直接使用原子例程里的 “触摸屏实验”)。
同时,记得在主函数里调用TP_Init();进行触摸屏初始化。&
2、修改程序,制作emWin与触摸屏的接口函数
& 由于我们用的&5.22&版本没有关于&touch的&C&文件,我便从&5.16&那儿拷过来了GUI_X_Touch_Analog.c,把这个文件加入到&StemWin5.22组里,
因为直接就用的原子的触摸了, 我们就直接调用&TP_Read_XY2(&x,&y);这个函数, 把他放进GUI_TOUCH_X_MeasureX(void)和&GUI_TOUCH_X_MeasureY(void)这两个函数里,
其实最后由这个函数&GUI_TOUCH_Exec()循环调用, 来一直读&AD&的值。
& &&如果完成第3步后,发现触摸屏方向不对,可以试着修改上面加入的TP_Read_XY2(&x,&y);里的&x和&y的位置。
把GUI_TOUCH_Exec();这个函数也要放进前一步建的
gui_time.c 文件里, 具体见下图:
3、通过示例确定校准值
& 这里的校准值就是取得 A/D 转换器的最小值和最大值。 emWin 需要用这些值来把测量结果转换为以像素表示的触摸位。这 4 个值为:
& emWin 的示例文件夹中有一个小程序,可用来获取触控面板的这些值。 该程序位于文
件夹 Sample\Tutorial 下,程序名称为 TOUCH_Sample.c。 在硬件上运行该示例显示效果如下图:
接下来我们在
LCDConf_FlexColor_Template.c 文件中加入上面提到的四个值
#define TOUCH_AD_TOP 221
#define TOUCH_AD_BOTTOM 3900
#define TOUCH_AD_LEFT 160
#define TOUCH_AD_RIGHT 3883
后面的数字只是临时写的, 然后我们再新建 gui_touch.c 文件, 这就是 TOUCH_Sample.c
文件的程序, 我们拷贝过来到 gui_touch.c 中, 如下图所示:
然后,main.c里程序如下图:
然后下载程序,
界面如下图:
这是确定左上角的值,记住
一定要触摸,蓝色的 X 就是 TOUCH_AD_LEFT 的值, Y 就是 TOUCH_AD_TOP 的值。
同理,拖动光标到右下角,蓝色&X
的值为 TOUCH_AD_RIGHT, Y值 为&TOUCH_AD_BOTTOM
。这 样,前 面 提 到 的 四 个 值 就 已 经 确 定 了,同 时 改 掉LCDConf_FlexColor_Template.c
里的那四个值。
4、在初始化程序LCD_X_Config
函数里调用 GUI_TOUCH_Calibrate 函数
如下图,加入下面两句程序:
&& && && && &&&GUI_TOUCH_Calibrate(GUI_COORD_X, 0, 240, TOUCH_AD_TOP, TOUCH_AD_BOTTOM);
& && && && && &&&GUI_TOUCH_Calibrate(GUI_COORD_Y, 0, 320, TOUCH_AD_LEFT, TOUCH_AD_RIGHT);& && &&&
至此,emWin加触摸屏的移植完成!
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?}

我要回帖

更多关于 触摸屏配方功能 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信