本帖最后由 情场探花 于 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
|