本帖最后由 Cube 于 2011-3-29 23:09 编辑
其实红杏的关键在于将重复的地址与寄存器
利用结构体表示
使得Px(0)->和PA->这类结构
灵活直观的用户被应用
难点:
1.#define GPIOEs (*((NU_GPIO_T *) GPIOE_BASE))
这一结构需要读懂
2.
typedef struct
{
NU_GPIO_PMD_T PMD;//模式控制(0输入1输出2开漏3准双向)
NU_GPIO_OFFD_T OFFD;//数字使能(高16位)
NU_REG_PINs DOUT;//数据输出值(低16位)
NU_REG_PINs DMASK;//数据输出写屏蔽
NU_REG_PINs PIN;//管脚数值(低16位)
NU_REG_PINs DBEN;//防反弹使能
NU_REG_PINs IMD;//中断模式控制(0边沿触发中断1电平触发中断)
NU_REG_BITs IEN;//中断使能(高16位上升沿或高电平,低16位下降沿或低电平)
NU_REG_PINs ISRC;//中断源标志
NU_REG RESERVED[7];//保留,为了构造GPIO结构数组
} NU_GPIO_T;
这样是个子模块
因为ABCDE有重复部分只是地址不同,
故先定义此结构
3.上面的结构中
NU_REG_PINs DOUT;//数据输出值(低16位)
请注意:NU_REG_PINs
是一个很关键的联合体
typedef volatile union
{
__IO NU_REG Regs;
__IO NU_PINs Bits;
}NU_REG_PINs;
它就是用32位寄存器内的32位来表达的成员
4.
typedef volatile struct
{
NU_REG Pin0: 1;
NU_REG Pin1: 1;
NU_REG Pin2: 1;
NU_REG Pin3: 1;
NU_REG Pin4: 1;
NU_REG Pin5: 1;
NU_REG Pin6: 1;
NU_REG Pin7: 1;
NU_REG Pin8: 1;
NU_REG Pin9: 1;
NU_REG Pin10: 1;
NU_REG Pin11: 1;
NU_REG Pin12: 1;
NU_REG Pin13: 1;
NU_REG Pin14: 1;
NU_REG Pin15: 1;
NU_REG Pin16: 1;
NU_REG Pin17: 1;
NU_REG Pin18: 1;
NU_REG Pin19: 1;
NU_REG Pin20: 1;
NU_REG Pin21: 1;
NU_REG Pin22: 1;
NU_REG Pin23: 1;
NU_REG Pin24: 1;
NU_REG Pin25: 1;
NU_REG Pin26: 1;
NU_REG Pin27: 1;
NU_REG Pin28: 1;
NU_REG Pin29: 1;
NU_REG Pin30: 1;
NU_REG Pin31: 1;
}NU_PINs
将其实现“位”化
5.
通过以上信息,可以读懂以下定义
#define GPIOAs (*((NU_GPIO_T *) GPIOA_BASE))
//定位全局结构变量GPIOAs
#define Px(x) ((NU_GPIO_T *) GPIOA_BASE + (x * 0x0040))
红杏类似俄罗斯套娃,一层层
实现GPIOs.PxA.DOUT.Regs |= 1;
切记:关键在于将重复的地址与寄存器
|