硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4623|回复: 4
收起左侧

[emWin] STemwin 多次打开关闭一个窗口后死在I2C循环中

[复制链接]

6

主题

42

回帖

60

积分

初级会员

积分
60
发表于 2016-6-2 16:06:24 | 显示全部楼层 |阅读模式
我的程序是STemwin 在桌面有一个图标,点击图标后创建一个窗口,窗口中3个按钮,和1个listbox。
点击窗口中的CANCEL按钮窗口关闭。
当我多次打开关闭这个窗口时(打开关闭打开关闭这样的动作),程序就会死!
经调试,程序是死在了硬件I2C的while循环中,如下代码中:
static HAL_StatusTypeDef I2C_WaitOnFlagUntilTimeout(I2C_HandleTypeDef*hi2c, uint32_t Flag, FlagStatus Status, uint32_t Timeout)  
{  
  uint32_t tickstart = HAL_GetTick();
  
  /* Wait until flag is set */
  if(Status == RESET)
  {   
    while(__HAL_I2C_GET_FLAG(hi2c, Flag) == RESET)
    {
      /* Check for the Timeout */
      if(Timeout != HAL_MAX_DELAY)
      {
        if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
        {
          hi2c->State= HAL_I2C_STATE_READY;
          /* Process Unlocked */
          __HAL_UNLOCK(hi2c);
          return HAL_TIMEOUT;
        }
      }
    }
  }...........省略

或者
static HAL_StatusTypeDef I2C_IsAcknowledgeFailed(I2C_HandleTypeDef *hi2c, uint32_t Timeout)
{
  uint32_t tickstart = 0x00;
  tickstart = HAL_GetTick();
  
  if(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_AF) == SET)
  {
    /* Wait until STOP Flag is reset */
    /* AutoEnd should be initiate after AF */
    while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_STOPF) == RESET)
    {
      /* Check for the Timeout */
      if(Timeout != HAL_MAX_DELAY)
      {
        if((Timeout == 0)||((HAL_GetTick() - tickstart ) > Timeout))
        {
          hi2c->State= HAL_I2C_STATE_READY;
          /* Process Unlocked */
          __HAL_UNLOCK(hi2c);
          return HAL_TIMEOUT;
        }
      }
    }...........省略

这个I2C程序是操作电阻触摸屏芯片的,由TIMER3定时器定时调用。
timer3中断优先级是(0,1)。
上面程序中超时检测是用的SYSTICK,其中断优先级是(0x0f,0)。
调试发现,程序死掉后,HAL_GetTick() 返回值始终不变,这样才进入死循环!
怀疑是systick优先级低,将其改为(0,0)最高优先级后,依然会进入上面的死循环!
求版主帮忙!!!求高手赐教!!!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-6-3 10:16:13 | 显示全部楼层
电阻触摸屏检测别放在中断里面实现了,给桌面窗口创建一个定时器,在桌面窗口的定时器消息中实现电阻触摸屏的检测,
效果也很好。
回复

使用道具 举报

6

主题

42

回帖

60

积分

初级会员

积分
60
 楼主| 发表于 2016-6-3 11:15:22 | 显示全部楼层

回 eric2013 的帖子

eric2013:电阻触摸屏检测别放在中断里面实现了,给桌面窗口创建一个定时器,在桌面窗口的定时器消息中实现电阻触摸屏的检测,
效果也很好。 (2016-06-03 10:16) 
恩,您的方案挺好,我这边主要是因为像这样的程序都是用的ST自带的,懒得修改!回头优化的时候考虑改下!
我这个问题似乎得到了解决方法,我把定时器抢占优先级设置为1,SYSTICK抢占优先级设置为0,就不会进入死循环了!

最后感谢版主回复!版主真是很敬业,发现坛子里几乎每一篇帖子都有版主的回复,您辛苦了!好人一生平安!
回复

使用道具 举报

34

主题

79

回帖

34

积分

初级会员

积分
34
发表于 2016-6-9 09:14:47 | 显示全部楼层
学习了
回复

使用道具 举报

14

主题

238

回帖

280

积分

高级会员

积分
280
发表于 2016-6-15 12:19:42 | 显示全部楼层

回 wozaihuayu 的帖子

wozaihuayu:恩,您的方案挺好,我这边主要是因为像这样的程序都是用的ST自带的,懒得修改!回头优化的时候考虑改下!
我这个问题似乎得到了解决方法,我把定时器抢占优先级设置为1,SYSTICK抢占优先级设置为0,就不会进入死循环了!

最后感谢版主回复!版主真是很敬业,发现坛子里几乎每一 .. (2016-06-03 11:15)
好像昨天STMCU微信公众号 推送了你的情况 也给出了解决方案就是修改SYSTick的抢占优先级大于定时器T3
12147CC6-C97A-4756-9A7D-B3ED66968551.PNG
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-17 08:03 , Processed in 0.042362 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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