OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5497|回复: 16

搞了2天,有点头大了,求助。。。

[复制链接]

5

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2014-7-2
在线时间
17 小时
发表于 2014-8-31 11:46:22 | 显示全部楼层 |阅读模式
5金钱
触摸屏校准好了,可以使用了,想保存一下校准数据,数据也写入内部FLASH了,也能读出来了。问题也来了:读出的数据就是不对,触摸屏就是不能使用,除非再次校准,应该数据保存的时候出问题了,以下是这部分的代码,请高人帮我看一下,问题到底出在哪呀?我都要哭了。

struct
{
  uint8_t CMD_RDX; //
uint8_t CMD_RDY; //
  int16_t xoff; //
int16_t yoff; //
float xfactor; //
float yfactor; //

}Touchconfig; //结构变量保存的是触摸屏的参数

union myfloat //
{
uint16_t u[2];
float f;
};
union myint //两个联合体用来做数据变换
{
uint16_t u;
int16_t  s;
};

union myfloat   xfac,yfac; //联合变量定义
union myint     xoff,yoff;
////////////////////////////////////////////////

......省略校准部分

xoff.s = Touchconfig.xoff;
yoff.s = Touchconfig.yoff;
xfac.f = Touchconfig.xfactor; //有符号数据复制到联合变量
yfac.f = Touchconfig.yfactor;

touch_save[0] =  Touchconfig.CMD_RDX; //联合无符号数据复制到无符号数组
touch_save[1] =  Touchconfig.CMD_RDY;
touch_save[2] =  xoff.u;
touch_save[3] =  yoff.u;
touch_save[4] =  xfac.u[0];
touch_save[5] =  xfac.u[1];
touch_save[6] =  yfac.u[0];
touch_save[7] =  yfac.u[1];

STMFLASH_Write(0,touch_save,8);//数据写入FLASH
////////////////////////////////////////////////////////////////////////////////

void Touch_Init(void)
{
uint16_t touch_save[8];
union myint   xoff,yoff;
union myfloat xfac,yfac;

/*********初始化ADS7843*********/
TPCLK_CLR;
TPCS_SET;
TPDI_SET;
TPCLK_SET;
TPCS_CLR;
 
STMFLASH_EEPROM_Read(0,touch_save,8);//从FLASH读取数据
if((touch_save[0] == 0x00D0)||(touch_save[0] == 0x0090))//如果读取到这两个数据表示已经校准过触摸屏
{
Touchconfig.CMD_RDX = (uint8_t)(touch_save[0]<<8);
  Touchconfig.CMD_RDY = (uint8_t)(touch_save[1]<<8);
xoff.u   = touch_save[2];//数组数据复制给联合无符号数据
yoff.u   = touch_save[3];
xfac.u[0]= touch_save[4];
xfac.u[1]= touch_save[5];
yfac.u[0]= touch_save[6];
yfac.u[1]= touch_save[7];

Touchconfig.xoff = xoff.s;//联合有符号数据复制到结构体
Touchconfig.yoff = yoff.s;
Touchconfig.xfactor = xfac.f;
Touchconfig.yfactor = yfac.f; 
//     Touchconfig.xfactor = (((u32)touch_save[4])<<16) + touch_save[5];
//     Touchconfig.yfactor = (((u32)touch_save[6])<<16) + touch_save[7];
}
else  touch_adj();//需要重新校准触摸屏
CLR_Screen(Blue); //清屏,退出触摸初始化

}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2014-7-2
在线时间
17 小时
 楼主| 发表于 2014-8-31 15:48:04 | 显示全部楼层
没人理我?自己顶一个
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-8-31 17:18:30 | 显示全部楼层
STMFLASH_Write,地址是0开始的???
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2014-7-2
在线时间
17 小时
 楼主| 发表于 2014-8-31 23:19:17 | 显示全部楼层
这个凼数我作了一点小改动,这个0地址其实是页地让后面的第四个字节
回复

使用道具 举报

5

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2014-7-2
在线时间
17 小时
 楼主| 发表于 2014-8-31 23:22:52 | 显示全部楼层
久地址后面的第五个字节,前面四个字节我他留出来了,我感觉这样调用函数比故方,地不密易出错
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-1 00:37:37 | 显示全部楼层
回复【5楼】dengzhengbing:
---------------------------------
先测试这个函数的正确性。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2014-7-2
在线时间
17 小时
 楼主| 发表于 2014-9-1 08:28:40 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
这个函数应该是正确的:
if((touch_save[0] == 0x00D0)||(touch_save[0] == 0x0090)){...}已经正确运行了,
就是说能够从FLASH中读出touch_save[0]

重启后能能够执行下面这句:

CLR_Screen(Blue);  //清屏,退出触摸初始化
回复

使用道具 举报

5

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2014-7-2
在线时间
17 小时
 楼主| 发表于 2014-9-1 08:49:55 | 显示全部楼层
而且,从串口返回的数据也能证实这一点,读出数据后从串口返回数据是:ff ff ff ff 0090 00d0 014c fff5 aafd bdb3 f1ba 3d84,
红色的数据从两次校准的结果比较有很大的差异,蓝色的数据从两次校准的结果差别不大倒是可以理解,我认为这两个数据恰恰是包含浮点数的最要紧的部分,从而产生错误,导致读出的数据不能使用
另外,我也分析过您的程序,将这两个浮点数乘了很大的倍数再保存,我试过也不行
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-1 23:14:22 | 显示全部楼层
回复【8楼】dengzhengbing:
---------------------------------
试试保存一个数组。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

5

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2014-7-2
在线时间
17 小时
 楼主| 发表于 2014-9-2 10:43:06 | 显示全部楼层
STMFLASH_Write(0,touch_save,8);//数据写入FLASH
 
touch_saved定义: uint16_t  touch_save[8];
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-9-2 12:20:43 | 显示全部楼层
回复【10楼】dengzhengbing:
---------------------------------
这里要是16才对吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

13

主题

185

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
金钱
272
注册时间
2014-4-9
在线时间
9 小时
发表于 2014-9-2 19:20:22 | 显示全部楼层
你保存的长度对吗?不要着自己数字节数,你想保存那个结构体就用sizeof(xxx)
大海啊,全是水; 骏马啊,四条腿。
回复

使用道具 举报

5

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2014-7-2
在线时间
17 小时
 楼主| 发表于 2014-9-3 10:10:45 | 显示全部楼层
16个字节,8个半字,应该没错呀,用sizeof(xxx)我想是不对的,这样就变成16字节了,但是我保存的是半字,应该按半字长计算呀

这两函数都是按半字计算的
void STMFLASH_EEPROM_Read(u16 ReadAddr,u16 *pBuffer,u16 NumToRead){;}

void STMFLASH_Write(u16 WriteAddr,u16 *pBuffer,u16 NumToWrite){;}
回复

使用道具 举报

13

主题

185

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
金钱
272
注册时间
2014-4-9
在线时间
9 小时
发表于 2014-9-3 16:38:04 | 显示全部楼层
如果前面对后面不对多半是保存长度不对,半字算可以用(sizeof(xxx)+1)/2;你可以先把把touchsave定义为全局变量仿真看变化情况;
还有如果这个结构体一定要保存的你可以给它分配一个固定flash地址,读取的时候可以用memcpy()函数操作,这样就不用什么定义变量转换联合体。
大海啊,全是水; 骏马啊,四条腿。
回复

使用道具 举报

13

主题

185

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
金钱
272
注册时间
2014-4-9
在线时间
9 小时
发表于 2014-9-3 16:39:29 | 显示全部楼层
还有如果你想原子版主这个大神回复你的问题你在回复的时候要点“回复”按钮,要不他不知道你继续提问题的。
大海啊,全是水; 骏马啊,四条腿。
回复

使用道具 举报

5

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2014-7-2
在线时间
17 小时
 楼主| 发表于 2014-9-5 12:31:03 | 显示全部楼层
数据写进去后读出来就不能触摸了,奇了怪了
回复

使用道具 举报

5

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2014-7-2
在线时间
17 小时
 楼主| 发表于 2014-9-5 12:31:24 | 显示全部楼层
数据写进去后读出来就不能触摸了,奇了怪了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-2 03:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表