【发布时间】:2012-12-08 16:24:59
【问题描述】:
假设我们想写地址0xc000,我们可以在C语言中定义一个宏为:
#define LCDCW1_ADDR 0xc000
#define READ_LCDCW1() (*(volatile uint32_t *)LCDCW1_ADDR)
#define WRITE_LCDCW1(val) ((*(volatile uint32_t *)LCDCW1_ADDR) = (val))
我的问题是,在使用任何微控制器时,以 MSP430 为例,P1OUT 寄存器地址为 0x0021。
但是当我们使用 P1OUT=0xFFFF; // 它为 P1OUT 分配一个值 0xFFFF。
我的问题是它如何写入该地址,例如在本例中为 0x0021。 IDE 是 IAR。我在下面定义的头文件 msp430g2553.h 中找到:
#define P1OUT_ (0x0021u) /* Port 1 Output */
DEFC( P1OUT , P1OUT_)
我想它正在定义地址,但其他宏在哪里可以写入或读取。
谁能解释一下 P1OUT 如何在该特定地址位置写入的流程?也请让我知道你在 0x0021u 中是什么意思?
谢谢
到目前为止,我发现的详细信息是:
在 msp430g2553.h 中
#ifdef __IAR_SYSTEMS_ICC__
#include "in430.h"
#pragma language=extended
#define DEFC(name, address) __no_init volatile unsigned char name @ address;
#define DEFW(name, address) __no_init volatile unsigned short name @ address;
#define DEFXC volatile unsigned char
#define DEFXW volatile unsigned short
#endif /* __IAR_SYSTEMS_ICC__ */
#ifdef __IAR_SYSTEMS_ASM__
#define DEFC(name, address) sfrb name = address;
#define DEFW(name, address) sfrw name = address;
#endif /* __IAR_SYSTEMS_ASM__*/
#define P1OUT_ (0x0021u) /* Port 1 Output */
DEFC( P1OUT , P1OUT_)
io430g2553.h 说
__no_init volatile union
{
unsigned char P1OUT; /* Port 1 Output */
struct
{
unsigned char P0 : 1; /* */
unsigned char P1 : 1; /* */
unsigned char P2 : 1; /* */
unsigned char P3 : 1; /* */
unsigned char P4 : 1; /* */
unsigned char P5 : 1; /* */
unsigned char P6 : 1; /* */
unsigned char P7 : 1; /* */
}P1OUT_bit;
} @0x0021;
有人能解释一下上面的定义是做什么的吗?我在 MSP430 IAR C/C++ 编译器中找到的详细信息:
Example of using __write and __read
The code in the following examples use memory-mapped I/O to write to an LCD
display:
__no_init volatile unsigned char LCD_IO @ address;
size_t __write(int Handle, const unsigned char * Buf,
size_t Bufsize)
{
size_t nChars = 0;
/* Check for stdout and stderr
(only necessary if file descriptors are enabled.) */
if (Handle != 1 && Handle != 2)
{
return -1;
}
for (/*Empty */; Bufsize > 0; --Bufsize)
{
LCD_IO = * Buf++;
++nChars;
}
return nChars;
}
The code in the following example uses memory-mapped I/O to read from a keyboard:
__no_init volatile unsigned char KB_IO @ 0xD2;
size_t __read(int Handle, unsigned char *Buf, size_t BufSize)
{
size_t nChars = 0;
/* Check for stdin
(only necessary if FILE descriptors are enabled) */
if (Handle != 0)
{
return -1;
}
for (/*Empty*/; BufSize > 0; --BufSize)
{
unsigned char c = KB_IO;
if (c == 0)
break;
*Buf++ = c;
++nChars;
}
return nChars;
}
有人知道吗?
【问题讨论】:
-
"
DEFC()"几乎可以肯定是一个宏,就像 "READ_LCDCW1()" 和 "#define LCDCW1_ADDR 0xc000"" 是宏一样。您必须查看系统上的 *.h 头文件之一才能了解它的作用。 “u”仅表示数字“0x0021”是“无符号”。您可以放心地将其关闭。 -
如果你有一个特定的地址并且你想在/从那个位置写/读,你使用一个指针......
-
#define DEFC(name, address) __no_init volatile unsigned char name @address; #define DEFW(name, address) __no_init volatile unsigned short name @address;在 msp430g2553.h 中找到上述详细信息
标签: c compiler-construction embedded msp430 iar