STM32智能手写板.docx

上传人:wj 文档编号:8776099 上传时间:2023-05-14 格式:DOCX 页数:21 大小:852.18KB
下载 相关 举报
STM32智能手写板.docx_第1页
第1页 / 共21页
STM32智能手写板.docx_第2页
第2页 / 共21页
STM32智能手写板.docx_第3页
第3页 / 共21页
STM32智能手写板.docx_第4页
第4页 / 共21页
STM32智能手写板.docx_第5页
第5页 / 共21页
STM32智能手写板.docx_第6页
第6页 / 共21页
STM32智能手写板.docx_第7页
第7页 / 共21页
STM32智能手写板.docx_第8页
第8页 / 共21页
STM32智能手写板.docx_第9页
第9页 / 共21页
STM32智能手写板.docx_第10页
第10页 / 共21页
STM32智能手写板.docx_第11页
第11页 / 共21页
STM32智能手写板.docx_第12页
第12页 / 共21页
STM32智能手写板.docx_第13页
第13页 / 共21页
STM32智能手写板.docx_第14页
第14页 / 共21页
STM32智能手写板.docx_第15页
第15页 / 共21页
STM32智能手写板.docx_第16页
第16页 / 共21页
STM32智能手写板.docx_第17页
第17页 / 共21页
STM32智能手写板.docx_第18页
第18页 / 共21页
STM32智能手写板.docx_第19页
第19页 / 共21页
STM32智能手写板.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

STM32智能手写板.docx

《STM32智能手写板.docx》由会员分享,可在线阅读,更多相关《STM32智能手写板.docx(21页珍藏版)》请在冰点文库上搜索。

STM32智能手写板.docx

重庆大学电子技能竞赛STM32手写板

STM32手写板设计

技术报告

参赛队员:

钟培文周倍同田其生

重庆大学电子技能竞赛

2014年5月20日

摘要

本文介绍了本小组在设计J题“STM32手写板”中的过程和成果。

主控芯片为STM32VET6,开发平台为Keil5.0,采用触摸屏进行输入,使用萨瑞R61509控制的3寸LCD屏幕进行显示,将手写板的分辨率提升到了160*160。

本文主要介绍了系统的软件设计流程和内容,涵盖了触摸输入和图像处理两大方面。

我们采用了Emwin5.24界面系统进行用户界面设计,采用了UCOS嵌入式实时操作系统进行系统任务设计,采用了边沿提取算法识别图像。

实现了点亮,画亮,反显,连写多字,对象拖移,笔画擦出,清屏等功能,以及修改画笔颜色和画笔宽度,还可能实现手动或者自动调节屏幕背光,以及自动关屏等功能。

目录

第一章引言 3

1.1设计思路及方案的总体说明 3

1.2章节介绍 3

第二章硬件系统 4

2.1主控芯片 4

2.2触摸屏 4

2.3三寸TFT液晶显示器 4

2.4外部光强检测电路 5

2.5完整电路图 5

三章软件系统 7

3.1Emwin图像界面库介绍 7

3.2UCOSII系统介绍 7

3.3系统功能框图 7

3.4系统工作流程 8

3.5主界面 8

3.6图像保存和各功能实现方案 9

3.6.1图像的获得和保存 9

3.6.2手写绘图 9

3.6.3笔画擦除和全屏擦除功能 9

3.6.4反显功能 10

3.6.5连写多字功能 10

3.6.6对象拖移功能 10

3.7画笔设置 11

3.8系统设置 11

3.9背光设置功能 11

3.10屏幕超时功能 11

第四章系统开发调试过程和测试数据 12

4.1调试开发 12

4.2测试数据 12

第五章部分重要源码 13

5.1建立其余任务的函数 13

5.2检测触摸并画点的函数 14

5.3创立界面的函数 16

5.4对象拖移边缘识别函数……………………………………………………………………………………………….17

第六章比赛总结 20

第一章引言

1.1设计思路及方案的总体说明

考虑到美观性和实用性,我们使用了3寸LCD液晶显示器替代了LED点阵,将手写框的分辨率提高到了160*160个点,不仅更美观,同时还可以对画笔的颜色和粗细进行更改,当然在提高分辨率的同时也极大的增加了系统负载的强度和图像处理的难度,特别是反映在RAM内存占用方面。

我们自己移植了新版本的Emwin5.24,并加入了UCOSII实时操作系统进行任务管理,通过UCOS的内部通讯机制传递触摸消息和其他硬件信息,使用Emwin的消息响应机制处理图像,整个系统整洁而有序。

同时采用光敏电阻采集外部光强,按键操作实现关屏和开屏。

系统框图如下图1.1

图1.1

1.2章节介绍

第一章引言:

介绍了系统总体概况

第二章硬件系统:

介绍了硬件系统概况,包括芯片选用和各种接口

第三章软件系统:

介绍了整个软件系统,是最为核心的部分

第四章开发调试过程及测量数据:

介绍了手写板的开发调试过程和电压电流测试数据等

第五章总结:

总结整个设计的过程以及参赛感悟

第二章硬件系统

2.1主控芯片

使用了ST公司的STM32VET6芯片,具有64KRAM以及512k的FLASH,片上外设非常丰富,由于此芯片使用非常广泛,不作更多介绍。

2.2触摸屏

触摸屏采用了4线电阻式触摸屏,触摸芯片采用的是使用较多的XPT2046。

XPT2046是一款4线制触摸屏控制器,内含12位辨率125KHz转换速率逐步逼近型A/D转换器。

XPT2046支持从1.5V到5.25V的低电压I/O接口。

XPT2046能通过执行两次A/D转换查出被按的屏幕位置,除此之外,还可以测量加在触摸屏上的压力。

内部自带2.5V参考电压可以作为辅助输入、温度测量和电池监测模式之用,电池监测的电压范围可以从0V到6V。

XPT2046片内集成有一个温度传感器。

在2.7V的典型工作状态下,关闭参考电压,功耗可小于0.75mW。

2.3三寸TFT液晶显示器

显示器采用了400*240分辨率的3寸TFT液晶显示器,采用萨瑞公司的RT61509显示驱动器。

为了达到显示效率和色彩的平衡,显示器采用16位64K色显示模式,如下图2.1。

在这个模式每个像素用5位红色6位绿色5位蓝色总共16位来表示,根据分辨率,一帧图像占用400*240*2=192000字节。

图2.1

显示器采用的是I8080时序,我们使用了STM32的FSMC接口模拟了8080时序对显示器进行控制,刷新频率可以达到50HZ。

2.4外部光强检测电路

采用了简单的ADC采集光敏电阻电压来获得外部光强,通过外部光强的变化来控制显示器背光亮度,达到节能的功能。

其电路如下图2.2

图2.2

2.5完整电路图

电源部分:

最小系统:

各种接口:

三章软件系统

3.1Emwin图像界面库介绍

emWin(embedwin的缩写)是Segger公司针对嵌入式平台开发的图形软件库,通过调用emWin提供的函数接口,开发嵌入式图形界面应用变得简单而快捷。

图形软件库就是一些与图形界面相关的函数,它提供接口给用户调用。

用户只需要调用相应的函数,就可以轻松的做出各种各样的图形图案而不用考虑相应的算法了。

主要功能有:

绘制2-D图形、显示位图文件、显示文字、处理用户输入、提供各种窗口对象。

emWin的这些功能就是为了解决人机交互应用的设计难题,并且相对来说对ROM和RAM的消耗相对来说并不高,又因为emWin可以在多任务系统及裸机的平台上运行,尤其适合嵌入式乱七八糟的开发要求,使得emWin在嵌入式人机交互场合中大放异彩。

3.2UCOSII系统介绍

uC/OSII(MicroControlOperationSystemTwo)是一个可以基于ROM运行的、可裁减的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器。

uC/OSII最大程度上使用ANSIC语言进行开发,可以简单的视为一个多任务调度器,在这个任务调度器之上完善并添加了和多任务操作系统相关的系统服务。

其主要特点有公开源代码,代码结构清晰、明了,注释详尽,组织有条理,可移植性好,可裁剪,可固化。

3.3系统功能框图

初始化

笔画擦除

全屏擦除

反显

屏幕超时

设置

功能选择

对象拖移

连写多字

画笔宽度

画笔颜色

背光设置

手写画图

获取触摸消息

3.4系统工作流程

l首先硬件初始化后,UCOS系统启动,先建立了各种任务

l然后在系统的任务调度下就一直循环运行任务,当有触摸消息时,先判断是在按下了功能选择按钮还是在手写区画下,如果是功能选择就执行相应的功能切换,如果是在手写区画下就在屏幕对应位置点亮屏幕画下一个点。

3.5主界面

利用Emwin提供的各种控件,我们可以轻松的开发出各种美观的界面,同时新版本还支持皮肤的切换,可以画出WIN7风格的皮肤。

我们使用将主界面分为功能区和手写区,功能区是各种功能按钮,手写区为160*160像素的方框,如下图3.1。

图3.1主界面

3.6图像保存和各功能实现方案

3.6.1图像的获得和保存

触摸任务以3ms的任务周期不断循环运行,由于触摸对时间要求很短,而其余消息处理时间可能过长,UCOS系统心跳周期为1ms,为了防止在处理消息速度太慢而丢失掉触摸消息,我们采用了UCOS的消息队列机制。

其相当于开辟了一个触摸缓存,可以完整的把触摸消息发送到处理函数,同时加快了手写响应。

开辟了一个保存手写区图像的160*160数组刚好和坐标线性对应,当获得到手写消息后先将数组中对应位置的值置1,表示此处被正常画下。

同时在实现其他功能时将图像转换为数组来处理,非常的直观。

3.6.2手写绘图

当获得到手写消息后,先将对应位置数组置1,然后调用Emwin图形库的函数进行绘图。

我们对画笔定义了一个结构体:

struct{

unsignedshortWith;

GUI_COLORColor;

GUI_COLORBkColor;

}MYLINE;

With表示画笔的宽度,Color表示手写区的前景色,BkColor表示手写区的背景色。

当需要绘图时根据画笔的结构体,先根据画笔前景色设置画笔颜色,在调用

GUI_FillCircle(x,y,MYLINE.With),这是Emwin提供的圆圈填充函数,这里根据我们设置的画笔宽度自动计算然后以画笔宽度为半径画一个圆点,即实现了点亮功能。

3.6.3笔画擦除和全屏擦除功能

由于我们使用了一个和图像对应的160*160的数组记录图像信息,我们可以很方便的对图像进行控制。

当开启笔画擦除功能时,我们在获得触摸消息后不是把对应位置数组置1,而是相反把它置0,同理在全屏擦除功能时我们直接把整个数组置0.由于Emwin会不断检测显示内容是不是发生了变化,当发生了变化之后会自动重绘,于是我们在重绘的时候根据位置数组的值来绘制手写区,如果是1就先设置前景色,在以画笔宽度填充一个原点,如果数组置为0,则以背景色填充一个像素点。

即实现了擦除功能。

3.6.4反显功能

由于我们使用了一个用来表示画笔属性的结构体,我们可以很方便的改变画笔属性和改变图像内容。

当开启了反显功能后,我们就交换画笔的前景色和背景色属性,然后根据位置数组用交换后前景色和背景色重绘手写框。

其实就是相当于交换了图像划线的颜色和背景颜色,即实现了反显功能。

下图是正常和反显后的主界面,如图3.2和3.3

图3.2(正常) 图3.3(反显)

3.6.5连写多字功能

在连写多字功能下,我们写完一个字后在按一下功能按钮就可以将图像保存下来,当保存了4张图像后在间隔1s重现保存的4张图像。

在整个系统的内配方面,由于Emwin占了接近全部内存的一半,而且图像位置数组也占用了相当大一部分内存,这里我们并没有将图像保存在内存中,而是将图像保存到了FLASH里面,在优化了源程序后,FLASH空间剩余200kb以上,完全足够。

为了保证写FLASH速度,我们采用了动态数组,然后对位置数组进行扫描,将已经画下的有效位置坐标保存到FLASH。

3.6.6对象拖移功能

当功能开启时我们首先在手写区画一个圆圈将需要拖移的对象圈起来,然后在选定要拖移的位置,拖移后选中的图像将会被拖移到相应位置。

对象拖移功能在我们的系统中是最为复杂的一个功能,因为首先要识别出用户画出的圆圈,而且画出的圆圈可能是不规则的,并且由于触摸读取的原因,圆圈还可能不是连续的,加大了识别的难度。

在开启功能后当用户画圈时我们并不是把位置数组置1,而是把它置为了2,表示这是识别圈,在拖移完成后图像重绘时会自动消失。

为了完整的识别出画下的圆圈,我们采用了在智能车系统中使用的边缘跟踪算法,在图像的开头先分别从左右两边逐行扫描每行中为2的坐标,当左右同时扫描到2时,先保存这一坐标然后以这一点为基准开始分别从圆圈的左右线往下跟踪。

具体方式是在前一行找到2时,在这一点的左右8个点内搜索下一行为2的坐标,如果下一行依然没有找到,我们便用上一行的坐标替代未找到的坐标进行补线。

经过调整搜线半径后测试拖移程序,效果很不错。

3.7画笔设置

画笔设置界面如下图3.4

可以以RGB形式自定义画笔颜色,画笔大小可以设置为1到5,意思是以1至5为半径画圆填充。

图3.4

3.8系统设置

系统设置如图3.5

系统设置包括手动/自动背光,模式切换,以及屏幕超时设定。

图3.5

3.9背光设置功能

在手动背光模式下将以滑块设置的参数来调节背光亮度,而在自动模式下,将通过ADC采集的值来自动控制背光。

3.10屏幕超时功能

屏幕超时的任务在运行时会一直按秒计数,当有触摸消息输入时将计数置为设定值,当无触摸消息是计数减一,当减为0时说明长时间没有触摸便进入到低功耗模式。

这里我们使用了STM32的STOP模式,通过优化IO口设置后电流低至5ma以下,完全符合要求。

第四章系统开发调试过程和测试数据

4.1调试开发

我们在调试的过程中采用了Keil来进行软件开发和编译,同时使用了UCGUIbuilder来进行辅助界面设计。

UCGUIbuilder是方便快捷的可视化Emwin编辑工具,能快速的制作简单的界面。

我们还使用了Micrium_uCGUI-Trial-V524,其为Emwin5.24的电脑仿真版本,在VC环境下能模拟仿真出设计的Emwin界面,十分的方便,如下图3.6

图3.6(仿真界面)

4.2测试数据

正常工作是电流:

122.7mA

低功耗模式下电流:

2.2mA

第五章部分重要源码

5.1建立其余任务的函数

staticvoidApp_TaskCreate(void)

{

NMEA_MBOX=OSSemCreate(0); //建立NMEA指令解析的信号量

SSLEEP=OSQCreate(&Msgsleep[0],2);

Touch_Q=OSQCreate(&MsgGrp[0],N_MESSAGES); //创建消息队列

/*建立用户界面任务*/

OSTaskCreateExt(AppTaskUserIF,

(void*)0,

(OS_STK*)&AppTaskUserIFStk[APP_TASK_USER_IF_STK_SIZE-1],

APP_TASK_USER_IF_PRIO,

APP_TASK_USER_IF_PRIO,

(OS_STK*)&AppTaskUserIFStk[0],

APP_TASK_USER_IF_STK_SIZE,

(void*)0, OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);

/*建立触摸驱动任务*/

OSTaskCreateExt(AppTaskKbd,

(void*)0,

(OS_STK*)&AppTaskKbdStk[APP_TASK_KBD_STK_SIZE-1],

APP_TASK_KBD_PRIO,

APP_TASK_KBD_PRIO,

(OS_STK*)&AppTaskKbdStk[0],

APP_TASK_KBD_STK_SIZE,

(void*)0,

OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);

/*建立睡眠任务*/

OSTaskCreateExt(APPTask_SLEEP,

(void*)0,

(OS_STK*)&Task_SLEEPStk[APP_TASK_SLEEP_STK_SIZE-1],

APP_TASK_SLEEP_PRIO,

APP_TASK_SLEEP_PRIO,

(OS_STK*)&Task_SLEEPStk[0],

APP_TASK_SLEEP_STK_SIZE,

(void*)0,

OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);

}

5.2检测触摸并画点的函数

voidSend_Paint(GUI_PID_STATEState,U8t){

inti,j;

intdx,dy;

if(Stateflag)

{

WM_SelectWindow(hwin3);

GUI_SetColor(MYLINE.Color);

if(drag==1){

if(GUI_TOUCH_GetState(&State))

{

if(State.x>209&&State.x<371&&State.y>59&&State.y<221)

{

buff[State.x-210][State.y-60]=2;

while(GUI_TOUCH_GetState(&State))

{

if(State.x>209&&State.x<371&&State.y>59&&State.y<221){

buff[State.x-210][State.y-60]=2;

GUI_SetColor(GUI_RED);

GUI_DrawPixel(State.x-190,State.y-40);

}

}

drag=2;

}

}

}

elseif(drag==2){

if(GUI_TOUCH_GetState(&State))

{

Stateflag=0;

if(State.x>209&&State.x<371&&State.y>59&&State.y<221)

{

i=State.x;

j=State.y;

while(GUI_TOUCH_GetState(&State))

{

if(State.x>209&&State.x<371&&State.y>59&&State.y<221){

dx=State.x-i;

dy=State.y-j;

}

}

replace(dx,dy);

drag=0;

BUTTON_SetTextColor(WM_GetDialogItem(hwin,GUI_ID_BUTTON2),BUTTON_CI_UNPRESSED,0xff901e);

WM_InvalidateWindow(hwin);

}

Stateflag=1;

}

}

elseif(drag==0){

if(State.x>209&&State.x<371&&State.y>59&&State.y<221){

if(erasure)

{

buff[State.x-210][State.y-60]=0;

for(j=State.y-62-MYLINE.With>=0?

State.y-62-MYLINE.With:

0;j<=(State.y-58+MYLINE.With<161?

State.y-58+MYLINE.With:

160);j++)

for(i=State.x-212-MYLINE.With>=0?

State.x-212-MYLINE.With:

0;i<=(State.x-208+MYLINE.With<161?

State.x-208+MYLINE.With:

160);i++)

buff[i][j]=0;

GUI_FillRect(State.x-190-MYLINE.With,State.y-40-MYLINE.With,State.x-190+MYLINE.With,State.y-40+MYLINE.With);

}

else

{

buff[State.x-210][State.y-60]=1;

GUI_FillCircle(State.x-190,State.y-40,MYLINE.With);

WM_SelectWindow(hwin2);

GUI_SetColor(GUI_RED);

GUI_DispStringAt("x:

",8,5);

GUI_DispDec(State.x-209,4);

GUI_DispString(",y:

");

GUI_DispDec(State.y-59,4);

}

}

}

}

}

5.3创立界面的函数

voidCreate_base(WM_MESSAGE*pMsg)

{

WM_HWINhWin=pMsg->hWin;

GUI_EndDialog(hWin,0);

WM_DeleteWindow(hwin2);

WM_DeleteWindow(hwin3);

Create_start();

}

voidCreate_set(WM_MESSAGE*pMsg)

{

WM_HWINhWin=pMsg->hWin;

Stateflag=0;

GUI_EndDialog(h

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 韩语学习

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2