在线时间83 小时
UID3135871
ST金币1272
蝴蝶豆3
注册时间2015-6-9
该用户从未签到
金牌会员
- 最后登录
- 2023-1-28
|
今天我们配置下G491的RTC,并做一个简单的小时钟GUI,让它显示时间的变化。
有了STM32CUBEMX配置代码就是快啊!
首先我们使用外部的32.768K晶振,不使用内部的32K晶振。这样RTC精度会更好些!
使能外部LSE:
配置外部LSE为RTC时钟:
配置RTC(这里没有开启任何中断,我们通过查询来获取时间的变化):
然后生成代码,这样就OK了。
在RTC的初始化这里,如果我们之前初始化过了,后备时钟寄存器有记录了,我们就跳过初始化,
这里我们要把生成的代码,修改一下(当然如果仅仅试验RTC,这里改不改就无所谓了)。
其实就是加了个是否第一次初始化的判断。
- /* RTC init function */
- void MX_RTC_Init(void)
- {
- RTC_TimeTypeDef sTime = {0};
- RTC_DateTypeDef sDate = {0};
- /** Initialize RTC Only
- */
- hrtc.Instance = RTC;
- hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
- hrtc.Init.AsynchPrediv = 127;
- hrtc.Init.SynchPrediv = 255;
- hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
- hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
- hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
- hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
- hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
- if (HAL_RTC_Init(&hrtc) != HAL_OK)
- {
- Error_Handler();
- }
- /* USER CODE BEGIN Check_RTC_BKUP */
- // 检查后备寄存器 看是否初次使用 是否第一次配置
- <font color="#ff0000"> uint32_t iSetFlag = 0x5058;// 这个标志值 0x5050值自己随意
- if(iSetFlag != HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0))
- { </font>
- /* USER CODE END Check_RTC_BKUP */
- /** Initialize RTC and set the Time and Date
- */
- sTime.Hours = 14;
- sTime.Minutes = 18;
- sTime.Seconds = 5;
- sTime.SubSeconds = 0;
- sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
- sTime.StoreOperation = RTC_STOREOPERATION_RESET;
- if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
- {
- Error_Handler();
- }
- sDate.WeekDay = RTC_WEEKDAY_TUESDAY;
- sDate.Month = RTC_MONTH_MARCH;
- sDate.Date = 13;
- sDate.Year = 21;
- if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
- {
- Error_Handler();
- }
- /* USER CODE BEGIN Check_RTC_BKUP */
- <font color="#ff0000"> //写入标志
- HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,iSetFlag);//标记已经初始化过了
- }</font>
- /* USER CODE END Check_RTC_BKUP */
- }
复制代码 在main函数里面读取,并显示:
- RTC_TimeTypeDef RTC_TimeStruct;
- RTC_DateTypeDef RTC_DateStruct;
- u8 tbuf[40];
- u8 cnt=0;
- HAL_RTC_GetTime(&hrtc,&RTC_TimeStruct,RTC_FORMAT_BIN);
- sprintf((char*)tbuf,"%02d:%02d:%02d",RTC_TimeStruct.Hours,RTC_TimeStruct.Minutes,RTC_TimeStruct.Seconds);
- // //LCD_ShowString(30,0,tbuf,RED,WHITE,3,0);
- LCD_ShowString(90,60,tbuf,RED,BLACK,16,0);
- HAL_RTC_GetDate(&hrtc,&RTC_DateStruct,RTC_FORMAT_BIN);
- sprintf((char*)tbuf,"20%02d-%02d-%02d",RTC_DateStruct.Year,RTC_DateStruct.Month,RTC_DateStruct.Date);
- LCD_ShowString(80,60-16,tbuf,GBLUE,BLACK,16,0);
- sprintf((char*)tbuf,"Week:%d",RTC_DateStruct.WeekDay);
- LCD_ShowString(95,180,tbuf,RED,BLACK,16,0);
复制代码 时钟相关的GUI,主要就是画圆,画刻度和指针(代码参考自网络):
- //时钟图形相关
- int xo=120,yo=120,zo=100,ro=120;//表心坐标z 指针长,圆大小
- void get_circle(int x,int y,int r,int col)
- {
- int xc=0;
- int yc,p;
- yc=r;
- p=3-(r<<1);
- while(xc <= yc)
- {
- GUI_Dot(x+xc,y+yc,col);
- GUI_Dot(x+xc,y-yc,col);
- GUI_Dot(x-xc,y+yc,col);
- GUI_Dot(x-xc,y-yc,col);
- GUI_Dot(x+yc,y+xc,col);
- GUI_Dot(x+yc,y-xc,col);
- GUI_Dot(x-yc,y+xc,col);
- GUI_Dot(x-yc,y-xc,col);
- if(p<0)
- {
- p += (xc++ << 2) + 6;
- }
- else
- p += ((xc++ - yc--)<<2) + 10;
- }
- }
- void draw_circle(void) //画圆
- {
- get_circle(xo,yo,ro,YELLOW);
- get_circle(xo,yo,(ro-1),YELLOW);
- get_circle(xo,yo,(ro-2),YELLOW);
- get_circle(xo,yo,(ro-3),YELLOW);
- get_circle(xo,yo,5,YELLOW);
- }
- void draw_dotline(void) //画格点
- {
- u8 i;
- u8 rome[][3]={"12","1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11" } ; //表盘数字
- int x1,y1,x2,y2,x3,y3;
-
- for(i=0;i<60;i++)
- {
- x1 = (int)(xo + (sin(i * PI / 30) * (ro-8)));
- y1 = (int)(ro - (cos(i * PI / 30) * (ro-8)));
-
- x2 = (int)(xo + (sin(i * PI / 30) * (ro-3)));
- y2 = (int)(ro - (cos(i * PI / 30) * (ro-3)));
- GUI_Line(x1,y1,x2,y2,BLACK);
-
- if(i%5==0)
- {
- x1 = (int)(xo + (sin(i * PI / 30) * (ro-15)));
- y1 = (int)(ro - (cos(i * PI / 30) * (ro-15)));
- x2 = (int)(xo + (sin(i * PI / 30) * (ro-3)));
- y2 = (int)(ro - (cos(i * PI / 30) * (ro-3)));
- //GUI_Line(x1,y1+ro,x2,y2+ro,RED);
- GUI_Line(x1,y1,x2,y2,RED);
- x3 = (int)((xo-8) + (sin((i ) * PI / 30) * (ro-20)));
- y3 = (int)((ro-8) - (cos((i ) * PI / 30) * (ro-20)));
复制代码 在main的while循环里面,每100ms检测一次时间,并更新绘图。
编译下载,现象如下:
在其中在开启一页设置时间的功能,一个建议的表就做好了。
这里我暂时就不动手了,大家有兴趣可以自己搞搞!
谢谢大家观看!
|
|