查看: 174|回复: 2

[原创] 【赚周年币】技术贴 基于STM32F413的实时时钟

[复制链接]

94

主题

2

好友

1988

积分

进士

Rank: 5Rank: 5

  • TA的每日心情
    奋斗
    7 分钟前
  • 签到天数: 394 天

    连续签到: 1 天

    [LV.9]以坛为家II

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

    发表于 2016-12-18 10:44:36 |显示全部楼层
    由于STM32F413的内部集成有RTC,,这就为实时时钟的制作通过了方便,我们只需在配套的RTC例程基础上为其添加相应的显示器件即可。
    从成本及方便性考虑,为它配置一个IIC接口的双色OLED屏是最经济的,下图即为其使用效果。
    图片2.png

    显示效果图

    OLED屏与STM32F413是如何连接的呢?
    你只需找到板上印有AVDDGNDPA5PA6的引脚,如何将OLED屏的引脚插到板子上即可,怎么样很简单吧,你不需要进行任何的连线处理。

    主程序则应改为如下的内容:
    1. int main(void)
    2. {
    3.   /* STM32F4xx HAL library initialization:
    4.        - Configure the Flash prefetch, instruction and Data caches
    5.        - Configure the Systick to generate an interrupt each 1 msec
    6.        - Set NVIC Group Priority to 4
    7.        - Global MSP (MCU Support Package) initialization
    8.      */
    9.   HAL_Init();

    10.   /* Configure LED2 */
    11.   BSP_LED_Init(LED2);

    12.   /* Configure the system clock to 100 MHz */
    13.   SystemClock_Config();
    14.   Lcd_Init();  
    15.   OLED_ShowString(2,0,"STM32F413-RTC",16);
    16.   OLED_ShowString(2,2,"Nucleo-144",16);
    17.   OLED_ShowString(2,4,"1.5MB Flash",16);
    18.   OLED_ShowString(2,6,"320-KB SRAM",16);
    19.   delay_ms(1000);
    20.   OLED_Clear();
    21.   OLED_ShowString(2,0,"STM32F413-RTC",16);
    22.   while(1);
    23.        
    24.   /*##-1- Configure the RTC peripheral #######################################*/
    25.   /* Configure RTC prescaler and RTC data registers */
    26.   /* RTC configured as follow:
    27.       - Hour Format    = Format 24
    28.       - Asynch Prediv  = Value according to source clock
    29.       - Synch Prediv   = Value according to source clock
    30.       - OutPut         = Output Disable
    31.       - OutPutPolarity = High Polarity
    32.       - OutPutType     = Open Drain
    33.   */
    34.   RtcHandle.Instance = RTC;
    35.   RtcHandle.Init.HourFormat = RTC_HOURFORMAT_24;
    36.   RtcHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;
    37.   RtcHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV;
    38.   RtcHandle.Init.OutPut = RTC_OUTPUT_DISABLE;
    39.   RtcHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
    40.   RtcHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
    41.   
    42.   if(HAL_RTC_Init(&RtcHandle) != HAL_OK)
    43.   {
    44.     /* Error */
    45.     Error_Handler();
    46.   }
    47.   /*##-2- Check if Data stored in BackUp register0: No Need to reconfigure RTC#*/
    48.   /* Read the BackUp Register 0 Data */
    49.   if(HAL_RTCEx_BKUPRead(&RtcHandle, RTC_BKP_DR0) != 0x32F2)
    50.   {  
    51.     /* Configure RTC Calendar */
    52.     RTC_CalendarConfig();
    53.   }
    54.   /* Infinite loop */  
    55.   while (1)
    56.   {
    57.     /*##-3- Display the updated Time and Date ################################*/
    58.     RTC_CalendarShow(aShowTime, aShowDate);
    59.   }
    60. }
    复制代码
    其实还有一个地方是最需要修改的,那就是RTC_CalendarShow()函数,其修改后的内容如下:
    1. static void RTC_CalendarShow(uint8_t *showtime, uint8_t *showdate)
    2. {
    3.   RTC_DateTypeDef sdatestructureget;
    4.   RTC_TimeTypeDef stimestructureget;
    5.   
    6.   /* Get the RTC current Time */
    7.   HAL_RTC_GetTime(&RtcHandle, &stimestructureget, RTC_FORMAT_BIN);
    8.   /* Get the RTC current Date */
    9.   HAL_RTC_GetDate(&RtcHandle, &sdatestructureget, RTC_FORMAT_BIN);
    10.        
    11.   OLED_ShowString(2,2,"           ",16);
    12.   OLED_ShowString(2,4,"           ",16);
    13.   OLED_ShowNum(4,2,2000 + sdatestructureget.Year,4,16);
    14.   OLED_ShowChar(36,2,':',16);
    15.   OLED_ShowNum(44,2,sdatestructureget.Month,2,16);
    16.   OLED_ShowChar(60,2,':',16);
    17.   OLED_ShowNum(68,2,sdatestructureget.Date,2,16);
    18.        
    19.   OLED_ShowNum(20,4,stimestructureget.Hours,2,16);
    20.   OLED_ShowChar(36,4,':',16);
    21.   OLED_ShowNum(44,4,stimestructureget.Minutes,2,16);
    22.   OLED_ShowChar(60,4,':',16);
    23.   OLED_ShowNum(68,4,stimestructureget.Seconds,2,16);
    24.        
    25.   #ifdef DISPLAY_ON_DUBUGGER
    26.   /* Display time Format: hh:mm:ss */
    27.   sprintf((char*)showtime,"%02d:%02d:%02d",stimestructureget.Hours,  stimestructureget.Minutes, stimestructureget.Seconds);
    28.   /* Display date Format: mm-dd-yy */
    29.   sprintf((char*)showdate,"%02d-%02d-%02d",sdatestructureget.Month, sdatestructureget.Date, 2000 + sdatestructureget.Year);
    30.   #endif
    31. }
    复制代码
        细心观察的你此时可能会发现一个问题,那就是起始时间的设置问题,由于在开发板上只提供了一个用户键,因此你至少需要再为它再添加一个键来与板上的用户键相配合,以完成起始时间的设置处理,感兴趣的你不妨一试。

    已有 1 人评分 收起 理由
    loveeeboard + 10

    总评分:  + 10   查看全部评分

    回复

    使用道具 举报

    5

    主题

    1

    好友

    1294

    积分

    进士

    Rank: 5Rank: 5

  • TA的每日心情
    擦汗
    2017-7-11 13:55
  • 签到天数: 180 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2016-12-18 10:57:29 |显示全部楼层
    谢谢分享                              
    回复

    使用道具 举报

    94

    主题

    2

    好友

    1988

    积分

    进士

    Rank: 5Rank: 5

  • TA的每日心情
    奋斗
    7 分钟前
  • 签到天数: 394 天

    连续签到: 1 天

    [LV.9]以坛为家II

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

    发表于 2016-12-18 11:17:47 |显示全部楼层
    jackten 发表于 2016-12-18 10:57
    谢谢分享

    多谢支持!
    回复

    使用道具 举报

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

    关闭

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

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

    GMT+8, 2017-7-23 16:34 , Processed in 0.179151 second(s), 13 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部