jinglixixi 发表于 2016-12-18 10:50:50

基于STM32F413的实时时钟

由于STM32F413(STM32官网)的内部集成有RTC,,这就为实时时钟的制作通过了方便,我们只需在配套的RTC例程基础上为其添加相应的显示器件即可。从成本及方便性考虑,为它配置一个IIC接口的双色OLED屏是最经济的,下图即为其使用效果。显示效果图
那OLED屏与STM32F413是如何连接的呢?你只需找到板上印有AVDD、GND、PA5、PA6的引脚,如何将OLED屏的引脚插到板子上即可,怎么样很简单吧,你不需要进行任何的连线处理。主程序则应改为如下的内容:int main(void)
{
/* STM32F4xx HAL library initialization:
       - Configure the Flash prefetch, instruction and Data caches
       - Configure the Systick to generate an interrupt each 1 msec
       - Set NVIC Group Priority to 4
       - Global MSP (MCU Support Package) initialization
   */
HAL_Init();

/* Configure LED2 */
BSP_LED_Init(LED2);

/* Configure the system clock to 100 MHz */
SystemClock_Config();
Lcd_Init();
OLED_ShowString(2,0,"STM32F413-RTC",16);
OLED_ShowString(2,2,"Nucleo-144",16);
OLED_ShowString(2,4,"1.5MB Flash",16);
OLED_ShowString(2,6,"320-KB SRAM",16);
delay_ms(1000);
OLED_Clear();
OLED_ShowString(2,0,"STM32F413-RTC",16);
while(1);
      
/*##-1- Configure the RTC peripheral #######################################*/
/* Configure RTC prescaler and RTC data registers */
/* RTC configured as follow:
      - Hour Format    = Format 24
      - Asynch Prediv= Value according to source clock
      - Synch Prediv   = Value according to source clock
      - OutPut         = Output Disable
      - OutPutPolarity = High Polarity
      - OutPutType   = Open Drain
*/
RtcHandle.Instance = RTC;
RtcHandle.Init.HourFormat = RTC_HOURFORMAT_24;
RtcHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;
RtcHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV;
RtcHandle.Init.OutPut = RTC_OUTPUT_DISABLE;
RtcHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
RtcHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;

if(HAL_RTC_Init(&RtcHandle) != HAL_OK)
{
    /* Error */
    Error_Handler();
}
/*##-2- Check if Data stored in BackUp register0: No Need to reconfigure RTC#*/
/* Read the BackUp Register 0 Data */
if(HAL_RTCEx_BKUPRead(&RtcHandle, RTC_BKP_DR0) != 0x32F2)
{
    /* Configure RTC Calendar */
    RTC_CalendarConfig();
}
/* Infinite loop */
while (1)
{
    /*##-3- Display the updated Time and Date ################################*/
    RTC_CalendarShow(aShowTime, aShowDate);
}
}其实还有一个地方是最需要修改的,那就是RTC_CalendarShow()函数,其修改后的内容如下:static void RTC_CalendarShow(uint8_t *showtime, uint8_t *showdate)
{
RTC_DateTypeDef sdatestructureget;
RTC_TimeTypeDef stimestructureget;

/* Get the RTC current Time */
HAL_RTC_GetTime(&RtcHandle, &stimestructureget, RTC_FORMAT_BIN);
/* Get the RTC current Date */
HAL_RTC_GetDate(&RtcHandle, &sdatestructureget, RTC_FORMAT_BIN);
      
OLED_ShowString(2,2,"         ",16);
OLED_ShowString(2,4,"         ",16);
OLED_ShowNum(4,2,2000 + sdatestructureget.Year,4,16);
OLED_ShowChar(36,2,':',16);
OLED_ShowNum(44,2,sdatestructureget.Month,2,16);
OLED_ShowChar(60,2,':',16);
OLED_ShowNum(68,2,sdatestructureget.Date,2,16);
      
OLED_ShowNum(20,4,stimestructureget.Hours,2,16);
OLED_ShowChar(36,4,':',16);
OLED_ShowNum(44,4,stimestructureget.Minutes,2,16);
OLED_ShowChar(60,4,':',16);
OLED_ShowNum(68,4,stimestructureget.Seconds,2,16);
      
#ifdef DISPLAY_ON_DUBUGGER
/* Display time Format: hh:mm:ss */
sprintf((char*)showtime,"%02d:%02d:%02d",stimestructureget.Hours,stimestructureget.Minutes, stimestructureget.Seconds);
/* Display date Format: mm-dd-yy */
sprintf((char*)showdate,"%02d-%02d-%02d",sdatestructureget.Month, sdatestructureget.Date, 2000 + sdatestructureget.Year);
#endif
}    细心观察的你此时可能会发现一个问题,那就是起始时间的设置问题,由于在开发板上只提供了一个用户键,因此你至少需要再为它再添加一个键来与板上的用户键相配合,以完成起始时间的设置处理,感兴趣的你不妨一试。





相关文档:
Nucleo-F413ZH官方技术文档
STM32F413产品详情及选型
STM32F4产品线简介
STM32F4参考设计
STM32官方开发工具一览
STM32F413参考手册

STM32F413数据手册DS11580

STM32F413数据手册DS11581


lzts 发表于 2016-12-18 11:11:51

用IIC显示屏是好方法.用户键可用长按,点按配合显示解决按键少的问题

jackten 发表于 2016-12-18 11:11:03

谢谢分享                  

leo121_3006061 发表于 2016-12-18 20:00:08

谢谢分享

5265325 发表于 2016-12-19 08:13:06

:lol:lol:lol:lol:lol:lol:lol:lol:lol:lol:lol:lol

ts2000 发表于 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到手了啊:lol

五哥1 发表于 2016-12-19 19:43:35

这个我在401CC上试过
页: [1] 2
查看完整版本: 基于STM32F413的实时时钟