Sensor sampling library

sensor_setup.s

Committer:
Joseph_Penikis
Date:
2015-02-23
Revision:
1:f9f0b92a9d7c

File content as of revision 1:f9f0b92a9d7c:

  AREA asm_func, CODE, READONLY
; Export my asm function locaiton so that the C compiler can find it and link
    EXPORT start_systick
    EXPORT measure_clock_cycles
;   
    ALIGN
;   
start_systick   
;   
; Setup base address for SysTick
    LDR r2, =0xE000E010 
; Setup SysTick and start
    LDR r0, [r2, #0x00]     ; Grab current SysTick control state
    LDR r1, =0x05           ; Mask to set SysTick clock source as processor clock and start it running
    ORRS r0, r0, r1
    STR r0, [r2, #0x00]
; Return to previous code
    BX  LR
;
measure_clock_cycles
;
    PUSH {r4-r7}
; Configure pin to sample from
    LDR r3, =0xF80FF094         ; Port C data direction register
    LDR r4, =0x00000020         ; Pin 5
    LDR r5, [r3]                ; Current config
    BICS r5, r5, r4             ; Turn PinC5 to 0, General Purpose Input
    STR r5, [r3]                ; Save config 
; Setup base address for current SysTick value
    LDR r5, =0xE000E018
; Sample starting SysTick   
    LSLS r0, r0, #2             ; Multiply by 2 as both rising and failing edges detected
    LDR r0, =0x00               ; Clear counter
    LDR r2, =0x20               ; Pin mask
    LDR r6, =0xF80FF090         ; Input register
    LDR r7, =0x00               ; Current pin state
    LDR r4, [r5]                ; Read current SysTick
loop
    LDR r3, [r6]                ; Read Input register
    ANDS r3, r3, r2             ; Mask out pin
    SUBS r3, r3, r7             ; Sneaky method of detecting bit change, equals zero when no change has occurred
    BEQ loop                    ; Loop Until change
    MOV r7, r3                  ; Store new pin state  
    ADDS r0, #1                 ; Increment counter by one
    SUBS r3, r3, r0             ; Subtract SAMPLES from counter
    BNE loop                    ; Loop until counter = samples
    LDR r1, [r5]                ; Read ending SysTick
; Compute time difference
    MOV r0, r4
    SBCS r0, r0, r1             ; r0 = r4 - r1
    BPL finish                  ; If result of subtraction creates a positive number, return r0, otherwise recalculate
    LDR r3, =0x00FFFFFF
    SUBS r0, r3, r1             ; r0 = (2^24 - 1 - r1) + r4
    ADDS r0, r0, r4
finish
; Return to previous code
    POP {r4-r7}
    BX LR
    ALIGN
    END