2014-02-25 105 views
0

編寫兩個(2)ARM彙編語言子例程,稱爲output_char和read_char。 這些子程序將允許用戶輸入一個字符並通過UART在PuTTy中顯示字符。 所有的用戶輸入都應該回顯至顯示器ARM彙編語言uART0輸入輸出,我做錯了什麼。

我試過編寫代碼,但沒有奏效。

U0LSR EQU 0x14   
register EQU 0xE000C000 


    STMFD SP!,{lr} 

read_character 
    LDR r0, =0xE000C014 
    LDRB r1, [r0] 
    BIC r1, r1, #0xFFFFFFFE 
    CMP r1, #0 
    BEQ read_character 
    LDR r6, =register 
    LDR r2, [r6] 



output_character 
    LDR r0, =0xE000C014 
    LDRB r1, [r0] 
    BIC r1, r1, #0xFFFFFFEF 
    MOV r1, r1, LSR #1 
    CMP r1, #0 
    BEQ output_character 
    LDR r6, =register 
    STR r2, [r6] 

    LDMFD sp!, {lr} 
    BX lr 
+0

這與您之前詢問的問題有什麼不同(http://stackoverflow.com/questions/22025929/arm-uart0-input-output-lpc2138-what-am-i-doing-wrong)? – Michael

+0

我其實提出了這個問題。對不起,這是我第一次來這裏。我將刪除先前的問題。 – user3353118

+0

這當然可以清理乾淨,但假設你已經正確初始化了uart,這看起來沒問題。輸出例行程序中不需要1的lsr,它對你沒有任何幫助。 –

回答

1

這看起來是相關

http://csserver.evansville.edu/~blandfor/EE311/ARMLecture/UARTNotes.pdf

考慮到這些應該是兩個單獨的功能,上述先前的評論適用。另外,我會假設,因爲這個問題並不是指初始化UART,否則它會成功地工作。 STMFD/LDMFD/BX三聯體應與兩種功能相關聯。此外,考慮到ARM過程調用標準

http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042e/IHI0042E_aapcs.pdf

,如果可能的話你應該限制自己的R0-R3在你的程序。如果您需要更多,則需要將它們添加到STMFD/LDMFD指令中,以便在不將寄存器返回到先前狀態的情況下修改寄存器。

寫入問題語句的方式,read_char函數需要調用write_char函數來將輸入的字符回顯到屏幕。你的答案中缺少這一點。看起來持有角色的寄存器與發送角色的寄存器相同,所以這很好。否則,read_character函數看起來OK。

您的write_character功能看起來不太正確,但是,您的BIC 0xFFFF FFEF看起來不正確。您希望查看發送器空位,您應該使用0xFFFF FFBF。作爲一個風格點,我建議使用AND來設置你想要的位,而不是BIC和反向位。使它更容易看到。如果在輸出中沒有看到任何內容,這很可能是問題,因爲LSR [4]處的BI(中斷指示符)位可能永遠不會很高,因此您的代碼將永遠循環。

最後,問題說明聲明使用read_char和output_char作爲函數名稱,因此您需要將這些標籤添加到每個STMFD指令中。你的BEQ很好,它需要循環回從線路狀態寄存器讀取的寄存器,所以它需要一個單獨的目標標籤。