; generated by Component: ARM Compiler 5.05 (build 41) Tool: ArmCC [4d0eb9]
; commandline ArmCC [--list --debug -c --asm --interleave -o.\obj\timer.o --asm_dir=.\lst\ --list_dir=.\lst\ --depend=.\obj\timer.d --cpu=Cortex-M0 --apcs=interwork -I..\..\..\Library\CMSIS\Include -I..\..\..\Library\Device\Nuvoton\Mini51Series\Include -I..\..\..\Library\StdDriver\inc -I.\StdDriver\inc -I.\CMSIS -IG:\Geek\Projects\Zulolo_F\Force\Code\Zulolo_F_Force\RTE -ID:\Keil_v5\ARM\PACK\Nuvoton\NuMicro_DFP\1.0.2\Device\Mini51\Include -ID:\Keil_v5\ARM\CMSIS\Include -I\ -D__MICROLIB --omf_browse=.\obj\timer.crf StdDriver\src\timer.c]
                          THUMB

                          AREA ||.text||, CODE, READONLY, ALIGN=2

                  TIMER_GetModuleClock PROC
;;;185      */
;;;186    uint32_t TIMER_GetModuleClock(TIMER_T *timer)
000000  4a55              LDR      r2,|L1.344|
;;;187    {
;;;188        uint32_t u32Src;
;;;189        if(timer == TIMER0)
;;;190            u32Src = (CLK->CLKSEL1 & CLK_CLKSEL1_TMR0_S_Msk) >> CLK_CLKSEL1_TMR0_S_Pos;
000002  4956              LDR      r1,|L1.348|
000004  4290              CMP      r0,r2                 ;189
;;;191        else
;;;192            u32Src = (CLK->CLKSEL1 & CLK_CLKSEL1_TMR1_S_Msk) >> CLK_CLKSEL1_TMR1_S_Pos;
000006  6948              LDR      r0,[r1,#0x14]
000008  d101              BNE      |L1.14|
;;;193        
;;;194        if(u32Src == 0)
;;;195            return((CLK->PWRCON & CLK_PWRCON_XTLCLK_EN_Msk) == 1 ? __XTAL12M : __XTAL32K);
;;;196        else if(u32Src == 1)
;;;197            return __IRC10K;
;;;198        else if(u32Src == 2)
;;;199            return SystemCoreClock;
;;;200        else
;;;201            return __IRC22M;
;;;202    
;;;203    }
00000a  0a00              LSRS     r0,r0,#8
00000c  e000              B        |L1.16|
                  |L1.14|
00000e  0b00              LSRS     r0,r0,#12
                  |L1.16|
000010  0740              LSLS     r0,r0,#29
000012  0f40              LSRS     r0,r0,#29
000014  d005              BEQ      |L1.34|
000016  2801              CMP      r0,#1                 ;196
000018  d00d              BEQ      |L1.54|
00001a  2802              CMP      r0,#2                 ;198
00001c  d00d              BEQ      |L1.58|
00001e  4850              LDR      r0,|L1.352|
000020  4770              BX       lr
                  |L1.34|
000022  6808              LDR      r0,[r1,#0]            ;195
000024  0780              LSLS     r0,r0,#30             ;195
000026  0f80              LSRS     r0,r0,#30             ;195
000028  2801              CMP      r0,#1                 ;195
00002a  d002              BEQ      |L1.50|
00002c  2001              MOVS     r0,#1                 ;195
00002e  03c0              LSLS     r0,r0,#15             ;195
000030  4770              BX       lr
                  |L1.50|
000032  484c              LDR      r0,|L1.356|
000034  4770              BX       lr
                  |L1.54|
000036  484c              LDR      r0,|L1.360|
000038  4770              BX       lr
                  |L1.58|
00003a  484c              LDR      r0,|L1.364|
00003c  6800              LDR      r0,[r0,#0]            ;199  ; SystemCoreClock
00003e  4770              BX       lr
;;;204    
                          ENDP

                  TIMER_Open PROC
;;;40       */
;;;41     uint32_t TIMER_Open(TIMER_T *timer, uint32_t u32Mode, uint32_t u32Freq)
000040  b5f8              PUSH     {r3-r7,lr}
;;;42     {
000042  4613              MOV      r3,r2
000044  460f              MOV      r7,r1
000046  4606              MOV      r6,r0
;;;43         uint32_t u32Clk = TIMER_GetModuleClock(timer);
000048  f7fffffe          BL       TIMER_GetModuleClock
00004c  4604              MOV      r4,r0
;;;44         uint32_t u32Cmpr = 0, u32Prescale = 0;
00004e  2500              MOVS     r5,#0
;;;45         
;;;46         // Fastest possible timer working freq is u32Clk / 2. While cmpr = 2, pre-scale = 0
;;;47         if(u32Freq > (u32Clk / 2)) {       
000050  0840              LSRS     r0,r0,#1
000052  4298              CMP      r0,r3
000054  d201              BCS      |L1.90|
;;;48             u32Cmpr = 2;
000056  2002              MOVS     r0,#2
000058  e008              B        |L1.108|
                  |L1.90|
;;;49         } else {
;;;50             if(u32Clk > 0xFFFFFF) { // For Mini, only needs to consider 24MHz at most 
00005a  4945              LDR      r1,|L1.368|
00005c  428c              CMP      r4,r1
00005e  d901              BLS      |L1.100|
;;;51                 u32Prescale = 1;
000060  2501              MOVS     r5,#1
;;;52                 u32Clk >>= 1;            
000062  4604              MOV      r4,r0
                  |L1.100|
;;;53             }
;;;54             u32Cmpr = u32Clk / u32Freq;
000064  4619              MOV      r1,r3
000066  4620              MOV      r0,r4
000068  f7fffffe          BL       __aeabi_uidivmod
                  |L1.108|
;;;55         }
;;;56             
;;;57         timer->TCSR = u32Mode | u32Prescale;
00006c  432f              ORRS     r7,r7,r5
00006e  6037              STR      r7,[r6,#0]
;;;58         timer->TCMPR = u32Cmpr;
000070  6070              STR      r0,[r6,#4]
000072  1c6d              ADDS     r5,r5,#1
;;;59        
;;;60         return(u32Clk / (u32Cmpr * (u32Prescale + 1)));
000074  4368              MULS     r0,r5,r0
000076  4601              MOV      r1,r0
000078  4620              MOV      r0,r4
00007a  f7fffffe          BL       __aeabi_uidivmod
;;;61     }
00007e  bdf8              POP      {r3-r7,pc}
;;;62     
                          ENDP

                  TIMER_Close PROC
;;;67       */
;;;68     void TIMER_Close(TIMER_T *timer)
000080  2100              MOVS     r1,#0
;;;69     {
;;;70         timer->TCSR = 0;
000082  6001              STR      r1,[r0,#0]
;;;71         timer->TEXCON = 0;
000084  6141              STR      r1,[r0,#0x14]
;;;72     
;;;73     }
000086  4770              BX       lr
;;;74     
                          ENDP

                  TIMER_Delay PROC
;;;82       */
;;;83     void TIMER_Delay(TIMER_T *timer, uint32_t u32Usec)
000088  b5f8              PUSH     {r3-r7,lr}
;;;84     {
00008a  460f              MOV      r7,r1
00008c  4605              MOV      r5,r0
;;;85         uint32_t u32Clk = TIMER_GetModuleClock(timer);
00008e  f7fffffe          BL       TIMER_GetModuleClock
000092  4606              MOV      r6,r0
;;;86         uint32_t u32Prescale = 0, delay = SystemCoreClock / u32Clk;
000094  2000              MOVS     r0,#0
000096  9000              STR      r0,[sp,#0]
000098  4834              LDR      r0,|L1.364|
00009a  4631              MOV      r1,r6
00009c  6800              LDR      r0,[r0,#0]  ; SystemCoreClock
00009e  f7fffffe          BL       __aeabi_uidivmod
0000a2  4604              MOV      r4,r0
;;;87         float fCmpr;
;;;88         
;;;89         // Clear current timer configuration
;;;90         timer->TCSR = 0;
0000a4  2000              MOVS     r0,#0
0000a6  6028              STR      r0,[r5,#0]
;;;91         timer->TEXCON = 0;
0000a8  6168              STR      r0,[r5,#0x14]
;;;92         
;;;93         if(u32Clk == 100000) {         // min delay is 100us if timer clock source is LIRC 10k
0000aa  4832              LDR      r0,|L1.372|
0000ac  4286              CMP      r6,r0
0000ae  d106              BNE      |L1.190|
;;;94             u32Usec = ((u32Usec + 99) / 100) * 100;
0000b0  4638              MOV      r0,r7
0000b2  2164              MOVS     r1,#0x64
0000b4  3063              ADDS     r0,r0,#0x63
0000b6  f7fffffe          BL       __aeabi_uidivmod
0000ba  2164              MOVS     r1,#0x64
0000bc  e005              B        |L1.202|
                  |L1.190|
;;;95         } else {    // 10 usec every step
;;;96             u32Usec = ((u32Usec + 9) / 10) * 10;        
0000be  4638              MOV      r0,r7
0000c0  210a              MOVS     r1,#0xa
0000c2  3009              ADDS     r0,r0,#9
0000c4  f7fffffe          BL       __aeabi_uidivmod
0000c8  210a              MOVS     r1,#0xa
                  |L1.202|
0000ca  4348              MULS     r0,r1,r0
0000cc  4607              MOV      r7,r0
;;;97         } 
;;;98         
;;;99         if(u32Clk > 0xFFFFFF) { // For Mini, only needs to consider 24MHz at most 
0000ce  4828              LDR      r0,|L1.368|
0000d0  4286              CMP      r6,r0
0000d2  d902              BLS      |L1.218|
;;;100            u32Prescale = 1;
0000d4  2001              MOVS     r0,#1
;;;101            u32Clk >>= 1;            
0000d6  0876              LSRS     r6,r6,#1
0000d8  9000              STR      r0,[sp,#0]
                  |L1.218|
;;;102        }
;;;103        
;;;104        // u32Usec * u32Clk might overflow if using uint32_t
;;;105        fCmpr = ((float)u32Usec * (float)u32Clk) / 1000000.0;   
0000da  4630              MOV      r0,r6
0000dc  f7fffffe          BL       __aeabi_ui2f
0000e0  4606              MOV      r6,r0
0000e2  4638              MOV      r0,r7
0000e4  f7fffffe          BL       __aeabi_ui2f
0000e8  4631              MOV      r1,r6
0000ea  f7fffffe          BL       __aeabi_fmul
0000ee  4922              LDR      r1,|L1.376|
0000f0  f7fffffe          BL       __aeabi_fdiv
;;;106    
;;;107        timer->TCMPR = (uint32_t)fCmpr;     
0000f4  f7fffffe          BL       __aeabi_f2uiz
0000f8  6068              STR      r0,[r5,#4]
;;;108        timer->TCSR = TIMER_TCSR_CEN_Msk | u32Prescale; // one shot mode
0000fa  2101              MOVS     r1,#1
0000fc  9800              LDR      r0,[sp,#0]
0000fe  0789              LSLS     r1,r1,#30
000100  4308              ORRS     r0,r0,r1
000102  6028              STR      r0,[r5,#0]
;;;109        
;;;110        // When system clock is faster than timer clock, it is possible timer active bit cannot set in time while we check it.
;;;111        // And the while loop below return immediately, so put a tiny delay here allowing timer start counting and raise active flag.
;;;112        for(; delay > 0; delay--) {    
000104  2c00              CMP      r4,#0
000106  d002              BEQ      |L1.270|
                  |L1.264|
;;;113            __NOP();
000108  bf00              NOP      
00010a  1e64              SUBS     r4,r4,#1
00010c  d1fc              BNE      |L1.264|
                  |L1.270|
;;;114        }        
;;;115       
;;;116        while(timer->TCSR & TIMER_TCSR_CACT_Msk);
00010e  6828              LDR      r0,[r5,#0]
000110  0180              LSLS     r0,r0,#6
000112  d4fc              BMI      |L1.270|
;;;117    
;;;118    }
000114  bdf8              POP      {r3-r7,pc}
;;;119    
                          ENDP

                  TIMER_EnableCapture PROC
;;;134      */
;;;135    void TIMER_EnableCapture(TIMER_T *timer, uint32_t u32CapMode, uint32_t u32Edge)
000116  b510              PUSH     {r4,lr}
;;;136    {
;;;137    
;;;138        timer->TEXCON = (timer->TEXCON & ~(TIMER_TEXCON_CAP_MODE_Msk | 
000118  6943              LDR      r3,[r0,#0x14]
00011a  24ff              MOVS     r4,#0xff
00011c  3417              ADDS     r4,r4,#0x17
00011e  43a3              BICS     r3,r3,r4
000120  430b              ORRS     r3,r3,r1
000122  4313              ORRS     r3,r3,r2
000124  2108              MOVS     r1,#8
000126  430b              ORRS     r3,r3,r1
000128  6143              STR      r3,[r0,#0x14]
;;;139                                           TIMER_TEXCON_RSTCAPSEL_Msk | 
;;;140                                           TIMER_TEXCON_TEX_EDGE_Msk)) |
;;;141                        u32CapMode | u32Edge | TIMER_TEXCON_TEXEN_Msk;
;;;142    }
00012a  bd10              POP      {r4,pc}
;;;143    
                          ENDP

                  TIMER_DisableCapture PROC
;;;148      */
;;;149    void TIMER_DisableCapture(TIMER_T *timer)
00012c  6941              LDR      r1,[r0,#0x14]
;;;150    {
;;;151        timer->TEXCON &= ~TIMER_TEXCON_TEXEN_Msk;
00012e  2208              MOVS     r2,#8
000130  4391              BICS     r1,r1,r2
000132  6141              STR      r1,[r0,#0x14]
;;;152    
;;;153    }
000134  4770              BX       lr
;;;154    
                          ENDP

                  TIMER_EnableEventCounter PROC
;;;163      */
;;;164    void TIMER_EnableEventCounter(TIMER_T *timer, uint32_t u32Edge)
000136  6942              LDR      r2,[r0,#0x14]
;;;165    {
;;;166        timer->TEXCON = (timer->TEXCON & ~TIMER_TEXCON_TX_PHASE_Msk) | u32Edge;
000138  0852              LSRS     r2,r2,#1
00013a  0052              LSLS     r2,r2,#1
00013c  430a              ORRS     r2,r2,r1
00013e  6142              STR      r2,[r0,#0x14]
;;;167        timer->TCSR |= TIMER_TCSR_CTB_Msk;
000140  6801              LDR      r1,[r0,#0]
000142  2201              MOVS     r2,#1
000144  0612              LSLS     r2,r2,#24
000146  4311              ORRS     r1,r1,r2
000148  6001              STR      r1,[r0,#0]
;;;168    }
00014a  4770              BX       lr
;;;169    
                          ENDP

                  TIMER_DisableEventCounter PROC
;;;174      */
;;;175    void TIMER_DisableEventCounter(TIMER_T *timer)
00014c  6801              LDR      r1,[r0,#0]
;;;176    {
;;;177        timer->TCSR &= ~TIMER_TCSR_CTB_Msk;
00014e  2201              MOVS     r2,#1
000150  0612              LSLS     r2,r2,#24
000152  4391              BICS     r1,r1,r2
000154  6001              STR      r1,[r0,#0]
;;;178    }
000156  4770              BX       lr
;;;179    
                          ENDP

                  |L1.344|
                          DCD      0x40010000
                  |L1.348|
                          DCD      0x50000200
                  |L1.352|
                          DCD      0x01518000
                  |L1.356|
                          DCD      0x00b71b00
                  |L1.360|
                          DCD      0x00002710
                  |L1.364|
                          DCD      SystemCoreClock
                  |L1.368|
                          DCD      0x00ffffff
                  |L1.372|
                          DCD      0x000186a0
                  |L1.376|
                          DCD      0x49742400

;*** Start embedded assembler ***

#line 1 "StdDriver\\src\\timer.c"
	AREA ||.rev16_text||, CODE
	THUMB
	EXPORT |__asm___7_timer_c_5bec749a____REV16|
#line 118 ".\\CMSIS\\core_cmInstr.h"
|__asm___7_timer_c_5bec749a____REV16| PROC
#line 119

 rev16 r0, r0
 bx lr
	ENDP
	AREA ||.revsh_text||, CODE
	THUMB
	EXPORT |__asm___7_timer_c_5bec749a____REVSH|
#line 132
|__asm___7_timer_c_5bec749a____REVSH| PROC
#line 133

 revsh r0, r0
 bx lr
	ENDP

;*** End   embedded assembler ***
