资深版主
- 积分
- 4306
- 金钱
- 4306
- 注册时间
- 2018-6-30
- 在线时间
- 808 小时
|
本帖最后由 1208 于 2018-12-19 12:34 编辑
mini板子RTC闹钟实验:当到达指定的时间闹钟灯就会亮,
按键KEY0按下灯就会熄灭,如果按键没按,灯10s后也会自动熄灭
战舰板子RTC闹钟实验:当到达指定的时间闹钟就会响,
按键KEY0按下灯就会停止,如果按键没按,灯10s后也会自动停止
1)RTC闹钟时钟实验 每次使用都要修改指定的后备寄存器中读出数据0x5050,重新下载
才能显示闹钟,让灯亮起来。(重新复位后是不能使用闹钟的)
if (BKP_ReadBackupRegister(BKP_DR1) != 0x5051) //每次重新下载要改
2)闹钟会在10s后响应
RTC_Set(2018,4,8,21,34,50); //设置时间
RTC_WaitForLastTask();
RTC_WaitForSynchro();
ALR_Set(2018,4,8,21,35,0); //设置闹钟
按键KEY0按下灯就会熄灭,如果按键没按,灯10s后也会自动熄灭
if(KEY0==0)
{
BEEP = 0;
}
if(count>20) //只会亮10s,跟时钟是同步走的
{
BEEP = 0;
count = 0 ;
}
3)要开启闹钟相应,则要先启动中断线17,下面中文参考手册17的资料
若ALRF=1且ALRIE=1,则允许产生RTC全局中断。如果在EXTI控制器中允许产生EXTI线 17
中断,则允许产生RTC全局中断和RTC闹钟中断。
若ALRF=1,如果在EXTI控制器中设置了EXTI线 17的中断模式,则允许产生RTC闹钟中断;
如果在EXTI控制器中设置了EXTI线 17的事件模式,则这条线上会产生一个脉冲(不会产生RTC
闹钟中断)
EXTI_ClearITPendingBit(EXTI_Line17);
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Line = EXTI_Line17;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
//闹钟中断
void RTCAlarm_IRQHandler(void)
{
if(RTC_GetITStatus(RTC_IT_ALR) != RESET)
{
BEEP = 1;
}
EXTI_ClearITPendingBit(EXTI_Line17);
RTC_WaitForLastTask();
RTC_ClearITPendingBit(RTC_IT_ALR);
RTC_WaitForLastTask();
}
4)切记要开中断,否则闹钟不会相应
RTC_ITConfig(RTC_IT_SEC|RTC_IT_ALR, ENABLE); //使能RTC秒中断和闹钟中断
我将时间的计数放在秒中断里面RTC时钟中断,每秒可以触发一次,
这样做的目的是起到定时关掉闹钟的效果
extern int count;
void RTC_IRQHandler(void)
{
if(RTC_GetITStatus(RTC_IT_SEC)!=RESET)
{
RTC_Get();
count++;
}
RTC_ClearITPendingBit(RTC_IT_OW|RTC_IT_SEC);
RTC_WaitForLastTask();
}
5)声明闹钟结构体
_alr_obj ALR; //闹钟结构体
typedef struct
{
vu8 year;
vu8 month;
vu8 day;
vu8 hour;
vu8 min;
vu8 sec;
}_alr_obj;
|
|