3

私は現在、アプリケーションボードが接続されているLPC2378をいじっています。ファンにはいくつかのコンポーネントがあり、そのうちの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   
4

2 に答える 2

1

命令はORRビットをオンにし、#0x80定数がビットを決定します(この場合、ビット7のみがオンになります)。ビットをオフにするには、AND命令が必要であり、適切なマスクを計算します(たとえば、ビット7をオフにするには、定数#0x7FでANDを実行します)。ビット5の適切な定数はと#0x20です#0xDF

于 2012-05-15T08:39:50.937 に答える
1

私がコードを理解している限り、ファンはビット7にのみ接続されています(ビットが0から数えられている場合)。

次の行は、ファンビットをオンにする役割を果たします。

ORR r0, r0, #0x80

「マスク」の1であるすべてのビットを1に設定しています。マスクは0x80、つまり1000 00002進数であるため、ビット7のみがオンになります。

ここで、ファンの代わりにヒーターをオンにする必要があり、(同じポートで)7ではなくビット5を設定する必要がある場合は、その行のマスクを変更するだけで済みます。新しいマスクは0010 0000バイナリ、つまり0x20ヘキサである必要があるため、新しいコードは次のようになります。

ORR r0, r0, #0x20

また、後でヒーターをオフにしたい場合は、ビット5のみの設定を解除し、ビット5を除くすべての場所に1が含まれるマスクを使用します。ビット単位のニーモニックがである場合BIC、行は次のようになります。 :

BIC r0, r0, 0xDF

今、私は何ヶ月もアセンブリを行っていませんが、私があまり間違えていなければ、あなたが与えたコードスニペットは実際にはサブルーチンです。callあなたはそれをあなたの主な機能からFanOnアドレスのようなもので呼ぶでしょう。そして、私には、サブルーチンは、使用するすべてのレジスタを保持するという点で優れているように見えます。たとえば、最初の行のスタックにそれらをプッシュし、最後にそれらを回復します。

したがって、コードを再利用するには、ヒーターをオンにするための新しいサブルーチンと、必要に応じてそれぞれをオフにするための新しいサブルーチンを記述し、それぞれのラベル/サブルーチン名を変更するだけFanOffですHeaterOn

すべてのレジスタが保存されているので、安心して順番に使用できます。

于 2012-05-15T08:40:00.193 に答える