您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > STM32F3位带操作问题
F3不能用位带操作GPIO之原由最近用到STM32F303,在修改IO的时候,觉得用库操作太麻烦了,要自己一个一个修改,用宏定义也不解决,自然就会想到用位带操作。查M4的手册知道M4也是支持位带操作,F3系列也是属于M4内核,而且在405也是用位带操作,觉得F303也是一样可以做位带操作。直接先修改一个IO,调试却发现在,IO电平始终没有变化。查IO,初始化没有问题。再查位带宏定义:#defineBITBAND(addr,bitnum)((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)5)+(bitnum2))#defineMEM_ADDR(addr)*((volatileunsignedlong*)(addr))#defineBIT_ADDR(addr,bitnum)MEM_ADDR(BITBAND(addr,bitnum))//IO口地址映射#defineGPIOA_ODR_Addr(GPIOA_BASE+20)#defineGPIOB_ODR_Addr(GPIOB_BASE+20)#defineGPIOC_ODR_Addr(GPIOC_BASE+20)第一次地址映射操作是内核决定的,F3跟F4都是相同的,这里不会有错。查ODR寄存器的偏移地址:_IOuint16_tODR;/*!GPIOportoutputdataregister,Addressoffset:0x14*/ODR的地址偏移了0x14,也就是20,也是对的。F4都可以用位带操作,F3却用不了,就觉得很奇怪。放了一段时间,不死心,继续查找问题。调试,看汇编代码,在位带操作IO那里打断点可以看到,操作寄存器的地址是0X42010290,查M3的GPIO地址,#defineGPIOC_BASE(AHB2PERIPH_BASE+0x0800)#defineAHB2PERIPH_BASE(PERIPH_BASE+0x08000000)#definePERIPH_BASE((uint32_t)0x40000000)/*!Peripheralbaseaddressinthealiasregion*/也就是GPIOC的地址是0x48000800。这明显就对不上,位带操作的地址都不是对应GPIO的ODR,当然操作不了GPIO的电平,这下死心了。死也要再死个明白,继续查M4的手册关于MemorySystem章节,可以看到位带操作地址有两个,BitBandRegion是直接位带操作(具体的可以百度),BitBandAlias是间接位带操作,要做地址映射才能操作,所以才会BITBAND这个宏定义。只有寄存器的地址在BitBadnAlias(0x42000000,0x43FFFFFF)地址区域内的才进行位带操作。F303的GPIO是属于AHB2,地址已经不在位置操作区域,所以地址映射后对应不是GPIO的寄存器,自然不能进行位带操作(ST这点也做得太坑了,为什么要把GPIO的归到AHB2)。M4的GPIO都在AHB1总线上,地址在位带操作地址区域自然可以用位带操作GPI,M1也是一样。
本文标题:STM32F3位带操作问题
链接地址:https://www.777doc.com/doc-2860910 .html