OpenEdv-开源电子网

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

RTC闹钟不会弄,求指导,我这几天刚整明白建模版,点小灯,问题小白,见谅啊 ,这个RTC真的晕了@@

[复制链接]

85

主题

378

帖子

0

精华

高级会员

Rank: 4

积分
902
金钱
902
注册时间
2013-4-29
在线时间
87 小时
发表于 2013-9-17 11:23:17 | 显示全部楼层 |阅读模式
搜了一下,有点益处但是还是没弄明白,//RTC中断服务函数
void RTC_IRQHandler(void)
{    
if(RTC->CRL&0x0001)//秒钟中断
{
RTC_Get();//更新时间  
}
if(RTC->CRL&0x0002)//闹钟中断
{
RTC->CRL&=~(0x0002);//清闹钟中断
//闹钟处理
}    
RTC->CRL&=0X0FFA;         //清除溢出,秒钟中断标志
while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成      
}
程序里没有说如何设置闹铃昂,没整明白
void calendar_alarm_init(_alarm_obj *alarmx)  
{    
   u32 curtime=0; 
u32 temptime=0; 
u32 destime=0XFFFFFFFF;//目标闹铃时间(s)设定到最大
  if(alarmx->weekmask)//必须要有闹钟存在,周日到周六任意一天  
{         
curtime=RTC->CNTH;//得到计数器中的值(秒钟数) 
curtime<<=16; 
curtime+=RTC->CNTL;     
//取一个与当前时间最接近的值作为闹钟寄存器的内容 
temptime=curtime/86400; //得到当前运行天数(此处没有用到天数,仅作说明用) 
temptime=temptime*86400; 
  temptime+=(u32)alarmx->hour*3600+(u32)alarmx->min*60;//得到秒钟数 
  if(temptime<=curtime)temptime+=86400;//执行时间已过,推迟到明天 
  destime=temptime;//更改闹钟寄存器 
  } 
RCC->APB1ENR|=1<<28;//使能电源时钟 
    RCC->APB1ENR|=1<<27;//使能备份时钟 
PWR->CR|=1<<8;    //取消备份区写保护 
//上面三步是必须的! 
RTC->CRL|=1<<4;   //允许配置  
RTC->ALRL=destime&0xffff; 
RTC->ALRH=destime>>16; 
RTC->CRL&=~(1<<4);//配置更新 
while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成   


其中_alarm_obj的结构体定义如下: 
//闹钟结构体     
__packed typedef struct   
{        
u8  weekmask; //闹钟响铃掩码    
u8  ringsta; //闹铃状态及铃声标志. 
//[7]:0,无闹铃;1,闹铃中; 
//[6:3]:保留 
//[2:0]:闹钟铃声类型 
u8  hour;     //闹铃小时 
u8  min; //闹铃分钟

u8 saveflag; //保存标志,0X0A,保存过了;其他,还从未保存     
}_alarm_obj;
这个也没太看懂。。。
我想问就是如果设置10S后闹钟 是不是

RTC->ALRH=0;  
RTC->ALRL=10;就可以了啊 如果 设置12:10分闹铃怎么办呢
设置时间有RTC_Set(2009,12,2,10,0,55)函数如果闹铃也有一个类似功能函数就好了,那有没有可以MINI板跑起来的闹铃程序啊,学习一下,










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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-17 14:15:01 | 显示全部楼层
这个。。。
其实RTC真很简单啊。
我们的RTC例程,没做闹钟进去,所以没有RTC_Set之类的函数。
如果要,你可以很容易的修改啊,把RTC_Set里面的:
RTC->CRL|=1<<4;   //允许配置 
RTC->CNTL=seccount&0xffff;
RTC->CNTH=seccount>>16;
RTC->CRL&=~(1<<4);//配置更新
改为:
RTC->CRL|=1<<4;   //允许配置 
RTC->ALRL=seccount&0xffff;
RTC->ALRH=seccount>>16;
RTC->CRL&=~(1<<4);//配置更新
那就是设置闹钟时间了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

85

主题

378

帖子

0

精华

高级会员

Rank: 4

积分
902
金钱
902
注册时间
2013-4-29
在线时间
87 小时
 楼主| 发表于 2013-9-17 15:16:09 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
谢原子哥,明白了,我改改调一下,那闹钟中断分组 是不是要设置一下啊
回复 支持 反对

使用道具 举报

85

主题

378

帖子

0

精华

高级会员

Rank: 4

积分
902
金钱
902
注册时间
2013-4-29
在线时间
87 小时
 楼主| 发表于 2013-9-17 15:17:58 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
两个中断在一起昂void RTC_IRQHandler(void)
{     
if(RTC->CRL&0x0001)//秒钟中断
{
RTC_Get();//更新时间   
}
if(RTC->CRL&0x0002)//闹钟中断
{
RTC->CRL&=~(0x0002);//清闹钟中断
//闹钟处理
}      
RTC->CRL&=0X0FFA;         //清除溢出,秒钟中断标志
while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成            
}
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-13 03:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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