你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32F413的实时时钟

[复制链接]
jinglixixi 提问时间:2016-12-18 10:50 /
由于STM32F413(STM32官网的内部集成有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 ST金币 +10 收起 理由
zero99 + 10

查看全部评分

收藏 3 评论17 发布时间:2016-12-18 10:50

举报

17个回答
lzts 回答时间:2016-12-18 11:11:51
用IIC显示屏是好方法.用户键可用长按,点按配合显示解决按键少的问题
jinglixixi 回答时间:2016-12-20 10:04:32
zero99 发表于 2016-12-19 14:38
感谢分享,楼主的F413到手了啊

咳,相应号召没在咋社区申请,只在它处得了个试用的机会,马上就要寄回去了。
zero99 回答时间:2016-12-21 16:33:21
jinglixixi 发表于 2016-12-20 10:04
咳,相应号召没在咋社区申请,只在它处得了个试用的机会,马上就要寄回去了。 ...

嗯,是的,谢谢您的分享
jackten 回答时间:2016-12-18 11:11:03
谢谢分享                  
leo121_3006061 回答时间:2016-12-18 20:00:08
谢谢分享
5265325 回答时间:2016-12-19 08:13:06
:lol:lol
小小超 回答时间:2016-12-19 08:20:06
谢谢分享!!
jinglixixi 回答时间:2016-12-19 09:05:23
lzts 发表于 2016-12-18 11:11
用IIC显示屏是好方法.用户键可用长按,点按配合显示解决按键少的问题

有道理,只是不太好用。
jinglixixi 回答时间:2016-12-19 09:07:11
多谢支持。
zero99 回答时间:2016-12-19 14:38:04
感谢分享,楼主的F413到手了啊
五哥1 回答时间:2016-12-19 19:43:35
这个我在401CC上试过
jinglixixi 回答时间:2016-12-20 10:01:29
五哥1 发表于 2016-12-19 19:43
这个我在401CC上试过

巧了,我也是先在F401上试的,然后又移到F13上,哈哈...
zbber 回答时间:2016-12-20 13:18:57
谢谢分享,好帖子顶一顶!感谢楼主
jinglixixi 回答时间:2016-12-20 13:58:21
zbber 发表于 2016-12-20 13:18
谢谢分享,好帖子顶一顶!感谢楼主

多谢支持!!!
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版