STM32F3位带操作问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

F3不能用位带操作GPIO之原由
最近用到STM32F303,在修改IO的时候,觉得用库操作太麻烦了,要自己一个一个修改,用宏定义也不解决,自然就会想到用位带操作。

查M4的手册知道M4也是支持位带操作,F3系列也是属于M4内核,而且在405也是用位带操作,觉得F303也是一样可以做位带操作。

直接先修改一个IO,调试却发现在,IO电平始终没有变化。

查IO,初始化没有问题。

再查位带宏定义:#define BITBAND(addr, bitnum) ((addr &
0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
//IO口地址映射
#define GPIOA_ODR_Addr (GPIOA_BASE+20)
#define GPIOB_ODR_Addr (GPIOB_BASE+20)
#define GPIOC_ODR_Addr (GPIOC_BASE+20)
第一次地址映射操作是内核决定的,F3跟F4都是相同的,这里不会有错。

查ODR寄存器的偏移地址:
_IO uint16_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */
ODR的地址偏移了0x14,也就是20,也是对的。

F4都可以用位带操作,F3却用不了,就觉得很奇怪。

放了一段时间,不死心,继续查找问题。

调试,看汇编代码,在位带操作IO那里打断点
可以看到,操作寄存器的地址是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也是一样。

相关文档
最新文档