我有一個問題,試圖讓連接到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引腳,可能會有用。 –