TI中文支持网
TI专业的中文技术问题搜集分享网站

gpio操作对应寄存器地址分析

gpioBaseAddr = (Uint32 *)&GpioDataRegs;for (regOffset = 0; regOffset < sizeof(GpioDataRegs)/2; regOffset++){gpioBaseAddr[regOffset] = 0x00000000;}
这段寄存器清零操作,没有看懂为什么要sizeof(GpioDataRegs)/2
对应寄存器地址,没对上,求大神讲解。
GpioDataRegs是以下结构体

struct GPIO_DATA_REGS {unionGPADAT_REGGPADAT;// GPIO A Data Register (GPIO0 to 31)unionGPASET_REGGPASET;// GPIO A Data Set Register (GPIO0 to 31)unionGPACLEAR_REGGPACLEAR;// GPIO A Data Clear Register (GPIO0 to 31)unionGPATOGGLE_REGGPATOGGLE;// GPIO A Data Toggle Register (GPIO0 to 31)unionGPBDAT_REGGPBDAT;// GPIO B Data Register (GPIO32 to 63)unionGPBSET_REGGPBSET;// GPIO B Data Set Register (GPIO32 to 63)unionGPBCLEAR_REGGPBCLEAR;// GPIO B Data Clear Register (GPIO32 to 63)unionGPBTOGGLE_REGGPBTOGGLE;// GPIO B Data Toggle Register (GPIO32 to 63)unionGPCDAT_REGGPCDAT;
。。。。
}
联合体都是如下格式的成员
union GPADAT_REG {Uint32  all;struct  GPADAT_BITS  bit;
};
数据手册,寄存器地址,为什么寄存器地址都是偶数0 2 4。。增长,但是0h的寄存器,含有4个字节。
Offset Acronym Register Name Write Protection Section
0h GPADAT GPIO A Data Register (GPIO0 to 31) Go
2h GPASET GPIO A Data Set Register (GPIO0 to 31) Go
4h GPACLEAR GPIO A Data Clear Register (GPIO0 to 31) Go
6h GPATOGGLE GPIO A Data Toggle Register (GPIO0 to 31) Go
8h GPBDAT GPIO B Data Register (GPIO32 to 63) Go
Ah GPBSET GPIO B Data Set Register (GPIO32 to 63) Go
Ch GPBCLEAR GPIO B Data Clear Register (GPIO32 to 63) Go
Eh GPBTOGGLE GPIO B Data Toggle Register (GPIO32 to 63) Go
10h GPCDAT GPIO C Data Register (GPIO64 to 95) 

weiping wang:stm32的芯片是一个字节对应一个地址,即如果寄存器地址为0h,该地址寄存器含有32位的配置,下一个寄存器地址应该是4h。
以上清0寄存器代码没看懂的:转为 (Uint32 *)地址后,gpioBaseAddr[regOffset],偏移与数据手册寄存器的地址偏移对应不上,最大
偏移sizeof(GpioDataRegs)/2也没对应上

gpioBaseAddr = (Uint32 *)&GpioDataRegs;for (regOffset = 0; regOffset < sizeof(GpioDataRegs)/2; regOffset++){gpioBaseAddr[regOffset] = 0x00000000;}
这段寄存器清零操作,没有看懂为什么要sizeof(GpioDataRegs)/2
对应寄存器地址,没对上,求大神讲解。
GpioDataRegs是以下结构体

struct GPIO_DATA_REGS {unionGPADAT_REGGPADAT;// GPIO A Data Register (GPIO0 to 31)unionGPASET_REGGPASET;// GPIO A Data Set Register (GPIO0 to 31)unionGPACLEAR_REGGPACLEAR;// GPIO A Data Clear Register (GPIO0 to 31)unionGPATOGGLE_REGGPATOGGLE;// GPIO A Data Toggle Register (GPIO0 to 31)unionGPBDAT_REGGPBDAT;// GPIO B Data Register (GPIO32 to 63)unionGPBSET_REGGPBSET;// GPIO B Data Set Register (GPIO32 to 63)unionGPBCLEAR_REGGPBCLEAR;// GPIO B Data Clear Register (GPIO32 to 63)unionGPBTOGGLE_REGGPBTOGGLE;// GPIO B Data Toggle Register (GPIO32 to 63)unionGPCDAT_REGGPCDAT;
。。。。
}
联合体都是如下格式的成员
union GPADAT_REG {Uint32  all;struct  GPADAT_BITS  bit;
};
数据手册,寄存器地址,为什么寄存器地址都是偶数0 2 4。。增长,但是0h的寄存器,含有4个字节。
Offset Acronym Register Name Write Protection Section
0h GPADAT GPIO A Data Register (GPIO0 to 31) Go
2h GPASET GPIO A Data Set Register (GPIO0 to 31) Go
4h GPACLEAR GPIO A Data Clear Register (GPIO0 to 31) Go
6h GPATOGGLE GPIO A Data Toggle Register (GPIO0 to 31) Go
8h GPBDAT GPIO B Data Register (GPIO32 to 63) Go
Ah GPBSET GPIO B Data Set Register (GPIO32 to 63) Go
Ch GPBCLEAR GPIO B Data Clear Register (GPIO32 to 63) Go
Eh GPBTOGGLE GPIO B Data Toggle Register (GPIO32 to 63) Go
10h GPCDAT GPIO C Data Register (GPIO64 to 95) 

Seven Han:

回复 weiping wang:

请看这个帖子中的解释:e2e.ti.com/…/692851

gpioBaseAddr = (Uint32 *)&GpioDataRegs;for (regOffset = 0; regOffset < sizeof(GpioDataRegs)/2; regOffset++){gpioBaseAddr[regOffset] = 0x00000000;}
这段寄存器清零操作,没有看懂为什么要sizeof(GpioDataRegs)/2
对应寄存器地址,没对上,求大神讲解。
GpioDataRegs是以下结构体

struct GPIO_DATA_REGS {unionGPADAT_REGGPADAT;// GPIO A Data Register (GPIO0 to 31)unionGPASET_REGGPASET;// GPIO A Data Set Register (GPIO0 to 31)unionGPACLEAR_REGGPACLEAR;// GPIO A Data Clear Register (GPIO0 to 31)unionGPATOGGLE_REGGPATOGGLE;// GPIO A Data Toggle Register (GPIO0 to 31)unionGPBDAT_REGGPBDAT;// GPIO B Data Register (GPIO32 to 63)unionGPBSET_REGGPBSET;// GPIO B Data Set Register (GPIO32 to 63)unionGPBCLEAR_REGGPBCLEAR;// GPIO B Data Clear Register (GPIO32 to 63)unionGPBTOGGLE_REGGPBTOGGLE;// GPIO B Data Toggle Register (GPIO32 to 63)unionGPCDAT_REGGPCDAT;
。。。。
}
联合体都是如下格式的成员
union GPADAT_REG {Uint32  all;struct  GPADAT_BITS  bit;
};
数据手册,寄存器地址,为什么寄存器地址都是偶数0 2 4。。增长,但是0h的寄存器,含有4个字节。
Offset Acronym Register Name Write Protection Section
0h GPADAT GPIO A Data Register (GPIO0 to 31) Go
2h GPASET GPIO A Data Set Register (GPIO0 to 31) Go
4h GPACLEAR GPIO A Data Clear Register (GPIO0 to 31) Go
6h GPATOGGLE GPIO A Data Toggle Register (GPIO0 to 31) Go
8h GPBDAT GPIO B Data Register (GPIO32 to 63) Go
Ah GPBSET GPIO B Data Set Register (GPIO32 to 63) Go
Ch GPBCLEAR GPIO B Data Clear Register (GPIO32 to 63) Go
Eh GPBTOGGLE GPIO B Data Toggle Register (GPIO32 to 63) Go
10h GPCDAT GPIO C Data Register (GPIO64 to 95) 

weiping wang:

回复 Seven Han:

能中文讲解下么,还是没怎么看懂

gpioBaseAddr = (Uint32 *)&GpioDataRegs;for (regOffset = 0; regOffset < sizeof(GpioDataRegs)/2; regOffset++){gpioBaseAddr[regOffset] = 0x00000000;}
这段寄存器清零操作,没有看懂为什么要sizeof(GpioDataRegs)/2
对应寄存器地址,没对上,求大神讲解。
GpioDataRegs是以下结构体

struct GPIO_DATA_REGS {unionGPADAT_REGGPADAT;// GPIO A Data Register (GPIO0 to 31)unionGPASET_REGGPASET;// GPIO A Data Set Register (GPIO0 to 31)unionGPACLEAR_REGGPACLEAR;// GPIO A Data Clear Register (GPIO0 to 31)unionGPATOGGLE_REGGPATOGGLE;// GPIO A Data Toggle Register (GPIO0 to 31)unionGPBDAT_REGGPBDAT;// GPIO B Data Register (GPIO32 to 63)unionGPBSET_REGGPBSET;// GPIO B Data Set Register (GPIO32 to 63)unionGPBCLEAR_REGGPBCLEAR;// GPIO B Data Clear Register (GPIO32 to 63)unionGPBTOGGLE_REGGPBTOGGLE;// GPIO B Data Toggle Register (GPIO32 to 63)unionGPCDAT_REGGPCDAT;
。。。。
}
联合体都是如下格式的成员
union GPADAT_REG {Uint32  all;struct  GPADAT_BITS  bit;
};
数据手册,寄存器地址,为什么寄存器地址都是偶数0 2 4。。增长,但是0h的寄存器,含有4个字节。
Offset Acronym Register Name Write Protection Section
0h GPADAT GPIO A Data Register (GPIO0 to 31) Go
2h GPASET GPIO A Data Set Register (GPIO0 to 31) Go
4h GPACLEAR GPIO A Data Clear Register (GPIO0 to 31) Go
6h GPATOGGLE GPIO A Data Toggle Register (GPIO0 to 31) Go
8h GPBDAT GPIO B Data Register (GPIO32 to 63) Go
Ah GPBSET GPIO B Data Set Register (GPIO32 to 63) Go
Ch GPBCLEAR GPIO B Data Clear Register (GPIO32 to 63) Go
Eh GPBTOGGLE GPIO B Data Toggle Register (GPIO32 to 63) Go
10h GPCDAT GPIO C Data Register (GPIO64 to 95) 

weiping wang:

回复 Seven Han:

能用中文讲解下么,十分谢谢

gpioBaseAddr = (Uint32 *)&GpioDataRegs;for (regOffset = 0; regOffset < sizeof(GpioDataRegs)/2; regOffset++){gpioBaseAddr[regOffset] = 0x00000000;}
这段寄存器清零操作,没有看懂为什么要sizeof(GpioDataRegs)/2
对应寄存器地址,没对上,求大神讲解。
GpioDataRegs是以下结构体

struct GPIO_DATA_REGS {unionGPADAT_REGGPADAT;// GPIO A Data Register (GPIO0 to 31)unionGPASET_REGGPASET;// GPIO A Data Set Register (GPIO0 to 31)unionGPACLEAR_REGGPACLEAR;// GPIO A Data Clear Register (GPIO0 to 31)unionGPATOGGLE_REGGPATOGGLE;// GPIO A Data Toggle Register (GPIO0 to 31)unionGPBDAT_REGGPBDAT;// GPIO B Data Register (GPIO32 to 63)unionGPBSET_REGGPBSET;// GPIO B Data Set Register (GPIO32 to 63)unionGPBCLEAR_REGGPBCLEAR;// GPIO B Data Clear Register (GPIO32 to 63)unionGPBTOGGLE_REGGPBTOGGLE;// GPIO B Data Toggle Register (GPIO32 to 63)unionGPCDAT_REGGPCDAT;
。。。。
}
联合体都是如下格式的成员
union GPADAT_REG {Uint32  all;struct  GPADAT_BITS  bit;
};
数据手册,寄存器地址,为什么寄存器地址都是偶数0 2 4。。增长,但是0h的寄存器,含有4个字节。
Offset Acronym Register Name Write Protection Section
0h GPADAT GPIO A Data Register (GPIO0 to 31) Go
2h GPASET GPIO A Data Set Register (GPIO0 to 31) Go
4h GPACLEAR GPIO A Data Clear Register (GPIO0 to 31) Go
6h GPATOGGLE GPIO A Data Toggle Register (GPIO0 to 31) Go
8h GPBDAT GPIO B Data Register (GPIO32 to 63) Go
Ah GPBSET GPIO B Data Set Register (GPIO32 to 63) Go
Ch GPBCLEAR GPIO B Data Clear Register (GPIO32 to 63) Go
Eh GPBTOGGLE GPIO B Data Toggle Register (GPIO32 to 63) Go
10h GPCDAT GPIO C Data Register (GPIO64 to 95) 

weiping wang:

回复 Jingyuan Zhao:

你的意思是sizeof的结果是以字(16位)为单位的个数?即sizeof(GPADAT)=2?

赞(0)
未经允许不得转载:TI中文支持网 » gpio操作对应寄存器地址分析
分享到: 更多 (0)