2回答

1收藏

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

#线上活动 #线上活动 2155 人阅读 | 2 人回复 | 2016-12-18

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

显示效果图

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 +10 收起 理由
loveeeboard + 10

查看全部评分

分享到:
回复

使用道具 举报

回答|共 2 个

倒序浏览

沙发

jackten

发表于 2016-12-18 10:57:29 | 只看该作者

谢谢分享                              
板凳

jinglixixi

发表于 2016-12-18 11:17:47 | 只看该作者

jackten 发表于 2016-12-18 10:57
谢谢分享

多谢支持!
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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