打印
[STM32F7]

NUCLEO_F767ZI实现RTC实时时钟

[复制链接]
681|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
利用NUCLEO_F767ZI开发板自身所具备的RTC,配以OLED显示屏可实现实时时钟计时功能,其效果如图1所示。
为了便于在OLED屏上实现中文显示,可以PCtoLCD2002字模提取软件来构建小字库,其排列顺序如图2所示。
              图1 RTC实时时钟
                  图2 字模提取

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

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

沙发
songchenping| | 2016-11-8 09:03 | 只看该作者
谢谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

464

主题

2783

帖子

38

粉丝