|
int main(void)
{
SystemClock_Config(); //系统时钟初始化成400MHz
LED_GPIO_Config(); //LED 端口初始化
KEY_GPIO_Config(); //KEY 端口初始化
USART_Config(); //配置串口1为:115200 8-N-1
//检测复位来源
if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) == SET)
{
LED1(ON);
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);
printf("\r\n 待机唤醒复位 \r\n");
}
else
{
LED2(ON);
printf("\r\n 非待机唤醒复位 \r\n");
printf("\r\n 按复位后按KEY2进入待机模式 \r\n");
}
while(1)
{
// K2 按键长按进入待机模式
// if(KEY2_LongPress())
// {
if(HAL_GPIO_ReadPin(KEY2_GPIO_PORT, KEY2_GPIO_PIN) == SET)
{
HAL_Delay(50);
if(HAL_GPIO_ReadPin(KEY2_GPIO_PORT, KEY2_GPIO_PIN) == SET)
{
printf("\r\n 即将进入待机模式,进入待机模式后可按KEY1唤醒,唤醒后会进行复位,程序从头开始执行\r\n");
LED3(ON);
HAL_Delay(1000);
HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); //禁止所有唤醒源,唤醒引脚PA0
HAL_PWREx_ClearWakeupFlag(PWR_WAKEUP_FLAG1);//清除WU状态位
HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); //使能WKUP引脚的唤醒功能 ,使能PA0
HAL_SuspendTick(); //暂停滴答时钟,防止通过滴答时钟中断唤醒
HAL_PWR_EnterSTANDBYMode(); //进入待机模式
while(!HAL_GPIO_ReadPin(KEY2_GPIO_PORT, KEY2_GPIO_PIN));
}
}
// }
}
//用于检测按键是否被长时间按下
static uint8_t KEY2_LongPress(void)
{
uint8_t downCnt =0; //记录按下的次数
uint8_t upCnt =0; //记录松开的次数
while(1) //死循环,由return结束
{
HAL_Delay(20);
if(HAL_GPIO_ReadPin(KEY2_GPIO_PORT, KEY2_GPIO_PIN) == SET) //检测到按下按键
{
downCnt++; //记录按下次数
upCnt=0; //清除按键释放记录
if(downCnt>=100) //按下时间足够
{
return 1; //检测到按键被时间长按下
}
}
else
{
upCnt++; //记录释放次数
if(upCnt>5) //连续检测到释放超过5次
{
return 0; //按下时间太短,不是按键长按操作
}
}
}
}
void KEY_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
KEY2_GPIO_CLK_ENABLE(); //开启按键GPIO口的时钟
GPIO_InitStructure.Pin = KEY2_GPIO_PIN; //选择按键的引脚
GPIO_InitStructure.Mode = GPIO_MODE_INPUT; //设置引脚为输入模式
GPIO_InitStructure.Pull = GPIO_NOPULL; //设置引脚不上拉也不下拉
HAL_GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure); //使用上面的结构体初始化按键
}
1.此程序下载后按KEY2不能进待机,必须按一次复位后,后续再按KEY2才能进待机。
2.不知道为什么我用KEY2_LongPress进不了,可能一直返回的是0?所以if(KEY2_LongPress())不成立吗?所以我给它注释掉了。
|
|