说明:战舰v3 没有LCD所以用串口usmart调试查看设置时间 ,以及闹铃到点打印。
创建rtc.c rtc.h文件 包含路径什么的操作都和ADC实验是一样的。
打印时间的函数定义为test_fun(),我直接写在main.c里面了
void test_fun(){ printf("Time:%d-%d-%d %d:%d:%d\n",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);//输出闹铃时间 }
将这个函数添加在usmart_config.c里面
struct _m_usmart_nametab usmart_nametab[]= { #if USMART_USE_WRFUNS==1 //如果使能了读写操作 (void*)read_addr,"u32 read_addr(u32 addr)", (void*)write_addr,"void write_addr(u32 addr,u32 val)", #endif (void*)delay_ms,"void delay_ms(u16 nms)", (void*)delay_us,"void delay_us(u32 nus)", (void*)RTC_Set,"u8 RTC_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)", (void*)RTC_Alarm_Set,"u8 RTC_Alarm_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec)", (void*)test_fun,"void test_fun()", };
为了得到闹钟的时间,我们在rtc.c中,重新定义一个_calendar_obj 类型的结构体alarm,用来存储闹钟的时间。在RTC_Alarm_Set函数中进行赋值。
u8 RTC_Alarm_Set(u16 syear,u8 smon,u8 sday,u8 hour,u8 min,u8 sec) { u16 t; u32 seccount=0; if(syear<1970||syear>2099)return 1; for(t=1970;t
在rtc.h头文件中添加
extern _calendar_obj alarm;
在main函数中比较现在的时间和闹铃时间,如果相同就打印时间,我只比较了小时和分钟。
if((alarm.hour==calendar.hour)&&(alarm.min==calendar.min))
{
test_fun();
}
整个main函数:
int main(void)
{
u8 t=0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
LCD_Init();
usmart_dev.init(SystemCoreClock/1000000); //初始化USMART
RTC_Init(); //RTC初始化
POINT_COLOR=RED;//设置字体为红色
LCD_ShowString(60,50,200,16,16,"WarShip STM32");
LCD_ShowString(60,70,200,16,16,"RTC TEST");
LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(60,110,200,16,16,"2015/1/14");
//显示时间
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(60,130,200,16,16," - - ");
LCD_ShowString(60,162,200,16,16," : : ");
while(1)
{
if(t!=calendar.sec)
{
t=calendar.sec;
if((alarm.hour==calendar.hour)&&(alarm.min==calendar.min))
{
test_fun();
}
LCD_ShowNum(60,130,calendar.w_year,4,16);
LCD_ShowNum(100,130,calendar.w_month,2,16);
LCD_ShowNum(124,130,calendar.w_date,2,16);
switch(calendar.week)
{
case 0:
LCD_ShowString(60,148,200,16,16,"Sunday ");
break;
case 1:
LCD_ShowString(60,148,200,16,16,"Monday ");
break;
case 2:
LCD_ShowString(60,148,200,16,16,"Tuesday ");
break;
case 3:
LCD_ShowString(60,148,200,16,16,"Wednesday");
break;
case 4:
LCD_ShowString(60,148,200,16,16,"Thursday ");
break;
case 5:
LCD_ShowString(60,148,200,16,16,"Friday");
break;
case 6:
LCD_ShowString(60,148,200,16,16,"Saturday ");
break;
}
LCD_ShowNum(60,162,calendar.hour,2,16);
LCD_ShowNum(84,162,calendar.min,2,16);
LCD_ShowNum(108,162,calendar.sec,2,16);
LED0=!LED0;
}
delay_ms(10);
};
}
实验结果:
在串口发送
点击发送RTC_Set设置时间,RTC_Alarm_Set设置闹钟,这里设置现在的时间为20:30 ,闹钟20:34,因为只检测分钟,所以当到了20:34的时候,会每隔一秒钟发送一次时间。 使用test_fun()可以随时查看时间。
可以看到 34分是闹钟响了一分钟。