0

これが私の定義です:

/* General Purpose Input/Output (GPIO) */
#define IOPIN          (*((volatile unsigned long *) 0xE0028000))
#define IOSET          (*((volatile unsigned long *) 0xE0028004))
#define IODIR          (*((volatile unsigned long *) 0xE0028008))
#define IOCLR          (*((volatile unsigned long *) 0xE002800C))

コード:

void put_on_other_port (void) {
asm("LDR R0, 0x00000080");
asm("STR R0, [0x00100000]");
}

LPC2148用にプログラミングしていて、P0.7の内容をP0.20に移動するためのARMアセンブラコードを書き込もうとしています。私はアセンブリ構文にまったく精通していないので、このコードを修正しようとすると、あらゆる種類のコンパイルエラーが発生します。P0.7のビットを(アセンブラコードで)P0.20に簡単に移動するにはどうすればよいですか?


これをCコードで試しました:

IODIR |= 0x00100000;
.
.
.
if (IOPIN & 0x00000080)
            IOSET = 0x00100000;
        else
            IOCLR = 0x00100000;

しかし、どちらも機能しませんでした。P0.20で出力が得られませんでした。


CコードでPWMをシミュレートしてみました:

IODIR |= 0x00100000;
.
.
.
int i;

IOSET = 0x00100000;
for (i = 0; i < 10000; i++);

IOCLR = 0x00100000;
for (i = 0; i < 10000; i++);

P0.20の値を無条件に設定してみました。

//IOSET = 0x00100000;    // commenting out to toggle between setting and clearing
IOCLR = 0x00100000;
4

2 に答える 2

1

LPC2148では、IO0SETはアドレス0xE0028004にあり、IO0CLRはアドレス0xE002800Cにあり、IO0PINは0xE0028000にあります。

これがアセンブリソリューションです。これを行うには多くの方法があります。

.globl copy_gpio_pin_state
copy_gpio_pin_state:
  ldr r0,=0xE0028000
  mov r2,#0x00100000
  ldr r1,[r0,#0x00]
  tst r1,#0x80
  streq r2,[r0,#0x0C]
  strne r2,[r0,#0x04]
  bx lr

これをasで組み立てます

arm-whatever-as copy.s -o copy.o

次に、Cコードから呼び出します

void copy_gpio_pin_state ( void );
...
copy_gpio_pin_state();

リンクするか、gccに追加します(gccはリンカーに渡します)

arm-whatever-gcc myprog.c copy.o -o ...
or
arm-whatever-ld ... myprog.o copy.o -o ...

また、2つのピン番号(マスクの方が良い)を簡単に渡して、再利用できるようにすることもできます。

実際のアセンブリはインラインよりもはるかに簡単です。実際のアセンブリをインラインアセンブリに適切に変換する方法を理解するのはさらに長い研究プロジェクトです(コンパイラごとに、場合によってはバージョンが異なるため、アセンブリ言語の移植性が高くなる傾向があります)

于 2012-12-06T14:32:48.517 に答える
0

やりたいことができない理由に気づきました。ピン/ポートをレジスタと混同しました。私がやろうと思ったのは、の出力を接続することでしP0.7P0.20(これはおそらく作業レジスタに値を渡すことで可能です)が、先生PINSELは、特定のポートの機能を選択するために使用され、いくつかの機能( PWM)は、指定されたレジスタ(PINSELLPC2xxxマニュアルのの表に記載されています)にのみバインドできます。

于 2012-12-07T11:52:09.280 に答える