查看: 139|回复: 0

基于STM32L496的RTC计时器

[复制链接]

主题

好友

4925

积分

状元

  • TA的每日心情
    奋斗
    2019-7-10 13:53
  • 签到天数: 1009 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2017-5-12 09:13:09 |显示全部楼层
    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);  }}
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /2 下一条

    手机版|电路城

    GMT+8, 2019-8-24 13:40 , Processed in 0.121174 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz!

    返回顶部