本人由于用的是原子哥的延时函数,单任务单片机中跑ucGUI。
从上面的问题来看,加上GUI_TOUCH_Exec()这个,延时出现问题,而原子哥的延时是用系统脉搏(SysTick)的,那么可以
肯定GUI_TOUCH_Exec()中有子函数改变了SysTick->LOAD的值,所以查找GUI_TOUCH_Exec();仔细看ucGUI的源码,
发现GUI_TOUCH_Exec()部分是没有延时的。那么可以肯定,问题出现在我们的触摸接口函数中GUI_TOUCH_X_MeasureY(void);
和GUI_TOUCH_X_MeasureX(void)函数。一级一级往下找发现:
========================================================
u16 TP_Read_AD(u8 CMD)
{
u8 count=0;
u16 Num=0;
TCLK=0; //先拉低时钟
TDIN=0; //拉低数据线
TCS=0; //选中触摸屏IC
TP_Write_Byte(CMD);//发送命令字
delay_us(6); //ADS7846的转换时间最长为6us ///////////此处改变了SysTick->LOAD的值
TCLK=0;
delay_us(1); ///////////此处改变了SysTick->LOAD的值
TCLK=1; //给1个时钟,清除BUSY
TCLK=0;
for(count=0;count<16;count++)//读出16位数据,只有高12位有效
{
Num<<=1;
TCLK=0; //下降沿有效
TCLK=1;
if(DOUT)Num++;
}
Num>>=4; //只有高12位有效.
TCS=1; //释放片选
return(Num);
}
========================================================
由上可知:在单任务系统中,在中断中使用原子哥给的延时是不合理的,因为这可能使中断外的延时错误,提前或滞后。
解决上序问题方式:
1、修改延时函数,使之能适应多任务系统。(自己没写:略)
2、直接修改上序的延时函数://自己添加的延时函数 void my_delay_us(u32 us)
{
u32 i, j;
for(i = 0; i < us; i++)
{
for(j = 0; j < 72; j++);
}
}
将上面的delay_us替换成my_delay_us即可。
当然这样模拟的延时是不准确的,但可以解决上序问题。
==============================================
希望初学的像我一样的菜鸟,多多注意这样的问题。高手一般不会犯这样的错误。
|