基于STM32L496的RTC计时器

作者: jinglixixi
上传时间为: 2017-05-12 09:13 AM
2017-05-12
阅读:

      STM32L496内置了RTC,完成只需为其配置一个合适的显示器即可实现计时功能。本打算为它配置一个TFT显示屏,然而耗费了大段时间也为如愿,甚是感到奇怪。因为就频率来讲L432与它同为80MHZ,在L432上能实现似乎在L496上应该也可以。此外,F769、F413等主频也都比它高,且也均能驱动,独独L496却难实现。

随后也测试了以LCD5110和OLED屏显示,L496与F767、F413等均能驱动显示。从节省GPIO口的角度出发,这里就为其配置一个IIC接口的OLED屏来实现RTC计时功能。

经实际测试,使用NUCLEO系列的Arduino接口即可直接实现连接,故使用起来十分方便。

OLED屏与L496的连接关系为:

SCLK -- PA.5 SDIN -- PA.6

为达到图示的工作效果,主要涉及的OLED函数是初始化函数、字符显示函数、数值显示函数及字符串显示函数。此外,还需对RTC显示函数加以修改,修改后的程序内容如下:

static void RTC_CalendarShow(void)
{
    RTC_DateTypeDef sdatestructureget;
    RTC_TimeTypeDef stimestructureget;
    uint8_t p;
    /* 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);
    p=stimestructureget.Seconds;
	OLED_ShowNum(88,2,p,2,16);
	OLED_ShowChar(56,2,':',16);
	p=stimestructureget.Minutes;
	OLED_ShowNum(64,2,p,2,16);
	OLED_ShowChar(80,2,':',16);
        p=stimestructureget.Hours;
	OLED_ShowNum(40,2,p,2,16);
	p=sdatestructureget.Date;
	OLED_ShowNum(88,4,p,2,16);
	OLED_ShowChar(56,4,'-',16);
	p=sdatestructureget.Month;
	OLED_ShowNum(64,4,p,2,16);
	OLED_ShowChar(80,4,'-',16);
        p=sdatestructureget.Year;
	OLED_ShowNum(24,4,2000+p,4,16);
	OLED_ShowString(24,6,"week:",16);
	p=sdatestructureget.WeekDay;
	OLED_ShowNum(64,6,p,2,16);
	
}

对应的主函数为:

int main(void)
{
 
  HAL_Init();
  /* Configure the system clock to 80 MHz */
  SystemClock_Config();
  BSP_LED_Init(LED3);
  __HAL_RTC_RESET_HANDLE_STATE(&RtcHandle);
  RtcHandle.Instance           = RTC;
  RtcHandle.Init.HourFormat     = RTC_HOURFORMAT_12;
  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)
  {
    /* Initialization Error */
    Error_Handler(); 
  }

  /*##-2-  Configure RTC Timestamp ############################################*/
  RTC_TimeStampConfig();
  OLED_Init();			 
  OLED_Clear();
  OLED_ShowString(58,0,"RTC",16);	
  OLED_ShowString(18,2,"jinglixixi",16);
  OLED_ShowString(18,4,"2017.5.10",16);
  HAL_Delay(1000);
  HAL_Delay(1000);
  OLED_Clear();
  OLED_ShowString(58,0,"RTC",16);	
  /* Infinite loop */  
  while (1)
  {
        RTC_CalendarShow();
        HAL_Delay(100);
  }
}

全部评论 ()
条评论
写评论

创建讨论帖子

登录 后参与评论
系统提示