; generated by ARM C/C++ Compiler, 4.1 [Build 894]
; commandline ArmCC [--list --split_sections --debug -c --asm --interleave -o.\obj\timer_ctrl.o --asm_dir=.\lst\ --list_dir=.\lst\ --depend=.\obj\timer_ctrl.d --cpu=Cortex-M0 --apcs=interwork -I..\..\..\..\Library\Device\Nuvoton\Nano1X2Series\Include -I..\..\..\..\Library\StdDriver\inc -I..\..\..\..\Library\CMSIS\Include -IC:\Keil\ARM\RV31\Inc -IC:\Keil\ARM\CMSIS\Include -D__MICROLIB --omf_browse=.\obj\timer_ctrl.crf ..\Timer_Ctrl.c]
                          THUMB

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

                  ChronographRead PROC
;;;103    
;;;104    int32_t ChronographRead(char Chron)
000000  b570              PUSH     {r4-r6,lr}
;;;105    {
;;;106    	int32_t chron_diff = (tick_counter - Chronograph[Chron].currentTime);
000002  210c              MOVS     r1,#0xc
000004  4a08              LDR      r2,|L1.40|
000006  4341              MULS     r1,r0,r1
000008  1889              ADDS     r1,r1,r2
00000a  4d08              LDR      r5,|L1.44|
00000c  6889              LDR      r1,[r1,#8]
00000e  682a              LDR      r2,[r5,#0]  ; tick_counter
000010  1a54              SUBS     r4,r2,r1
;;;107    	
;;;108    	if(Chron==ChronMain)
000012  2800              CMP      r0,#0
000014  d106              BNE      |L1.36|
;;;109    		UPDATE_DT = (float)chron_diff/1000;
000016  4620              MOV      r0,r4
000018  f7fffffe          BL       __aeabi_i2f
00001c  4904              LDR      r1,|L1.48|
00001e  f7fffffe          BL       __aeabi_fdiv
000022  6128              STR      r0,[r5,#0x10]  ; UPDATE_DT
                  |L1.36|
;;;110    	
;;;111    	return chron_diff;
000024  4620              MOV      r0,r4
;;;112    }
000026  bd70              POP      {r4-r6,pc}
;;;113    
                          ENDP

                  |L1.40|
                          DCD      ||.bss||
                  |L1.44|
                          DCD      ||.data||
                  |L1.48|
                          DCD      0x447a0000

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

                  ChronographSet PROC
;;;92     
;;;93     void ChronographSet(char Chron)
000000  210c              MOVS     r1,#0xc
;;;94     {
;;;95     	Chronograph[Chron].lastTime = Chronograph[Chron].currentTime;
000002  4a04              LDR      r2,|L2.20|
000004  4348              MULS     r0,r1,r0
000006  1881              ADDS     r1,r0,r2
000008  688b              LDR      r3,[r1,#8]
00000a  5013              STR      r3,[r2,r0]
;;;96     	Chronograph[Chron].currentTime = tick_counter;  
00000c  4802              LDR      r0,|L2.24|
00000e  6800              LDR      r0,[r0,#0]  ; tick_counter
000010  6088              STR      r0,[r1,#8]
;;;97     }
000012  4770              BX       lr
;;;98     
                          ENDP

                  |L2.20|
                          DCD      ||.bss||
                  |L2.24|
                          DCD      ||.data||

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

                  ChronographStart PROC
;;;98     
;;;99     void ChronographStart(char Chron)
000000  4904              LDR      r1,|L3.20|
;;;100    {
;;;101    	Chronograph[Chron].currentTime = Chronograph[Chron].lastTime = tick_counter;
000002  6809              LDR      r1,[r1,#0]  ; tick_counter
000004  220c              MOVS     r2,#0xc
000006  4350              MULS     r0,r2,r0
000008  4a03              LDR      r2,|L3.24|
00000a  5011              STR      r1,[r2,r0]
00000c  1880              ADDS     r0,r0,r2
00000e  6081              STR      r1,[r0,#8]
;;;102    }
000010  4770              BX       lr
;;;103    
                          ENDP

000012  0000              DCW      0x0000
                  |L3.20|
                          DCD      ||.data||
                  |L3.24|
                          DCD      ||.bss||

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

                  Delay PROC
;;;37     
;;;38     void Delay(uint32_t delayCnt)
000000  e001              B        |L4.6|
                  |L4.2|
;;;39     {
;;;40     	while(delayCnt--) {
;;;41     		__NOP();
000002  bf00              NOP      
;;;42     		__NOP();
000004  bf00              NOP      
                  |L4.6|
000006  1e40              SUBS     r0,r0,#1              ;40
000008  d2fb              BCS      |L4.2|
;;;43     	}
;;;44     }
00000a  4770              BX       lr
;;;45     void DelayLoop(unsigned short delay){
                          ENDP


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

                  DelayLoop PROC
                  |L5.0|
;;;44     }
;;;45     void DelayLoop(unsigned short delay){
000000  1e40              SUBS     r0,r0,#1
;;;46     	while(--delay);//About 200 psec per run
000002  0400              LSLS     r0,r0,#16
000004  0c00              LSRS     r0,r0,#16
000006  d1fb              BNE      |L5.0|
;;;47     }
000008  4770              BX       lr
;;;48     void DelayUsec(unsigned int usec){
                          ENDP


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

                  DelayMsec PROC
;;;51     }
;;;52     void DelayMsec(unsigned short msec){
000000  4903              LDR      r1,|L6.16|
000002  680a              LDR      r2,[r1,#0]  ; tick_counter
                  |L6.4|
000004  680b              LDR      r3,[r1,#0]  ; tick_counter
;;;53     	int tick_count= getTickCount();
;;;54     	while((getTickCount()-tick_count)<msec);
000006  1a9b              SUBS     r3,r3,r2
000008  4283              CMP      r3,r0
00000a  dbfb              BLT      |L6.4|
;;;55     }
00000c  4770              BX       lr
;;;56     void setup_system_tick(uint32_t sampleRate)
                          ENDP

00000e  0000              DCW      0x0000
                  |L6.16|
                          DCD      ||.data||

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

                  DelayUsec PROC
;;;47     }
;;;48     void DelayUsec(unsigned int usec){
000000  e004              B        |L7.12|
                  |L7.2|
;;;49     	while(usec--)
;;;50     		DelayLoop(5);
000002  2105              MOVS     r1,#5
                  |L7.4|
000004  1e49              SUBS     r1,r1,#1
000006  0409              LSLS     r1,r1,#16
000008  0c09              LSRS     r1,r1,#16
00000a  d1fb              BNE      |L7.4|
                  |L7.12|
00000c  1e40              SUBS     r0,r0,#1              ;49
00000e  d2f8              BCS      |L7.2|
;;;51     }
000010  4770              BX       lr
;;;52     void DelayMsec(unsigned short msec){
                          ENDP


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

                  GetFrameCount PROC
;;;87     
;;;88     uint32_t GetFrameCount()
000000  4801              LDR      r0,|L8.8|
;;;89     {
;;;90     	return frame_counter;
000002  6840              LDR      r0,[r0,#4]  ; frame_counter
;;;91     }
000004  4770              BX       lr
;;;92     
                          ENDP

000006  0000              DCW      0x0000
                  |L8.8|
                          DCD      ||.data||

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

                  IncFrameCount PROC
;;;82     
;;;83     void IncFrameCount(int inc)
000000  4902              LDR      r1,|L9.12|
;;;84     {
;;;85     	frame_counter+=inc;
000002  684a              LDR      r2,[r1,#4]  ; frame_counter
000004  1810              ADDS     r0,r2,r0
000006  6048              STR      r0,[r1,#4]  ; frame_counter
;;;86     }
000008  4770              BX       lr
;;;87     
                          ENDP

00000a  0000              DCW      0x0000
                  |L9.12|
                          DCD      ||.data||

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

                  SysTick_Config PROC
;;;644     */
;;;645    __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
000000  490b              LDR      r1,|L10.48|
;;;646    {
000002  b510              PUSH     {r4,lr}
;;;647      if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
000004  4288              CMP      r0,r1
000006  d901              BLS      |L10.12|
000008  2001              MOVS     r0,#1
;;;648    
;;;649      SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
;;;650      NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */
;;;651      SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
;;;652      SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
;;;653                       SysTick_CTRL_TICKINT_Msk   |
;;;654                       SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
;;;655      return (0);                                                  /* Function successful */
;;;656    }
00000a  bd10              POP      {r4,pc}
                  |L10.12|
00000c  0201              LSLS     r1,r0,#8              ;649
00000e  0a09              LSRS     r1,r1,#8              ;649
000010  4808              LDR      r0,|L10.52|
000012  1e49              SUBS     r1,r1,#1              ;649
000014  6141              STR      r1,[r0,#0x14]         ;649
000016  4908              LDR      r1,|L10.56|
000018  2307              MOVS     r3,#7                 ;649
00001a  69ca              LDR      r2,[r1,#0x1c]         ;649
00001c  0212              LSLS     r2,r2,#8              ;649
00001e  0a12              LSRS     r2,r2,#8              ;649
000020  0444              LSLS     r4,r0,#17             ;649
000022  4322              ORRS     r2,r2,r4              ;649
000024  61ca              STR      r2,[r1,#0x1c]         ;649
000026  2100              MOVS     r1,#0                 ;651
000028  6181              STR      r1,[r0,#0x18]         ;651
00002a  6103              STR      r3,[r0,#0x10]         ;652
00002c  4608              MOV      r0,r1                 ;655
00002e  bd10              POP      {r4,pc}
;;;657    
                          ENDP

                  |L10.48|
                          DCD      0x00ffffff
                  |L10.52|
                          DCD      0xe000e000
                  |L10.56|
                          DCD      0xe000ed04

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

                  SysTick_Handler PROC
;;;64     }
;;;65     void SysTick_Handler(void)
000000  b510              PUSH     {r4,lr}
;;;66     {
;;;67     	static int FC_Last;
;;;68     	int freqCount=0;
;;;69     
;;;70     	if((tick_counter%1000)==0) {
000002  4c0d              LDR      r4,|L11.56|
000004  217d              MOVS     r1,#0x7d
000006  00c9              LSLS     r1,r1,#3
000008  6820              LDR      r0,[r4,#0]  ; tick_counter
00000a  f7fffffe          BL       __aeabi_uidivmod
00000e  2900              CMP      r1,#0
000010  d10c              BNE      |L11.44|
;;;71     		freqCount=frame_counter-FC_Last;
000012  6860              LDR      r0,[r4,#4]  ; frame_counter
000014  68e1              LDR      r1,[r4,#0xc]  ; FC_Last
000016  1a40              SUBS     r0,r0,r1
;;;72     		UPDATE_DT = (float)(1.0f/freqCount);
000018  f7fffffe          BL       __aeabi_i2f
00001c  4601              MOV      r1,r0
00001e  207f              MOVS     r0,#0x7f
000020  05c0              LSLS     r0,r0,#23
000022  f7fffffe          BL       __aeabi_fdiv
000026  6120              STR      r0,[r4,#0x10]  ; UPDATE_DT
;;;73     #if DISPLAY_LOOP_TIME
;;;74     		printf("FC:%d\n",freqCount);
;;;75     #endif
;;;76     		FC_Last = frame_counter;
000028  6860              LDR      r0,[r4,#4]  ; frame_counter
00002a  60e0              STR      r0,[r4,#0xc]  ; FC_Last
                  |L11.44|
;;;77     	}
;;;78     
;;;79     	tick_counter++;
00002c  6820              LDR      r0,[r4,#0]  ; tick_counter
00002e  1c40              ADDS     r0,r0,#1
000030  6020              STR      r0,[r4,#0]  ; tick_counter
;;;80     	nvtMillisecondTick();
000032  f7fffffe          BL       nvtMillisecondTick
;;;81     }
000036  bd10              POP      {r4,pc}
;;;82     
                          ENDP

                  |L11.56|
                          DCD      ||.data||

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

                  TIMER_Init PROC
;;;134    
;;;135    void TIMER_Init()
000000  2001              MOVS     r0,#1
000002  4902              LDR      r1,|L12.12|
000004  07c0              LSLS     r0,r0,#31
000006  6008              STR      r0,[r1,#0]
;;;136    {
;;;137    	NVIC_EnableIRQ(SysTick_IRQn);
;;;138    }
000008  4770              BX       lr
                          ENDP

00000a  0000              DCW      0x0000
                  |L12.12|
                          DCD      0xe000e100

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

                  getTickCount PROC
;;;118    
;;;119    int getTickCount()
000000  4801              LDR      r0,|L13.8|
;;;120    {
;;;121    	return tick_counter;
000002  6800              LDR      r0,[r0,#0]  ; tick_counter
;;;122    }
000004  4770              BX       lr
;;;123    
                          ENDP

000006  0000              DCW      0x0000
                  |L13.8|
                          DCD      ||.data||

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

                  getUpdateDT PROC
;;;113    
;;;114    float getUpdateDT()
000000  4801              LDR      r0,|L14.8|
;;;115    {
;;;116    	return UPDATE_DT;
000002  6900              LDR      r0,[r0,#0x10]  ; UPDATE_DT
;;;117    }
000004  4770              BX       lr
;;;118    
                          ENDP

000006  0000              DCW      0x0000
                  |L14.8|
                          DCD      ||.data||

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

                  micros PROC
;;;123    
;;;124    uint32_t micros()
000000  4801              LDR      r0,|L15.8|
;;;125    {
;;;126    	return u32Timer2Cnt;
000002  6880              LDR      r0,[r0,#8]  ; u32Timer2Cnt
;;;127    }
000004  4770              BX       lr
;;;128    
                          ENDP

000006  0000              DCW      0x0000
                  |L15.8|
                          DCD      ||.data||

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

                  millis PROC
;;;128    
;;;129    uint32_t millis()
000000  b510              PUSH     {r4,lr}
;;;130    {
;;;131    	return (u32Timer2Cnt/1000);
000002  4803              LDR      r0,|L16.16|
000004  217d              MOVS     r1,#0x7d
000006  00c9              LSLS     r1,r1,#3
000008  6880              LDR      r0,[r0,#8]  ; u32Timer2Cnt
00000a  f7fffffe          BL       __aeabi_uidivmod
;;;132    }
00000e  bd10              POP      {r4,pc}
;;;133    
                          ENDP

                  |L16.16|
                          DCD      ||.data||

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

                  setup_system_tick PROC
;;;55     }
;;;56     void setup_system_tick(uint32_t sampleRate)
000000  4601              MOV      r1,r0
;;;57     {
000002  b510              PUSH     {r4,lr}
;;;58     	uint32_t tickPeriod = SystemCoreClock/sampleRate;
000004  4804              LDR      r0,|L17.24|
000006  6800              LDR      r0,[r0,#0]  ; SystemCoreClock
000008  f7fffffe          BL       __aeabi_uidivmod
;;;59     	
;;;60     	SysTick_Config(tickPeriod);
00000c  f7fffffe          BL       SysTick_Config
;;;61     	ChronographStart(ChronMain);
000010  2000              MOVS     r0,#0
000012  f7fffffe          BL       ChronographStart
;;;62     //	printf("SystemCoreClock:%d\n",SystemCoreClock);
;;;63     //	printf("Tick Time: %d ms\n",1000/sampleRate);
;;;64     }
000016  bd10              POP      {r4,pc}
;;;65     void SysTick_Handler(void)
                          ENDP

                  |L17.24|
                          DCD      SystemCoreClock

                          AREA ||.bss||, DATA, NOINIT, ALIGN=2

                  Chronograph
                          %        48

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

                  tick_counter
                          DCD      0x00000000
                  frame_counter
                          DCD      0x00000000
                  u32Timer2Cnt
                          DCD      0x00000000
                  FC_Last
                          DCD      0x00000000
                  UPDATE_DT
                          DCD      0x00000000

                          AREA ||area_number.22||, DATA, ALIGN=2

                          EXPORTAS ||area_number.22||, ||.data||
                  GPABCallback_Counter
                          DCD      0x00000000

                          AREA ||area_number.23||, DATA, ALIGN=2

                          EXPORTAS ||area_number.23||, ||.data||
                  u32Timer0Cnt
                          DCD      0x00000000

                          AREA ||area_number.24||, DATA, ALIGN=2

                          EXPORTAS ||area_number.24||, ||.data||
                  u32Timer1Cnt
                          DCD      0x00000000

                          AREA ||area_number.25||, DATA, ALIGN=2

                          EXPORTAS ||area_number.25||, ||.data||
                  u32Timer3Cnt
                          DCD      0x00000000

;*** Start embedded assembler ***

#line 1 "..\\Timer_Ctrl.c"
	AREA ||.rev16_text||, CODE, READONLY
	THUMB
	EXPORT |__asm___12_Timer_Ctrl_c_43aede3f____REV16|
#line 118 "..\\..\\..\\..\\Library\\CMSIS\\Include\\core_cmInstr.h"
|__asm___12_Timer_Ctrl_c_43aede3f____REV16| PROC
#line 119

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

 revsh r0, r0
 bx lr
	ENDP

;*** End   embedded assembler ***
