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

查看: 4442|回复: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版