打印
[STM32F1]

STM32F103跳过进入停止模式

[复制链接]
6468|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fq1110|  楼主 | 2015-2-12 10:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,STM32会跳过进入停止模式命令,继续运行。
查看参考手册上有这么一句:
为了进入停止模式,所有的外部中断的请求位(挂起寄存器(EXTI_PR))和RTC的闹钟标志都必须被清除,否则停止模式的进入流程将会被跳过,程序继续运行。
以下是我的代码,看了手册后,增加了前面两句。
EXTI_ClearITPendingBit(0x7ffff);
RTC_ClearITPendingBit(0x07);
PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);         
结果在运行这三句之后,程序还在运行。请各位大侠帮忙分析分析。
沙发
李炳1991| | 2015-2-12 11:30 | 只看该作者
对于103系列的芯片我遇到过一次就是如果对RTC没有进行配置,或者配置不正确就不会进入待机模式。

使用特权

评论回复
板凳
airwill| | 2015-2-12 16:09 | 只看该作者
我觉得在进入待机模式前, 用调试器看一看, 到底有没有全部清掉
因为有些中断请求不能清掉 (比如电平中断),  跟设置有关.

使用特权

评论回复
地板
fq1110|  楼主 | 2015-2-12 18:47 | 只看该作者
李炳1991 发表于 2015-2-12 11:30
对于103系列的芯片我遇到过一次就是如果对RTC没有进行配置,或者配置不正确就不会进入待机模式。 ...

我按你的要求,重新配置了rtc,还是没有起到作用。谢谢你。

使用特权

评论回复
5
fq1110|  楼主 | 2015-2-12 18:48 | 只看该作者
airwill 发表于 2015-2-12 16:09
我觉得在进入待机模式前, 用调试器看一看, 到底有没有全部清掉
因为有些中断请求不能清掉 (比如电平中断),  ...

非常感谢,我检查了,所有外部中断的请求位,exti->pr,rtc->ctl,没有发现什么问题。
还是不行。

使用特权

评论回复
6
小浣熊| | 2015-2-12 20:08 | 只看该作者
问题解决了吗,不妨用调试器测测看。。

使用特权

评论回复
7
fq1110|  楼主 | 2015-2-12 20:56 | 只看该作者
小浣熊 发表于 2015-2-12 20:08
问题解决了吗,不妨用调试器测测看。。

没解决了,就是用仿真器调试的,理论上讲进入停止模式,时钟都没了,调试应该会断开。结果调试还能用,程序还在跑。

使用特权

评论回复
8
cddxcdx| | 2015-2-13 09:55 | 只看该作者
是不是外部中断源还在?

使用特权

评论回复
9
zh113214| | 2015-2-14 18:44 | 只看该作者
进来看看,个人也感觉挺奇怪的,不知道楼主的问题找到没!

使用特权

评论回复
10
fq1110|  楼主 | 2015-2-15 09:39 | 只看该作者
谢谢大家了,我们14号就开始放假了,年后单独写个测试代码测试下。肯定是有什么影响到了他。提前祝大家新年快乐。

使用特权

评论回复
11
fq1110|  楼主 | 2015-2-15 09:41 | 只看该作者
分数未分配完,或分数分配存在错误?
啥子意思?50分不是都分完了吗?

使用特权

评论回复
12
Frank_Dong| | 2015-5-3 20:10 | 只看该作者
楼主,现在调试的怎么样,有结果吗。我现在也遇到这个问题了,我要进入standby模式,PWR_WakeUpPinCmd(ENABLE);            
            PWR_EnterSTANDBYMode();
            __WFI();  发现PDDS位根本写不了1,sleepdeep位可以写进去。用仿真器仿真程序还在跑,根本不会停。

使用特权

评论回复
13
Frank_Dong| | 2015-5-3 20:11 | 只看该作者
楼主,现在调试的怎么样,有结果吗。我现在也遇到这个问题了,我要进入standby模式,PWR_WakeUpPinCmd(ENABLE);            
            PWR_EnterSTANDBYMode();
            __WFI();  发现PDDS位根本写不了1,sleepdeep位可以写进去。用仿真器仿真程序还在跑,根本不会停。

使用特权

评论回复
14
fq1110|  楼主 | 2015-5-4 19:06 | 只看该作者
参考手册中有这么句话:为了进入停止模式,所有的外部中断的请求位(挂起寄存器(EXTI_PR))和RTC的闹钟标志都必须被清除,否则停止模式的进入流程将会被跳过,程序继续运行。
这个我当时加了也还是不正常,最后我把systick关了之后,就ok了,你可以去试试,希望能帮到你。

使用特权

评论回复
评论
通宵敲代码 2019-6-20 15:54 回复TA
刚刚在这地方被坑了一把,把SysTick中断关掉,就完全正常了 
15
Frank_Dong| | 2015-5-4 21:05 | 只看该作者
fq1110 发表于 2015-5-4 19:06
参考手册中有这么句话:为了进入停止模式,所有的外部中断的请求位(挂起寄存器(EXTI_PR))和RTC的闹钟标志都 ...

    RCC_DeInit();
    TIM_DeInit(TIM3);
    TIM_DeInit(TIM1);
    ADC_DeInit(ADC1);
    USART_DeInit(USART1);
    GPIO_DeInit(GPIOA);
    GPIO_DeInit(GPIOB);
    GPIO_DeInit(GPIOC);
    DMA_DeInit(DMA1_Channel1);       
    DMA_DeInit(DMA1_Channel5);
   
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,DISABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,DISABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,DISABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, DISABLE);
    EXTI_ClearITPendingBit(0x7ffff);
    RTC_ClearITPendingBit(0x07);
    PWR_WakeUpPinCmd(ENABLE);            
    PWR_EnterSTANDBYMode();
    __WFI();
我都写成这了,还不行。真奇怪。我的systick根本就没有用。

使用特权

评论回复
16
电子农民工| | 2016-3-22 15:16 | 只看该作者
遇到同样的问题。求解

使用特权

评论回复
17
Cheas_Tong| | 2016-5-18 13:46 | 只看该作者
本帖最后由 Cheas_Tong 于 2016-5-18 13:50 编辑

我刚开始也是碰到问题,进入STOP模式后电流30mA。而且只能进入一次STOP模式,后来重新焊接一块板,一个一个外围增加,每增加一个外围测一次电流,最后把电流降到6.9uA,只能进入一次STOP模式是因为外部中断没有清掉。目前还在调试阶段我没有开启RTC,电流也能降到6.9uA而且其他外围在低功耗时也是有几uA电流的

使用特权

评论回复
18
Cheas_Tong| | 2016-5-18 13:47 | 只看该作者
在外部中断函数中清除中断标志

使用特权

评论回复
19
yegw420| | 2016-9-26 10:00 | 只看该作者
我也遇到过这个问题
解决方法是 清除中断标志
我的设备有一个中断 是可以关闭的, 但是io口状态变化时还是可以产生中断标志,
所以在睡眠前要清除干净

                                        __HAL_RCC_GPIOA_CLK_DISABLE();
                                        __HAL_RCC_GPIOB_CLK_DISABLE();
                       
                                        HAL_NVIC_DisableIRQ(EXTI9_5_IRQn);

                                        while (__HAL_GPIO_EXTI_GET_FLAG(GPIO_PIN_6))
                                                        __HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_6);

                                        /* Enter STOP 1 mode */
                                        HAL_PWREx_EnterSTOP1Mode(PWR_STOPENTRY_WFI);

使用特权

评论回复
20
sj07| | 2016-11-17 09:48 | 只看该作者
本帖最后由 sj07 于 2016-11-17 09:51 编辑

如果确认清除了所有 IT PENDING FLAG.还有一个终极手段:
在进STOP函数前加SysTick->CTRL  = 0; 关TICKER中断
在唤醒中断中首先SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                   SysTick_CTRL_TICKINT_Msk   |
                   SysTick_CTRL_ENABLE_Msk;   
开启TICKER.这个TICKER是所有的库函数必需使用的,除非所有代码你自己写。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

530

帖子

1

粉丝