可以看到,操作寄存器的地址是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也是一样。