#define

最近看com相关的资料,看到CCmdTarget实现com接口的时候,去读了一些宏的定义,在afxdisp.h头文件中

#define BEGIN_INTERFACE_PART(localClass, baseClass) /
 class X##localClass : public baseClass /

本来这个宏定义很容易理解的,但是这里多出个X##,我真没见过这种用法,不晓得它是什么用意。
后来问了几个朋友也都不知道。

你知道么?

也许你也不知道~呵呵,最后我还是找到了相关的资料,解读了这个define,还顺便认识了另外两个不常用的define

#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x

x##y表示什么?表示x连接y,举例说:
int  n = Conn(123,456);  结果就是n=123456;
char* str = Conn("asdf", "adf")结果就是 str = "asdfadf";
怎么样,很神奇吧


再来看#@x,其实就是给x加上单引号,结果返回是一个const char。举例说:
char a = ToChar(1);结果就是a='1';
做个越界试验char a = ToChar(123);结果是a='3';
但是如果你的参数超过四个字符,编译器就给给你报错了!error C2015: too many characters in constant   :P

最后看看#x,估计你也明白了,他是给x加双引号
char* str = ToString(123132);就成了str="123132";

最后留几个小试验给大家去测测:
#define Dec(x,y) (x-y)
int n = Dec( A(123,1), 1230);
n = Conn(123, Conn(123,332) );
char* str = A("12", ToString( Dec(3,1));
结果会如何呢? 嘿嘿嘿嘿~

------------------------------我是华丽的分割线---------------------------------------

本文转自:玩心未泯

#ifndef __CHIP_H__ #define __CHIP_H__ #define GPIO0_ROEN 0x103C00 #define GPIO0_MOEN BIT5 #define GPIO0_ROUT 0x103C00 #define GPIO0_MOUT BIT4 #define GPIO0_RIN 0x103C00 #define GPIO0_MIN BIT0 #define GPIO1_ROEN 0x103C02 #define GPIO1_MOEN BIT5 #define GPIO1_ROUT 0x103C02 #define GPIO1_MOUT BIT4 #define GPIO1_RIN 0x103C02 #define GPIO1_MIN BIT0 #define GPIO2_ROEN 0x103C04 #define GPIO2_MOEN BIT5 #define GPIO2_ROUT 0x103C04 #define GPIO2_MOUT BIT4 #define GPIO2_RIN 0x103C04 #define GPIO2_MIN BIT0 #define GPIO3_ROEN 0x103C06 #define GPIO3_MOEN BIT5 #define GPIO3_ROUT 0x103C06 #define GPIO3_MOUT BIT4 #define GPIO3_RIN 0x103C06 #define GPIO3_MIN BIT0 #define GPIO4_ROEN 0x103C08 #define GPIO4_MOEN BIT5 #define GPIO4_ROUT 0x103C08 #define GPIO4_MOUT BIT4 #define GPIO4_RIN 0x103C08 #define GPIO4_MIN BIT0 #define GPIO5_ROEN 0x103C0A #define GPIO5_MOEN BIT5 #define GPIO5_ROUT 0x103C0A #define GPIO5_MOUT BIT4 #define GPIO5_RIN 0x103C0A #define GPIO5_MIN BIT0 #define GPIO6_ROEN 0x103C0C #define GPIO6_MOEN BIT5 #define GPIO6_ROUT 0x103C0C #define GPIO6_MOUT BIT4 #define GPIO6_RIN 0x103C0C #define GPIO6_MIN BIT0 #define GPIO7_ROEN 0x103C0E #define GPIO7_MOEN BIT5 #define GPIO7_ROUT 0x103C0E #define GPIO7_MOUT BIT4 #define GPIO7_RIN 0x103C0E #define GPIO7_MIN BIT0 #define GPIO8_ROEN 0x103C10 #define GPIO8_MOEN BIT5 #define GPIO8_ROUT 0x103C10 #define GPIO8_MOUT BIT4 #define GPIO8_RIN 0x103C10 #define GPIO8_MIN BIT0 #define GPIO9_ROEN 0x103C12 #define GPIO9_MOEN BIT5 #define GPIO9_ROUT 0x103C12 #define GPIO9_MOUT BIT4 #define GPIO9_RIN 0x103C12 #define GPIO9_MIN BIT0 #define GPIO10_ROEN 0x103C18 #define GPIO10_MOEN BIT5 #define GPIO10_ROUT 0x103C18 #define GPIO10_MOUT BIT4 #define GPIO10_RIN 0x103C18 #define GPIO10_MIN BIT0 #define GPIO11_ROEN 0x103C1A #define GPIO11_MOEN BIT5 #define GPIO11_ROUT 0x103C1A #define GPIO11_MOUT BIT4 #define GPIO11_RIN 0x103C1A #define GPIO11_MIN BIT0 #define GPIO12_ROEN 0x103C1C #define GPIO12_MOEN BIT5 #define GPIO12_ROUT 0x103C1C #define GPIO12_MOUT BIT4 #define GPIO12_RIN 0x103C1C #define GPIO12_MIN BIT0 #define GPIO13_ROEN 0x103C1E #define GPIO13_MOEN BIT5 #define GPIO13_ROUT 0x103C1E #define GPIO13_MOUT BIT4 #define GPIO13_RIN 0x103C1E #define GPIO13_MIN BIT0 #define GPIO14_ROEN 0x103C28 #define GPIO14_MOEN BIT5 #define GPIO14_ROUT 0x103C28 #define GPIO14_MOUT BIT4 #define GPIO14_RIN 0x103C28 #define GPIO14_MIN BIT0 #define GPIO15_ROEN 0x103C2A #define GPIO15_MOEN BIT5 #define GPIO15_ROUT 0x103C2A #define GPIO15_MOUT BIT4 #define GPIO15_RIN 0x103C2A #define GPIO15_MIN BIT0 #define GPIO16_ROEN 0x103C2C #define GPIO16_MOEN BIT5 #define GPIO16_ROUT 0x103C2C #define GPIO16_MOUT BIT4 #define GPIO16_RIN 0x103C2C #define GPIO16_MIN BIT0 #define GPIO17_ROEN 0x103C2E #define GPIO17_MOEN BIT5 #define GPIO17_ROUT 0x103C2E #define GPIO17_MOUT BIT4 #define GPIO17_RIN 0x103C2E #define GPIO17_MIN BIT0 #define GPIO18_ROEN 0x103CC0 #define GPIO18_MOEN BIT5 #define GPIO18_ROUT 0x103CC0 #define GPIO18_MOUT BIT4 #define GPIO18_RIN 0x103CC0 #define GPIO18_MIN BIT0 #define GPIO19_ROEN 0x103CC2 #define GPIO19_MOEN BIT5 #define GPIO19_ROUT 0x103CC2 #define GPIO19_MOUT BIT4 #define GPIO19_RIN 0x103CC2 #define GPIO19_MIN BIT0 #define GPIO20_ROEN 0x103CC4 #define GPIO20_MOEN BIT5 #define GPIO20_ROUT 0x103CC4 #define GPIO20_MOUT BIT4 #define GPIO20_RIN 0x103CC4 #define GPIO20_MIN BIT0 #define GPIO21_ROEN 0x103CC6 #define GPIO21_MOEN BIT5 #define GPIO21_ROUT 0x103CC6 #define GPIO21_MOUT BIT4 #define GPIO21_RIN 0x103CC6 #define GPIO21_MIN BIT0 #define GPIO22_ROEN 0x103C40 #define GPIO22_MOEN BIT5 #define GPIO22_ROUT 0x103C40 #define GPIO22_MOUT BIT4 #define GPIO22_RIN 0x103C40 #define GPIO22_MIN BIT0 #define GPIO23_ROEN 0x103C42 #define GPIO23_MOEN BIT5 #define GPIO23_ROUT 0x103C42 #define GPIO23_MOUT BIT4 #define GPIO23_RIN 0x103C42 #define GPIO23_MIN BIT0 #define GPIO24_ROEN 0x103C44 #define GPIO24_MOEN BIT5 #define GPIO24_ROUT 0x103C44 #define GPIO24_MOUT BIT4 #define GPIO24_RIN 0x103C44 #define GPIO24_MIN BIT0 #define GPIO25_ROEN 0x103C46 #define GPIO25_MOEN BIT5 #define GPIO25_ROUT 0x103C46 #define GPIO25_MOUT BIT4 #define GPIO25_RIN 0x103C46 #define GPIO25_MIN BIT0 #define GPIO26_ROEN 0x103C48 #define GPIO26_MOEN BIT5 #define GPIO26_ROUT 0x103C48 #define GPIO26_MOUT BIT4 #define GPIO26_RIN 0x103C48 #define GPIO26_MIN BIT0 #define GPIO27_ROEN 0x103C4A #define GPIO27_MOEN BIT5 #define GPIO27_ROUT 0x103C4A #define GPIO27_MOUT BIT4 #define GPIO27_RIN 0x103C4A #define GPIO27_MIN BIT0 #define GPIO28_ROEN 0x103C4C #define GPIO28_MOEN BIT5 #define GPIO28_ROUT 0x103C4C #define GPIO28_MOUT BIT4 #define GPIO28_RIN 0x103C4C #define GPIO28_MIN BIT0 #define GPIO29_ROEN 0x103C4E #define GPIO29_MOEN BIT5 #define GPIO29_ROUT 0x103C4E #define GPIO29_MOUT BIT4 #define GPIO29_RIN 0x103C4E #define GPIO29_MIN BIT0 #define GPIO30_ROEN 0x103C50 #define GPIO30_MOEN BIT5 #define GPIO30_ROUT 0x103C50 #define GPIO30_MOUT BIT4 #define GPIO30_RIN 0x103C50 #define GPIO30_MIN BIT0 #define GPIO31_ROEN 0x103C52 #define GPIO31_MOEN BIT5 #define GPIO31_ROUT 0x103C52 #define GPIO31_MOUT BIT4 #define GPIO31_RIN 0x103C52 #define GPIO31_MIN BIT0 #define GPIO32_ROEN 0x103C54 #define GPIO32_MOEN BIT5 #define GPIO32_ROUT 0x103C54 #define GPIO32_MOUT BIT4 #define GPIO32_RIN 0x103C54 #define GPIO32_MIN BIT0 #define GPIO33_ROEN 0x103C56 #define GPIO33_MOEN BIT5 #define GPIO33_ROUT 0x103C56 #define GPIO33_MOUT BIT4 #define GPIO33_RIN 0x103C56 #define GPIO33_MIN BIT0 #define GPIO34_ROEN 0x103C58 #define GPIO34_MOEN BIT5 #define GPIO34_ROUT 0x103C58 #define GPIO34_MOUT BIT4 #define GPIO34_RIN 0x103C58 #define GPIO34_MIN BIT0 #define GPIO35_ROEN 0x103C5A #define GPIO35_MOEN BIT5 #define GPIO35_ROUT 0x103C5A #define GPIO35_MOUT BIT4 #define GPIO35_RIN 0x103C5A #define GPIO35_MIN BIT0 #define GPIO36_ROEN 0x103C5C #define GPIO36_MOEN BIT5 #define GPIO36_ROUT 0x103C5C #define GPIO36_MOUT BIT4 #define GPIO36_RIN 0x103C5C #define GPIO36_MIN BIT0 #define GPIO37_ROEN 0x103C5E #define GPIO37_MOEN BIT5 #define GPIO37_ROUT 0x103C5E #define GPIO37_MOUT BIT4 #define GPIO37_RIN 0x103C5E #define GPIO37_MIN BIT0 #define GPIO38_ROEN 0x103C60 #define GPIO38_MOEN BIT5 #define GPIO38_ROUT 0x103C60 #define GPIO38_MOUT BIT4 #define GPIO38_RIN 0x103C60 #define GPIO38_MIN BIT0 #define GPIO39_ROEN 0x103C62 #define GPIO39_MOEN BIT5 #define GPIO39_ROUT 0x103C62 #define GPIO39_MOUT BIT4 #define GPIO39_RIN 0x103C62 #define GPIO39_MIN BIT0 #define GPIO40_ROEN 0x103C30 #define GPIO40_MOEN BIT5 #define GPIO40_ROUT 0x103C30 #define GPIO40_MOUT BIT4 #define GPIO40_RIN 0x103C30 #define GPIO40_MIN BIT0 #define GPIO41_ROEN 0x103C32 #define GPIO41_MOEN BIT5 #define GPIO41_ROUT 0x103C32 #define GPIO41_MOUT BIT4 #define GPIO41_RIN 0x103C32 #define GPIO41_MIN BIT0 #define GPIO42_ROEN 0x103C34 #define GPIO42_MOEN BIT5 #define GPIO42_ROUT 0x103C34 #define GPIO42_MOUT BIT4 #define GPIO42_RIN 0x103C34 #define GPIO42_MIN BIT0 #define GPIO43_ROEN 0x103C36 #define GPIO43_MOEN BIT5 #define GPIO43_ROUT 0x103C36 #define GPIO43_MOUT BIT4 #define GPIO43_RIN 0x103C36 #define GPIO43_MIN BIT0 #define GPIO44_ROEN 0x103CE0 #define GPIO44_MOEN BIT5 #define GPIO44_ROUT 0x103CE0 #define GPIO44_MOUT BIT4 #define GPIO44_RIN 0x103CE0 #define GPIO44_MIN BIT0 #define GPIO45_ROEN 0x103CE2 #define GPIO45_MOEN BIT5 #define GPIO45_ROUT 0x103CE2 #define GPIO45_MOUT BIT4 #define GPIO45_RIN 0x103CE2 #define GPIO45_MIN BIT0 #define GPIO46_ROEN 0x103CE4 #define GPIO46_MOEN BIT5 #define GPIO46_ROUT 0x103CE4 #define GPIO46_MOUT BIT4 #define GPIO46_RIN 0x103CE4 #define GPIO46_MIN BIT0 #define GPIO47_ROEN 0x103CE6 #define GPIO47_MOEN BIT5 #define GPIO47_ROUT 0x103CE6 #define GPIO47_MOUT BIT4 #define GPIO47_RIN 0x103CE6 #define GPIO47_MIN BIT0 #define GPIO48_ROEN 0x103CE8 #define GPIO48_MOEN BIT5 #define GPIO48_ROUT 0x103CE8 #define GPIO48_MOUT BIT4 #define GPIO48_RIN 0x103CE8 #define GPIO48_MIN BIT0 #define GPIO49_ROEN 0x103CEA #define GPIO49_MOEN BIT5 #define GPIO49_ROUT 0x103CEA #define GPIO49_MOUT BIT4 #define GPIO49_RIN 0x103CEA #define GPIO49_MIN BIT0 #define GPIO50_ROEN 0x103CEC #define GPIO50_MOEN BIT5 #define GPIO50_ROUT 0x103CEC #define GPIO50_MOUT BIT4 #define GPIO50_RIN 0x103CEC #define GPIO50_MIN BIT0 #define GPIO51_ROEN 0x103CEE #define GPIO51_MOEN BIT5 #define GPIO51_ROUT 0x103CEE #define GPIO51_MOUT BIT4 #define GPIO51_RIN 0x103CEE #define GPIO51_MIN BIT0 #define GPIO52_ROEN 0x103C20 #define GPIO52_MOEN BIT5 #define GPIO52_ROUT 0x103C20 #define GPIO52_MOUT BIT4 #define GPIO52_RIN 0x103C20 #define GPIO52_MIN BIT0 #define GPIO53_ROEN 0x103C22 #define GPIO53_MOEN BIT5 #define GPIO53_ROUT 0x103C22 #define GPIO53_MOUT BIT4 #define GPIO53_RIN 0x103C22 #define GPIO53_MIN BIT0 #define GPIO54_ROEN 0x103CA0 #define GPIO54_MOEN BIT5 #define GPIO54_ROUT 0x103CA0 #define GPIO54_MOUT BIT4 #define GPIO54_RIN 0x103CA0 #define GPIO54_MIN BIT0 #define GPIO55_ROEN 0x103CA2 #define GPIO55_MOEN BIT5 #define GPIO55_ROUT 0x103CA2 #define GPIO55_MOUT BIT4 #define GPIO55_RIN 0x103CA2 #define GPIO55_MIN BIT0 #define GPIO56_ROEN 0x103CA4 #define GPIO56_MOEN BIT5 #define GPIO56_ROUT 0x103CA4 #define GPIO56_MOUT BIT4 #define GPIO56_RIN 0x103CA4 #define GPIO56_MIN BIT0 #define GPIO57_ROEN 0x103CA6 #define GPIO57_MOEN BIT5 #define GPIO57_ROUT 0x103CA6 #define GPIO57_MOUT BIT4 #define GPIO57_RIN 0x103CA6 #define GPIO57_MIN BIT0 #define GPIO58_ROEN 0x103CA8 #define GPIO58_MOEN BIT5 #define GPIO58_ROUT 0x103CA8 #define GPIO58_MOUT BIT4 #define GPIO58_RIN 0x103CA8 #define GPIO58_MIN BIT0 #define GPIO59_ROEN 0x103CAA #define GPIO59_MOEN BIT5 #define GPIO59_ROUT 0x103CAA #define GPIO59_MOUT BIT4 #define GPIO59_RIN 0x103CAA #define GPIO59_MIN BIT0 #define GPIO60_ROEN 0xF8E #define GPIO60_MOEN BIT0 #define GPIO60_ROUT 0xF8E #define GPIO60_MOUT BIT1 #define GPIO60_RIN 0xF8E #define GPIO60_MIN BIT2 #define GPIO61_ROEN 0xF28 #define GPIO61_MOEN BIT0 #define GPIO61_ROUT 0xF28 #define GPIO61_MOUT BIT1 #define GPIO61_RIN 0xF28 #define GPIO61_MIN BIT2 #define GPIO62_ROEN 0xF00 #define GPIO62_MOEN BIT0 #define GPIO62_ROUT 0xF00 #define GPIO62_MOUT BIT1 #define GPIO62_RIN 0xF00 #define GPIO62_MIN BIT2 #define GPIO63_ROEN 0xF02 #define GPIO63_MOEN BIT0 #define GPIO63_ROUT 0xF02 #define GPIO63_MOUT BIT1 #define GPIO63_RIN 0xF02 #define GPIO63_MIN BIT2 #define GPIO64_ROEN 0xF04 #define GPIO64_MOEN BIT0 #define GPIO64_ROUT 0xF04 #define GPIO64_MOUT BIT1 #define GPIO64_RIN 0xF04 #define GPIO64_MIN BIT2 #define GPIO65_ROEN 0xF06 #define GPIO65_MOEN BIT0 #define GPIO65_ROUT 0xF06 #define GPIO65_MOUT BIT1 #define GPIO65_RIN 0xF06 #define GPIO65_MIN BIT2 #define GPIO66_ROEN 0xF08 #define GPIO66_MOEN BIT0 #define GPIO66_ROUT 0xF08 #define GPIO66_MOUT BIT1 #define GPIO66_RIN 0xF08 #define GPIO66_MIN BIT2 #define GPIO67_ROEN 0xF0E #define GPIO67_MOEN BIT0 #define GPIO67_ROUT 0xF0E #define GPIO67_MOUT BIT1 #define GPIO67_RIN 0xF0E #define GPIO67_MIN BIT2 #define GPIO68_ROEN 0xF10 #define GPIO68_MOEN BIT0 #define GPIO68_ROUT 0xF10 #define GPIO68_MOUT BIT1 #define GPIO68_RIN 0xF10 #define GPIO68_MIN BIT2 #define GPIO69_ROEN 0xF12 #define GPIO69_MOEN BIT0 #define GPIO69_ROUT 0xF12 #define GPIO69_MOUT BIT1 #define GPIO69_RIN 0xF12 #define GPIO69_MIN BIT2 #define GPIO70_ROEN 0xF30 #define GPIO70_MOEN BIT0 #define GPIO70_ROUT 0xF30 #define GPIO70_MOUT BIT1 #define GPIO70_RIN 0xF30 #define GPIO70_MIN BIT2 #define GPIO71_ROEN 0xF32 #define GPIO71_MOEN BIT0 #define GPIO71_ROUT 0xF32 #define GPIO71_MOUT BIT1 #define GPIO71_RIN 0xF32 #define GPIO71_MIN BIT2 #define GPIO72_ROEN 0xF34 #define GPIO72_MOEN BIT0 #define GPIO72_ROUT 0xF34 #define GPIO72_MOUT BIT1 #define GPIO72_RIN 0xF34 #define GPIO72_MIN BIT2 #define GPIO73_ROEN 0xF36 #define GPIO73_MOEN BIT0 #define GPIO73_ROUT 0xF36 #define GPIO73_MOUT BIT1 #define GPIO73_RIN 0xF36 #define GPIO73_MIN BIT2 #define GPIO74_ROEN 0xF88 #define GPIO74_MOEN BIT0 #define GPIO74_ROUT 0xF88 #define GPIO74_MOUT BIT1 #define GPIO74_RIN 0xF88 #define GPIO74_MIN BIT2 #define GPIO75_ROEN 0xF8A #define GPIO75_MOEN BIT0 #define GPIO75_ROUT 0xF8A #define GPIO75_MOUT BIT1 #define GPIO75_RIN 0xF8A #define GPIO75_MIN BIT2 #define GPIO76_ROEN 0xF94 #define GPIO76_MOEN BIT0 #define GPIO76_ROUT 0xF94 #define GPIO76_MOUT BIT1 #define GPIO76_RIN 0xF94 #define GPIO76_MIN BIT2 #define GPIO77_ROEN 0xF96 #define GPIO77_MOEN BIT0 #define GPIO77_ROUT 0xF96 #define GPIO77_MOUT BIT1 #define GPIO77_RIN 0xF96 #define GPIO77_MIN BIT2 #define GPIO78_ROEN 0x1423 #define GPIO78_MOEN BIT0 #define GPIO78_ROUT 0x1424 #define GPIO78_MOUT BIT0 #define GPIO78_RIN 0x1425 #define GPIO78_MIN BIT0 #define GPIO79_ROEN 0x1423 #define GPIO79_MOEN BIT1 #define GPIO79_ROUT 0x1424 #define GPIO79_MOUT BIT1 #define GPIO79_RIN 0x1425 #define GPIO79_MIN BIT1 #define GPIO80_ROEN 0x1423 #define GPIO80_MOEN BIT0 #define GPIO80_ROUT 0x1424 #define GPIO80_MOUT BIT0 #define GPIO80_RIN 0x1425 #define GPIO80_MIN BIT0 #define GPIO81_ROEN 0x1423 #define GPIO81_MOEN BIT1 #define GPIO81_ROUT 0x1424 #define GPIO81_MOUT BIT1 #define GPIO81_RIN 0x1425 #define GPIO81_MIN BIT1 #define GPIO82_ROEN 0x33E2 #define GPIO82_MOEN BIT4 #define GPIO82_ROUT 0x33E4 #define GPIO82_MOUT BIT0 #define GPIO82_RIN 0x33E4 #define GPIO82_MIN BIT4 #define GPIO83_ROEN 0x33E2 #define GPIO83_MOEN BIT5 #define GPIO83_ROUT 0x33E4 #define GPIO83_MOUT BIT1 #define GPIO83_RIN 0x33E4 #define GPIO83_MIN BIT5 #define GPIO84_ROEN 0x33E2 #define GPIO84_MOEN BIT6 #define GPIO84_ROUT 0x33E4 #define GPIO84_MOUT BIT2 #define GPIO84_RIN 0x33E4 #define GPIO84_MIN BIT6 #define GPIO85_ROEN 0x33E2 #define GPIO85_MOEN BIT7 #define GPIO85_ROUT 0x33E4 #define GPIO85_MOUT BIT3 #define GPIO85_RIN 0x33E4 #define GPIO85_MIN BIT7 #define GPIO86_ROEN 0x14210a #define GPIO86_MOEN BIT4 #define GPIO86_ROUT 0x14210a #define GPIO86_MOUT BIT2 #define GPIO86_RIN 0x142131 #define GPIO86_MIN BIT5 #define GPIO87_ROEN 0x14210a #define GPIO87_MOEN BIT5 #define GPIO87_ROUT 0x14210a #define GPIO87_MOUT BIT3 #define GPIO87_RIN 0x142131 #define GPIO87_MIN BIT4 #define GPIO88_ROEN 0x103C80 #define GPIO88_MOEN BIT5 #define GPIO88_ROUT 0x103C80 #define GPIO88_MOUT BIT4 #define GPIO88_RIN 0x103C80 #define GPIO88_MIN BIT0 #define GPIO89_ROEN 0x103C82 #define GPIO89_MOEN BIT5 #define GPIO89_ROUT 0x103C82 #define GPIO89_MOUT BIT4 #define GPIO89_RIN 0x103C82 #define GPIO89_MIN BIT0 #define GPIO90_ROEN 0x103C84 #define GPIO90_MOEN BIT5 #define GPIO90_ROUT 0x103C84 #define GPIO90_MOUT BIT4 #define GPIO90_RIN 0x103C84 #define GPIO90_MIN BIT0 #define GPIO91_ROEN 0x103C86 #define GPIO91_MOEN BIT5 #define GPIO91_ROUT 0x103C86 #define GPIO91_MOUT BIT4 #define GPIO91_RIN 0x103C86 #define GPIO91_MIN BIT0 #define GPIO92_ROEN 0x103C88 #define GPIO92_MOEN BIT5 #define GPIO92_ROUT 0x103C88 #define GPIO92_MOUT BIT4 #define GPIO92_RIN 0x103C88 #define GPIO92_MIN BIT0 #define GPIO93_ROEN 0x103C8A #define GPIO93_MOEN BIT5 #define GPIO93_ROUT 0x103C8A #define GPIO93_MOUT BIT4 #define GPIO93_RIN 0x103C8A #define GPIO93_MIN BIT0 #define GPIO94_ROEN 0x103C8C #define GPIO94_MOEN BIT5 #define GPIO94_ROUT 0x103C8C #define GPIO94_MOUT BIT4 #define GPIO94_RIN 0x103C8C #define GPIO94_MIN BIT0 #define GPIO95_ROEN 0x103C8E #define GPIO95_MOEN BIT5 #define GPIO95_ROUT 0x103C8E #define GPIO95_MOUT BIT4 #define GPIO95_RIN 0x103C8E #define GPIO95_MIN BIT0 #define GPIO96_ROEN 0x103C90 #define GPIO96_MOEN BIT5 #define GPIO96_ROUT 0x103C90 #define GPIO96_MOUT BIT4 #define GPIO96_RIN 0x103C90 #define GPIO96_MIN BIT0 #define BUF_SIZE 256 #define CONFIG_RIU_BASE_ADDRESS 0x1F000000 //kernel也提供了相关实现 #ifndef GENMASK #define GENMASK(h,l) (((~0UL) << (l)) & (~0UL >> (32 - 1 - (h)))) #endif #define GET_BASE_ADDR_BY_BANK(x,y) ((x) + ((y) << 1)) #define _RIUA_8BIT(bank,offset) GET_BASE_ADDR_BY_BANK(CONFIG_RIU_BASE_ADDRESS, bank) + (((offset) & ~1)<<1) + ((offset) & 1) #define _RIUA_16BIT(bank,offset) GET_BASE_ADDR_BY_BANK(CONFIG_RIU_BASE_ADDRESS, bank) + ((offset)<<2) #define _GPIO_R_WORD_MASK(addr,mask) ((*(volatile u16*)(addr)) & (mask)) #define _GPIO_W_WORD_MASK(addr,val,mask) {(*(volatile u16*)(addr)) = ((*(volatile u16*)(addr)) & ~(mask)) | ((u16)(val) & (mask));} #define _GPIO_R_BYTE(addr) (*(volatile u8*)(addr)) #define PMSLEEP_BANK 0x000E00 #define CHIPTOP_BANK 0x101E00 #define SAR_BANK 0x001400 #define MHal_RIU_REG(addr) (*(volatile U8*)(CONFIG_RIU_BASE_ADDRESS + (((addr) & ~1)<<1) + (addr & 1))) #define REG_EJ_MODE 0x0f #define REG_EJ_MODE_MASK (BIT1|BIT0) #define REG_TEST_IN_MODE 0x12 #define REG_TEST_IN_MODE_MASK (BIT1|BIT0) #define REG_TEST_OUT_MODE 0x12 #define REG_TEST_OUT_MODE_MASK (BIT5|BIT4) #define REG_SPI0_MODE 0x0c #define REG_SPI0_MODE_MASK (BIT2|BIT1|BIT0) #define REG_PWM6_MODE 0x02 #define REG_PWM6_MODE_MASK (BIT5|BIT4|BIT3) #define REG_PWM7_MODE 0x02 #define REG_PWM7_MODE_MASK (BIT8|BIT7|BIT6) #define PINMUX_FOR_PM_PWM5_MODE 0x2e #define REG_PM_PWM5_MODE 0x27 #define REG_PM_PWM5_MODE_MASK BIT1 #define PINMUX_FOR_PM_PWM10_MODE 0x31 #define REG_PM_PWM10_MODE 0x27 #define REG_PM_PWM10_MODE_MASK BIT4 #define PINMUX_FOR_PM_LED_MODE 0x33 #define REG_PM_LED_MODE 0x28 #define REG_PM_LED_MODE_MASK (BIT5|BIT4) #define PINMUX_FOR_PM_VID_MODE 0x34 #define REG_PM_VID_MODE 0x28 #define REG_PM_VID_MODE_MASK (BIT13|BIT12) #define PINMUX_FOR_TEST_OUT_MODE 0x24 #define REG_TEST_OUT_MODE 0x12 #define REG_TEST_OUT_MODE_MASK (BIT5|BIT4) #define REG_SAR_AISEL 0x11*2 #define REG_SAR_CH0_AISEL BIT0 #define REG_SAR_CH1_AISEL BIT1 //输出模式 #define MHal_GPIO_Pad_EN(r_oen,m_oen) (MHal_RIU_REG(r_oen) &= (~m_oen)) //输入模式 #define MHal_GPIO_Pad_Dn(r_oen,m_oen) (MHal_RIU_REG(r_oen) |= (m_oen)) //输出高电平 #define MHal_GPIO_OutHigh(r_out,m_out) (MHal_RIU_REG(r_out) |= m_out) //输出低电平 #define MHal_GPIO_OutLOW(r_out,m_out) (MHal_RIU_REG(r_out) &= (~m_out)) #define CONCAT(a,b,c) a##b##c #define GPIO_ROEN(_x_) CONCAT(GPIO,_x_,_ROEN) #define GPIO_MOEN(_x_) CONCAT(GPIO,_x_,_MOEN) #define GPIO_RIN(_x_) CONCAT(GPIO,_x_,_RIN) #define GPIO_MIN(_x_) CONCAT(GPIO,_x_,_MIN) #define GPIO_ROUT(_x_) CONCAT(GPIO,_x_,_ROUT) #define GPIO_MOUT(_x_) CONCAT(GPIO,_x_,_MOUT) int board_gpio_init(void); #endif
最新发布
09-17
<think>好的,我现在需要分析用户提供的这段代码。首先,用户给出的是一个名为chip.h的头文件,里面定义了大量的GPIO寄存器地址、位掩码以及一些宏定义和函数声明。用户可能希望了解这个文件的作用、结构以及关键部分的解析。 首先,我需要确定这个文件的主要功能。看起来这是一个硬件相关的头文件,用于定义GPIO寄存器的地址和位操作,以及一些宏来操作这些寄存器。这通常用于嵌入式系统开发,特别是在U-Boot或Linux内核中配置硬件寄存器。 接下来,我需要解析文件的各个部分。首先是包含保护宏,防止重复包含。然后是GPIO寄存器的定义,每个GPIO引脚都有ROEN、MOEN、ROUT、MOUT、RIN、MIN等寄存器,对应的地址和位掩码。例如,GPIO0_ROEN地址是0x103C00,MOEN是BIT5,这可能表示输出使能位。这些定义允许通过宏或函数来操作具体的寄存器位,从而控制GPIO的方向和状态。 然后是BUF_SIZE和CONFIG_RIU_BASE_ADDRESS的定义,后者可能是RIU(寄存器接口单元)的基地址,用于计算寄存器的物理地址。接下来是一些宏,如_GENMASK,用于生成位掩码,以及_RIUA_8BIT和_RIUA_16BIT,用于根据bank和offset计算寄存器地址。这些宏帮助开发者更方便地访问不同bank的寄存器。 还有_GPIO_R_WORD_MASK、_GPIO_W_WORD_MASK等宏,用于读写寄存器中的特定位域。这些宏使用了volatile指针来确保编译器不会优化对寄存器的访问,保持内存访问的正确性。 接下来是各种寄存器bank的定义,如PMSLEEP_BANK、CHIPTOP_BANK等,以及相关的寄存器和位掩码,例如REG_EJ_MODE和REG_TEST_IN_MODE等。这些可能用于配置不同的硬件模块或引脚复用功能。 MHal_RIU_REG宏用于访问具体的寄存器地址,通过基地址加上偏移量。然后是一些GPIO操作的宏,如MHal_GPIO_Pad_EN设置输出使能,MHal_GPIO_OutHigh设置高电平,这些宏通过操作对应的寄存器来控制GPIO的状态。 最后是GPIO寄存器名称的拼接宏,使用CONCAT将GPIO编号和寄存器类型组合成具体的寄存器名称,方便在代码中引用。 用户可能的需求是理解这个头文件的作用,各个部分的定义如何用于硬件操作,以及如何在代码中使用这些宏和定义。可能的应用场景包括嵌入式开发中的GPIO配置、设备驱动编写等。潜在的问题可能涉及寄存器地址错误、位掩码使用不当、或者宏定义的误用,导致硬件无法正确操作。 我需要确保在解释时涵盖这些部分:文件的作用、关键宏定义、寄存器地址和位操作、以及典型应用场景和潜在问题。同时,要提供相关问题帮助用户深入理解,比如如何修改GPIO配置,如何计算寄存器地址,或者如何处理宏冲突等。</think>### **chip.h 文件详解** #### **文件作用** 该头文件定义了 **硬件寄存器地址、GPIO 操作宏、位掩码** 等底层硬件抽象,主要用于 **嵌入式系统(如 U-Boot 或 Linux 内核)中的 GPIO 和寄存器级控制**。核心功能包括: 1. **寄存器地址映射**:为不同硬件模块(如 GPIO、PWM、SAR)定义物理地址。 2. **位操作宏**:提供对寄存器特定比特位的读写(如 `MHal_GPIO_OutHigh`)。 3. **硬件抽象层**:通过宏和函数封装,简化底层寄存器操作。 --- ### **关键代码解析** #### **1. GPIO 寄存器定义** ```c #define GPIO0_ROEN 0x103C00 #define GPIO0_MOEN BIT5 #define GPIO0_ROUT 0x103C00 #define GPIO0_MOUT BIT4 #define GPIO0_RIN 0x103C00 #define GPIO0_MIN BIT0 ``` - **作用**:定义每个 GPIO 引脚的寄存器地址和比特位。 - `ROEN`:输出使能寄存器(`0` 表示使能输出)。 - `ROUT`:输出数据寄存器(`1` 输出高电平,`0` 输出低电平)。 - `RIN`:输入数据寄存器(读取引脚状态)。 - **示例**:`GPIO0_MOEN` 对应 `BIT5`,表示输出使能位在寄存器的第 5 位。 #### **2. 寄存器地址计算宏** ```c #define _RIUA_8BIT(bank, offset) GET_BASE_ADDR_BY_BANK(CONFIG_RIU_BASE_ADDRESS, bank) + (((offset) & ~1)<<1) + ((offset) & 1) #define _RIUA_16BIT(bank, offset) GET_BASE_ADDR_BY_BANK(CONFIG_RIU_BASE_ADDRESS, bank) + ((offset)<<2) ``` - **作用**:将硬件模块的 `bank` 和 `offset` 转换为物理地址。 - `CONFIG_RIU_BASE_ADDRESS` 是 RIU(寄存器接口单元)的基地址(`0x1F000000`)。 - `GET_BASE_ADDR_BY_BANK` 通过 `bank` 值计算模块基地址。 - **示例**:`_RIUA_16BIT(CHIPTOP_BANK, 0x0f)` 计算 CHIPTOP 模块的 `0x0f` 寄存器地址。 #### **3. 寄存器位操作宏** ```c #define _GPIO_W_WORD_MASK(addr, val, mask) {(*(volatile u16*)(addr)) = ((*(volatile u16*)(addr)) & ~(mask)) | ((u16)(val) & (mask));} ``` - **作用**:对指定地址的寄存器进行 **原子位修改**,保留其他位不变。 - **示例**: ```c _GPIO_W_WORD_MASK(GPIO0_ROEN, 0, BIT5); // 使能 GPIO0 输出 ``` #### **4. GPIO 操作宏** ```c #define MHal_GPIO_Pad_EN(r_oen, m_oen) (MHal_RIU_REG(r_oen) &= (~m_oen)) // 使能输出 #define MHal_GPIO_OutHigh(r_out, m_out) (MHal_RIU_REG(r_out) |= m_out) // 输出高电平 #define MHal_GPIO_OutLOW(r_out, m_out) (MHal_RIU_REG(r_out) &= (~m_out)) // 输出低电平 ``` - **作用**:通过直接写寄存器控制 GPIO 状态。 - **示例**: ```c MHal_GPIO_Pad_EN(GPIO16_ROEN, GPIO16_MOEN); // 设置 GPIO16 为输出模式 MHal_GPIO_OutHigh(GPIO16_ROUT, GPIO16_MOUT); // 输出高电平 ``` #### **5. 寄存器 Bank 定义** ```c #define PMSLEEP_BANK 0x000E00 #define CHIPTOP_BANK 0x101E00 #define SAR_BANK 0x001400 ``` - **作用**:定义不同硬件模块的寄存器基地址偏移。 - **示例**:`CHIPTOP_BANK` 用于配置芯片顶层功能(如时钟、复位)。 --- ### **典型应用场景** | **场景** | **示例代码** | |-------------------------|-----------------------------------------------------------------------------| | **GPIO 输出控制** | `MHal_GPIO_OutHigh(GPIO16_ROUT, GPIO16_MOUT);` // 设置 GPIO16 高电平 | | **寄存器位修改** | `_GPIO_W_WORD_MASK(GPIO16_ROEN, 0, BIT5);` // 使能 GPIO16 输出 | | **引脚复用配置** | `REG_TEST_OUT_MODE` 和 `REG_TEST_OUT_MODE_MASK` 用于设置引脚为特定功能模式。| | **硬件初始化** | `board_gpio_init()` 函数中通过宏配置 GPIO 和 PWM。 | --- ### **潜在问题与调试** 1. **寄存器地址错误** - **现象**:硬件无响应或系统崩溃。 - **解决**:核对 `CONFIG_RIU_BASE_ADDRESS` 和 `bank/offset` 是否符合 SoC 手册。 2. **位掩码冲突** - **现象**:修改一个寄存器位影响其他功能。 - **解决**:使用 `_GPIO_W_WORD_MASK` 保留未修改位。 3. **GPIO 方向配置错误** - **现象**:无法读取输入或驱动输出。 - **解决**:检查 `MHal_GPIO_Pad_EN`(输出)或 `MHal_GPIO_Pad_Dn`(输入)设置。 4. **宏定义冲突** - **现象**:编译错误(如 `BIT5` 未定义)。 - **解决**:确保 `BIT0-BIT15` 的宏定义已包含。 --- ### **相关问题** 1. 如何通过 `MHal_RIU_REG` 读写寄存器? 2. 若 GPIO 引脚需要设置为输入模式,如何修改 `MHal_GPIO_Pad_EN`? 3. `_RIUA_8BIT` 和 `_RIUA_16BIT` 的地址计算差异是什么? 4. 如何修改 `MHal_GPIO_OutHigh` 以支持原子操作(避免竞态条件)? 5. 如果 `REG_PM_PWM5_MODE_MASK` 的值错误,如何定位和修正?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值