首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于开发板的ARM组件

用于开发板的ARM组件
EN

Stack Overflow用户
提问于 2012-05-15 16:31:53
回答 2查看 415关注 0票数 3

我目前正在摆弄一台LPC2378,它有一个连接了应用程序的主板。风扇上有几个组件,其中2个是风扇和加热器。

如果端口4的位6和7连接到风扇(电机控制器),则以下代码将打开风扇:

代码语言:javascript
复制
  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将关闭加热器)。

在回答问题后编辑:

代码语言:javascript
复制
;==============================================================================
; 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   
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-15 16:40:00

就我所理解的代码而言,风扇只连接到位7(如果位从0开始)。

下面这行代码负责打开风扇位:

代码语言:javascript
复制
ORR r0, r0, #0x80

您正在将“掩码”中为1的所有位都设置为1。由于掩码是0x80,即二进制形式的1000 0000,因此它只打开位7。

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

代码语言:javascript
复制
ORR r0, r0, #0x20

此外,如果您想在以后某个时刻关闭加热器,只需取消设置位5,通过与掩码and进行and操作,该掩码在除第5位以外的所有位置都具有1。如果表示逐位and的助记符为BIC,则该行将为:

代码语言:javascript
复制
BIC r0, r0, 0xDF

现在,我已经几个月没有做任何汇编了,但是如果我没有弄错的话,你给出的代码片段实际上是一个子例程。您可以使用类似于FanOn地址的call从您的主要功能调用它。而且,在我看来,这个子例程在某种程度上很好,它保留了它使用的所有寄存器,例如,它将它们推入第一行的堆栈中,并在最后恢复它们。

因此,要重用代码,您可以只编写一个新的子例程来打开加热器,如果需要,还可以编写一个用于关闭每个东西的子例程,并且只更改每个东西的标签/子例程名称,例如FanOffHeaterOn……

因为它们都保存了所有的寄存器,所以你可以不用担心地按顺序使用它们。

票数 1
EN

Stack Overflow用户

发布于 2012-05-15 16:39:51

ORR指令开启一位,#0x80常量决定位(在这种情况下,仅开启位7)。要关闭该位,您将需要一个AND指令并计算适当的掩码(例如,要关闭位7,您需要and常量#0x7F)。位5的适当常量为#0x20#0xDF

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10596917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档