我用的官方的库文件,的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); } } |
睡醒后,虽然又外设都初始化了,但是开发板上的TSL按键模块并没有苏醒,开启了一半,由寄存器具体数值查到的,所以初始化程序后面又加了一句直接操作寄存器的语句, TSC->CR |= 0x02; //使 TSL开始工作,
然后就好使,
其实仍有疑问,就是初始化时的却置位了CR寄存器,但是没有起作用,手动置位却好使了,
疑惑没解开,好在运行没有错误了!!!!!!!
评分
查看全部评分
{
//判断 线性电容按键 与 睡眠开启按键(普通弹性按键)是否有一个被按下
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);
}