簡體   English   中英

ARM Assembly for development board

[英]ARM Assembly for development board

我正在搞亂附帶有應用板的LPC 2378。 在風扇上有幾個部件,其中2個是風扇和加熱器。

如果端口4的第6位和第7位連接到風扇(電機控制器),則以下代碼將打開風扇:

  FanOn
  STMFD r13!,{r0,r5,r14}      ; Push r0, r5 and LR
  LDR R5, =FIO4PIN            ; Address of FIO4PIN
  LDR r0, [r5]                ; Read current Port4
  ORR r0, r0, #0x80
  STR r0, [r5]                ; Output
  LDMFD r13!,{r0,r5,r14}      ; Pop r0, r5 and LR
  mov pc, r14                 ; Put link register back into PC

如何重寫此代碼塊以打開連接到端口4的第5位的加熱器,(將該位設置為1將其打開,將其設置為0將關閉它)。

回答問題后編輯:

;==============================================================================
; Turn Heater On
;==============================================================================
heaterOn
  STMFD r13!,{r0,r5,r14}      ; Push r0, r5 and LR
  LDR R5, =FIO4PIN            ; Address of FIO4PIN
  LDR r0, [r5]                ; Read current Port4
  ORR r0, r0, #0x20
  STR r0, [r5]                ; Output
  LDMFD r13!,{r0,r5,r14}      ; Pop r0, r5 and LR
  mov pc, r14                 ; Put link register back into PC     
;==============================================================================
; Turn The Heater Off
;==============================================================================        
heaterOff
  STMFD r13!,{r0,r5,r14}      ; Push r0, r5 and LR
  LDR R5, =FIO4PIN            ; Address of FIO4PIN
  LDR r0, [r5]                ; Read current Port4
  AND r0, r0, #0xDF
  STR r0, [r5]                ; Output
  LDMFD r13!,{r0,r5,r14}      ; Pop r0, r5 and LR
  mov pc, r14                 ; Put link register back into PC   

ORR指令置​​ON, #0x80常量確定位(在這種情況下,只有第7位打開)。 要關閉該位,您需要一個AND指令並計算相應的掩碼(例如,要關閉第7位,您將使用常量#0x7F進行AND操作)。 第5位的適當常量是#0x20#0xDF

盡管我理解代碼,但風扇僅連接到第7位(如果位從0開始計數)。

以下行負責打開風扇位:

ORR r0, r0, #0x80

您將“掩碼”中的所有1位設置為1.由於掩碼為0x80 ,即二進制為1000 0000 ,因此僅打開第7位。

現在,如果你需要打開加熱器而不是風扇,你必須設置第5位而不是7(在同一端口上),你只需要更改該行中的掩碼。 新掩碼應為0010 0000二進制,即hexa為0x20 ,因此新代碼應為:

ORR r0, r0, #0x20

此外,如果你想在稍后的某個時刻關閉加熱器,你可以通過僅設置第5位來實現它,通過使用除了位5之外的任何地方都有1s的掩碼。如果按位的助記符是BIC ,那么該行將是是:

BIC r0, r0, 0xDF

現在,我幾個月沒有做任何組裝,但如果我沒有弄錯,你提供的代碼片段實際上是一個子程序。 你會從你的主要功能有類似的東西把它callFanOn地址。 而且,對我來說,似乎子程序很好,它保留了它使用的所有寄存器,例如它將它們推送到第一行的堆棧並最終恢復它們。

因此,為了重新使用代碼,您可以編寫一個新的子程序來打開加熱器,一個用於在需要時關閉每個項目,並且只更改每個項目的標簽/子程序名稱,例如FanOffHeaterOn 。 ..

由於它們都保留了所有寄存器,因此您可以順利使用它們而無需擔心。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM