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?