可以看到,操作寄存器的地址是0X42010290,查M3的GPIO地址,
#define GPIOC_BASE (AHB2PERIPH_BASE + 0x0800)
#define AHB2PERIPH_BASE (PERIPH_BASE + 0x08000000)
#define PERIPH_BASE ((uint32_t)0x40000000) /*!< Peripheral base address in the alias region */
也就是GPIOC的地址是0x48000800。這明顯就對不上,位帶操作的地址都不是對應(yīng)GPIO的ODR,當(dāng)然操作不了GPIO的電平,這下死心了。
死也要再死個明白,繼續(xù)查M4的手冊關(guān)于Memory System章節(jié),可以看到位帶操作地址有兩個,Bit Band Region是直接位帶操作(具體的可以百度),Bit Band Alias是間接位帶操作,要做地址映射才能操作,所以才會BITBAND這個宏定義。只有寄存器的地址在Bit Badn Alias(0x42000000,0x43FFFFFF)地址區(qū)域內(nèi)的才進(jìn)行位帶操作。F303的GPIO是屬于AHB2,地址已經(jīng)不在位置操作區(qū)域,所以地址映射后對應(yīng)不是GPIO的寄存器,自然不能進(jìn)行位帶操作(ST這點也做得太坑了,為什么要把GPIO的歸到AHB2)。M4的GPIO都在AHB1總線上,地址在位帶操作地址區(qū)域自然可以用位帶操作GPI,M1也是一樣。