Advertisement
Guest User

johansiar

a guest
May 10th, 2018
146
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 9.17 KB | None | 0 0
  1.         NAME    main
  2.         PUBLIC  main
  3.         SECTION .text : CODE (2)
  4.         THUMB
  5.          
  6.  
  7. ;//Port A - Button
  8. PIOA_WPMR EQU  0x400E0EE4       ; Write Protect Mode Register
  9.  
  10. PIOA_PER  EQU 0x400E0E00        ; PIO Enable Register
  11. PIOA_ODR  EQU 0x400E0E14        ; Output Disable Register
  12.  
  13. PIOA_IER  EQU 0x400E0E40        ; Interrupt Enable Register
  14. PIOA_IDR  EQU 0x400E0E44        ; Interrupt Disable Register  
  15.  
  16. PIOA_PUER EQU 0x400E0E64        ; Pull Up Enable Register
  17. PIOA_PDSR EQU 0x400E0E3C        ; Pin Data Status Register
  18.  
  19. PIOA_IMR  EQU 0x400E0E48        ; PIO Controller Interrupt Mask Register
  20. PIOA_ISR  EQU 0x400E0E4C        ; PIO Controller Interrupt Status Register
  21.  
  22. ;// C port - (leds)
  23. PIOC_WPMR EQU  0x400E12E4       ; Write Protect Mode Register
  24.  
  25. PIOC_PER  EQU  0x400E1200       ; PIO Enable Register - Arduino Due
  26. PIOC_OER  EQU  0x400E1210       ; Output Enable Register
  27. PIOC_SODR EQU  0x400E1230       ; Set Output Data Register
  28. PIOC_PUDR EQU  0x400E1260       ; Pull Up Disable Register
  29. PIOC_CODR EQU  0x400E1234       ; Clear Output Data Register
  30. PIOC_ODSR  EQU 0x400E1238       ;  Controller Output Data Status Registe
  31. ;
  32. ;//Initiliaze Avbrot
  33. ;
  34.  
  35. SYSTICK_CTRL     EQU 0xE000E010
  36. SYSTICK_LOAD     EQU 0xE000E014
  37. SYSTICK_VAL      EQU 0xE000E018
  38. SYSTICK_CALIB    EQU 0xE000E01C
  39.  
  40. ; //PMC
  41. PMC_WPMR  EQU   0x400E06E4      ; PMC Write Protect Mode Register
  42.  
  43. PMC_PCER  EQU   0x400E0610      ; Peripheral Clock Enable Register 0
  44. PMC_PCDR  EQU   0x400E0614      ; Peripheral Clock Disable Register 0
  45. PMC_PCSR  EQU   0x400E0618      ; Peripheral Clock Status Register 0
  46.  
  47. ;   //Enable Edge on port A
  48. PIOA_ESR      EQU 0x400E0EC0    ;Edge Select Register
  49. PIOA_FELLSR   EQU 0x400E0ED0    ;Falling Edge Enable
  50. PIOA_AIMER    EQU 0x400E0EB0    ;Additional Interrupt Modes Enable Register
  51.  
  52. ; //NVIC Adress
  53. SETENA EQU 0xE000E100 ;Interupt Set Enable Register
  54. CLRENA EQU 0xE000E180 ;Interupt Clear Enable Register
  55. CLRPEN EQU 0xE000E280 ; Interrupt Clear Pending Register
  56.  
  57.  
  58.  
  59. ; //Huvudprogram -------------------------------------
  60. main        
  61. ;//Set up Peripheral Clock
  62.           LDR   R0,=PMC_PCER
  63.           LDR   R1,=(5 << 11)  ; Peripheral Identifier: bit11=PIOA, bit13=PIOC
  64.           STR   R1,[R0]
  65.          
  66.          
  67.          
  68. ;   //Initialize port C (LEDs)
  69.  
  70.           LDR R0, =PIOC_PER ; Enable port C
  71.           LDR R1, =0xE   ; LED Bit3
  72.           STR R1, [R0]      ;
  73.           LDR R0, =PIOC_OER ;
  74.           STR R1, [R0]      ;
  75.           LDR R0, =PIOC_PUDR;
  76.           STR R1, [R0]      ;
  77.                              
  78. ; //Set up NVIC for PIOA interrupts
  79.          LDR   R0,=CLRENA        ; Disable/Clear PIOA interrupt
  80.          MOV   R1,#0x800         ; PIOA = bit 11
  81.          STR   R1,[R0]           ;
  82.          LDR   R0,=CLRPEN        ; Clear pending PIOA
  83.          STR   R1,[R0]           ; interrupt
  84.          LDR   R0,=SETENA        ; Allow interrupt from PIOA
  85.          STR   R1,[R0]           ;
  86.  
  87. ; //Set up PIOA input with pull-up
  88.          LDR   R0,=PIOA_PER      ; Enable PIOA
  89.          MOV   R1,#0x4000        ; on bit14
  90.          STR   R1,[R0]          
  91.          LDR   R0,=PIOA_ODR      ; Output disable on bit14 USRLEFT
  92.          STR   R1,[R0]          
  93.          LDR   R0,=PIOA_PUER     ; Pull_up enable on bit14
  94.          STR   R1,[R0]        
  95.        
  96. ; //Set up PIOA for edge triggering
  97.          LDR   R0,=PIOA_ESR      ; Set Edge select on bit14
  98.          STR   R1,[R0]           ;
  99.          LDR   R0,=PIOA_FELLSR   ; Set Falling Egde/Low Level
  100.          STR   R1,[R0]           ; Select on bit14&15
  101.          LDR   R0,=PIOA_AIMER    ; Allow additional interrupt
  102.          STR   R1,[R0]           ; mode (ESR & FELLSR)
  103.                                  ; on bit14&15      
  104.  ; //Set up PIOA for interrupts
  105.          LDR   R0,=PIOA_IMR      ; Read all current enabled
  106.          LDR   R2,[R0]           ; PIOA interrupts
  107.          LDR   R0,=PIOA_IDR      ; Disable all PIOA interrupts
  108.          LDR   R1,=0xFFFFFFFF    ; Not to disturb our setup
  109.          STR   R1,[R0]           ; with spurious interrupts
  110.          LDR   R0,=PIOA_ISR      ; Dummy read to clear pending
  111.          LDR   R0,[R0]           ; interrupts                                
  112. ; // Now finally allow PIOA interrupts on bit 14 USRLEFT
  113.          LDR   R0,=PIOA_IDR        ;Disable
  114.          MOV   R1,#0xFFFF        
  115.          STR   R1, [R0]           ;Disable all PIOA interupt
  116.  
  117.          LDR   R0,=PIOA_IER       ; Enable PIOA interrupt
  118.          MOV   R1,#0x4000         ; turn on on bit14
  119.          STR   R1,[R0]                                  
  120.        
  121. SysTick_Initialize
  122.         LDR R0, =SYSTICK_CTRL    ; Control and Status Register
  123.         MOV R1, #0               ; all bits clear
  124.         STR R1, [R0]             ; => stop counter, prevent interrupts
  125.         LDR R0, =SYSTICK_VAL     ; Current Value Register
  126.         STR R1, [R0]             ; => clear current value
  127.         LDR R0, =SYSTICK_LOAD    ; Reload Value Register
  128.         LDR R1, =15999999         ; trigger every 1024 cycles, counter decrements
  129.                                  ; from 1023 to 0, 1024 cycles total
  130.         STR R1, [R0]             ; => set reload value
  131.         LDR R0, =SYSTICK_CTRL    ; Control and Status Register
  132.         MOV R1, #0x07            ; ENABLE, TICKINT and CLKSOURCE set
  133.         STR R1, [R0]             ; => start counter
  134.  
  135.  
  136.  
  137. loop
  138.         ;//Disable interrupt
  139.          LDR   R0,=PIOA_IDR        ;Disable
  140.          MOV   R1,#0xFFFF        
  141.          STR   R1, [R0]           ;Disable all PIOA interupt
  142.          LDR   R1, =PIOA_PDSR    ; Read from Pin Data
  143.          LDR R0,[R1] ; Läser från adress i R1 till R0                            
  144.          AND R2, R0, #0x8000    ; Maskning bit 15 USER RIGHT    
  145.          CMP R2, #0             ; Compare R2 with 0  
  146.          BEQ INCREASE              
  147. back
  148.         //Endable interrupt again
  149.         BL Delay_ms
  150.         LDR   R0,=PIOA_IER       ; Enable PIOA interrupt
  151.         MOV   R1,#0x4000         ; turn on on bit14&15
  152.         STR   R1,[R0]    
  153.         B loop        
  154.        
  155. INCREASE
  156.        LDR R0,=PIOC_ODSR;
  157.        LDR R1, [R0];
  158.        AND R1, R1, #0x6
  159.        CMP R1, #6
  160.        BEQ reset
  161.        LDR R0, =PIOC_CODR;
  162.        STR R1, [R0]      ;
  163.        LSR R1, R1, #1
  164.        ADD R1, R1, #1
  165.        LSL R1, R1, #1  
  166.        LDR R0, =PIOC_SODR;
  167.        STR R1, [R0]      ;
  168.        B back
  169. reset
  170.     LDR R0, =PIOC_CODR;
  171.     STR R1,[R0]
  172.     B back    
  173.        
  174.        
  175.         PUBLIC SysTick_Handler
  176. SysTick_Handler
  177.         LDR R0,=PIOC_ODSR        ;Look at the LEDs
  178.         MOV R1, #8            
  179.         LDR R2, [R0]             ;Read value from address LEDs
  180.         AND R1, R2, R1           ; Maskning and compare
  181.         CMP R1, #0
  182.         BEQ LedUp
  183.         B LedDown
  184. LedUp
  185.  ;       LDR R0,=PIOA_
  186.        
  187.         LDR R0,=PIOC_SODR
  188.         MOV R1, #0x8
  189.         STR R1, [R0]
  190.         BX LR             ;The same MOV PC,LR
  191.        
  192. LedDown
  193.         LDR R0,=PIOC_CODR
  194.         MOV R1, #8
  195.         STR R1, [R0]
  196.         BX LR    
  197.        
  198.         PUBLIC PIOA_Handler
  199. PIOA_Handler  
  200.  
  201.            LDR   R0,=PIOA_ISR      ; Dummy read to clear pending
  202.           LDR   R1,[R0]           ; interrupts  
  203.           LDR   R1, =PIOA_PDSR    ; Read from Pin Data
  204.           LDR R0,[R1] ; Läser från adress i R1 till R0
  205.           AND R2, R0, #0xC000 ; Maskning bit 14, 15
  206.           CMP R2, #0 ; Compare R2 with 0
  207.           BEQ LAMP2                      
  208.           AND R2, R0, #0x8000    ; Maskning bit 15        
  209.           CMP R2, #0 ; Compare R2 with 0  
  210.           LDR R0,=PIOC_ODSR;
  211.           LDR R1, [R0];
  212.           AND R1, R1, #0x6
  213.    
  214.    
  215.             CMP R1,#2    ;Led1
  216.             BEQ LOAD1
  217.             CMP R1,#4    ;Led2
  218.             BEQ LOAD2
  219.             CMP R1,#6    ;Led1&2
  220.             BEQ LOAD3
  221.          
  222.        
  223.  
  224. LAMP2  
  225.  
  226.     LDR R1, =0xFFFF
  227.     LDR R0, =PIOC_CODR; Clear all Leds
  228.     STR R1, [R0]      ;
  229.     LDR R0, =SYSTICK_LOAD    ; Reload Value Register
  230.     LDR R1, =11999999         ;0.5 Hz
  231.     STR R1, [R0]             ; Store new load
  232.     BX LR
  233.    
  234. LAMP1
  235.    
  236.      BX LR
  237.  
  238.  
  239. LOAD1
  240.     LDR R0, =SYSTICK_LOAD    ; Reload Value Register
  241.     LDR R1, =5999999         ;1 Hz
  242.     STR R1,[R0]
  243.     BX LR
  244. LOAD2
  245.     LDR R0, =SYSTICK_LOAD    ; Reload Value Register
  246.     LDR R1, =2999999         ;2 Hz
  247.     STR R1,[R0]
  248.     BX LR
  249. LOAD3
  250.     LDR R0, =SYSTICK_LOAD    ; Reload Value Register
  251.     LDR R1, =1499999         ;4 Hz
  252.     STR R1,[R0]
  253.     BX LR
  254.    
  255.    
  256. ;Subrutin Delay_ms ----------------------------------------
  257. ; Vänta ett antal ms  
  258. ; Inparameter: R7 - delay i ms  
  259. ; ---------------------------------------------------------
  260. DELAY_CALIB EQU 1200
  261. ; utprovat värde (baserat på master clock –12Mhz)
  262. Delay_ms
  263.       STMFD     SP!,{R0,R1}
  264.       LDR  R0, =1000
  265. do_delay_ms
  266.       LDR  R1,=DELAY_CALIB
  267. loop_ms
  268.       SUBS R1,R1,#1
  269.       BNE  loop_ms
  270.       SUBS R0,R0,#1
  271.       BNE  do_delay_ms
  272.       LDMFD SP!,{R0,R1}
  273.       BX LR
  274. ; ---------------------------------------------------------------------------------------------------------------------
  275.    
  276.    
  277.    
  278. theend        
  279.         END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement