关于原子电阻触屏数据的保存优化

2019-07-20 18:51发布

  电阻触屏在使用时需要校准,一般情况下会在第一次校准的时候保存下校准数据,下次开机时直接读取数据,就不用再次校准了。
  原子的触屏参数分别为:float xfac,float yfac,short xoff,short yoff,校准后保存数据时,先将参数乘以10000,再强行转成int型数据,然后保存到FLASH上,以这种方式保存数据会损失一定精度,但看效果,完成不影响使用。
  但对于有强迫症的人,肯定想保存原始数据,因此就有了触屏数据的保存优化了,具体优化如下:


首先,在touch.h文件定义数据结构:
[mw_shl_code=applescript,true]//′¥ÃtÆá¿ØÖÆÆ÷
typedef struct
{
    float xfac;                                       
        float yfac;
        short xoff;
        short yoff;          
    u8 Flag;                        //3õê¼»ˉ′¥ÃtÆá¿ØÖÆÆ÷
    u8 touchtype;
}tp_val;


typedef union{
    u32 databuf[4];
    tp_val Touch_Val;
}TOUCH_VAL;
[/mw_shl_code]

在touch.c文件定义变量 :TOUCH_VAL touchval;
数据保存函数,一次性保存,不再一个一个参数保存:
[mw_shl_code=applescript,true]//±£′æD£×¼2Îêy                                                                                    
void TP_Save_Adjdata(void)
{
    //±£′æD£Õy½á1û!                                                                             
    touchval.Touch_Val.xfac = tp_dev.xfac;   
    touchval.Touch_Val.yfac = tp_dev.yfac;
    touchval.Touch_Val.xoff = tp_dev.xoff;                    
        touchval.Touch_Val.yoff = tp_dev.yoff;
        touchval.Touch_Val.touchtype = tp_dev.touchtype;       
        touchval.Touch_Val.Flag = ADJFlag;
   
    STMFLASH_Write(TOUCH_ADD,touchval.databuf,sizeof(touchval)/4);
}
[/mw_shl_code]


关于STMFLASH_Write的说明:由于LZ在F429I-DIS开发板上测试,所以没有外挂EEPROM,将数据保存在stm自身flash上,TOUCH_ADD为数据的首地址,文件前面定义:
#define TOUCH_ADD       0x800C000
使用EEPROM的可以视情况修改。

下面是读取参数函数
[mw_shl_code=applescript,true]u8 TP_Get_Adjdata(void)
{                                          
    STMFLASH_Read(TOUCH_ADD,touchval.databuf,sizeof(touchval)/4);
        if(ADJFlag == touchval.Touch_Val.Flag)           //′¥ÃtÆáòѾ-D£×¼1yáË                          
        {                                                                                                     
                tp_dev.xfac = touchval.Touch_Val.xfac;;//μÃμ½xD£×¼2Îêy
                tp_dev.yfac = touchval.Touch_Val.yfac;;//μÃμ½yD£×¼2Îêy
                tp_dev.xoff = touchval.Touch_Val.xoff;        //μÃμ½xÆ«òÆá¿                             
                tp_dev.yoff = touchval.Touch_Val.yoff;        //μÃμ½yÆ«òÆá¿                                   
                tp_dev.touchtype = touchval.Touch_Val.touchtype;//¶áè¡′¥ÆáààDí±ê¼Ç
                if(tp_dev.touchtype)//X,Y·½ÏòóëÆáÄ»Ïà·′
                {
                        CMD_RDX=0X90;
                        CMD_RDY=0XD0;         
                }else                                   //X,Y·½ÏòóëÆáÄ»Ïàí¬
                {
                        CMD_RDX=0XD0;
                        CMD_RDY=0X90;         
                }                 
                return 1;         
        }
        return 0;
}         [/mw_shl_code]




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。