ARM Assembly for development board

时间:2012-05-15 08:31:53

标签: c assembly embedded arm

我目前正在搞一个附有应用板的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   

2 个答案:

答案 0 :(得分:1)

ORR指令有点ON,#0x80常量确定位(在这种情况下,只有第7位打开)。要关闭该位,您需要一个AND指令并计算相应的掩码(例如,要关闭第7位,您将使用常量#0x7F进行AND操作)。第5位的适当常量是#0x20#0xDF

答案 1 :(得分:1)

尽管我理解代码,但风扇仅连接到第7位(如果位从0开始计数)。

以下行负责打开风扇位:

ORR r0, r0, #0x80

您将“掩码”中1的所有位设置为1.由于掩码为0x80,即二进制为1000 0000,因此仅打开第7位。

现在,如果您需要打开加热器而不是风扇,并且您必须设置第5位而不是7(在同一端口上),您只需要更改该行中的模板。新掩码应为0010 0000二进制,即hexa中的0x20,因此新代码应为:

ORR r0, r0, #0x20

另外,如果你想在稍后的某个时刻关闭加热器,你可以通过仅使用第5位来设置它,除了第5位之外,除了位5之外还有1s的掩码。如果按位的助记符是{{ 1}},该行将是:

BIC

现在,我几个月没有做任何组装,但如果我没有弄错,你提供的代码片段实际上是一个子程序。您可以使用BIC r0, r0, 0xDF call地址从主要功能中调用它。而且,对我来说,似乎子程序很好,它保留了它使用的所有寄存器,例如:它将它们推到第一行的堆栈中,最后将它们恢复。

因此,要重新使用代码,您可以编写一个新的子程序来打开加热器,另一个用于在需要时关闭每个项目,并且只更改每个项目的标签/子程序名称,例如: FanOnFanOff ...

由于它们都保留了所有寄存器,因此您可以顺序使用它们而无需担心。