对于上下文,我在启动板开发板上使用mspgcc
和msp430g2553
。
我想创建一个指向各种硬件寄存器的指针。标准头通过以下语句提供对寄存器的访问:
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;
答案 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