查看: 136|回复: 0

[原创] NUCLEO_F767ZI实现RTC实时时钟

[复制链接]

54

主题

1

好友

824

积分

举人

Rank: 4

  • TA的每日心情
    奋斗
    昨天 09:25
  • 签到天数: 199 天

    [LV.7]常住居民III

    爱板会员勋章 活跃会员勋章

    发表于 2016-11-8 11:06:17 |显示全部楼层
    利用NUCLEO_F767ZI开发板自身所具备的RTC,配以OLED显示屏可实现实时时钟计时功能,其效果如图1所示。
    为了便于在OLED屏上实现中文显示,可以PCtoLCD2002字模提取软件来构建小字库,其排列顺序如图2所示。
    图片1.png

    1 RTC实时时钟
    图片2.png

    2 字模提取

    在构建小字库后,可通过下面的程序来实现显示界面的布局。
    1. void jm()
    2. {
    3.         OLED_Clear();
    4.         OLED_ShowString(18,0,"RTC",16);
    5.         OLED_ShowCHinese(42,0,14);  
    6.         OLED_ShowCHinese(60,0,3);  
    7.         OLED_ShowCHinese(78,0,3);  
    8.         OLED_ShowCHinese(96,0,15);
    9.         OLED_ShowString(0,2,"2016",16);
    10.         OLED_ShowCHinese(32,2,0);   
    11.         OLED_ShowString(50,2,"11",16);
    12.         OLED_ShowCHinese(68,2,1);
    13.         OLED_ShowString(86,2," 7",16);
    14.         OLED_ShowCHinese(104,2,2);  
    15.         OLED_ShowString(16,4,"12",16);
    16.         OLED_ShowCHinese(32,4,3);   
    17.         OLED_ShowString(50,4,"30",16);
    18.         OLED_ShowCHinese(68,4,4);
    19.         OLED_ShowString(86,4,"00",16);
    20.         OLED_ShowCHinese(104,4,5);   
    21.         OLED_ShowCHinese(40,6,6);  
    22.         OLED_ShowCHinese(60,6,7);         
    23.         OLED_ShowCHinese(80,6,8);
    24. }
    复制代码
        在使用HAL库的基础上,通过对RTC设置与读取函数的调用,可实现RTC的实时时钟计时功能,其主函数的内容如下:
    1. int main(void)
    2. {
    3.       RTC_TimeTypeDef RTC_TimeStruct;
    4.       RTC_DateTypeDef RTC_DateStruct;
    5.       u8 t=0;                 
    6.       HAL_Init();                                              
    7.       Stm32_Clock_Init(432,25,2,9);   
    8.       delay_init(216);               
    9.       LED_Init();        //  LED初始化               
    10.       RTC_Init();        //  RTC初始化                 
    11.       RTC_Set_WakeUp(RTC_WAKEUPCLOCK_CK_SPRE_16BITS,0);
    12.              OLED_Init();             //        OLED初始化         
    13.              OLED_Clear();      //   清屏
    14.              jm();               //   显示界面

    15.      RTC_Set_Time(12,30,0,RTC_HOURFORMAT12_AM);   //  设置时间
    16.      RTC_Set_Date(16,11,7,1);                            //   设置日期
    17.      while(1)
    18.      {
    19.                 t++;
    20.                 if((t%10)==0)       
    21.                 {    //  读取时间值
    22.           HAL_RTC_GetTime(&RTC_Handler,&RTC_TimeStruct,RTC_FORMAT_BIN);
    23.           //  显示时间值
    24.                         OLED_ShowNum(16,4,RTC_TimeStruct.Hours,2,16);
    25.                         OLED_ShowNum(50,4,RTC_TimeStruct.Minutes,2,16);
    26.           OLED_ShowNum(86,4,RTC_TimeStruct.Seconds,2,16);       
    27.           //        读取日期值               
    28.           HAL_RTC_GetDate(&RTC_Handler,&RTC_DateStruct,RTC_FORMAT_BIN);
    29.           //    显示日期值
    30.                         OLED_ShowNum(16,2,RTC_DateStruct.Year,2,16);
    31.                         OLED_ShowNum(50,2,RTC_DateStruct.Month,2,16);
    32.           OLED_ShowNum(86,2,RTC_DateStruct.Date,2,16);                                     
    33.                         if(RTC_DateStruct.WeekDay<7)                 //   读取星期值并显示              
    34.              OLED_ShowCHinese(80,6,7+RTC_DateStruct.WeekDay);
    35.                         else OLED_ShowCHinese(80,6,2);
    36.                     }
    37.                 if((t%20)==0)  LED0_Toggle;                       //    指示灯闪烁提示
    38.      delay_ms(10);
    39.         }  
    40. }
    复制代码
        受开发板上只有一个USER键的制约,这里没有提供RTC的时钟校正处理,只是以指定数值的方式设置RTC的初始值。若再扩展一个输入键,则可实时地对RTC的值进行调整。

    回复

    使用道具 举报

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

    关闭

    站长推荐上一条 /6 下一条


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-8 00:51 , Processed in 0.171804 second(s), 12 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部