本帖最后由 wozaihuayu 于 2016-6-2 17:03 编辑
我的程序是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)最高优先级后,依然会进入上面的死循环!
求高手指点!!!提一些建议也可以!!! |