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

查看: 4405|回复: 17

[STM32F413] 基于STM32F413的实时时钟

[复制链接]

59

主题

1666

回帖

17

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2016-12-18 10:50: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. }
复制代码
    细心观察的你此时可能会发现一个问题,那就是起始时间的设置问题,由于在开发板上只提供了一个用户键,因此你至少需要再为它再添加一个键来与板上的用户键相配合,以完成起始时间的设置处理,感兴趣的你不妨一试。





评分

参与人数 1ST金币 +10 收起 理由
zero99 + 10

查看全部评分

回复

使用道具 举报

2

主题

794

回帖

2

蝴蝶豆

金牌会员

最后登录
2019-3-6
发表于 2016-12-18 11:11:51 | 显示全部楼层
用IIC显示屏是好方法.用户键可用长按,点按配合显示解决按键少的问题
回复 支持 1 反对 0

使用道具 举报

10

主题

693

回帖

0

蝴蝶豆

金牌会员

最后登录
2018-6-15
发表于 2016-12-18 11:11:03 | 显示全部楼层
谢谢分享                  
回复 支持 反对

使用道具 举报

6

主题

1026

回帖

7

蝴蝶豆

金牌会员

最后登录
2020-11-25
发表于 2016-12-18 20:00:08 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

11

主题

449

回帖

0

蝴蝶豆

金牌会员

最后登录
2018-12-18
发表于 2016-12-19 08:13:06 | 显示全部楼层
:lol:lol
回复 支持 反对

使用道具 举报

27

主题

1709

回帖

42

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2016-12-19 08:20:06 | 显示全部楼层
谢谢分享!!
回复 支持 反对

使用道具 举报

59

主题

1666

回帖

17

蝴蝶豆

论坛元老

最后登录
2020-12-9
 楼主| 发表于 2016-12-19 09:05:23 | 显示全部楼层
lzts 发表于 2016-12-18 11:11
用IIC显示屏是好方法.用户键可用长按,点按配合显示解决按键少的问题

有道理,只是不太好用。
回复 支持 反对

使用道具 举报

59

主题

1666

回帖

17

蝴蝶豆

论坛元老

最后登录
2020-12-9
 楼主| 发表于 2016-12-19 09:07:11 | 显示全部楼层
多谢支持。
回复 支持 反对

使用道具 举报

1182

主题

3785

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-3-17
发表于 2016-12-19 14:38:04 | 显示全部楼层
感谢分享,楼主的F413到手了啊
回复 支持 反对

使用道具 举报

19

主题

1714

回帖

7

蝴蝶豆

论坛元老

最后登录
2020-10-25
发表于 2016-12-19 19:43:35 | 显示全部楼层
这个我在401CC上试过
回复 支持 反对

使用道具 举报

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