我有一个问题,试图让连接到gpio pin 18在树莓派上的LED。我已经用C测试了我的设置,并确认这不是问题,但是我的汇编代码是问题。使用ARM组件的闪存树莓pi LED
这是我到目前为止的代码:
.global main
main:
SUB SP, SP, #16 @ Create 16 bytes storage
LDR R0, .addr_file @ get GPIO Controller addr
LDR R1, .flags @ set flag permissions
BL open @ call to get file handle
STR R0, [SP, #12] @ File handle number
LDR R3, [SP, #12] @ Get File handle
STR R3, [SP, #0] @ Store file handle on top stack
LDR R3, .gpiobase @ get GPIO_Base address
STR R3, [SP, #4] @ store on SP+4
MOV R0, #0 @ R0=0
MOV R1, #4096 @ R1=page
MOV R2, #3 @ R2=3
MOV R3, #1 @ R3=1 (stdouts)
BL mmap @ call libc fct for mmap
STR R0, [SP, #16] @ store virtual mem addr
LDR R3, [SP, #16] @ get virtual mem addr
fctsel:
ADD R3, R3, #4 @ add 4 for block 1 (GPFSEL1)
LDR R2, [SP, #16] @ get virtual mem addr
ADD R2, R2, #16 @ add 4 for block 1 (GPFSEL1)
LDR R2, [R2, #0] @ load R2 with value at R2
BIC R2, R2, #0b111<<24 @ Bitwise clear of three bits
STR R2, [R3, #0] @ Store result in Register [set input]
LDR R3, [SP, #16] @ Get virtual mem address
ADD R3, R3, #4 @ Add 4 for block 1 (GPFSEL1)
LDR R2, [SP, #16] @ Get virtual mem addr
ADD R2, R2, #4 @ add 4 for block 1 (GPFSEL1)
LDR R2, [R2, #0] @ Load R2 with value at R2
ORR R2, R2, #1<<24 @ Set bit....
STR R2, [R3, #0] @ ...and make output
on:
LDR R3, [SP, #16] @ get virt mem addr
MOV R4, #1 @ get 1
MOV R2, R4, LSL#18 @ Shift by pin number
STR R2, [R3, #0] @ write to memory
LDR R0, [SP, #12] @ get file handle
BL close @ close file
ADD SP, SP, #16 @ restore SP
MOV R7, #1
SWI 0
.addr_file: .word .file
.flags: .word 1576962
@.gpiobase: .word 0x20200000 @ GPIO_Base for Pi 1
.gpiobase: .word 0x3F200000 @ GPIO_Base for Pi 2
.data
.file: .ascii "/dev/mem\000"
我设法得到它与GPIO引脚47的工作。但是,当我改变它与第18针一起工作时,这是我遇到问题的地方。预先感谢任何帮助,非常感谢!
忘了问你你正在使用哪种Raspberry Pi。 GPIO引脚布局很重要,它们都不相同。 – InfinitelyManic
您是否使用存储/重载('STR R0,[SP,#16]'/'LDR R3,[SP,#16]')作为某种有意的延迟?如果没有,那么*未优化*编译器生成的代码不是一个很好的示例。它在C语句之间溢出/重新加载到内存中,仅用于支持在断点停止时使用调试器修改C变量。普通代码应该只保留寄存器中的变量; ARM有16个,其中14个是通用的。无论如何,我不认为你需要将任何东西都泄露给记忆,所以唯一的商店应该是实际的MMIO写作。 –
来自仅供链接的答案:http://enigmater.blogspot.ca/p/blog-page_13.html?m = 1描述了GPIO引脚,可能会有用。 –