; generated by Component: ARM Compiler 5.06 update 4 (build 422) Tool: ArmCC [4d3604]
; commandline ArmCC [--c99 --list --split_sections --debug -c --asm --interleave -o.\obj\lib_driver_timer_pan159.o --asm_dir=.\lst\ --list_dir=.\lst\ --depend=.\obj\lib_driver_timer_pan159.d --cpu=Cortex-M0 --apcs=interwork -O3 --diag_suppress=9931 -I..\..\..\Library\CMSIS\Include -I..\..\..\Library\Device\Nuvoton\Mini58Series\Include -I..\..\..\Library\StdDriver\inc -I..\..\Template -I..\..\..\Library\StdDriver\driver -I.\RTE\_Template -ID:\Keil_v5\ARM\PACK\Nuvoton\NuMicro_DFP\1.0.9\Device\Mini58\Include -ID:\Keil_v5\ARM\CMSIS\Include -D__MICROLIB -D__UVISION_VERSION=523 --omf_browse=.\obj\lib_driver_timer_pan159.crf ..\..\..\Library\StdDriver\driver\lib_driver_timer_pan159.c]
                          THUMB

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

                  DrvTimer0_SetTimer PROC
;;;86     
;;;87     void DrvTimer0_SetTimer(uint32_t usec)
000000  b570              PUSH     {r4-r6,lr}
;;;88     {
;;;89          uint32_t u32Clk = TIMER_GetModuleClock(TIMER0);
000002  4d10              LDR      r5,|L1.68|
000004  4606              MOV      r6,r0                 ;88
000006  4628              MOV      r0,r5
000008  f7fffffe          BL       TIMER_GetModuleClock
;;;90         uint32_t u32Cmpr = 0, u32Prescale = 0;
00000c  2400              MOVS     r4,#0
;;;91     
;;;92         if(usec > (u32Clk / 2)) {
00000e  0841              LSRS     r1,r0,#1
000010  42b1              CMP      r1,r6
000012  d201              BCS      |L1.24|
;;;93             u32Cmpr = 2;
000014  2002              MOVS     r0,#2
000016  e00f              B        |L1.56|
                  |L1.24|
;;;94         } else {
;;;95             if(u32Clk >= 0x2000000) {
000018  2201              MOVS     r2,#1
00001a  0652              LSLS     r2,r2,#25
00001c  4290              CMP      r0,r2
00001e  d302              BCC      |L1.38|
;;;96                 u32Prescale = 3;    // real prescaler value is 4
000020  2403              MOVS     r4,#3
;;;97                 u32Clk >>= 2;
000022  0880              LSRS     r0,r0,#2
000024  e005              B        |L1.50|
                  |L1.38|
;;;98             } else if(u32Clk >= 0x1000000) {
000026  2201              MOVS     r2,#1
000028  0612              LSLS     r2,r2,#24
00002a  4290              CMP      r0,r2
00002c  d301              BCC      |L1.50|
;;;99                 u32Prescale = 1;    // real prescaler value is 2
00002e  2401              MOVS     r4,#1
000030  4608              MOV      r0,r1
                  |L1.50|
;;;100                u32Clk >>= 1;
;;;101            }
;;;102            u32Cmpr = u32Clk / usec;
000032  4631              MOV      r1,r6
000034  f7fffffe          BL       __aeabi_uidivmod
                  |L1.56|
;;;103        }
;;;104    
;;;105        TIMER0->CTL = TIMER_PERIODIC_MODE | u32Prescale;
000038  2101              MOVS     r1,#1
00003a  06c9              LSLS     r1,r1,#27
00003c  430c              ORRS     r4,r4,r1
00003e  602c              STR      r4,[r5,#0]
;;;106        TIMER0->CMP = u32Cmpr;
000040  6068              STR      r0,[r5,#4]
;;;107    }
000042  bd70              POP      {r4-r6,pc}
;;;108    
                          ENDP

                  |L1.68|
                          DCD      0x40010000

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

                  DrvTimer1_SetTimer PROC
;;;108    
;;;109    void DrvTimer1_SetTimer(uint32_t usec)
000000  b570              PUSH     {r4-r6,lr}
;;;110    {
000002  4605              MOV      r5,r0
;;;111         uint32_t u32Clk = TIMER_GetModuleClock(TIMER1);
000004  4810              LDR      r0,|L2.72|
000006  f7fffffe          BL       TIMER_GetModuleClock
;;;112        uint32_t u32Cmpr = 0, u32Prescale = 0;
00000a  2400              MOVS     r4,#0
;;;113    
;;;114        if(usec > (u32Clk / 2)) {
00000c  0841              LSRS     r1,r0,#1
00000e  42a9              CMP      r1,r5
000010  d201              BCS      |L2.22|
;;;115            u32Cmpr = 2;
000012  2002              MOVS     r0,#2
000014  e00f              B        |L2.54|
                  |L2.22|
;;;116        } else {
;;;117            if(u32Clk >= 0x2000000) {
000016  2201              MOVS     r2,#1
000018  0652              LSLS     r2,r2,#25
00001a  4290              CMP      r0,r2
00001c  d302              BCC      |L2.36|
;;;118                u32Prescale = 3;    // real prescaler value is 4
00001e  2403              MOVS     r4,#3
;;;119                u32Clk >>= 2;
000020  0880              LSRS     r0,r0,#2
000022  e005              B        |L2.48|
                  |L2.36|
;;;120            } else if(u32Clk >= 0x1000000) {
000024  2201              MOVS     r2,#1
000026  0612              LSLS     r2,r2,#24
000028  4290              CMP      r0,r2
00002a  d301              BCC      |L2.48|
;;;121                u32Prescale = 1;    // real prescaler value is 2
00002c  2401              MOVS     r4,#1
00002e  4608              MOV      r0,r1
                  |L2.48|
;;;122                u32Clk >>= 1;
;;;123            }
;;;124            u32Cmpr = u32Clk / usec;
000030  4629              MOV      r1,r5
000032  f7fffffe          BL       __aeabi_uidivmod
                  |L2.54|
;;;125        }
;;;126    
;;;127        TIMER1->CTL = TIMER_PERIODIC_MODE | u32Prescale;
000036  2101              MOVS     r1,#1
000038  06c9              LSLS     r1,r1,#27
00003a  430c              ORRS     r4,r4,r1
00003c  4902              LDR      r1,|L2.72|
00003e  3920              SUBS     r1,r1,#0x20
000040  620c              STR      r4,[r1,#0x20]
;;;128        TIMER1->CMP = u32Cmpr;
000042  6248              STR      r0,[r1,#0x24]
;;;129    }
000044  bd70              POP      {r4-r6,pc}
                          ENDP

000046  0000              DCW      0x0000
                  |L2.72|
                          DCD      0x40010020

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

                  NVIC_SetPriority PROC
;;;687     */
;;;688    __STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
000000  0783              LSLS     r3,r0,#30
;;;689    {
;;;690      if ((int32_t)(IRQn) < 0)
;;;691      {
;;;692        SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
000002  22ff              MOVS     r2,#0xff
000004  0edb              LSRS     r3,r3,#27
000006  409a              LSLS     r2,r2,r3
000008  0789              LSLS     r1,r1,#30
00000a  0e09              LSRS     r1,r1,#24
00000c  4099              LSLS     r1,r1,r3
00000e  2800              CMP      r0,#0                 ;690
000010  da0b              BGE      |L3.42|
000012  0700              LSLS     r0,r0,#28
000014  0f00              LSRS     r0,r0,#28
000016  3808              SUBS     r0,r0,#8
000018  0883              LSRS     r3,r0,#2
00001a  4808              LDR      r0,|L3.60|
00001c  009b              LSLS     r3,r3,#2
00001e  1818              ADDS     r0,r3,r0
000020  69c3              LDR      r3,[r0,#0x1c]
000022  4393              BICS     r3,r3,r2
000024  430b              ORRS     r3,r3,r1
000026  61c3              STR      r3,[r0,#0x1c]
;;;693           (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
;;;694      }
;;;695      else
;;;696      {
;;;697        NVIC->IP[_IP_IDX(IRQn)]  = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)]  & ~(0xFFUL << _BIT_SHIFT(IRQn))) |
;;;698           (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));
;;;699      }
;;;700    }
000028  4770              BX       lr
                  |L3.42|
00002a  0883              LSRS     r3,r0,#2              ;697
00002c  4804              LDR      r0,|L3.64|
00002e  009b              LSLS     r3,r3,#2              ;697
000030  181b              ADDS     r3,r3,r0              ;697
000032  6818              LDR      r0,[r3,#0]            ;697
000034  4390              BICS     r0,r0,r2              ;697
000036  4308              ORRS     r0,r0,r1              ;697
000038  6018              STR      r0,[r3,#0]            ;697
00003a  4770              BX       lr
;;;701    
                          ENDP

                  |L3.60|
                          DCD      0xe000ed00
                  |L3.64|
                          DCD      0xe000e400

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

                  TMR0_IRQHandler PROC
;;;42      ******************************************************************************/
;;;43     void TMR0_IRQHandler(void)
000000  4904              LDR      r1,|L4.20|
000002  2001              MOVS     r0,#1
000004  6088              STR      r0,[r1,#8]
;;;44     {
;;;45     	TIMER_ClearIntFlag(TIMER0);
;;;46         if(__s_lib_driver_timer_pan159_irq_handler){
000006  4804              LDR      r0,|L4.24|
000008  6800              LDR      r0,[r0,#0]  ; __s_lib_driver_timer_pan159_irq_handler
00000a  2800              CMP      r0,#0
00000c  d000              BEQ      |L4.16|
;;;47             __s_lib_driver_timer_pan159_irq_handler();
00000e  4700              BX       r0
                  |L4.16|
;;;48         }
;;;49     }
000010  4770              BX       lr
;;;50     
                          ENDP

000012  0000              DCW      0x0000
                  |L4.20|
                          DCD      0x40010000
                  |L4.24|
                          DCD      ||.data||

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

                  TMR1_IRQHandler PROC
;;;78      ******************************************************************************/
;;;79     void TMR1_IRQHandler(void)
000000  4904              LDR      r1,|L5.20|
000002  2001              MOVS     r0,#1
000004  6088              STR      r0,[r1,#8]
;;;80     {
;;;81     	TIMER_ClearIntFlag(TIMER1);
;;;82         if(__s_lib_driver_timer1_pan159_irq_handler){
000006  4804              LDR      r0,|L5.24|
000008  6840              LDR      r0,[r0,#4]  ; __s_lib_driver_timer1_pan159_irq_handler
00000a  2800              CMP      r0,#0
00000c  d000              BEQ      |L5.16|
;;;83             __s_lib_driver_timer1_pan159_irq_handler();
00000e  4700              BX       r0
                  |L5.16|
;;;84         }
;;;85     }
000010  4770              BX       lr
;;;86     
                          ENDP

000012  0000              DCW      0x0000
                  |L5.20|
                          DCD      0x40010020
                  |L5.24|
                          DCD      ||.data||

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

                  timer1_pan159_init PROC
;;;57      ******************************************************************************/
;;;58     void timer1_pan159_init(uint32_t freq, void(*irq_handler)(void))
000000  b570              PUSH     {r4-r6,lr}
;;;59     {
000002  4604              MOV      r4,r0
000004  460d              MOV      r5,r1
;;;60     	CLK_EnableModuleClock(TMR1_MODULE);
000006  480f              LDR      r0,|L6.68|
000008  f7fffffe          BL       CLK_EnableModuleClock
;;;61     	TIMER_Open(TIMER1, TIMER_PERIODIC_MODE, freq);
00000c  4622              MOV      r2,r4
00000e  4c0e              LDR      r4,|L6.72|
000010  2101              MOVS     r1,#1
000012  06c9              LSLS     r1,r1,#27
000014  4620              MOV      r0,r4
000016  f7fffffe          BL       TIMER_Open
;;;62         // Enable timer interrupt
;;;63         if(irq_handler){
00001a  2d00              CMP      r5,#0
00001c  d00a              BEQ      |L6.52|
00001e  6820              LDR      r0,[r4,#0]
000020  0621              LSLS     r1,r4,#24
000022  4308              ORRS     r0,r0,r1
000024  6020              STR      r0,[r4,#0]
000026  1508              ASRS     r0,r1,#20
000028  4908              LDR      r1,|L6.76|
00002a  6008              STR      r0,[r1,#0]
;;;64             TIMER_EnableInt(TIMER1);
;;;65             NVIC_EnableIRQ(TMR1_IRQn);
;;;66             NVIC_SetPriority(TMR1_IRQn,2);
00002c  2102              MOVS     r1,#2
00002e  2009              MOVS     r0,#9
000030  f7fffffe          BL       NVIC_SetPriority
                  |L6.52|
;;;67         }
;;;68         __s_lib_driver_timer1_pan159_irq_handler = irq_handler;
000034  4806              LDR      r0,|L6.80|
000036  6045              STR      r5,[r0,#4]  ; __s_lib_driver_timer1_pan159_irq_handler
000038  6820              LDR      r0,[r4,#0]
00003a  2101              MOVS     r1,#1
00003c  0789              LSLS     r1,r1,#30
00003e  4308              ORRS     r0,r0,r1
000040  6020              STR      r0,[r4,#0]
;;;69         // Start Timer 0.
;;;70         TIMER_Start(TIMER1);
;;;71     }
000042  bd70              POP      {r4-r6,pc}
;;;72     /*******************************************************************************
                          ENDP

                  |L6.68|
                          DCD      0xaec00003
                  |L6.72|
                          DCD      0x40010020
                  |L6.76|
                          DCD      0xe000e100
                  |L6.80|
                          DCD      ||.data||

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

                  timer_pan159_init PROC
;;;20      ******************************************************************************/
;;;21     void timer_pan159_init(uint32_t freq, void(*irq_handler)(void))
000000  b570              PUSH     {r4-r6,lr}
;;;22     {
000002  4604              MOV      r4,r0
000004  460d              MOV      r5,r1
;;;23     	CLK_EnableModuleClock(TMR0_MODULE);
000006  480f              LDR      r0,|L7.68|
000008  f7fffffe          BL       CLK_EnableModuleClock
;;;24     	TIMER_Open(TIMER0, TIMER_PERIODIC_MODE, freq);
00000c  4622              MOV      r2,r4
00000e  4c0e              LDR      r4,|L7.72|
000010  2101              MOVS     r1,#1
000012  06c9              LSLS     r1,r1,#27
000014  4620              MOV      r0,r4
000016  f7fffffe          BL       TIMER_Open
;;;25         // Enable timer interrupt
;;;26         if(irq_handler){
00001a  2d00              CMP      r5,#0
00001c  d00a              BEQ      |L7.52|
00001e  6820              LDR      r0,[r4,#0]
000020  0361              LSLS     r1,r4,#13
000022  4308              ORRS     r0,r0,r1
000024  6020              STR      r0,[r4,#0]
000026  1548              ASRS     r0,r1,#21
000028  4908              LDR      r1,|L7.76|
00002a  6008              STR      r0,[r1,#0]
;;;27             TIMER_EnableInt(TIMER0);
;;;28             NVIC_EnableIRQ(TMR0_IRQn);
;;;29             NVIC_SetPriority(TMR0_IRQn,2);
00002c  2102              MOVS     r1,#2
00002e  2008              MOVS     r0,#8
000030  f7fffffe          BL       NVIC_SetPriority
                  |L7.52|
;;;30         }
;;;31         __s_lib_driver_timer_pan159_irq_handler = irq_handler;
000034  4806              LDR      r0,|L7.80|
000036  6005              STR      r5,[r0,#0]  ; __s_lib_driver_timer_pan159_irq_handler
000038  6820              LDR      r0,[r4,#0]
00003a  2101              MOVS     r1,#1
00003c  0789              LSLS     r1,r1,#30
00003e  4308              ORRS     r0,r0,r1
000040  6020              STR      r0,[r4,#0]
;;;32         // Start Timer 0.
;;;33         TIMER_Start(TIMER0);
;;;34     }
000042  bd70              POP      {r4-r6,pc}
;;;35     
                          ENDP

                  |L7.68|
                          DCD      0xae800002
                  |L7.72|
                          DCD      0x40010000
                  |L7.76|
                          DCD      0xe000e100
                  |L7.80|
                          DCD      ||.data||

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

                  __s_lib_driver_timer_pan159_irq_handler
                          DCD      0x00000000
                  __s_lib_driver_timer1_pan159_irq_handler
                          DCD      0x00000000

;*** Start embedded assembler ***

#line 1 "..\\..\\..\\Library\\StdDriver\\driver\\lib_driver_timer_pan159.c"
	AREA ||.rev16_text||, CODE
	THUMB
	EXPORT |__asm___25_lib_driver_timer_pan159_c_81fccacb____REV16|
#line 388 "..\\..\\..\\Library\\CMSIS\\Include\\cmsis_armcc.h"
|__asm___25_lib_driver_timer_pan159_c_81fccacb____REV16| PROC
#line 389

 rev16 r0, r0
 bx lr
	ENDP
	AREA ||.revsh_text||, CODE
	THUMB
	EXPORT |__asm___25_lib_driver_timer_pan159_c_81fccacb____REVSH|
#line 402
|__asm___25_lib_driver_timer_pan159_c_81fccacb____REVSH| PROC
#line 403

 revsh r0, r0
 bx lr
	ENDP

;*** End   embedded assembler ***
