3

对于上下文,我在启动板开发板上使用mspgcc和。msp430g2553

我想创建一个可以指向各种硬件寄存器的指针。标准头文件通过如下语句提供对寄存器的访问:

P1DIR &= 0x08;

以上是端口 1 gpio 引脚的方向寄存器。 P1DIR是一个 8 位硬件寄存器。

我尝试分配一个可用于修改它的指针如下:

volatile unsigned char *reg;
reg = (unsigned char *) &P1DIR;

这不会通过 gcc 生成任何错误或警告,但是它不起作用。当使用 gdb 测试值时,reg 包含值0xFFFF而不是数据表中所述的0x0022(address of )。P1DIR

以下是标题中有助于解决问题的行:

/* External references resolved by a device-specific linker command file */
#define SFR_8BIT(address)   extern volatile unsigned char address
...
SFR_8BIT(P1DIR);                              /* Port 1 Direction */

据我所知,链接器使用一个名为periph.x(位于/usr/local/msp430-uniarch-20110716/msp430/lib/ldscripts/msp430g2553)的文件,其中包含以下行:

__P1DIR = 0x0022;
4

1 回答 1

2

根本不需要特定的编译器,只需要标准的 C ...

#define WDTCTL     (*((volatile unsigned short *)0x0120))
#define P1DIR (*((volatile unsigned char *)0x0022))
...
    WDTCTL = 0x5A80;
...
    P1DIR |= 0x01;
    P1OUT |= 0x01;
    P1DIR &= ~0x02;

然后检查您的拆卸以确保它有效。

f8b4:   b2 40 80 5a     mov #23168, &0x0120 ;#0x5a80
...
    f8ca:   d2 d3 22 00     bis.b   #1, &0x0022 ;r3 As==01
    f8ce:   d2 d3 21 00     bis.b   #1, &0x0021 ;r3 As==01
    f8d2:   f2 f0 fd ff     and.b   #-3,    &0x0022 ;#0xfffd
于 2013-09-27T13:52:30.457 回答