25 linux ndk 头文件_正点原子Linux第二十五章RTC实时时钟实验
1)資料下載:點擊資料即可下載
2)對正點原子Linux感興趣的同學可以加群討論:935446741
3)關注正點原子公眾號,獲取最新資料更新
第二十五章RTC實時時鐘實驗
實時時鐘是很常用的一個外設,通過實時時鐘我們就可以知道年、月、日和時間等信息。因此在需要記錄時間的場合就需要實時時鐘,可以使用專用的實時時鐘芯片來完成此功能,但是現在大多數的MCU或者MPU內部就已經自帶了實時時鐘外設模塊。比如I.MX6U內部的SNVS就提供了RTC功能,本章我們就學習如何使用I.MX6U內部的RTC來完成實時時鐘功能。
25.1 I.MX6U RTC簡介
如果學習過STM32的話應該知道,STM32內部有一個RTC外設模塊,這個模塊需要一個32.768KHz的晶振,對這個RTC模塊進行初始化就可以得到一個實時時鐘。I.MX6U內部也有個RTC模塊,但是不叫作“RTC”,而是叫做“SNVS”,這一點要注意!本章我們參考《I.MX6UL參考手冊》,而不是《I.MX6ULL參考手冊》,因為《I.MX6ULL參考手冊》很多SNVS相關的寄存器并沒有給出來,不知道是為何?但是《I.MX6UL參考手冊》里面是完整的。所以本章我們使用《I.MX6UL參考手冊》,如果直接在《I.MX6UL參考手冊》的書簽里面找“RTC”相關的字眼是找不到的。I.MX6U系列的RTC是在SNVS里面,也就是《I.MX6UL參考手冊》的第46章“Chapter46 Secure Non-Volatile Storage(SNVS)”。
SNVS直譯過來就是安全的非易性存儲,SNVS里面主要是一些低功耗的外設,包括一個安全的實時計數器(RTC)、一個單調計數器(monotonic counter)和一些通用的寄存器,本章我們肯定只使用實時計數器(RTC)。SNVS里面的外設在芯片掉電以后由電池供電繼續運行,I.MX6U-ALPHA開發板上有一個紐扣電池,這個紐扣電池就是在主電源關閉以后為SNVS供電的,如圖25.1.1所示:
圖25.1.1 I.MX6U-ALPHA開發板紐扣電池
因為紐扣電池在掉電以后會繼續給SNVS供電,因此實時計數器就會一直運行,這樣的話時間信息就不會丟失,除非紐扣電池沒電了。在有紐扣電池作為后備電源的情況下,不管系統主電源是否斷電,SNVS都正常運行。SNVS有兩部分:SNVS_HP和SNVS_LP,系統主電源斷電以后SNVS_HP也會斷電,但是在后備電源支持下,SNVS_LP是不會斷電的,而且SNVS_LP是和芯片復位隔離開的,因此SNVS_LP相關的寄存器的值會一直保存著。
SNVS分為兩個子模塊:SNVS_HP和SNVS_LP,也就是高功耗域(SNVS_HP)和低功耗域(SNVS_LP),這兩個域的電源來源如下:
SNVS_LP:專用的always-powered-on電源域,系統主電源和備用電源都可以為其供電。
SNVS_HP:系統(芯片)電源。
SNVS的這兩個子模塊的電源如圖25.1.2所示:
圖25.1.2 SNVS子模塊電源結構圖
圖25.1.2中各個部分功能如下:
、VDD_HIGH_IN是系統(芯片)主電源,這個電源會同時供給給SNVS_HP和SNVS_LP。
、VDD_SNVS_IN是紐扣電池供電的電源,這個電源只會供給給SNVS_LP,保證在系統主電源VDD_HIGH_IN掉電以后SNVS_LP會繼續運行。
、SNVS_HP部分。
、SNVS_LP部分,此部分有個SRTC,這個就是我們本章要使用的RTC。
其實不管是SNVS_HP還是SNVS_LP,其內部都有一個SRTC,但是因為SNVS_HP在系統電源掉電以后就會關閉,所以我們本章使用的是SNVS_LP內部的SRTC。畢竟我們肯定都不想開發板或者設備每次關閉以后時鐘都被清零,然后開機以后先設置時鐘。
其實不管是SNVS_HP里面的RTC,還是SNVS_LP里面的SRTC,其本質就是一個定時器,和我們在第八章講的EPIT定時器一樣,只要給它提供時鐘,它就會一直運行。SRTC需要外界提供一個32.768KHz的時鐘,I.MX6U-ALPHA核心板上的32.768KHz的晶振就是提供這個時鐘的。寄存器SNVS_LPSRTCMR和SNVS_LPSRTCLR保存著秒數,直接讀取這兩個寄存器的值就知道過了多長時間了。一般以1970年1月1日為起點,加上經過的秒數即可得到現在的時間和日期,原理還是很簡單的。SRTC也是帶有鬧鐘功能的,可以在寄存器SNVS_LPAR中寫入鬧鐘時間值,當時鐘值和鬧鐘值匹配的時候就會產生鬧鐘中斷,要使用時鐘功能的話還需要進行一些設置,本章我們就不使用鬧鐘了。
接下來我們看一下本章要用到的與SRTC相關的部分寄存器,首先是SNVS_HPCOMR寄存器,這個寄存器我們只用到了位:NPSWA_EN(bit31),這個位是非特權軟件訪問控制位,如果非特權軟件要訪問SNVS的話此位必須為1。
接下來看一下寄存器SNVS_LPCR寄存器,此寄存器也只用到了一個位:SRTC_ENV(bit0),此位為1的話就使能STC計數器。
最后來看一下寄存器SNVS_SRTCMR和SNVS_SRTCLR,這兩個寄存器保存著RTC的秒數,按照NXP官方的《6UL參考手冊》中的說法,SNVS_SRTCMR保存著高15位,SNVS_SRTCLR保存著低32位,因此SRTC的計數器一共是47位。
但是!我在編寫驅動的時候發現按照手冊上說的去讀取計數器值是錯誤的!具體表現就是時間是混亂的,因此我在查找了NXP提供的SDK包中的fsl_snvs_hp.c以及Linux內核中的rtc-snvs.c這兩個驅動文件以后發現《6UL參考手冊》上對SNVS_SRTCMR和SNVS_SRTCLR的解釋是錯誤的,經過查閱這兩個文件,得到如下結論:
①、SRTC計數器是32位的,不是47位!
②、SNVS_SRTCMR的bit14:0這15位是SRTC計數器的高15位。
③、SNVS_SRTCLR的bit31:bit15這17位是SRTC計數器的低17位。
按照上面的解釋去讀取這兩個寄存器就可以得到正確的時間,如果要調整時間的話也是向這兩個寄存器寫入要設置的時間值對應的秒數就可以了,但是要修改這兩個寄存器的話要先關閉SRTC。
關于SNVS中和RTC有關的寄存器就介紹到這里,關于這些寄存器詳細的描述,請參考《I.MX6UL參考手冊》第2931頁的46.7小節。本章我們使用I.MX6U的SNVS_LP的SRTC,配置步驟如下:
1、初始化SNVS_SRTC
初始化SNVS_LP中的SRTC。
2、設置RTC時間
第一次使用RTC肯定要先設置時間。
3、使能RTC
配置好RTC并設置好初始時間以后就可以開啟RTC了。
25.2硬件原理分析
本試驗用到的資源如下:
、指示燈LED0。
、RGB LCD接口。
③、SRTC。
SRTC需要外接一個32.768KHz的晶振,在I.MX6U-ALPHA核心板上就有這個32.768KHz的晶振,原理圖如圖25.2.1所示:
圖25.2.1外接32.768KHz晶振
25.3實驗程序編寫
本實驗對應的例程路徑為:開發板光盤-> 1、裸機例程->16_rtc。
25.3.1修改文件MCIMX6Y2.h
在第十三章移植的NXP官方SDK包是針對I.MX6ULL編寫的,因此文件MCIMX6Y2.h中的結構體SNVS_Type里面的寄存器是不全的,我們需要在其中加入本章實驗所需要的寄存器,修改SNVS_Type為如下所示:
示例代碼25.3.1.1 SNVS_Type結構體
1typedefstruct{
2 __IO uint32_t HPLR;
3 __IO uint32_t HPCOMR;
4 __IO uint32_t HPCR;
5 __IO uint32_t HPSICR;
6 __IO uint32_t HPSVCR;
7 __IO uint32_t HPSR;
8 __IO uint32_t HPSVSR;
9 __IO uint32_t HPHACIVR;
10 __IO uint32_t HPHACR;
11 __IO uint32_t HPRTCMR;
12 __IO uint32_t HPRTCLR;
13 __IO uint32_t HPTAMR;
14 __IO uint32_t HPTALR;
15 __IO uint32_t LPLR;
16 __IO uint32_t LPCR;
17 __IO uint32_t LPMKCR;
18 __IO uint32_t LPSVCR;
19 __IO uint32_t LPTGFCR;
20 __IO uint32_t LPTDCR;
21 __IO uint32_t LPSR;
22 __IO uint32_t LPSRTCMR;
23 __IO uint32_t LPSRTCLR;
24 __IO uint32_t LPTAR;
25 __IO uint32_t LPSMCMR;
26 __IO uint32_t LPSMCLR;
27}SNVS_Type;
25.3.2編寫實驗程序
本章實驗在上一章例程的基礎上完成,更改工程名字為“rtc”,然后在bsp文件夾下創建名為“rtc”的文件夾,然后在bsp/rtc中新建bsp_rtc.c和bsp_rtc.h這兩個文件。在bsp_rtc.h中輸入如下內容:
示例代碼25.3.2.1 bsp_rtc.h文件代碼
1 #ifndef _BSP_RTC_H
2 #define _BSP_RTC_H
3/***************************************************************
4 Copyright ? zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
5文件名 : bsp_rtc.h
6作者 : 左忠凱
7版本 : V1.0
8描述 : RTC驅動頭文件。
9其他 : 無
10論壇 : http://www.openedv.com
11日志 : 初版V1.0 2019/1/3 左忠凱創建
12 ***************************************************************/
13 #include "imx6ul.h"
14
15/* 相關宏定義 */
16 #define SECONDS_IN_A_DAY (86400) /* 一天86400秒 */
17 #define SECONDS_IN_A_HOUR (3600) /* 一個小時3600秒 */
18 #define SECONDS_IN_A_MINUTE (60) /* 一分鐘60秒 */
19 #define DAYS_IN_A_YEAR (365) /* 一年365天 */
20 #define YEAR_RANGE_START (1970) /* 開始年份1970年 */
21 #define YEAR_RANGE_END (2099) /* 結束年份2099年 */
22
23/* 時間日期結構體 */
24struct rtc_datetime
25{
26unsignedshort year; /* 范圍為:1970 ~ 2099 */
27unsignedchar month; /* 范圍為:1 ~ 12 */
28unsignedchar day; /* 范圍為:1 ~ 31 (不同的月,天數不同).*/
29unsignedchar hour; /* 范圍為:0 ~ 23 */
30unsignedchar minute; /* 范圍為:0 ~ 59 */
31unsignedchar second; /* 范圍為:0 ~ 59 */
32};
33
34/* 函數聲明 */
35void rtc_init(void);
36void rtc_enable(void);
37void rtc_disable(void);
38unsignedint rtc_coverdate_to_seconds(struct rtc_datetime
*datetime);
39unsignedint rtc_getseconds(void);
40void rtc_setdatetime(struct rtc_datetime *datetime);
41void rtc_getdatetime(struct rtc_datetime *datetime);
42
43 #endif
第16到21行定義了一些宏,比如一天多少秒、一小時多少秒等等,這些宏將用于將秒轉換為時間,或者將時間轉換為秒。第24行定義了一個結構體rtc_datetime,此結構體用于描述日期和時間參數。剩下的就是一些函數聲明了,很簡單。
在文件bsp_rtc.c中輸入如下內容:
示例代碼25.3.2.2 bsp_rtc.c文件代碼
/***************************************************************
Copyright ? zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名 : bsp_rtc.c
作者 : 左忠凱
版本 : V1.0
描述 : RTC驅動文件。
其他 : 無
論壇 : http://www.openedv.com
日志 : 初版V1.0 2019/1/3 左忠凱創建
***************************************************************/
1 #include "bsp_rtc.h"
2 #include "stdio.h"
3
4/*
5 * @description :初始化RTC
6 */
7void rtc_init(void)
8{
9/*
10 * 設置HPCOMR寄存器
11 * bit[31] 1 : 允許訪問SNVS寄存器,一定要置1
12 */
13 SNVS->HPCOMR |=(1<<31);
14
15 #if0
16struct rtc_datetime rtcdate;
17
18 rtcdate.year =2018U;
19 rtcdate.month =12U;
20 rtcdate.day =13U;
21 rtcdate.hour =14U;
22 rtcdate.minute =52;
23 rtcdate.second =0;
24 rtc_setDatetime(&rtcdate); /* 初始化時間和日期 */
25 #endif
26 rtc_enable(); /* 使能RTC */
27}
28
29/*
30 * @description : 開啟RTC
31 */
32void rtc_enable(void)
33{
34/*
35 * LPCR寄存器bit0置1,使能RTC
36 */
37 SNVS->LPCR |=1<<0;
38while(!(SNVS->LPCR &0X01)); /* 等待使能完成 */
39
40}
41
42/*
43 * @description : 關閉RTC
44 */
45void rtc_disable(void)
46{
47/*
48 * LPCR寄存器bit0置0,關閉RTC
49 */
50 SNVS->LPCR &=~(1<<0);
51while(SNVS->LPCR &0X01); /* 等待關閉完成*/
52}
53
54/*
55 * @description : 判斷指定年份是否為閏年,閏年條件如下:
56 * @param – year : 要判斷的年份
57 * @return : 1 是閏年,0 不是閏年
58 */
59unsignedchar rtc_isleapyear(unsignedshort year)
60{
61unsignedchar value=0;
62
63if(year %400==0)
64 value =1;
65else
66{
67if((year %4==0)&&(year %100!=0))
68 value =1;
69else
70 value =0;
71}
72return value;
73}
74
75/*
76 * @description : 將時間轉換為秒數
77 * @param – datetime : 要轉換日期和時間。
78 * @return : 轉換后的秒數
79 */
80unsignedint rtc_coverdate_to_seconds(struct rtc_datetime *datetime)
81{
82unsignedshort i =0;
83unsignedint seconds =0;
84unsignedint days =0;
85unsignedshort monthdays[]={0U,0U,31U,59U,90U,120U,151U,
181U,212U,243U,273U,304U,334U};
86
87for(i =1970; i < datetime->year; i++)
88{
89 days += DAYS_IN_A_YEAR; /* 平年,每年365天 */
90if(rtc_isleapyear(i)) days +=1; /* 閏年多加一天 */
91}
92
93 days += monthdays[datetime->month];
94if(rtc_isleapyear(i)&&(datetime->month >=3)) days +=1;
95
96 days += datetime->day -1;
97
98 seconds = days * SECONDS_IN_A_DAY +
99 datetime->hour * SECONDS_IN_A_HOUR +
100 datetime->minute * SECONDS_IN_A_MINUTE +
101 datetime->second;
102
103return seconds;
104}
105
106/*
107 * @description : 設置時間和日期
108 * @param – datetime : 要設置的日期和時間
109 * @return : 無
110 */
111void rtc_setdatetime(struct rtc_datetime *datetime)
112{
113
114unsignedint seconds =0;
115unsignedint tmp = SNVS->LPCR;
116
117 rtc_disable(); /* 設置寄存器HPRTCMR和HPRTCLR前要先關閉RTC */
118/* 先將時間轉換為秒 */
119 seconds = rtc_coverdate_to_seconds(datetime);
120 SNVS->LPSRTCMR =(unsignedint)(seconds >>17);/* 設置高16位 */
121 SNVS->LPSRTCLR =(unsignedint)(seconds <<15);/* 設置地16位 */
122
123/* 如果此前RTC是打開的在設置完RTC時間以后需要重新打開RTC */
124if(tmp &0x1)
125 rtc_enable();
126}
127
128/*
129 * @description : 將秒數轉換為時間
130 * @param - seconds : 要轉換的秒數
131 * @param – datetime : 轉換后的日期和時間
132 * @return : 無
133 */
134void rtc_convertseconds_to_datetime(unsignedint seconds,
struct rtc_datetime *datetime)
135{
136unsignedint x;
137unsignedint secondsRemaining, days;
138unsignedshort daysInYear;
139
140/* 每個月的天數 */
141unsignedchar daysPerMonth[]={0U,31U,28U,31U,30U,31U,
30U,31U,31U,30U,31U,30U,31U};
142
143 secondsRemaining = seconds;/* 剩余秒數初始化 */
144 days = secondsRemaining / SECONDS_IN_A_DAY +1;
145 secondsRemaining = secondsRemaining % SECONDS_IN_A_DAY;
146
147/* 計算時、分、秒 */
148 datetime->hour = secondsRemaining / SECONDS_IN_A_HOUR;
149 secondsRemaining = secondsRemaining % SECONDS_IN_A_HOUR;
150 datetime->minute = secondsRemaining /60;
151 datetime->second = secondsRemaining % SECONDS_IN_A_MINUTE;
152
153/* 計算年 */
154 daysInYear = DAYS_IN_A_YEAR;
155 datetime->year = YEAR_RANGE_START;
156while(days > daysInYear)
157{
158/* 根據天數計算年 */
159 days -= daysInYear;
160 datetime->year++;
161
162/* 處理閏年 */
163if(!rtc_isleapyear(datetime->year))
164 daysInYear = DAYS_IN_A_YEAR;
165else/*閏年,天數加一 */
166 daysInYear = DAYS_IN_A_YEAR +1;
167}
168/*根據剩余的天數計算月份 */
169if(rtc_isleapyear(datetime->year))/* 如果是閏年的話2月加一天 */
170 daysPerMonth[2]=29;
171for(x =1; x <=12; x++)
172{
173if(days <= daysPerMonth[x])
174{
175 datetime->month = x;
176break;
177}
178else
179{
180 days -= daysPerMonth[x];
181}
182}
183 datetime->day = days;
184}
185
186/*
187 * @description : 獲取RTC當前秒數
188 * @param : 無
189 * @return : 當前秒數
190 */
191unsignedint rtc_getseconds(void)
192{
193unsignedint seconds =0;
194
195 seconds =(SNVS->LPSRTCMR <<17)|(SNVS->LPSRTCLR >>15);
196return seconds;
197}
198
199/*
200 * @description : 獲取當前時間
201 * @param – datetime : 獲取到的時間,日期等參數
202 * @return : 無
203 */
204void rtc_getdatetime(struct rtc_datetime *datetime)
205{
206unsignedint seconds =0;
207 seconds = rtc_getseconds();
208 rtc_convertseconds_to_datetime(seconds, datetime);
209}
文件bsp_rtc.c里面一共有9個函數,依次來看一下這些函數的意義。函數rtc_init明顯是初始化rtc的,主要是使能RTC,也可以在rtc_init函數里面設置時間。函數rtc_enable和rtc_disable分別是RTC的使能和禁止函數。函數rtc_isleapyear用于判斷某一年是否為閏年。函數rtc_coverdate_to_seconds負責將給定的日期和時間信息轉換為對應的秒數。函數rtc_setdatetime用于設置時間,也就是設置寄存器SNVS_LPSRTCMR和SNVS_LPSRTCLR。函數rtc_convertseconds_to_datetime用于將給定的秒數轉換為對應的時間值。函數rtc_getseconds獲取SRTC當前秒數,其實就是讀取寄存器SNVS_LPSRTCMR和SNVS_LPSRTCLR,然后將其結合成47位的值。最后一個函數rtc_getdatetime是獲取時間值。
我們在main函數里面先初始化RTC,然后進入3S倒計時,如果這3S內按下了KEY0按鍵,那么就設置SRTC的日期。如果3S倒計時結束以后沒有按下KEY0,也就是沒有設置SRTC時間的話就進入while循環,然后讀取RTC的時間值并且顯示在LCD上,在文件main.c中輸入如下所示內容:
示例代碼25.3.2.3 main.c文件代碼
/**************************************************************
Copyright ? zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名 : mian.c
作者 : 左忠凱
版本 : V1.0
描述 : I.MX6U開發板裸機實驗17 RTC實時時鐘實驗
其他 : 本實驗學習如何編寫I.MX6U內部的RTC驅動,使用內部RTC可以實現
一個實時時鐘。
論壇 : http://www.openedv.com
日志 : 初版V1.0 2019/1/15 左忠凱創建
**************************************************************/
1 #include "bsp_clk.h"
2 #include "bsp_delay.h"
3 #include "bsp_led.h"
4 #include "bsp_beep.h"
5 #include "bsp_key.h"
6 #include "bsp_int.h"
7 #include "bsp_uart.h"
8 #include "bsp_lcd.h"
9 #include "bsp_lcdapi.h"
10 #include "bsp_rtc.h"
11 #include "stdio.h"
12
13/*
14 * @description : main函數
15 * @param : 無
16 * @return : 無
17 */
18int main(void)
19{
20 unsignedchar key =0;
21 int t =0;
22 int i =3; /* 倒計時3S */
23 char buf[160];
24 struct rtc_datetime rtcdate;
25 unsignedchar state = OFF;
26
27 int_init(); /* 初始化中斷(一定要最先調用!) */
28 imx6u_clkinit(); /* 初始化系統時鐘 */
29 delay_init(); /* 初始化延時 */
30 clk_enable(); /* 使能所有的時鐘 */
31 led_init(); /* 初始化led */
32 beep_init(); /* 初始化beep */
33 uart_init(); /* 初始化串口,波特率115200 */
34 lcd_init(); /* 初始化LCD */
35 rtc_init(); /* 初始化RTC */
36
37 tftlcd_dev.forecolor = LCD_RED;
38 lcd_show_string(50,10,400,24,24, /* 顯示字符串 */
(char*)"ALPHA-IMX6UL RTC TEST");
39 tftlcd_dev.forecolor = LCD_BLUE;
40 memset(buf,0,sizeof(buf));
41
42 while(1)
43 {
44 if(t==100)/* 1s時間到了 */
45 {
46 t=0;
47 printf("will be running %d s......r", i);
48
49 lcd_fill(50,40,370,70, tftlcd_dev.backcolor);/* 清屏 */
50 sprintf(buf,"will be running %ds......", i);
51 lcd_show_string(50,40,300,24,24, buf);
52 i--;
53 if(i <0)
54 break;
55 }
56
57 key = key_getvalue();
58 if(key == KEY0_VALUE)
59 {
60 rtcdate.year =2018;
61 rtcdate.month =1;
62 rtcdate.day =15;
63 rtcdate.hour =16;
64 rtcdate.minute =23;
65 rtcdate.second =0;
66 rtc_setdatetime(&rtcdate);/* 初始化時間和日期 */
67 printf("rn RTC Init finishrn");
68 break;
69 }
70
71 delayms(10);
72 t++;
73 }
74 tftlcd_dev.forecolor = LCD_RED;
75 lcd_fill(50,40,370,70, tftlcd_dev.backcolor);/* 清屏 */
76 lcd_show_string(50,40,200,24,24,(char*)"Current Time:");
77 tftlcd_dev.forecolor = LCD_BLUE;
78
79 while(1)
80 {
81 rtc_getdatetime(&rtcdate);
82 sprintf(buf,"%d/%d/%d %d:%d:%d",rtcdate.year, rtcdate.month,
rtcdate.day, rtcdate.hour, rtcdate.minute, rtcdate.second);
83 lcd_fill(50,70,300,94, tftlcd_dev.backcolor);
84 lcd_show_string(50,70,250,24,24,(char*)buf);/* 顯示字符串 */
85
86 state =!state;
87 led_switch(LED0,state);
88 delayms(1000);/* 延時一秒 */
89 }
90 return0;
91}
第35行調用函數rtc_init初始化RTC。
第42到73行是倒計時3S,如果在這3S 內按下了KEY0按鍵就會調用函數rtc_setdatetime設置當前的時間。如果3S到技術結束以后沒有按下KEY0那就表示不需要設置時間,跳出循環,執行下面的代碼。
第79到89行就是主循環,此循環每隔1S調用函數rtc_getdatetime獲取一次時間值,并且通過串口打印給SecureCRT或者在LCD上顯示。
25.4編譯下載驗證
25.4.1 編寫Makefile和鏈接腳本
修改Makefile中的TARGET為rtc,然后在在INCDIRS和SRCDIRS中加入“bsp/rtc”,修改后的Makefile如下:
示例代碼25.4.1 Makefile代碼
1 CROSS_COMPILE ?= arm-linux-gnueabihf-
2 TARGET ?=rtc
3
4/* 省略掉其它代碼...... */
5
6 INCDIRS := imx6ul
7 stdio/include
8 bsp/clk
9 bsp/led
10 bsp/delay
11 bsp/beep
12 bsp/gpio
13 bsp/key
14 bsp/exit
15 bsp/int
16 bsp/epittimer
17 bsp/keyfilter
18 bsp/uart
19 bsp/lcd
20 bsp/rtc
21
22 SRCDIRS := project
23 stdio/lib
24 bsp/clk
25 bsp/led
26 bsp/delay
27 bsp/beep
28 bsp/gpio
29 bsp/key
30 bsp/exit
31 bsp/int
32 bsp/epittimer
33 bsp/keyfilter
34 bsp/uart
35 bsp/lcd
36 bsp/rtc
37
38/* 省略掉其它代碼...... */
39
40 clean:
41 rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS)$(SOBJS)
第2行修改變量TARGET為“rtc”,也就是目標名稱為“rtc”。
第20行在變量INCDIRS中添加RTC驅動頭文件(.h)路徑。
第36行在變量SRCDIRS中添加RTC驅動驅動文件(.c)路徑。
鏈接腳本保持不變。
25.4.2編譯下載
使用Make命令編譯代碼,編譯成功以后使用軟件imxdownload將編譯完成的rtc.bin文件下載到SD卡中,命令如下:
chmod 777 imxdownload //給予imxdownload可執行權限,一次即可
./imxdownload rtc.bin /dev/sdd //燒寫到SD卡中
燒寫成功以后將SD卡插到開發板的SD卡槽中,然后復位開發板。程序一開始進入3S倒計時,如圖25.4.2.1所示:
圖24.4.2.13秒鐘倒計時
如果在倒計數結束之前按下KEY0,那么RTC就會被設置為我們代碼中設置的時間和日期值,RTC運行如圖24.4.2.2所示:
圖24.4.2.2設置有的時間
我們在main函數中設置的時間是2018年1月15日,16點23分0秒,在倒計數結束之前按下KEY0按鍵設置RTC,圖24.4.2.2中的時間就是我們設置以后的時間。
總結
以上是生活随笔為你收集整理的25 linux ndk 头文件_正点原子Linux第二十五章RTC实时时钟实验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java compare 返回值_关于J
- 下一篇: python table数据抓取_Pyt