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 编程,我正在尝试编写 ARM 汇编代码以将 P0.7 的内容移动到 P0.20。我对汇编语法一点也不熟悉,所以当我尝试修复这段代码时会遇到各种编译错误。如何轻松地将 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 ...

您还可以轻松地为两者传递密码(掩码更好)并使其可重复使用。

真正的汇编比内联容易得多,要弄清楚如何正确地将真正的汇编转换为内联汇编是一个更长的研究项目(对于每个编译器和可能的版本,因为它会有所不同,汇编语言往往更具可移植性)

于 2012-12-06T14:32:48.517 回答
0

我意识到为什么我不能做我想做的事。我将引脚/端口与寄存器混淆了。我想我要做的只是简单地将 to 的输出连接起来P0.7P0.20这可能通过将值传递给工作寄存器来实现)但是我的老师向我解释了PINSEL用于选择给定端口的功能以及某些功能(例如PWM)只能绑定到指定的寄存器(在PINSELLPC2xxx 手册中的表格中找到。

于 2012-12-07T11:52:09.280 回答