打印
[STM32F1]

停止模式:睡过去了,醒不起来!(内有源码)

[复制链接]
759|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
情场探花|  楼主 | 2017-11-16 22:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 情场探花 于 2017-11-17 20:37 编辑

我用的是 STM32F103C8T6,打算进入停止模式,利用芯片里的 RTC 唤醒。
问题是能进入停止状态,但是无法唤醒。我在 AAAAA 那里安排了让 LED 闪烁的代码。退出停止模式后,AAAAA 应该是第一条指令。但我没看到 LED 闪烁。
还请高人给看看哪里没弄好,谢谢!

void RTCAlarm_IRQHandler(void)
{
        EXTI->PR |= 0x20000;
        __wfi();
}

int main (void) {
        //在 RCC_BDCR 中设置 RTCSEL[1:0] ,也就是选择 LSI RC 来产生唤醒中断
        PWR->CR |= PWR_CR_DBP;
        RCC->BDCR &= ~(RCC_BDCR_RTCSEL);
        RCC->BDCR |= 0x8200;        //set RTCEN, RTCSEL = 0X2
        PWR->CR &= ~(PWR_CR_DBP);
        //配置 EXTI17 为上升沿触发
        EXTI->IMR |= 0x20000;                //enable exti17
        EXTI->EMR &= 0xfffdffff;        //disable the event of exti17
        EXTI->RTSR |= 0x20000;        //rising edge triggered
        EXTI->FTSR &= 0xfffdffff;        //falling edge not triggered
        //允许 RTC 产生中断
        while (RTC->CRL & RTC_CRL_RTOFF == 0)
                ;
        RTC->CRL |= RTC_CRL_CNF;
        RTC->CRH |= RTC_CRH_ALRIE;
        RTC->PRLH = 0;
        RTC->PRLL = 0x10;//PRLH:PRLL 和 DIVH:DIVL 都是分频系数。测试阶段,把它们设得很小,这样一进入停止模式就立刻退出了
        RTC->DIVH = 0x0;
        RTC->DIVL = 0x1;
        RTC->CRL &= ~RTC_CRL_CNF;
        while (RTC->CRL & RTC_CRL_RTOFF == 0)
                ;
        NVIC_EnableIRQ(RTCAlarm_IRQn);
        //进入停止模式
        SCB->SCR |= SCB_SCR_SLEEPDEEP;//set SLEEPDEEP
        PWR->CR &= ~(PWR_CR_PDDS);                //clear PWR_CR PDDS
        PWR->CR |= PWR_CR_LPDS;        //set PWR_CR LPDS

        __wfi();


        AAAAA


沙发
情场探花|  楼主 | 2017-11-16 22:26 | 只看该作者
我也尝试过设断点调试,但是 __wfi() 这里如果有断点就不能进入停止模式了!

使用特权

评论回复
板凳
情场探花|  楼主 | 2017-11-17 20:38 | 只看该作者
自己顶,求高人

使用特权

评论回复
地板
一路向北lm| | 2017-11-17 22:09 | 只看该作者
设置用什么触发唤醒?

使用特权

评论回复
5
情场探花|  楼主 | 2017-11-18 20:47 | 只看该作者
一路向北lm 发表于 2017-11-17 22:09
设置用什么触发唤醒?

想用 RTC 里的 LSI 唤醒。

使用特权

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

本版积分规则

446

主题

1203

帖子

6

粉丝