📄 rtc.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 951] for uVision
; commandline ArmCC [--debug -c --asm --interleave -ortc.o --device=DARMP --apcs=interwork -O0 -IC:\Keil\ARM\INC\Philips APP\rtc.c]
ARM
AREA ||.text.7||, CODE, READONLY, ALIGN=2
RTCInit PROC
;;;35 /* 设置实时时钟 */
;;;36 CCR =0x00;
000000 e3a00000 MOV r0,#0
000004 e59f11a4 LDR r1,|L1.432|
000008 e5c10008 STRB r0,[r1,#8]
;;;37 /*
;;;38 CLKEN 时钟使能。当该位为1 时,时间计数器使能。为0 时,时间计数器都被禁止,
;;;39 这时可对其进行初始化。
;;;40 CTCRST CTC 复位。为1 时,时钟节拍计数器复位。在CCR[1]变为0 之前,它将一直保持复位状态。
;;;41 CLKSRC 如果该位为0,时钟节拍计数器计数预分频器的时钟,这与早先的Philips 嵌入式ARM
;;;42 系列器件相吻合。如果该位为1,CTC 计数连接在RTCX1 和RTCX2
;;;43 两端的32kHz 振荡器信号(关于硬件的详细内容请见
;;;44 */
;;;45 PREINT = Fpclk / 32768 - 1;
00000c e59f01a0 LDR r0,|L1.436|
000010 e1c108b0 STRH r0,[r1,#0x80]
;;;46 PREFRAC = Fpclk - (Fpclk / 32768) * 32768;
000014 e3a00c1b MOV r0,#0x1b00
000018 e1c108b4 STRH r0,[r1,#0x84]
;;;47 YEAR = 2007;
00001c e59f0194 LDR r0,|L1.440|
000020 e1c103bc STRH r0,[r1,#0x3c]
;;;48 MONTH = 4;
000024 e3a00004 MOV r0,#4
000028 e5c10038 STRB r0,[r1,#0x38]
;;;49 DOM = 25;
00002c e3a00019 MOV r0,#0x19
000030 e5c1002c STRB r0,[r1,#0x2c]
;;;50 /*interrupt Setting */
;;;51 #if RTC_INTERRUPT_FLAG
;;;52 ILR = (0<<0)|(0<<1) ;
;;;53
;;;54 /*
;;;55 RTCCIF 为1 时,计数器增量中断模块产生中断。向该位写入1 清除计数器增量中断。
;;;56 RTCALF 为1 时,报警寄存器产生中断。向该位写入1 清除报警中断。
;;;57 */
;;;58 CIIR = 0x00;
;;;59 /*
;;;60 0 IMSEC 为1 时,秒值的增加产生一次中断。
;;;61 1 IMMIN 为1 时,分值的增加产生一次中断。
;;;62 2 IMHOUR 为1 时,小时值的增加产生一次中断。
;;;63 3 IMDOM 为1 时,日期(月)值的增加产生一次中断。
;;;64 4 IMDOW 为1 时,星期值的增加产生一次中断。
;;;65 5 IMDOY 为1 时,日期(年)值的增加产生一次中断。
;;;66 6 IMMON 为1 时,月值的增加产生一次中断。
;;;67 7 IMYEAR 为1 时,年值的增加产生一次中断。
;;;68 */
;;;69
;;;70 AMR = 0x00;
;;;71 /*
;;;72 0 AMRSEC 为1 时,秒值不与报警寄存器比较。
;;;73 1 AMRMIN 为1 时,分值不与报警寄存器比较。
;;;74 2 AMRHOUR 为1 时,小时值不与报警寄存器比较。
;;;75 3 AMRDOM 为1 时,日期(月)值不与报警寄存器比较。
;;;76 4 AMRDOW 为1 时,星期值不与报警寄存器比较。
;;;77 5 AMRDOY 为1 时,日期(年)值不与报警寄存器比较。
;;;78 6 AMRMON 为1 时,月值不与报警寄存器比较。
;;;79 7 AMRYEAR 为1 时,年值不与报警寄存器比较。
;;;80 */
;;;81 #endif
;;;82
;;;83 }
000034 e12fff1e BX lr
ENDP
RTCStart PROC
;;;93 {
;;;94 CCR = 0x01;
000038 e3a00001 MOV r0,#1
00003c e59f116c LDR r1,|L1.432|
000040 e5c10008 STRB r0,[r1,#8]
;;;95 /*
;;;96 CLKEN 时钟使能。当该位为1 时,时间计数器使能。为0 时,时间计数器都被禁止,
;;;97 这时可对其进行初始化。
;;;98 CTCRST CTC 复位。为1 时,时钟节拍计数器复位。在CCR[1]变为0 之前,它将一直保持复位状态。
;;;99 CLKSRC 如果该位为0,时钟节拍计数器计数预分频器的时钟,这与早先的Philips 嵌入式ARM
;;;100 系列器件相吻合。如果该位为1,CTC 计数连接在RTCX1 和RTCX2
;;;101 两端的32kHz 振荡器信号(关于硬件的详细内容请见
;;;102 */
;;;103 }
000044 e12fff1e BX lr
ENDP
RTCStop PROC
;;;112 {
;;;113 CCR &= 0xfe;
000048 e59f0160 LDR r0,|L1.432|
00004c e5d00008 LDRB r0,[r0,#8]
000050 e20000fe AND r0,r0,#0xfe
000054 e59f1154 LDR r1,|L1.432|
000058 e5c10008 STRB r0,[r1,#8]
;;;114 /*
;;;115 CLKEN 时钟使能。当该位为1 时,时间计数器使能。为0 时,时间计数器都被禁止,
;;;116 这时可对其进行初始化。
;;;117 CTCRST CTC 复位。为1 时,时钟节拍计数器复位。在CCR[1]变为0 之前,它将一直保持复位状态。
;;;118 CLKSRC 如果该位为0,时钟节拍计数器计数预分频器的时钟,这与早先的Philips 嵌入式ARM
;;;119 系列器件相吻合。如果该位为1,CTC 计数连接在RTCX1 和RTCX2
;;;120 两端的32kHz 振荡器信号(关于硬件的详细内容请见
;;;121 */
;;;122 }
00005c e12fff1e BX lr
ENDP
RTC_CTCReset PROC
;;;132 {
;;;133 CCR |= 0x02;
000060 e59f0148 LDR r0,|L1.432|
000064 e5d00008 LDRB r0,[r0,#8]
000068 e3800002 ORR r0,r0,#2
00006c e59f113c LDR r1,|L1.432|
000070 e5c10008 STRB r0,[r1,#8]
;;;134 /*
;;;135 CLKEN 时钟使能。当该位为1 时,时间计数器使能。为0 时,时间计数器都被禁止,
;;;136 这时可对其进行初始化。
;;;137 CTCRST CTC 复位。为1 时,时钟节拍计数器复位。在CCR[1]变为0 之前,它将一直保持复位状态。
;;;138 CLKSRC 如果该位为0,时钟节拍计数器计数预分频器的时钟,这与早先的Philips 嵌入式ARM
;;;139 系列器件相吻合。如果该位为1,CTC 计数连接在RTCX1 和RTCX2
;;;140 两端的32kHz 振荡器信号(关于硬件的详细内容请见
;;;141 */
;;;142 }
000074 e12fff1e BX lr
ENDP
RTCSetTime PROC
;;;151 void RTCSetTime( RTCTime Time )
;;;152 {
000078 e92d000f PUSH {r0-r3}
;;;153 SEC = Time.RTC_Sec; /*SEC 6 秒值的范围为0~59。 */
00007c e59d0000 LDR r0,[sp,#0]
000080 e59f1128 LDR r1,|L1.432|
000084 e5c10020 STRB r0,[r1,#0x20]
;;;154 MIN = Time.RTC_Min; /*MIN 6 分值的范围为0~59。 */
000088 e59d0004 LDR r0,[sp,#4]
00008c e5c10024 STRB r0,[r1,#0x24]
;;;155 HOUR = Time.RTC_Hour; /*HOUR 5 小时值的范围为0~23。 */
000090 e59d0008 LDR r0,[sp,#8]
000094 e5c10028 STRB r0,[r1,#0x28]
;;;156 DOM = Time.RTC_Mday; /*DOM 5日期(月)值的范围为1~28,29,30 或31(取决于月份以及是否为闰年)。[1] */
000098 e59d000c LDR r0,[sp,#0xc]
00009c e5c1002c STRB r0,[r1,#0x2c]
;;;157 DOW = Time.RTC_Wday; /*星期值的范围为0~6。[1] */
0000a0 e59d0018 LDR r0,[sp,#0x18]
0000a4 e5c10030 STRB r0,[r1,#0x30]
;;;158 DOY = Time.RTC_Yday; /*日期(年)值的范围为1~365(闰年为366) */
0000a8 e59d001c LDR r0,[sp,#0x1c]
0000ac e1c103b4 STRH r0,[r1,#0x34]
;;;159 MONTH = Time.RTC_Mon; /*MONTH 4 月值的范围为1~12。 */
0000b0 e59d0010 LDR r0,[sp,#0x10]
0000b4 e5c10038 STRB r0,[r1,#0x38]
;;;160 YEAR = Time.RTC_Year; /*YEAR 12 年值的范围为0~4095 */
0000b8 e59d0014 LDR r0,[sp,#0x14]
0000bc e1c103bc STRH r0,[r1,#0x3c]
;;;161 }
0000c0 e28dd010 ADD sp,sp,#0x10
0000c4 e12fff1e BX lr
ENDP
RTCSetAlarm PROC
;;;170 void RTCSetAlarm( RTCTime Alarm )
;;;171 {
0000c8 e92d000f PUSH {r0-r3}
;;;172 ALSEC = Alarm.RTC_Sec; /* ALSEC 6 秒报警值 */
0000cc e59d0000 LDR r0,[sp,#0]
0000d0 e59f10d8 LDR r1,|L1.432|
0000d4 e5c10060 STRB r0,[r1,#0x60]
;;;173 ALMIN = Alarm.RTC_Min; /* ALMIN 6 分报警值 */
0000d8 e59d0004 LDR r0,[sp,#4]
0000dc e5c10064 STRB r0,[r1,#0x64]
;;;174 ALHOUR = Alarm.RTC_Hour; /* ALHOUR 5 小时报警值 */
0000e0 e59d0008 LDR r0,[sp,#8]
0000e4 e5c10068 STRB r0,[r1,#0x68]
;;;175 ALDOM = Alarm.RTC_Mday; /* ALDOM 5 日期(月)报警值 */
0000e8 e59d000c LDR r0,[sp,#0xc]
0000ec e5c1006c STRB r0,[r1,#0x6c]
;;;176 ALDOW = Alarm.RTC_Wday; /* ALDOW 3 星期报警值 */
0000f0 e59d0018 LDR r0,[sp,#0x18]
0000f4 e5c10070 STRB r0,[r1,#0x70]
;;;177 ALDOY = Alarm.RTC_Yday; /* ALDOY 9 日期(年)报警值 */
0000f8 e59d001c LDR r0,[sp,#0x1c]
0000fc e1c107b4 STRH r0,[r1,#0x74]
;;;178 ALMON = Alarm.RTC_Mon; /* ALMON 4 月报警值 */
000100 e59d0010 LDR r0,[sp,#0x10]
000104 e5c10078 STRB r0,[r1,#0x78]
;;;179 ALYEAR = Alarm.RTC_Year; /* ALYEAR 12 年报警值 */
000108 e59d0014 LDR r0,[sp,#0x14]
00010c e1c107bc STRH r0,[r1,#0x7c]
;;;180 }
000110 e28dd010 ADD sp,sp,#0x10
000114 e12fff1e BX lr
ENDP
RTCGetTime PROC
;;;190 RTCTime RTCGetTime( void )
;;;191 {
000118 e92d4010 PUSH {r4,lr}
00011c e24dd020 SUB sp,sp,#0x20
000120 e1a04000 MOV r4,r0
;;;192 RTCTime LocalTime;
;;;193 LocalTime.RTC_Sec = SEC;
000124 e59f0084 LDR r0,|L1.432|
000128 e5d00020 LDRB r0,[r0,#0x20]
00012c e58d0000 STR r0,[sp,#0]
;;;194 LocalTime.RTC_Min = MIN;
000130 e59f0078 LDR r0,|L1.432|
000134 e5d00024 LDRB r0,[r0,#0x24]
000138 e58d0004 STR r0,[sp,#4]
;;;195 LocalTime.RTC_Hour = HOUR;
00013c e59f006c LDR r0,|L1.432|
000140 e5d00028 LDRB r0,[r0,#0x28]
000144 e58d0008 STR r0,[sp,#8]
;;;196 LocalTime.RTC_Mday = DOM;
000148 e59f0060 LDR r0,|L1.432|
00014c e5d0002c LDRB r0,[r0,#0x2c]
000150 e58d000c STR r0,[sp,#0xc]
;;;197 LocalTime.RTC_Wday = DOW;
000154 e59f0054 LDR r0,|L1.432|
000158 e5d00030 LDRB r0,[r0,#0x30]
00015c e58d0018 STR r0,[sp,#0x18]
;;;198 LocalTime.RTC_Yday = DOY;
000160 e59f0048 LDR r0,|L1.432|
000164 e1d003b4 LDRH r0,[r0,#0x34]
000168 e58d001c STR r0,[sp,#0x1c]
;;;199 LocalTime.RTC_Mon = MONTH;
00016c e59f003c LDR r0,|L1.432|
000170 e5d00038 LDRB r0,[r0,#0x38]
000174 e58d0010 STR r0,[sp,#0x10]
;;;200 LocalTime.RTC_Year = YEAR;
000178 e59f0030 LDR r0,|L1.432|
00017c e1d003bc LDRH r0,[r0,#0x3c]
000180 e58d0014 STR r0,[sp,#0x14]
;;;201 return LocalTime;
000184 e3a02020 MOV r2,#0x20
000188 e1a0100d MOV r1,sp
00018c e1a00004 MOV r0,r4
000190 ebfffffe BL __aeabi_memcpy4
000194 e28dd020 ADD sp,sp,#0x20
000198 e8bd4010 POP {r4,lr}
;;;202 }
00019c e12fff1e BX lr
ENDP
RTCSetAlarmMask PROC
;;;212 {
;;;213 AMR = 0x00;
0001a0 e3a01000 MOV r1,#0
0001a4 e59f2004 LDR r2,|L1.432|
0001a8 e5c21010 STRB r1,[r2,#0x10]
;;;214 /*
;;;215 0 AMRSEC 为1 时,秒值不与报警寄存器比较。
;;;216 1 AMRMIN 为1 时,分值不与报警寄存器比较。
;;;217 2 AMRHOUR 为1 时,小时值不与报警寄存器比较。
;;;218 3 AMRDOM 为1 时,日期(月)值不与报警寄存器比较。
;;;219 4 AMRDOW 为1 时,星期值不与报警寄存器比较。
;;;220 5 AMRDOY 为1 时,日期(年)值不与报警寄存器比较。
;;;221 6 AMRMON 为1 时,月值不与报警寄存器比较。
;;;222 7 AMRYEAR 为1 时,年值不与报警寄存器比较。
;;;223 */
;;;224 }
0001ac e12fff1e BX lr
|L1.432|
0001b0 e0024000 DCD 0xe0024000
|L1.436|
0001b4 0000016d DCD 0x0000016d
|L1.440|
0001b8 000007d7 DCD 0x000007d7
ENDP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -