OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4593|回复: 8

STM32F030K6 低功耗待机模式,唤醒不了

[复制链接]

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2016-9-16
在线时间
38 小时
发表于 2017-6-15 14:59:53 | 显示全部楼层 |阅读模式
10金钱
大神们,我请教一个问题,我用STM32F030K6 这个芯片做一个低功耗(待机模式)的程序,用的PA0作为唤醒脚,然后遇到的问题是:1、在程序中,直接调用库函数“PWR_EnterSTANDBYMode();”进入待机模式,可以进去,但是功耗会比较大,有200多ua,然后在网上看,貌似都是得使能PWR时钟的
2、然后我在进入待机模式之前添加“ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);”这个函数(使能PWR时钟),功耗是降了不少,在50ua左右,但是问题来了,进入待机之后,就唤醒不了,用电表去测按下按键PA0也是有高电位的,进入待机模式之前也是有把PA0配置为输入模式的。


    这里很是不解,希望大家给下意见!!
[mw_shl_code=applescript,true]
void EXTI_Key_Init(void)
{

         GPIO_InitTypeDef GPIO_InitStruct;
         EXTI_InitTypeDef EXTI_InitStruct;
         NVIC_InitTypeDef NVIC_InitStruct;

         RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
                                               
                                               
         GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
         GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
         GPIO_InitStruct.GPIO_Speed = GPIO_Speed_Level_2;
         GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_DOWN;
         GPIO_Init(GPIOA, &GPIO_InitStruct);

         SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);

                                               
         EXTI_ClearITPendingBit(EXTI_Line0);

                                               
         EXTI_InitStruct.EXTI_Line = EXTI_Line0;
         EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
         EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
         EXTI_InitStruct.EXTI_LineCmd = ENABLE;
         EXTI_Init(&EXTI_InitStruct);

         NVIC_InitStruct.NVIC_IRQChannel = EXTI0_1_IRQn;
         NVIC_InitStruct.NVIC_IRQChannelPriority = 0;
         NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
         NVIC_Init(&NVIC_InitStruct);
//         
//        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
       
         A:       
       
         if (CHECK_EXTI() == 0)
         {
                 LowPower();
         }
         
        if (!SYSTEM_FLAG)
        {         
                goto A;
        }
       
}[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

原子哥,我上述的问题解决了,是程序上死循环了。。。 但是刚刚又发现了一个问题,我的程序是开机检测是否长按按键,如果长按开机,不是直接进入待机模式。 现在的现象是:开机进入休眠53uA左右,然后按一下按键(并未开机),功耗既然提升到了5.9mA了 不是说待机唤醒就是跟上电复位一样的么,为何变化会这么大的呢?求赐教[mw_shl_code=applescript,true]KEY_Init(); if (CHECK_EXTI() == 0) { SystemClo ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2016-9-16
在线时间
38 小时
 楼主| 发表于 2017-6-15 14:59:54 | 显示全部楼层

原子哥,我上述的问题解决了,是程序上死循环了。。。
但是刚刚又发现了一个问题,我的程序是开机检测是否长按按键,如果长按开机,不是直接进入待机模式。
现在的现象是:开机进入休眠53uA左右,然后按一下按键(并未开机),功耗既然提升到了5.9mA了

不是说待机唤醒就是跟上电复位一样的么,为何变化会这么大的呢?求赐教[mw_shl_code=applescript,true]KEY_Init();
        if (CHECK_EXTI() == 0)
        {
                SystemClock();  //没有使用外部晶振,所以降时钟设置为内部时钟
                Gpio_Init();  //未使用的设置为下拉输入,带上拉电阻的设置为上拉输入
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);  //开启PWR时钟
                PWR_WakeUpPinCmd(PWR_WakeUpPin_1, ENABLE);  //待机唤醒脚使能
                LowPower();  //进入待机模式
        }[/mw_shl_code]
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165462
金钱
165462
注册时间
2010-12-1
在线时间
2114 小时
发表于 2017-6-15 21:49:05 | 显示全部楼层
帮顶
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165462
金钱
165462
注册时间
2010-12-1
在线时间
2114 小时
发表于 2017-6-18 19:26:39 | 显示全部楼层
LSP 发表于 2017-6-16 15:07
原子哥,我上述的问题解决了,是程序上死循环了。。。
但是刚刚又发现了一个问题,我的程序是开机检测是 ...

因为你一按下实际上就是开机了,只是开机以后,假装没有开机(MCU不跑到任务代码去)
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2016-9-16
在线时间
38 小时
 楼主| 发表于 2017-6-19 10:25:27 | 显示全部楼层
待机的时候,按键按下(PA0)相当于复位,然后程序重新重头开始执行,然后又执行KEY初始化和判断是否长按按键的函数,如果没有长按按键则进入待机,这逻辑有什么不对吗?如果有问题,能给点意见么,怎么改比较好呢?


回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2016-9-16
在线时间
38 小时
 楼主| 发表于 2017-6-19 10:26:53 | 显示全部楼层
正点原子 发表于 2017-6-18 19:26
因为你一按下实际上就是开机了,只是开机以后,假装没有开机(MCU不跑到任务代码去)

待机的时候,按键按下(PA0)相当于复位,然后程序重新重头开始执行,然后又执行KEY初始化和判断是否长按按键的函数,如果没有长按按键则进入待机,这逻辑有什么不对吗?如果有问题,能给点意见么,怎么改比较好呢?
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2016-9-16
在线时间
38 小时
 楼主| 发表于 2017-6-20 10:49:55 | 显示全部楼层
发现按一下按键是一直在复位的,不是在次进入待机模式的,很是不解。。。。
回复

使用道具 举报

3

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2016-9-16
在线时间
38 小时
 楼主| 发表于 2017-6-21 14:45:21 | 显示全部楼层
终于把问题找到了,我的一直复位是因为,唤醒标志WUF和进入待机状态在进入待机后唤醒没有清零,所以一直是在待机唤醒(即一直在复位),我在网上也没有看到这种情况,不过还是见招拆招。。。。希望如果有人遇到跟我类似的情况的人可以参考下。。。
进入待机前清理下状态:
[mw_shl_code=applescript,true]
PWR->CR |= (1<<2); //清除唤醒标志WUF
                PWR->CR |= (1<<3); //清除待机待机状态标志
                printf("PA0的状态为:%d \r\n", (GPIOA->IDR & (1<<0)));
                printf("唤醒标志WUF的状态为:%d \r\n", (PWR->CSR & (1<<0)));
                printf("待机状态的状态为:%d \r\n", ((PWR->CSR & (1<<1))>>1));
[/mw_shl_code]

回复

使用道具 举报

0

主题

12

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2017-8-6
在线时间
0 小时
发表于 2017-8-7 11:06:52 | 显示全部楼层
代理兆易创新(GD)32-bit ARM架构,Cortex-M3、M4内核MCU,可提供技术支持等服务;
GD32F130系列 M3内核与STM32F030/051系列,硬件pin to pin兼容;烧录器、寄存器、开发环境完全兼容;
欢迎来电咨询探讨,邱先生 电话:136 8955 5135;
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-20 09:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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