用内部LSI作为RTC的时钟源,正常工作时,测试闹钟能正常中断,但进入停止模式后,闹钟唤醒不了
u8 RTC_Init(void)
{
RCC->APB1ENR|=1<<28; //使能电源时钟
RCC->APB1ENR|=1<<27; //使能备份时钟
PWR->CR|=1<<8; //取消备份区写保护
RCC->BDCR|=1<<16; //备份区域软复位
RCC->BDCR&=~(1<<16); //备份区域软复位结束
RCC->CSR|=1<<0; //开启内部低速振荡器
while(!(RCC->CSR&0X02));//等待内部时钟就绪
RCC->BDCR|=0x0200; //LSI作为RTC时钟
RCC->BDCR|=1<<15; //RTC时钟使能
// RTC->CRL &= (u16)(~(1<<3));
while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步
RTC->CRL|=1<<4; //允许配置
RTC->  RLH=0X0000;
RTC->  RLL=32767; //时钟周期设置(有待观察,看是否跑慢了?)理论值:32767
RTC->CRL&=~(1<<4);//配置更新
while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
RTC->CRH|=0X02; //允许闹钟中断
while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
RTC->CRL|=1<<4; //允许配置
RTC->ALRH=(((RTC->CNTH << 16)+RTC->CNTL)+5) >> 16;
RTC->ALRL=(u16)((((RTC->CNTH << 16)+RTC->CNTL)+5) & 0x0000FFFF);//4915; //150ms
RTC->CRL&=~(1<<4);//配置更新
while(!(RTC->CRL&(1<<5))); //等待RTC寄存器操作完成
RCC->APB2ENR|=0x01;//使能io复用时钟
//自动设置
EXTI->IMR|=1<<17;// 开启line 上的中断
EXTI->EMR|=1<<17;//不屏蔽line 上的事件 (如果不屏蔽这句,在硬件上是可以的,但是在软件仿真的时候无法进入中断!)
EXTI->RTSR|=1<<17;//line 上事件上升降沿触发
MY_NVIC_Init(2,5,RTC_IRQChannel,2);//优先级设置
return 0; //ok
}
//RTC时钟中断
//每秒触发一次
void RTC_IRQHandler(void)
{
if(RTC->CRL&0x0002)//闹钟中断
{
RTC->CRH|=0X02; //允许闹钟中断
RTC->CRL&=~(0x0002); //清闹钟中断
}
RTC->CRL&=0X0FFA; //清除溢出,秒钟中断标志
while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
if (EXTI->  R & (1<<17)) {
PoutLedHost = ~PoutLedHost;
RTC->CRL|=1<<4; //允许配置
RTC->ALRH=(((RTC->CNTH << 16)+RTC->CNTL)+5) >> 16;
RTC->ALRL=(u16)((((RTC->CNTH << 16)+RTC->CNTL)+5) & 0x0000FFFF);//4915; //150ms
RTC->CRL&=~(1<<4);//配置更新
while(!(RTC->CRL&(1<<5))); //等待RTC寄存器操作完成
EXTI->  R=1<<17; //清除LINE17上的中断标志位
}
}
|