OpenEdv-开源电子网

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

stm32cubemx生成代码移植touch.c源码后读坐标太慢,画线也很慢

[复制链接]

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2019-3-28
在线时间
59 小时
发表于 2020-6-28 11:19:38 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 chenjian1419 于 2020-6-28 11:34 编辑

请教各位,平台:stm32f103zet6,我用stm32cubemx生成的代码,移植原子哥touch.c源码后,触摸屏读坐标和画点划线为什么速度很慢,划稍微快一点点就画不出来,不知道问题出在哪里了,有了解的大佬帮忙看看。

划线的图片

划线的图片

代码如下:

void rtp_test(void)
{
        u8 key;
        u8 i=0;          
        while(1)
        {
                 key=KEY_Scan(0);
                tp_dev.scan(0);                  
                if(tp_dev.sta&TP_PRES_DOWN)               
                {       
                         if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)
                        {       
                                if(tp_dev.x[0]>(lcddev.width-24)&&tp_dev.y[0]<16)Load_Drow_Dialog();
                                else TP_Draw_Big_Point(tp_dev.x[0],tp_dev.y[0],RED);                                                    
                        }
                }else delay_ms(10);          
                if(key==KEY0_PRES)       
                {
                        LCD_Clear(WHITE);
                    TP_Adjust();         
                        Load_Drow_Dialog();
                }
                i++;
                if(i%20==0)HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
        }
}

u8 TP_Scan(u8 tp)
{                           
        if(HAL_GPIO_ReadPin(GPIOF,PEN_Pin)==GPIO_PIN_RESET)
        {
                if(tp)TP_Read_XY2(&tp_dev.x[0],&tp_dev.y[0]);
                else if(TP_Read_XY2(&tp_dev.x[0],&tp_dev.y[0]))
                {
                         tp_dev.x[0]=tp_dev.xfac*tp_dev.x[0]+tp_dev.xoff;
                        tp_dev.y[0]=tp_dev.yfac*tp_dev.y[0]+tp_dev.yoff;  
                 }
                if((tp_dev.sta&TP_PRES_DOWN)==0)
                {        
                        tp_dev.sta=TP_PRES_DOWN|TP_CATH_PRES;
                        tp_dev.x[4]=tp_dev.x[0];
                        tp_dev.y[4]=tp_dev.y[0];                                      
                }        

        }else
        {
                if(tp_dev.sta&TP_PRES_DOWN)
                {
                        tp_dev.sta&=~(1<<7);
                }else
                {
                        tp_dev.x[4]=0;
                        tp_dev.y[4]=0;
                        tp_dev.x[0]=0xffff;
                        tp_dev.y[0]=0xffff;
                }            
        }

        return tp_dev.sta&TP_PRES_DOWN;
}        



u8 TP_Read_XY2(u16 *x,u16 *y)
{
               
        u16 x1,y1;
         u16 x2,y2;
         u8 flag;   
    flag=TP_Read_XY(&x1,&y1);   
    if(flag==0)return(0);
    flag=TP_Read_XY(&x2,&y2);           
    if(flag==0)return(0);         
    if(((x2<=x1&&x1<x2+ERR_RANGE)||(x1<=x2&&x2<x1+ERR_RANGE))
    &&((y2<=y1&&y1<y2+ERR_RANGE)||(y1<=y2&&y2<y1+ERR_RANGE)))
    {
        *x=(x1+x2)/2;
        *y=(y1+y2)/2;
        return 1;
    }else return 0;         
}


u8 TP_Read_XY(u16 *x,u16 *y)
{
        u16 xtemp,ytemp;                                                   
        xtemp=TP_Read_XOY(CMD_RDX);
        ytemp=TP_Read_XOY(CMD_RDY);                                                                                                            
        //if(xtemp<100||ytemp<100)return 0;
        
        *x=xtemp;
        *y=ytemp;
        return 1;
}


u16 TP_Read_XOY(u8 xy)
{
        u16 i, j;
        u16 buf[READ_TIMES];
        u16 sum=0;
        u16 temp;
        for(i=0;i<READ_TIMES;i++)buf=TP_Read_AD(xy);        
        for(i=0;i<READ_TIMES-1; i++)
        {
                for(j=i+1;j<READ_TIMES;j++)
                {
                        if(buf>buf[j])
                        {
                                temp=buf;
                                buf=buf[j];
                                buf[j]=temp;
                        }
                }
        }         
        sum=0;
        for(i=LOST_VAL;i<READ_TIMES-LOST_VAL;i++)sum+=buf;
        temp=sum/(READ_TIMES-2*LOST_VAL);
        return temp;   
}


u16 TP_Read_AD(u8 CMD)         
{         
        u8 count=0;           
        u16 Num=0;
  HAL_GPIO_WritePin(GPIOF, TCS_Pin, GPIO_PIN_RESET);                        
        HAL_GPIO_WritePin(GPIOB, TCLK_Pin, GPIO_PIN_RESET);                  
        HAL_GPIO_WritePin(GPIOF, TDIN_Pin, GPIO_PIN_RESET);         
        TP_Write_Byte(CMD);
        HAL_delay_us(6);
        HAL_GPIO_WritePin(GPIOB, TCLK_Pin, GPIO_PIN_RESET);                          
        HAL_delay_us(1);               
        HAL_GPIO_WritePin(GPIOB, TCLK_Pin, GPIO_PIN_SET);         
        HAL_delay_us(1);   
        HAL_GPIO_WritePin(GPIOB, TCLK_Pin, GPIO_PIN_RESET);                        
        for(count=0;count<16;count++)
        {                                   
                Num<<=1;         
                HAL_GPIO_WritePin(GPIOB, TCLK_Pin, GPIO_PIN_RESET);                              
                HAL_delay_us(1);   
                 HAL_GPIO_WritePin(GPIOB, TCLK_Pin, GPIO_PIN_SET);
                 if(HAL_GPIO_ReadPin(GPIOB ,DOUT_Pin))Num++;         
               
        }         
        Num>>=4;  
        HAL_GPIO_WritePin(GPIOF, TCS_Pin, GPIO_PIN_SET);
        return(Num);   
}



void TP_Write_Byte(u8 num)   
{  
        u8 count=0;  
        for(count=0;count<8;count++)  
        {           
                if(num&0x80)HAL_GPIO_WritePin(GPIOF, TDIN_Pin, GPIO_PIN_SET);  
                else HAL_GPIO_WritePin(GPIOF, TDIN_Pin, GPIO_PIN_RESET);   
                num<<=1;   
                HAL_GPIO_WritePin(GPIOB, TCLK_Pin, GPIO_PIN_RESET);
                HAL_delay_us(1);
                HAL_GPIO_WritePin(GPIOB, TCLK_Pin, GPIO_PIN_SET);        

        }                                             
}

最佳答案

查看完整内容[请看2#楼]

已经解决了,谢谢!要把写数据函数和读AD数据里面的延时全部去掉,标准库和HAL库用的指令延时不一样吧!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2019-3-28
在线时间
59 小时
 楼主| 发表于 2020-6-28 11:19:39 | 显示全部楼层
三叶草 发表于 2020-6-28 14:01
刷新速率和AD转化速度太慢吧

已经解决了,谢谢!要把写数据函数和读AD数据里面的延时全部去掉,标准库和HAL库用的指令延时不一样吧!
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-6-28 14:01:09 | 显示全部楼层
刷新速率和AD转化速度太慢吧
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-6-29 07:23:37 | 显示全部楼层
chenjian1419 发表于 2020-6-28 11:19
已经解决了,谢谢!要把写数据函数和读AD数据里面的延时全部去掉,标准库和HAL库用的指令延时不一样吧!

延时最好最好自己写,用示波器看这样准,而且延时函数和你设置的主频有关系
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-17 18:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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