OpenEdv-开源电子网

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

奇怪问题 uCGUI利用中断定时获取触摸状态 但影响delay的延时???

[复制链接]

7

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2014-2-11
在线时间
14 小时
发表于 2014-3-16 22:29:18 | 显示全部楼层 |阅读模式
1、注释掉GUI_TOUCH_Exec();  delay_ms(300); 能正常工作
现象:红绿灯交替点亮
/////////////////////////////////////////////////////////////////////////////////////////////////////
// 进入中断10ms一次

void TIM3_IRQHandler(void)
{
if(TIM3->SR & 0x0001) // 溢出中断
{
// GUI_TOUCH_Exec();
}
TIM3->SR &= ~(1 << 0); // 清除中断标志位
}

///////////////////////////////////////////////////////////////////////////////////////////////////////
// 主函数部分:

while(1)
{
LED0=0;
LED1=1;
delay_ms(300);
LED0=1;
LED1=0;
delay_ms(300);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////


2、用上GUI_TOUCH_Exec();  delay_ms(300); 能不能正常工作
现象:红绿灯一直点亮
/////////////////////////////////////////////////////////////////////////////////////////////////////
// 进入中断10ms一次

void TIM3_IRQHandler(void)
{
if(TIM3->SR & 0x0001) // 溢出中断
{
GUI_TOUCH_Exec();
}
TIM3->SR &= ~(1 << 0); // 清除中断标志位
}

///////////////////////////////////////////////////////////////////////////////////////////////////////
说明:中断进入到100ms一次时,正感觉到红绿灯交替闪烁,但不是正常的延时时间。 
        中断进入到1000ms一次时,正感觉到红绿灯交替闪烁,是正常的延时时间。
        所以:加上GUI_TOUCH_Exec(); 可以说延时失效。
 


为可睡懒觉,而奋斗终身!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

68

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2014-2-11
在线时间
14 小时
 楼主| 发表于 2014-3-19 16:52:13 | 显示全部楼层
本人由于用的是原子哥的延时函数,单任务单片机中跑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即可。

    当然这样模拟的延时是不准确的,但可以解决上序问题。

==============================================
希望初学的像我一样的菜鸟,多多注意这样的问题。高手一般不会犯这样的错误。


为可睡懒觉,而奋斗终身!
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165537
金钱
165537
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-16 23:44:57 | 显示全部楼层
帮顶
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-2-20
在线时间
0 小时
发表于 2015-5-26 19:15:37 | 显示全部楼层
回复【3楼】爱睡懒觉:
---------------------------------
太感谢了,解决了我的问题。
回复 支持 反对

使用道具 举报

7

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2013-10-6
在线时间
15 小时
发表于 2015-5-29 07:15:07 | 显示全部楼层
我也要注意了
回复 支持 反对

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2018-2-10 19:31:00 | 显示全部楼层
谢谢。这问题困扰我好久。。。
回复 支持 反对

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2017-10-6
在线时间
39 小时
发表于 2018-3-25 23:01:32 | 显示全部楼层
我也发现了这个问题 哈哈哈 单片机真的要好好学啊!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-14 21:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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