如何在msp430上分配一个变量指针来访问硬件寄存器?

时间:2013-09-27 08:49:51

标签: c embedded msp430

对于上下文,我在启动板开发板上使用mspgccmsp430g2553

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

P1DIR &= 0x08;

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

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

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

这不会通过gcc生成任何错误或警告,但它不起作用。使用gdb测试值时,reg包含值0xFFFF而不是0x0022(地址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;

1 个答案:

答案 0 :(得分: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