2015-11-14 1 views
0

J'utilise LPC1114FN28/102 et son mode d'emploi can be found here. J'utilise my original macro pour développer des programmes pour ce microcontrôleur avec nasm.PIO0_11 sur LPC1114FN28/102 ne va pas conduire la sortie

J'essaye de faire clignoter une LED connectée au port E/S général (je me fous de l'intervalle de clignotement ici).

Lorsque j'utilise PIO0_3 avec ce code, cela fonctionne bien.

%include "lpc1114_macro.inc" 

start: 
; Initial SP value 
    dd 0x10000FF0 
; reset 
    dd reset - start + 1 
; NMI 
    dd nmi - start + 1 
; HardFault 
    dd hardfault - start + 1 
; reserved 
    dd 0 
    dd 0 
    dd 0 
    dd -(0x10000FF0 + (reset - start + 1) + (nmi - start + 1) + (hardfault - start + 1)) 
    dd 0 
    dd 0 
    dd 0 
; SVCall 
    dd svcall - start + 1 
; reserved 
    dd 0 
    dd 0 
; PendSV 
    dd pendsv - start + 1 
; SysTick 
    dd systick - start + 1 
; IRQn 
    dd irq0 - start + 1 
    dd irq1 - start + 1 
    dd irq2 - start + 1 
    dd irq3 - start + 1 
    dd irq4 - start + 1 
    dd irq5 - start + 1 
    dd irq6 - start + 1 
    dd irq7 - start + 1 
    dd irq8 - start + 1 
    dd irq9 - start + 1 
    dd irq10 - start + 1 
    dd irq11 - start + 1 
    dd irq12 - start + 1 
    dd irq13 - start + 1 
    dd irq14 - start + 1 
    dd irq15 - start + 1 
    dd irq16 - start + 1 
    dd irq17 - start + 1 
    dd irq18 - start + 1 
    dd irq19 - start + 1 
    dd irq20 - start + 1 
    dd irq21 - start + 1 
    dd irq22 - start + 1 
    dd irq23 - start + 1 
    dd irq24 - start + 1 
    dd irq25 - start + 1 
    dd irq26 - start + 1 
    dd irq27 - start + 1 
    dd irq28 - start + 1 
    dd irq29 - start + 1 
    dd irq30 - start + 1 
    dd irq31 - start + 1 
    times (63 - 48 + 1) dd 0 

nmi: 
hardfault: 
svcall: 
pendsv: 
systick: 
irq0: 
irq1: 
irq2: 
irq3: 
irq4: 
irq5: 
irq6: 
irq7: 
irq8: 
irq9: 
irq10: 
irq11: 
irq12: 
irq13: 
irq14: 
irq15: 
irq16: 
irq17: 
irq18: 
irq19: 
irq20: 
irq21: 
irq22: 
irq23: 
irq24: 
irq25: 
irq26: 
irq27: 
irq28: 
irq29: 
irq30: 
irq31: 
    BX LR 

reset: 
    ; disable pullup/pulldown on PIO0_3 
    LDR R0, iocon_pio0_3_addr 
    MOVS R1, #0xC0 
    STR R1, [R0, #0] 
    ; set PIO0_3 as output 
    LDR R0, pio0_dir_addr 
    MOVS R1, #1 
    LSLS R1, #3 
    STR R1, [R0, #0] 
    ; output to PIO0_3 
    LDR R0, pio0_3_addr 
mainloop: 
    MOVS R1, #1 
    LSLS R1, #3 
    STR R1, [R0, #0] 
    BL busyloop 
    MOVS R1, #0 
    STR R1, [R0, #0] 
    BL busyloop 
    B mainloop 

    align 4 
iocon_pio0_3_addr: 
    dd 0x4004402C 
pio0_3_addr: 
    dd 0x50000020 
pio0_dir_addr: 
    dd 0x50008000 

busyloop: 
    PUSH {R0} 
    LDR R0, busyloop_num 
busyloop_loop: 
    SUBS R0, #1 
    BPL busyloop_loop 
    POP {R0} 
    BX LR 
    align 4 
busyloop_num: 
    dd 1500000 

    align 4 

En revanche, lorsque je tente d'utiliser PIO0_11 avec ce code, qui a seulement un peu de changement de code précédent, le port ne semble pas travailler et est en état de haute impédance. Pourquoi le port ne fonctionne-t-il pas et que dois-je faire pour surmonter ce problème?

%include "lpc1114_macro.inc" 

start: 
; Initial SP value 
    dd 0x10000FF0 
; reset 
    dd reset - start + 1 
; NMI 
    dd nmi - start + 1 
; HardFault 
    dd hardfault - start + 1 
; reserved 
    dd 0 
    dd 0 
    dd 0 
    dd -(0x10000FF0 + (reset - start + 1) + (nmi - start + 1) + (hardfault - start + 1)) 
    dd 0 
    dd 0 
    dd 0 
; SVCall 
    dd svcall - start + 1 
; reserved 
    dd 0 
    dd 0 
; PendSV 
    dd pendsv - start + 1 
; SysTick 
    dd systick - start + 1 
; IRQn 
    dd irq0 - start + 1 
    dd irq1 - start + 1 
    dd irq2 - start + 1 
    dd irq3 - start + 1 
    dd irq4 - start + 1 
    dd irq5 - start + 1 
    dd irq6 - start + 1 
    dd irq7 - start + 1 
    dd irq8 - start + 1 
    dd irq9 - start + 1 
    dd irq10 - start + 1 
    dd irq11 - start + 1 
    dd irq12 - start + 1 
    dd irq13 - start + 1 
    dd irq14 - start + 1 
    dd irq15 - start + 1 
    dd irq16 - start + 1 
    dd irq17 - start + 1 
    dd irq18 - start + 1 
    dd irq19 - start + 1 
    dd irq20 - start + 1 
    dd irq21 - start + 1 
    dd irq22 - start + 1 
    dd irq23 - start + 1 
    dd irq24 - start + 1 
    dd irq25 - start + 1 
    dd irq26 - start + 1 
    dd irq27 - start + 1 
    dd irq28 - start + 1 
    dd irq29 - start + 1 
    dd irq30 - start + 1 
    dd irq31 - start + 1 
    times (63 - 48 + 1) dd 0 

nmi: 
hardfault: 
svcall: 
pendsv: 
systick: 
irq0: 
irq1: 
irq2: 
irq3: 
irq4: 
irq5: 
irq6: 
irq7: 
irq8: 
irq9: 
irq10: 
irq11: 
irq12: 
irq13: 
irq14: 
irq15: 
irq16: 
irq17: 
irq18: 
irq19: 
irq20: 
irq21: 
irq22: 
irq23: 
irq24: 
irq25: 
irq26: 
irq27: 
irq28: 
irq29: 
irq30: 
irq31: 
    BX LR 

reset: 
    ; disable pullup/pulldown on PIO0_11 
    LDR R0, iocon_pio0_11_addr 
    MOVS R1, #0xC1 
    STR R1, [R0, #0] 
    ; set PIO0_11 as output 
    LDR R0, pio0_dir_addr 
    MOVS R1, #1 
    LSLS R1, #11 
    STR R1, [R0, #0] 
    ; output to PIO0_11 
    LDR R0, pio0_11_addr 
mainloop: 
    MOVS R1, #1 
    LSLS R1, #11 
    STR R1, [R0, #0] 
    BL busyloop 
    MOVS R1, #0 
    STR R1, [R0, #0] 
    BL busyloop 
    B mainloop 

    align 4 
iocon_pio0_11_addr: 
    dd 0x40044074 
pio0_11_addr: 
    dd 0x50002000 
pio0_dir_addr: 
    dd 0x50008000 

busyloop: 
    PUSH {R0} 
    LDR R0, busyloop_num 
busyloop_loop: 
    SUBS R0, #1 
    BPL busyloop_loop 
    POP {R0} 
    BX LR 
    align 4 
busyloop_num: 
    dd 1500000 

    align 4 

Je pense que la fonction de sélection pour le port ne fonctionne pas bien car elle a réussi avec PIO0_9 et échoué avec PIO0_10.

+0

D'un rapide coup d'œil, vous avez tout droit. Que se passe-t-il si vous remplacez 'pio0_11_addr' par' 0x50003ffc' (cela affecte toutes les broches)? – Jester

+0

La condition ne change pas. Notez que la broche est haute impédance, pas haut ni bas. – MikeCAT

Répondre

1

L'horloge pour le bloc de configuration d'E/S doit être activée avant d'accéder aux registres IOCON.

Ce code a fonctionné:

%include "lpc1114_macro.inc" 

start: 
; Initial SP value 
    dd 0x10000FF0 
; reset 
    dd reset - start + 1 
; NMI 
    dd nmi - start + 1 
; HardFault 
    dd hardfault - start + 1 
; reserved 
    dd 0 
    dd 0 
    dd 0 
    dd -(0x10000FF0 + (reset - start + 1) + (nmi - start + 1) + (hardfault - start + 1)) 
    dd 0 
    dd 0 
    dd 0 
; SVCall 
    dd svcall - start + 1 
; reserved 
    dd 0 
    dd 0 
; PendSV 
    dd pendsv - start + 1 
; SysTick 
    dd systick - start + 1 
; IRQn 
    dd irq0 - start + 1 
    dd irq1 - start + 1 
    dd irq2 - start + 1 
    dd irq3 - start + 1 
    dd irq4 - start + 1 
    dd irq5 - start + 1 
    dd irq6 - start + 1 
    dd irq7 - start + 1 
    dd irq8 - start + 1 
    dd irq9 - start + 1 
    dd irq10 - start + 1 
    dd irq11 - start + 1 
    dd irq12 - start + 1 
    dd irq13 - start + 1 
    dd irq14 - start + 1 
    dd irq15 - start + 1 
    dd irq16 - start + 1 
    dd irq17 - start + 1 
    dd irq18 - start + 1 
    dd irq19 - start + 1 
    dd irq20 - start + 1 
    dd irq21 - start + 1 
    dd irq22 - start + 1 
    dd irq23 - start + 1 
    dd irq24 - start + 1 
    dd irq25 - start + 1 
    dd irq26 - start + 1 
    dd irq27 - start + 1 
    dd irq28 - start + 1 
    dd irq29 - start + 1 
    dd irq30 - start + 1 
    dd irq31 - start + 1 
    times (63 - 48 + 1) dd 0 

nmi: 
hardfault: 
svcall: 
pendsv: 
systick: 
irq0: 
irq1: 
irq2: 
irq3: 
irq4: 
irq5: 
irq6: 
irq7: 
irq8: 
irq9: 
irq10: 
irq11: 
irq12: 
irq13: 
irq14: 
irq15: 
irq16: 
irq17: 
irq18: 
irq19: 
irq20: 
irq21: 
irq22: 
irq23: 
irq24: 
irq25: 
irq26: 
irq27: 
irq28: 
irq29: 
irq30: 
irq31: 
    BX LR 

reset: 
    ; enable clock for IOCON 
    LDR R0, sysahbclkctrl_addr 
    LDR R1, [R0] 
    MOVS R2, #1 
    LSLS R2, #16 
    ORRS R1, R2 
    STR R1, [R0] 
    ; disable pullup/pulldown on PIO0_11 
    LDR R0, iocon_pio0_11_addr 
    MOVS R1, #0xC1 
    STR R1, [R0, #0] 
    ; disable clock for IOCON 
    LDR R0, sysahbclkctrl_addr 
    LDR R1, [R0] 
    MOVS R2, #1 
    LSLS R2, #16 
    BICS R1, R2 
    STR R1, [R0] 
    ; set PIO0_11 as output 
    LDR R0, pio0_dir_addr 
    MOVS R1, #1 
    LSLS R1, #11 
    STR R1, [R0, #0] 
    ; output to PIO0_11 
    LDR R0, pio0_11_addr 
mainloop: 
    MOVS R1, #1 
    LSLS R1, #11 
    STR R1, [R0, #0] 
    BL busyloop 
    MOVS R1, #0 
    STR R1, [R0, #0] 
    BL busyloop 
    B mainloop 

    align 4 
sysahbclkctrl_addr: 
    dd 0x40048080 
iocon_pio0_11_addr: 
    dd 0x40044074 
pio0_11_addr: 
    dd 0x50002000 
pio0_dir_addr: 
    dd 0x50008000 

busyloop: 
    PUSH {R0} 
    LDR R0, busyloop_num 
busyloop_loop: 
    SUBS R0, #1 
    BPL busyloop_loop 
    POP {R0} 
    BX LR 
    align 4 
busyloop_num: 
    dd 1500000 

    align 4