我正在使用LPC1114FN28/102
及其用户手册can be found here
我使用my original macro使用nasm为该微控制器开发程序。
我正在尝试使连接到通用I / O端口的LED闪烁(我不太关心这里闪烁的间隔)。
当我使用PIO0_3
代码时,它运行良好。
%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
另一方面,当我尝试将PIO0_11
与此代码一起使用时,该代码与之前的代码相比只有一些变化,端口似乎无法工作并且处于高阻态。< / p>
%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
为什么端口不起作用以及我应该采取什么措施来解决这个问题?
我认为为端口选择的功能并不好用
因为PIO0_9
成功,PIO0_10
失败。
答案 0 :(得分:1)
在访问IOCON寄存器之前,必须先启用I / O配置块的时钟。
此代码有效:
%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