本帖最后由 jinglixixi 于 2020-9-29 20:16 編輯
原打算先為開發板配置一個顯示屏,有了顯示窗口就便于信息輸出了,無奈耗了幾天的時間也沒使OLED屏顯示半點痕跡,先在例程的功能模塊上練練手了。 RTC是大多數ARM產品都配置的功能,自然AT32F403AF也不例外,沒有OLED屏做支撐,也就只能依賴串口通信了,無奈呀,無奈! 由于開發板自身就可以虛擬出串口,也就省去了外掛USB轉TTL串口模塊的麻煩,當然這個虛擬出的串口占用的編號比較大,只能將其強行改的小一些,否則串口調試工具可不答應。 將程序編譯下載后,其運行效果如圖1所示。
1.jpg (49.36 KB, 下載次數: 73)
下載附件
2020-9-28 22:44 上傳
圖1 運行效果 天啊,這哥們兒還停留在2018年吶! 老哥醒醒吧,光陰荏苒,現在已經是2020年了。 喚醒老哥的辦法只有一個,那就是修改初始時間設置。 打開時間設置函數才發現事情有點怪,什么情況? 你親自看下面這個函數吧! - uint8_t RTC_Set(uint16_t syear, uint8_t smon, uint8_t sday, uint8_t hour, uint8_t min, uint8_t sec)
- {
- uint32_t t;
- uint32_t seccount=0;
- if(syear<1970||syear>2099)
- return 1;
- for(t=1970;t<syear;t++)
- {
- if(Is_Leap_Year(t))seccount+=31622400;
- else seccount+=31536000;
- }
- smon-=1;
- for(t=0;t<smon;t++)
- {
- seccount+=(uint8_t)mon_table[t]*86400;
- if(Is_Leap_Year(syear)&&t==1)seccount+=86400;
- }
- seccount+=(uint8_t)(sday-1)*86400;
- seccount+=(uint8_t)hour*3600;
- seccount+=(uint8_t)min*60;
- seccount+=sec;
- /* Enable PWR and BKP clock */
- RCC_APB1PeriphClockCmd(RCC_APB1PERIPH_PWR | RCC_APB1PERIPH_BKP, ENABLE);
- /* Enable write access to Backup domain */
- PWR_BackupAccessCtrl(ENABLE);
- /* Set the RTC counter value */
- RTC_SetCounter(seccount);
- /* Wait until last write operation on RTC registers has finished */
- RTC_WaitForLastTask();
- return 0;
- }
復制代碼
看出來沒有,我們通常使用的RTC函數是從相應的寄存器中讀取時間值和日期值。這哥們兒竟然需要統一折算到秒,莫非它就是一個大號的秒信號計數器呀! 設置時間時折算到秒來更新計時值,讀取時再按進制變換成年月日、分時秒。 難怪在程序的數組中存放了這些清規戒律吶! const uint8_t table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; const uint8_tmon_table[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 原來是怕老哥出軌呀! 通過分析RTC初始化函數RTC_Init(),才發現初始時間的設置函數被藏在這里,其內容是RTC_Set(2018,8, 8, 8, 8, 0);。 別客氣,按電腦的系統時間將它擺平了! 修改后經程序的程序編譯下載,其步調終于跟上隊了,其時間效果如圖2所示。 嗯,表現還不賴! 哎,就怪我的表現不好,沒有及時為你配上一個顏值高的小臉蛋!算哥欠你的。
2.jpg (48.48 KB, 下載次數: 73)
下載附件
2020-9-28 22:44 上傳
圖2 更新RTC計時
|