可以看到,操作寄存器的地址是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。這明顯就對不上,位帶操作的地址都不是對應GPIO的ODR,當然操作不了GPIO的電平,這下死心了。
死也要再死個明白,繼續查M4的手冊關于Memory System章節,可以看到位帶操作地址有兩個,Bit Band Region是直接位帶操作(具體的可以百度),Bit Band Alias是間接位帶操作,要做地址映射才能操作,所以才會BITBAND這個宏定義。只有寄存器的地址在Bit Badn Alias(0x42000000,0x43FFFFFF)地址區域內的才進行位帶操作。F303的GPIO是屬于AHB2,地址已經不在位置操作區域,所以地址映射后對應不是GPIO的寄存器,自然不能進行位帶操作(ST這點也做得太坑了,為什么要把GPIO的歸到AHB2)。M4的GPIO都在AHB1總線上,地址在位帶操作地址區域自然可以用位帶操作GPI,M1也是一樣。