Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- NAME main
- PUBLIC main
- SECTION .text : CODE (2)
- THUMB
- ;//Port A - Button
- PIOA_WPMR EQU 0x400E0EE4 ; Write Protect Mode Register
- PIOA_PER EQU 0x400E0E00 ; PIO Enable Register
- PIOA_ODR EQU 0x400E0E14 ; Output Disable Register
- PIOA_IER EQU 0x400E0E40 ; Interrupt Enable Register
- PIOA_IDR EQU 0x400E0E44 ; Interrupt Disable Register
- PIOA_PUER EQU 0x400E0E64 ; Pull Up Enable Register
- PIOA_PDSR EQU 0x400E0E3C ; Pin Data Status Register
- PIOA_IMR EQU 0x400E0E48 ; PIO Controller Interrupt Mask Register
- PIOA_ISR EQU 0x400E0E4C ; PIO Controller Interrupt Status Register
- ;// C port - (leds)
- PIOC_WPMR EQU 0x400E12E4 ; Write Protect Mode Register
- PIOC_PER EQU 0x400E1200 ; PIO Enable Register - Arduino Due
- PIOC_OER EQU 0x400E1210 ; Output Enable Register
- PIOC_SODR EQU 0x400E1230 ; Set Output Data Register
- PIOC_PUDR EQU 0x400E1260 ; Pull Up Disable Register
- PIOC_CODR EQU 0x400E1234 ; Clear Output Data Register
- PIOC_ODSR EQU 0x400E1238 ; Controller Output Data Status Registe
- ;
- ;//Initiliaze Avbrot
- ;
- SYSTICK_CTRL EQU 0xE000E010
- SYSTICK_LOAD EQU 0xE000E014
- SYSTICK_VAL EQU 0xE000E018
- SYSTICK_CALIB EQU 0xE000E01C
- ; //PMC
- PMC_WPMR EQU 0x400E06E4 ; PMC Write Protect Mode Register
- PMC_PCER EQU 0x400E0610 ; Peripheral Clock Enable Register 0
- PMC_PCDR EQU 0x400E0614 ; Peripheral Clock Disable Register 0
- PMC_PCSR EQU 0x400E0618 ; Peripheral Clock Status Register 0
- ; //Enable Edge on port A
- PIOA_ESR EQU 0x400E0EC0 ;Edge Select Register
- PIOA_FELLSR EQU 0x400E0ED0 ;Falling Edge Enable
- PIOA_AIMER EQU 0x400E0EB0 ;Additional Interrupt Modes Enable Register
- ; //NVIC Adress
- SETENA EQU 0xE000E100 ;Interupt Set Enable Register
- CLRENA EQU 0xE000E180 ;Interupt Clear Enable Register
- CLRPEN EQU 0xE000E280 ; Interrupt Clear Pending Register
- ; //Huvudprogram -------------------------------------
- main
- ;//Set up Peripheral Clock
- LDR R0,=PMC_PCER
- LDR R1,=(5 << 11) ; Peripheral Identifier: bit11=PIOA, bit13=PIOC
- STR R1,[R0]
- ; //Initialize port C (LEDs)
- LDR R0, =PIOC_PER ; Enable port C
- LDR R1, =0xE ; LED Bit3
- STR R1, [R0] ;
- LDR R0, =PIOC_OER ;
- STR R1, [R0] ;
- LDR R0, =PIOC_PUDR;
- STR R1, [R0] ;
- ; //Set up NVIC for PIOA interrupts
- LDR R0,=CLRENA ; Disable/Clear PIOA interrupt
- MOV R1,#0x800 ; PIOA = bit 11
- STR R1,[R0] ;
- LDR R0,=CLRPEN ; Clear pending PIOA
- STR R1,[R0] ; interrupt
- LDR R0,=SETENA ; Allow interrupt from PIOA
- STR R1,[R0] ;
- ; //Set up PIOA input with pull-up
- LDR R0,=PIOA_PER ; Enable PIOA
- MOV R1,#0x4000 ; on bit14
- STR R1,[R0]
- LDR R0,=PIOA_ODR ; Output disable on bit14 USRLEFT
- STR R1,[R0]
- LDR R0,=PIOA_PUER ; Pull_up enable on bit14
- STR R1,[R0]
- ; //Set up PIOA for edge triggering
- LDR R0,=PIOA_ESR ; Set Edge select on bit14
- STR R1,[R0] ;
- LDR R0,=PIOA_FELLSR ; Set Falling Egde/Low Level
- STR R1,[R0] ; Select on bit14&15
- LDR R0,=PIOA_AIMER ; Allow additional interrupt
- STR R1,[R0] ; mode (ESR & FELLSR)
- ; on bit14&15
- ; //Set up PIOA for interrupts
- LDR R0,=PIOA_IMR ; Read all current enabled
- LDR R2,[R0] ; PIOA interrupts
- LDR R0,=PIOA_IDR ; Disable all PIOA interrupts
- LDR R1,=0xFFFFFFFF ; Not to disturb our setup
- STR R1,[R0] ; with spurious interrupts
- LDR R0,=PIOA_ISR ; Dummy read to clear pending
- LDR R0,[R0] ; interrupts
- ; // Now finally allow PIOA interrupts on bit 14 USRLEFT
- LDR R0,=PIOA_IDR ;Disable
- MOV R1,#0xFFFF
- STR R1, [R0] ;Disable all PIOA interupt
- LDR R0,=PIOA_IER ; Enable PIOA interrupt
- MOV R1,#0x4000 ; turn on on bit14
- STR R1,[R0]
- SysTick_Initialize
- LDR R0, =SYSTICK_CTRL ; Control and Status Register
- MOV R1, #0 ; all bits clear
- STR R1, [R0] ; => stop counter, prevent interrupts
- LDR R0, =SYSTICK_VAL ; Current Value Register
- STR R1, [R0] ; => clear current value
- LDR R0, =SYSTICK_LOAD ; Reload Value Register
- LDR R1, =15999999 ; trigger every 1024 cycles, counter decrements
- ; from 1023 to 0, 1024 cycles total
- STR R1, [R0] ; => set reload value
- LDR R0, =SYSTICK_CTRL ; Control and Status Register
- MOV R1, #0x07 ; ENABLE, TICKINT and CLKSOURCE set
- STR R1, [R0] ; => start counter
- loop
- ;//Disable interrupt
- LDR R0,=PIOA_IDR ;Disable
- MOV R1,#0xFFFF
- STR R1, [R0] ;Disable all PIOA interupt
- LDR R1, =PIOA_PDSR ; Read from Pin Data
- LDR R0,[R1] ; Läser från adress i R1 till R0
- AND R2, R0, #0x8000 ; Maskning bit 15 USER RIGHT
- CMP R2, #0 ; Compare R2 with 0
- BEQ INCREASE
- back
- //Endable interrupt again
- BL Delay_ms
- LDR R0,=PIOA_IER ; Enable PIOA interrupt
- MOV R1,#0x4000 ; turn on on bit14&15
- STR R1,[R0]
- B loop
- INCREASE
- LDR R0,=PIOC_ODSR;
- LDR R1, [R0];
- AND R1, R1, #0x6
- CMP R1, #6
- BEQ reset
- LDR R0, =PIOC_CODR;
- STR R1, [R0] ;
- LSR R1, R1, #1
- ADD R1, R1, #1
- LSL R1, R1, #1
- LDR R0, =PIOC_SODR;
- STR R1, [R0] ;
- B back
- reset
- LDR R0, =PIOC_CODR;
- STR R1,[R0]
- B back
- PUBLIC SysTick_Handler
- SysTick_Handler
- LDR R0,=PIOC_ODSR ;Look at the LEDs
- MOV R1, #8
- LDR R2, [R0] ;Read value from address LEDs
- AND R1, R2, R1 ; Maskning and compare
- CMP R1, #0
- BEQ LedUp
- B LedDown
- LedUp
- ; LDR R0,=PIOA_
- LDR R0,=PIOC_SODR
- MOV R1, #0x8
- STR R1, [R0]
- BX LR ;The same MOV PC,LR
- LedDown
- LDR R0,=PIOC_CODR
- MOV R1, #8
- STR R1, [R0]
- BX LR
- PUBLIC PIOA_Handler
- PIOA_Handler
- LDR R0,=PIOA_ISR ; Dummy read to clear pending
- LDR R1,[R0] ; interrupts
- LDR R1, =PIOA_PDSR ; Read from Pin Data
- LDR R0,[R1] ; Läser från adress i R1 till R0
- AND R2, R0, #0xC000 ; Maskning bit 14, 15
- CMP R2, #0 ; Compare R2 with 0
- BEQ LAMP2
- AND R2, R0, #0x8000 ; Maskning bit 15
- CMP R2, #0 ; Compare R2 with 0
- LDR R0,=PIOC_ODSR;
- LDR R1, [R0];
- AND R1, R1, #0x6
- CMP R1,#2 ;Led1
- BEQ LOAD1
- CMP R1,#4 ;Led2
- BEQ LOAD2
- CMP R1,#6 ;Led1&2
- BEQ LOAD3
- LAMP2
- LDR R1, =0xFFFF
- LDR R0, =PIOC_CODR; Clear all Leds
- STR R1, [R0] ;
- LDR R0, =SYSTICK_LOAD ; Reload Value Register
- LDR R1, =11999999 ;0.5 Hz
- STR R1, [R0] ; Store new load
- BX LR
- LAMP1
- BX LR
- LOAD1
- LDR R0, =SYSTICK_LOAD ; Reload Value Register
- LDR R1, =5999999 ;1 Hz
- STR R1,[R0]
- BX LR
- LOAD2
- LDR R0, =SYSTICK_LOAD ; Reload Value Register
- LDR R1, =2999999 ;2 Hz
- STR R1,[R0]
- BX LR
- LOAD3
- LDR R0, =SYSTICK_LOAD ; Reload Value Register
- LDR R1, =1499999 ;4 Hz
- STR R1,[R0]
- BX LR
- ;Subrutin Delay_ms ----------------------------------------
- ; Vänta ett antal ms
- ; Inparameter: R7 - delay i ms
- ; ---------------------------------------------------------
- DELAY_CALIB EQU 1200
- ; utprovat värde (baserat på master clock –12Mhz)
- Delay_ms
- STMFD SP!,{R0,R1}
- LDR R0, =1000
- do_delay_ms
- LDR R1,=DELAY_CALIB
- loop_ms
- SUBS R1,R1,#1
- BNE loop_ms
- SUBS R0,R0,#1
- BNE do_delay_ms
- LDMFD SP!,{R0,R1}
- BX LR
- ; ---------------------------------------------------------------------------------------------------------------------
- theend
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement