; generated by ARM C/C++ Compiler, 4.1 [Build 894]
; commandline ArmCC [--c99 --list --split_sections --debug -c --asm --interleave -o.\obj\smpl_rtc.o --asm_dir=.\lst\ --list_dir=.\lst\ --depend=.\obj\smpl_rtc.d --cpu=Cortex-M0 --apcs=interwork -I..\inc -I..\drv -I..\bsp -I..\bsp\Cmsis -I..\bsp\Driver -I..\bsp\system -I..\lib -I..\lib\libtk -IC:\Keil\ARM\RV31\Inc -IC:\Keil\ARM\CMSIS\Include -D__MICROLIB -D__LCDDISPLAY_BTL001_H --omf_browse=.\obj\smpl_rtc.crf ..\src\Smpl_RTC.c]
                          THUMB

                          AREA ||i.RTC_AlarmCallBackfn||, CODE, READONLY, ALIGN=1

                  RTC_AlarmCallBackfn PROC
;;;104    
;;;105    void RTC_AlarmCallBackfn(void)
000000  b500              PUSH     {lr}
;;;106    {
000002  b089              SUB      sp,sp,#0x24
;;;107    	S_DRVRTC_TIME_DATA_T sCurTime;
;;;108    
;;;109    	//printf("Alarm!!\n");
;;;110    //yuanxh	DrvRTC_Read(DRVRTC_CURRENT_TIME, &sCurTime);
;;;111    	//printf("Current Time:%d/%02d/%02d %02d:%02d:%02d\n",sCurTime.u32Year,sCurTime.u32cMonth,sCurTime.u32cDay,sCurTime.u32cHour,sCurTime.u32cMinute,sCurTime.u32cSecond);
;;;112    //	showTime(sCurTime.u32cHour, sCurTime.u32cMinute);
;;;113    
;;;114    	planNextRTCInterrupt(&sCurTime);
000004  4668              MOV      r0,sp
000006  f7fffffe          BL       planNextRTCInterrupt
;;;115    	
;;;116    }
00000a  b009              ADD      sp,sp,#0x24
00000c  bd00              POP      {pc}
;;;117    
                          ENDP


                          AREA ||i.RTC_TickCallBackfn||, CODE, READONLY, ALIGN=2

                  RTC_TickCallBackfn PROC
;;;118    volatile uint32_t tickcount=0;
;;;119    void RTC_TickCallBackfn(void)
000000  490a              LDR      r1,|L2.44|
;;;120    {
;;;121    	//printf("Tick!!\n");
;;;122    	
;;;123    	if((tickcount%2)==0)
000002  6808              LDR      r0,[r1,#0]  ; tickcount
;;;124    	{
;;;125    		//DrvLCD_EnableSegment(3, 29);
;;;126    		//DrvLCD_DisableSegment(3, 29);
;;;127    		GPIOE->PMD |= 0x1000;GPIOE->DOUT |= 0x0040;	//for LED
000004  4a0b              LDR      r2,|L2.52|
000006  07c3              LSLS     r3,r0,#31             ;123
000008  4809              LDR      r0,|L2.48|
00000a  d008              BEQ      |L2.30|
;;;128    	}
;;;129    	else
;;;130    	{
;;;131    		//DrvLCD_DisableSegment(3, 29);
;;;132    		//DrvLCD_EnableSegment(3, 29);
;;;133    		GPIOE->PMD = 0x1000;GPIOE->DOUT &= 0xFFBF;//for LED
00000c  6002              STR      r2,[r0,#0]
00000e  6882              LDR      r2,[r0,#8]
000010  4b09              LDR      r3,|L2.56|
000012  401a              ANDS     r2,r2,r3
                  |L2.20|
000014  6082              STR      r2,[r0,#8]
;;;134    	}
;;;135    
;;;136    	tickcount++;
000016  6808              LDR      r0,[r1,#0]  ; tickcount
000018  1c40              ADDS     r0,r0,#1
00001a  6008              STR      r0,[r1,#0]  ; tickcount
;;;137    }
00001c  4770              BX       lr
                  |L2.30|
00001e  6803              LDR      r3,[r0,#0]            ;127
000020  4313              ORRS     r3,r3,r2              ;127
000022  6003              STR      r3,[r0,#0]            ;127
000024  6882              LDR      r2,[r0,#8]            ;127
000026  2340              MOVS     r3,#0x40              ;127
000028  431a              ORRS     r2,r2,r3              ;127
00002a  e7f3              B        |L2.20|
;;;138    
                          ENDP

                  |L2.44|
                          DCD      ||.data||
                  |L2.48|
                          DCD      0x50004100
                  |L2.52|
                          DCD      0x00001000
                  |L2.56|
                          DCD      0x0000ffbf

                          AREA ||i.planNextRTCInterrupt||, CODE, READONLY, ALIGN=1

                  planNextRTCInterrupt PROC
;;;21     
;;;22     void planNextRTCInterrupt(S_DRVRTC_TIME_DATA_T *sCurTime)
000000  b570              PUSH     {r4-r6,lr}
;;;23     {
000002  4604              MOV      r4,r0
;;;24     	// plan next interrupt timing
;;;25     	if(sCurTime->u32cMinute < 59)
000004  6880              LDR      r0,[r0,#8]
;;;26     		sCurTime->u32cMinute += 1;
;;;27     	else
;;;28     	{
;;;29     		if(sCurTime->u32cHour < 23)
;;;30     			sCurTime->u32cHour += 1;
;;;31     		else	// next day 
;;;32     		{
;;;33     			sCurTime->u32cHour = 0;
000006  2600              MOVS     r6,#0
000008  283b              CMP      r0,#0x3b              ;25
00000a  d202              BCS      |L3.18|
00000c  1c40              ADDS     r0,r0,#1              ;26
00000e  60a0              STR      r0,[r4,#8]            ;26
000010  e042              B        |L3.152|
                  |L3.18|
000012  68e0              LDR      r0,[r4,#0xc]          ;29
000014  2817              CMP      r0,#0x17              ;29
000016  d202              BCS      |L3.30|
000018  1c40              ADDS     r0,r0,#1              ;30
00001a  60e0              STR      r0,[r4,#0xc]          ;30
00001c  e03b              B        |L3.150|
                  |L3.30|
;;;34     
;;;35     			// new year first day
;;;36     			if(sCurTime->u32cMonth==12 && sCurTime->u32cDay==31) 
00001e  60e6              STR      r6,[r4,#0xc]
000020  69a0              LDR      r0,[r4,#0x18]
;;;37     			{
;;;38     				sCurTime->u32Year += 1;
;;;39     				sCurTime->u32cMonth = 1;
000022  2501              MOVS     r5,#1
000024  280c              CMP      r0,#0xc               ;36
000026  d018              BEQ      |L3.90|
;;;40     				sCurTime->u32cDay = 1;
;;;41     			}
;;;42     			else if(sCurTime->u32cMonth==1 ||
000028  2801              CMP      r0,#1
00002a  d019              BEQ      |L3.96|
;;;43     					sCurTime->u32cMonth==3 ||
00002c  2803              CMP      r0,#3
00002e  d017              BEQ      |L3.96|
;;;44     					sCurTime->u32cMonth==5 ||
000030  2805              CMP      r0,#5
000032  d015              BEQ      |L3.96|
;;;45     					sCurTime->u32cMonth==7 ||
000034  2807              CMP      r0,#7
000036  d013              BEQ      |L3.96|
;;;46     					sCurTime->u32cMonth==8 ||
000038  2808              CMP      r0,#8
00003a  d011              BEQ      |L3.96|
;;;47     					sCurTime->u32cMonth==10 ||
00003c  280a              CMP      r0,#0xa
00003e  d00f              BEQ      |L3.96|
;;;48     					sCurTime->u32cMonth==12)	// 1,3,5,7,8,10,12 31-day month
000040  280c              CMP      r0,#0xc
000042  d00d              BEQ      |L3.96|
;;;49     			{
;;;50     				if(sCurTime->u32cDay < 31)
;;;51     					sCurTime->u32cDay += 1;
;;;52     				else
;;;53     				{
;;;54     					sCurTime->u32cDay = 1;
;;;55     					sCurTime->u32cMonth += 1;
;;;56     				}
;;;57     			}
;;;58     			else if(sCurTime->u32cMonth==2)	// 2, 28 or 29-day month
000044  2802              CMP      r0,#2
000046  d016              BEQ      |L3.118|
;;;59     			{
;;;60     				if(DrvRTC_IsLeapYear())	// leap year
;;;61     				{
;;;62     					if(sCurTime->u32cDay < 29)
;;;63     						sCurTime->u32cDay += 1;
;;;64     					else
;;;65     					{
;;;66     						sCurTime->u32cDay = 1;
;;;67     						sCurTime->u32cMonth += 1;
;;;68     					}
;;;69     				}
;;;70     				else
;;;71     				{
;;;72     					if(sCurTime->u32cDay < 28)
;;;73     						sCurTime->u32cDay += 1;
;;;74     					else
;;;75     					{
;;;76     						sCurTime->u32cDay = 1;
;;;77     						sCurTime->u32cMonth += 1;
;;;78     					}
;;;79     				}
;;;80     			}
;;;81     			else if(sCurTime->u32cMonth==4 ||
000048  2804              CMP      r0,#4
00004a  d027              BEQ      |L3.156|
;;;82     					sCurTime->u32cMonth==6 ||
00004c  2806              CMP      r0,#6
00004e  d025              BEQ      |L3.156|
;;;83     					sCurTime->u32cMonth==9 ||
000050  2809              CMP      r0,#9
000052  d023              BEQ      |L3.156|
;;;84     					sCurTime->u32cMonth==11)	// 4,6,9,11 30-day
000054  280b              CMP      r0,#0xb
000056  d021              BEQ      |L3.156|
000058  e01d              B        |L3.150|
                  |L3.90|
00005a  6961              LDR      r1,[r4,#0x14]         ;36
00005c  291f              CMP      r1,#0x1f              ;36
00005e  d004              BEQ      |L3.106|
                  |L3.96|
000060  6961              LDR      r1,[r4,#0x14]         ;50
000062  291f              CMP      r1,#0x1f              ;50
000064  d31d              BCC      |L3.162|
                  |L3.102|
000066  6165              STR      r5,[r4,#0x14]         ;55
000068  e013              B        |L3.146|
                  |L3.106|
00006a  69e0              LDR      r0,[r4,#0x1c]         ;38
00006c  61a5              STR      r5,[r4,#0x18]         ;40
00006e  1c40              ADDS     r0,r0,#1              ;38
000070  6165              STR      r5,[r4,#0x14]         ;40
000072  61e0              STR      r0,[r4,#0x1c]         ;40
000074  e00f              B        |L3.150|
                  |L3.118|
000076  f7fffffe          BL       DrvRTC_IsLeapYear
00007a  2800              CMP      r0,#0                 ;60
00007c  6960              LDR      r0,[r4,#0x14]         ;60
00007e  d004              BEQ      |L3.138|
000080  281d              CMP      r0,#0x1d              ;62
000082  d204              BCS      |L3.142|
                  |L3.132|
000084  1c40              ADDS     r0,r0,#1              ;63
000086  6160              STR      r0,[r4,#0x14]         ;63
000088  e005              B        |L3.150|
                  |L3.138|
00008a  281c              CMP      r0,#0x1c              ;72
00008c  d3fa              BCC      |L3.132|
                  |L3.142|
00008e  6165              STR      r5,[r4,#0x14]         ;77
000090  69a0              LDR      r0,[r4,#0x18]         ;77
                  |L3.146|
;;;85     			{
;;;86     				if(sCurTime->u32cDay < 30)
;;;87     					sCurTime->u32cDay += 1;
;;;88     				else
;;;89     				{
;;;90     					sCurTime->u32cDay = 1;
;;;91     					sCurTime->u32cMonth += 1;
000092  1c40              ADDS     r0,r0,#1
000094  61a0              STR      r0,[r4,#0x18]
                  |L3.150|
;;;92     				}
;;;93     			}			
;;;94     		}
;;;95     		
;;;96     		sCurTime->u32cMinute = 0;
000096  60a6              STR      r6,[r4,#8]
                  |L3.152|
;;;97     	}
;;;98     	sCurTime->u32cSecond = 0;
;;;99     	//printf("Next Interrupt Time:%d/%02d/%02d %02d:%02d:%02d\n",sCurTime->u32Year,sCurTime->u32cMonth,sCurTime->u32cDay,sCurTime->u32cHour,sCurTime->u32cMinute,sCurTime->u32cSecond);
;;;100    //yuanxh	DrvRTC_Write(DRVRTC_ALARM_TIME, sCurTime);
;;;101    //yuanxh	DrvRTC_EnableInt(DRVRTC_ALARM_INT, RTC_AlarmCallBackfn);
;;;102    	
;;;103    }
000098  6066              STR      r6,[r4,#4]
00009a  bd70              POP      {r4-r6,pc}
                  |L3.156|
00009c  6961              LDR      r1,[r4,#0x14]         ;86
00009e  291e              CMP      r1,#0x1e              ;86
0000a0  d2e1              BCS      |L3.102|
                  |L3.162|
0000a2  1c49              ADDS     r1,r1,#1              ;87
0000a4  6161              STR      r1,[r4,#0x14]         ;87
0000a6  e7f6              B        |L3.150|
;;;104    
                          ENDP


                          AREA ||.data||, DATA, ALIGN=2

                  tickcount
                          DCD      0x00000000

;*** Start embedded assembler ***

#line 1 "..\\src\\Smpl_RTC.c"
	AREA ||.rev16_text||, CODE, READONLY
	THUMB
	EXPORT |__asm___10_Smpl_RTC_c_1f742779____REV16|
#line 115 "C:\\Keil\\ARM\\CMSIS\\Include\\core_cmInstr.h"
|__asm___10_Smpl_RTC_c_1f742779____REV16| PROC
#line 116

 rev16 r0, r0
 bx lr
	ENDP
	AREA ||.revsh_text||, CODE, READONLY
	THUMB
	EXPORT |__asm___10_Smpl_RTC_c_1f742779____REVSH|
#line 130
|__asm___10_Smpl_RTC_c_1f742779____REVSH| PROC
#line 131

 revsh r0, r0
 bx lr
	ENDP

;*** End   embedded assembler ***
