搜索
查看: 1576|回复: 0

[分享] 【STM32G491试用】+240*240LCD简易小时钟

[复制链接]

该用户从未签到

14

主题

237

帖子

3

蝴蝶豆

金牌会员

最后登录
2023-1-28
发表于 2021-3-15 10:12:40 | 显示全部楼层 |阅读模式
今天我们配置下G491的RTC,并做一个简单的小时钟GUI,让它显示时间的变化。
有了STM32CUBEMX配置代码就是快啊!
首先我们使用外部的32.768K晶振,不使用内部的32K晶振。这样RTC精度会更好些!
使能外部LSE:
A1.png
配置外部LSE为RTC时钟:
A2.png
配置RTC(这里没有开启任何中断,我们通过查询来获取时间的变化):
A3.png

然后生成代码,这样就OK了。
在RTC的初始化这里,如果我们之前初始化过了,后备时钟寄存器有记录了,我们就跳过初始化,
这里我们要把生成的代码,修改一下(当然如果仅仅试验RTC,这里改不改就无所谓了)。
其实就是加了个是否第一次初始化的判断。
  1. /* RTC init function */
  2. void MX_RTC_Init(void)
  3. {
  4.   RTC_TimeTypeDef sTime = {0};
  5.   RTC_DateTypeDef sDate = {0};

  6.   /** Initialize RTC Only
  7.   */
  8.   hrtc.Instance = RTC;
  9.   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  10.   hrtc.Init.AsynchPrediv = 127;
  11.   hrtc.Init.SynchPrediv = 255;
  12.   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  13.   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
  14.   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  15.   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  16.   hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
  17.   if (HAL_RTC_Init(&hrtc) != HAL_OK)
  18.   {
  19.     Error_Handler();
  20.   }

  21.   /* USER CODE BEGIN Check_RTC_BKUP */
  22.    // 检查后备寄存器  看是否初次使用 是否第一次配置
  23. <font color="#ff0000">        uint32_t iSetFlag = 0x5058;// 这个标志值 0x5050值自己随意
  24.         if(iSetFlag != HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0))
  25.         {  </font>
  26.   /* USER CODE END Check_RTC_BKUP */

  27.   /** Initialize RTC and set the Time and Date
  28.   */
  29.   sTime.Hours = 14;
  30.   sTime.Minutes = 18;
  31.   sTime.Seconds = 5;
  32.   sTime.SubSeconds = 0;
  33.   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
  34.   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
  35.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
  36.   {
  37.     Error_Handler();
  38.   }
  39.   sDate.WeekDay = RTC_WEEKDAY_TUESDAY;
  40.   sDate.Month = RTC_MONTH_MARCH;
  41.   sDate.Date = 13;
  42.   sDate.Year = 21;

  43.   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
  44.   {
  45.     Error_Handler();
  46.   }
  47.   /* USER CODE BEGIN Check_RTC_BKUP */
  48. <font color="#ff0000">        //写入标志
  49.         HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,iSetFlag);//标记已经初始化过了
  50.   }</font>
  51.   /* USER CODE END Check_RTC_BKUP */
  52. }
复制代码
在main函数里面读取,并显示:
  1. RTC_TimeTypeDef RTC_TimeStruct;
  2. RTC_DateTypeDef RTC_DateStruct;
  3. u8 tbuf[40];
  4. u8 cnt=0;

  5.                         HAL_RTC_GetTime(&hrtc,&RTC_TimeStruct,RTC_FORMAT_BIN);
  6.                         sprintf((char*)tbuf,"%02d:%02d:%02d",RTC_TimeStruct.Hours,RTC_TimeStruct.Minutes,RTC_TimeStruct.Seconds);
  7. //                        //LCD_ShowString(30,0,tbuf,RED,WHITE,3,0);       
  8.                         LCD_ShowString(90,60,tbuf,RED,BLACK,16,0);       
  9.                         HAL_RTC_GetDate(&hrtc,&RTC_DateStruct,RTC_FORMAT_BIN);
  10.                         sprintf((char*)tbuf,"20%02d-%02d-%02d",RTC_DateStruct.Year,RTC_DateStruct.Month,RTC_DateStruct.Date);
  11.                         LCD_ShowString(80,60-16,tbuf,GBLUE,BLACK,16,0);       
  12.                         sprintf((char*)tbuf,"Week:%d",RTC_DateStruct.WeekDay);
  13.                         LCD_ShowString(95,180,tbuf,RED,BLACK,16,0);
复制代码
时钟相关的GUI,主要就是画圆,画刻度和指针(代码参考自网络):
  1. //时钟图形相关
  2. int xo=120,yo=120,zo=100,ro=120;//表心坐标z 指针长,圆大小

  3. void get_circle(int x,int y,int r,int col)
  4. {
  5.         int xc=0;
  6.         int yc,p;
  7.         yc=r;
  8.         p=3-(r<<1);       
  9.         while(xc <= yc)
  10.         {
  11.                 GUI_Dot(x+xc,y+yc,col);
  12.                 GUI_Dot(x+xc,y-yc,col);       
  13.                 GUI_Dot(x-xc,y+yc,col);
  14.                 GUI_Dot(x-xc,y-yc,col);
  15.                 GUI_Dot(x+yc,y+xc,col);       
  16.                 GUI_Dot(x+yc,y-xc,col);
  17.                 GUI_Dot(x-yc,y+xc,col);
  18.                 GUI_Dot(x-yc,y-xc,col);
  19.                 if(p<0)
  20.                 {
  21.                         p += (xc++ << 2) + 6;       
  22.                 }
  23.                 else
  24.                         p += ((xc++ - yc--)<<2) + 10;
  25.         }
  26. }
  27. void draw_circle(void)         //画圆
  28. {
  29.         get_circle(xo,yo,ro,YELLOW);
  30.         get_circle(xo,yo,(ro-1),YELLOW);
  31.         get_circle(xo,yo,(ro-2),YELLOW);
  32.         get_circle(xo,yo,(ro-3),YELLOW);
  33.         get_circle(xo,yo,5,YELLOW);                       
  34. }
  35. void draw_dotline(void)  //画格点
  36. {
  37.         u8 i;
  38.         u8 rome[][3]={"12","1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11" } ; //表盘数字
  39.         int x1,y1,x2,y2,x3,y3;
  40.        
  41.         for(i=0;i<60;i++)
  42.         {
  43.                 x1 = (int)(xo + (sin(i * PI / 30) * (ro-8)));               
  44.                 y1 = (int)(ro - (cos(i * PI / 30) * (ro-8)));
  45.                
  46.                 x2 = (int)(xo + (sin(i * PI / 30) * (ro-3)));
  47.                 y2 = (int)(ro - (cos(i * PI / 30) * (ro-3)));

  48.                 GUI_Line(x1,y1,x2,y2,BLACK);
  49.        
  50.                 if(i%5==0)
  51.                 {
  52.                         x1 = (int)(xo + (sin(i * PI / 30) * (ro-15)));
  53.                         y1 = (int)(ro - (cos(i * PI / 30) * (ro-15)));
  54.                         x2 = (int)(xo + (sin(i * PI / 30) * (ro-3)));
  55.                         y2 = (int)(ro - (cos(i * PI / 30) * (ro-3)));
  56.                         //GUI_Line(x1,y1+ro,x2,y2+ro,RED);       
  57.                         GUI_Line(x1,y1,x2,y2,RED);       

  58.                         x3 = (int)((xo-8) + (sin((i ) * PI / 30) * (ro-20)));
  59.                         y3 = (int)((ro-8) - (cos((i ) * PI / 30) * (ro-20)));
复制代码
在main的while循环里面,每100ms检测一次时间,并更新绘图。
编译下载,现象如下:
a02.gif
在其中在开启一页设置时间的功能,一个建议的表就做好了。
这里我暂时就不动手了,大家有兴趣可以自己搞搞!
谢谢大家观看!

回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-26 06:57 , Processed in 0.150725 second(s), 32 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表