OpenEdv-开源电子网

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

RTC闹钟中断怎么也进不了

[复制链接]

23

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2013-10-8
在线时间
0 小时
发表于 2013-10-24 12:42:51 | 显示全部楼层 |阅读模式
//闹铃装载函数
void alarm_set(u8 h,u8 m)
{
  alarm.weekmask=1;
  alarm.hour=h; //设置闹铃小时
  alarm.min=m; //设置闹铃分钟
}  

//重新初始化闹钟     
//alarmx:闹钟结构体
void calendar_alarm_init(_alarm_obj *alarmx) 
{   
。。。。。。。。。。。。。。。。。。。
}
u8 RTC_Init(void)
{
//检查是不是第一次配置时钟
u8 temp=0;

if(BKP->DR1!=0X5050)//第一次配置
{  
  RCC->APB1ENR|=1<<28;     //使能电源时钟    
RCC->APB1ENR|=1<<27;     //使能备份时钟    
PWR->CR|=1<<8;           //取消备份区写保护
RCC->BDCR|=1<<16;        //备份区域软复位   
RCC->BDCR&=~(1<<16);     //备份区域软复位结束    
 //RCC->BDCR|=1<<0;         //开启外部低速振荡器
// RCC->CR|=1<<16;         //开启外部高速振荡器
    RCC->CSR|=1<<0;         //开启外部低速振荡器 

   while((!(RCC->CSR&0X02))&&temp<250)//等待内部时钟就绪
 //while((!(RCC->CR&0X00010000))&&temp<250)//等待内部时钟就绪  
{
temp++;
delay_ms(10);
};
if(temp>=250)return 1;//初始化时钟失败,晶振有问题    

// RCC->BDCR|=1<<8; //LSE作为RTC时钟
    //  RCC->BDCR|=3<<8; //HSE作为RTC时钟
    RCC->BDCR|=1<<9; //LSI作为RTC时钟  
   
RCC->BDCR|=1<<15;//RTC时钟使能  
  while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成  
    while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步  
    RTC->CRH|=0X01;    //允许秒中断
EXTI->IMR|=1<<17;  //开启线17中断,连接到RTC闹钟事件 
  RTC->CRH|=0X02;    //允许闹钟中断
    while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成  
RTC->CRL|=1<<4;              //允许配置  
RTC->RLH=0X0000;
RTC->RLL=40000;          //时钟周期设置(有待观察,看是否跑慢了?)理论值:32767      
RTC_Set(2012,9,7,13,16,40);  //设置时间  
RTC->CRL&=~(1<<4);           //配置更新,退出配置模式
while(!(RTC->CRL&(1<<5)));   //等待RTC寄存器操作完成  
BKP->DR1=0X5050;  
printf("FIRST TIME\n");
}else//系统继续计时
{
    while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步  
    RTC->CRH|=0X01;    //允许秒中断
EXTI->IMR|=1<<17;  //开启线17中断,连接到RTC闹钟事件 
RTC->CRH|=0X02;    //允许闹钟中断
    while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
printf("OK\n");
}      
MY_NVIC_Init(0,0,RTC_IRQChannel,2);//优先级设置    
RTC_Get();//更新时间 
return 0; //ok
}

if(RTC->CRL&0x0002)//闹钟中断
{
  
RTC->CRL&=~(0x0002); //清闹钟中断
if(alarm.weekmask&(1<<calendar.week))
{
alarm.ringsta|=1<<7;//标记为闹铃状态.
if(alarm.ringsta&1<<7)
{
printf("MIN:%d\r\n",calendar.min);
}   
}
calendar_alarm_init(&alarm);//重新设置下一次闹铃
}
 
int main(void)
{
u8 t;   
  Stm32_Clock_Init(9); //系统时钟设置
uart_init(72,9600); //串口初始化为9600
delay_init(72);   //延时初始化 

        RTC_Init(); 
alarm_set(13,17);
calendar_alarm_init(&alarm);
       


程序进来RTC_Init(); 允许闹钟中断 ,alarm_set(13,17);设置闹钟值,然后在初始化 calendar_alarm_init(&alarm); 把闹钟值放进RTC->ALRH寄存器,然后等待闹钟中断,在中断里重置闹钟值,
为什么进不了闹钟中断

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-10 09:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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