硬汉嵌入式论坛

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

[其它] H743待机遇到的BUG

[复制链接]
回帖奖励 10 个金币 回复本帖可获得 1 个金币奖励! 每人限 1 次(中奖概率 30%)

24

主题

37

回帖

109

积分

初级会员

积分
109
发表于 2024-6-13 16:38:31 | 显示全部楼层 |阅读模式


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())不成立吗?所以我给它注释掉了。




回复

使用道具 举报

24

主题

37

回帖

109

积分

初级会员

积分
109
 楼主| 发表于 2024-6-13 16:39:11 | 显示全部楼层
KEY1是PA0,KEY2是PC13
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2024-6-14 12:42:52 | 显示全部楼层

回帖奖励 +1 个金币

楼主的程序逻辑没有研究,只看了下这部分
HAL_PWR_EnterSTANDBYMode();                                        //进入待机模式                                
while(!HAL_GPIO_ReadPin(KEY2_GPIO_PORT, KEY2_GPIO_PIN));

进入待机后,唤醒是相当于复位,也就是后的While读已经用不上了。
回复

使用道具 举报

24

主题

37

回帖

109

积分

初级会员

积分
109
 楼主| 发表于 2024-6-14 16:51:29 | 显示全部楼层
eric2013 发表于 2024-6-14 12:42
楼主的程序逻辑没有研究,只看了下这部分
HAL_PWR_EnterSTANDBYMode();                                  ...

这个确实忘记了,不过这个是替代那个按键进入的函数,不影响
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-14 22:52 , Processed in 0.038677 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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