你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32l0系列,TSL线性电容按键在进入睡眠模式,叫醒后无法开启

[复制链接]
▲-猪-▼Ψ 提问时间:2016-11-16 10:07 /
我用的官方的库文件,的hal函数
下面这个程序,在进入睡后,叫醒,触摸按键无法正常工作,但是弹性按键却可以继续循环进入睡眠模式。
while(1)
{
   
    //判断 线性电容按键 与 睡眠开启按键(普通弹性按键)是否有一个被按下
    MyLinRots[0].p_Data->Position = 0;
    MyLinRots[0].p_Data->StateId = TSL_STATEID_RELEASE;
    ButtonPressed = 0;
    tsl_status = tsl_user_Exec();
    while((ButtonPressed == 0) && ((MyLinRots[0].p_Data->StateId != TSL_STATEID_DETECT) || (LINEAR_POSITION == 0)) && (!LINEAR_POSITION))
    {
      tsl_status = tsl_user_Exec();
    }
   

    //若线性电容按键被触发,则进入一下逻辑。
    if(MyLinRots[0].p_Data->StateId  == TSL_STATEID_DETECT)
    {
      /* Run mode menu ********************************************************/
      if((LINEAR_POSITION >= 1 ) && (LINEAR_POSITION <= 64))
      {
      }
      
      /* Sleep mode menu ******************************************************/
      else if ((LINEAR_POSITION >= 65 ) && (LINEAR_POSITION <= 127))
      {
      }
      
      /* LP Sleep menu ********************************************************/
      else if ((LINEAR_POSITION >= 128 ) && (LINEAR_POSITION <= 191))
      {
      }
      /* Stop menu ************************************************************/
      else
      {
      }
    }

    //若普通弹性按键按下,则触发开启睡眠模式
    else /* BUTTON_KEY != 0 */
    {
      
//     IDD_SaveContext();     //从IDD库中找到的关闭IO和时钟的函数(检测睡眠模式 功耗电流时 用的函数)
       SystemPower_Config();  //官方sleep库中的关闭IO 和时钟的函数。

       HAL_I2C_DeInit(&I2CxHandle);      
       HAL_Delay(5000);
  
       BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_EXTI);
       HAL_SuspendTick();
       HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
       HAL_ResumeTick();
      
       IDD_RestoreContext();    //从IDD库中找到的关闭IO和时钟的函数(检测睡眠模式 功耗电流时 用的函数)

       //苏醒后LED灯闪烁
       BSP_LED_Init(LED3);
       BSP_LED_On(LED3);
       HAL_Delay(500);
       BSP_LED_Off(LED3);
       HAL_Delay(500);
       BSP_LED_On(LED3);
       HAL_Delay(500);
       BSP_LED_Off(LED3);
       HAL_Delay(500);
       BSP_LED_On(LED3);
       HAL_Delay(500);
       BSP_LED_Off(LED3);
        
    }
}
收藏 评论12 发布时间:2016-11-16 10:07

举报

12个回答
▲-猪-▼Ψ 回答时间:2016-11-27 00:27:13
自问自答吧,

睡醒后,虽然又外设都初始化了,但是开发板上的TSL按键模块并没有苏醒,开启了一半,由寄存器具体数值查到的,所以初始化程序后面又加了一句直接操作寄存器的语句,           TSC->CR |= 0x02;               //使  TSL开始工作,

然后就好使,

其实仍有疑问,就是初始化时的却置位了CR寄存器,但是没有起作用,手动置位却好使了,
疑惑没解开,好在运行没有错误了!!!!!!!

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

▲-猪-▼Ψ 回答时间:2016-11-16 10:08:34
进入线性按键后,里面的具体逻辑,有所删减,要不程序太多了,不好分析问题
▲-猪-▼Ψ 回答时间:2016-11-16 10:09:36
如果再次精炼一下程序,就好使了,大神们,可不可以帮忙分析一下错误点在那里?
▲-猪-▼Ψ 回答时间:2016-11-16 10:10:23
while(1) {     //判断 线性电容按键 与 睡眠开启按键(普通弹性按键)是否有一个被按下     MyLinRots[0].p_Data->Position = 0;     MyLinRots[0].p_Data->StateId = TSL_STATEID_RELEASE;     ButtonPressed = 0;     tsl_status = tsl_user_Exec();     while((ButtonPressed == 0) && ((MyLinRots[0].p_Data->StateId != TSL_STATEID_DETECT) || (LINEAR_POSITION == 0)) && (!LINEAR_POSITION))     {       tsl_status = tsl_user_Exec();     }   //     IDD_SaveContext();     //从IDD库中找到的关闭IO和时钟的函数(检测睡眠模式 功耗电流时 用的函数)        SystemPower_Config();  //官方sleep库中的关闭IO 和时钟的函数。         HAL_I2C_DeInit(&I2CxHandle);              HAL_Delay(5000);           BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_EXTI);        HAL_SuspendTick();        HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);        HAL_ResumeTick();               IDD_RestoreContext();    //从IDD库中找到的关闭IO和时钟的函数(检测睡眠模式 功耗电流时 用的函数)         //苏醒后LED灯闪烁        BSP_LED_Init(LED3);        BSP_LED_On(LED3);        HAL_Delay(500);        BSP_LED_Off(LED3);        HAL_Delay(500);        BSP_LED_On(LED3);        HAL_Delay(500);        BSP_LED_Off(LED3);        HAL_Delay(500);        BSP_LED_On(LED3);        HAL_Delay(500);        BSP_LED_Off(LED3);          }
▲-猪-▼Ψ 回答时间:2016-11-16 10:10:52
额乱码了,重发一遍
▲-猪-▼Ψ 回答时间:2016-11-16 10:11:47
while(1)
{
    //判断 线性电容按键 与 睡眠开启按键(普通弹性按键)是否有一个被按下
    MyLinRots[0].p_Data->Position = 0;
    MyLinRots[0].p_Data->StateId = TSL_STATEID_RELEASE;
    ButtonPressed = 0;
    tsl_status = tsl_user_Exec();
    while((ButtonPressed == 0) && ((MyLinRots[0].p_Data->StateId != TSL_STATEID_DETECT) || (LINEAR_POSITION == 0)) && (!LINEAR_POSITION))
    {
      tsl_status = tsl_user_Exec();
    }


//     IDD_SaveContext();     //从IDD库中找到的关闭IO和时钟的函数(检测睡眠模式 功耗电流时 用的函数)
       SystemPower_Config();  //官方sleep库中的关闭IO 和时钟的函数。

       HAL_I2C_DeInit(&I2CxHandle);      
       HAL_Delay(5000);
  
       BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_EXTI);
       HAL_SuspendTick();
       HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);
       HAL_ResumeTick();
      
       IDD_RestoreContext();    //从IDD库中找到的关闭IO和时钟的函数(检测睡眠模式 功耗电流时 用的函数)

       //苏醒后LED灯闪烁
       BSP_LED_Init(LED3);
       BSP_LED_On(LED3);
       HAL_Delay(500);
       BSP_LED_Off(LED3);
       HAL_Delay(500);
       BSP_LED_On(LED3);
       HAL_Delay(500);
       BSP_LED_Off(LED3);
       HAL_Delay(500);
       BSP_LED_On(LED3);
       HAL_Delay(500);
       BSP_LED_Off(LED3);
        
}
▲-猪-▼Ψ 回答时间:2016-11-16 10:14:07
发现,只要删除,判断是否弹性按键按下,这段判断句,则程序运行正常,加上这段话,出了睡眠,线性电容按键无法开启。
xhzheng 回答时间:2016-11-16 10:20:16
好高手,路过;
▲-猪-▼Ψ 回答时间:2016-11-16 10:56:18
不是高手,我只是用官方库复制粘贴的程序……还出bug了……
▲-猪-▼Ψ 回答时间:2016-11-16 10:56:45
assssdz 回答时间:2016-11-16 12:33:43
:)
andypanfan 回答时间:2016-11-28 21:16:35
这个代码  很难看!!!!

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版