最近用到STM32F303,在修改IO的时候,觉得用库操作太麻烦了,要自己一个一个修改,用宏定义也不解决,自然就会想到用位带操作。查M4的手册知道M4也是支持位带操作,F3系列也是属于M4内核,而且在405也是用位带操作,觉得F303也是一样可以做位带操作。直接先修改一个IO,调试却发现在,IO电平始终没有变化。查IO,初始化没有问题。再查位带宏定义:( [4 f+ I6 Y& F: }; X #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) Q5 c9 h9 Y! ~ #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)$ k. P( g* g; R #define GPIOC_ODR_Addr (GPIOC_BASE+20) n7 o2 Y* L+ c$ v0 T7 y; c1 o7 R1 c" d 第一次地址映射操作是内核决定的,F3跟F4都是相同的,这里不会有错。查ODR寄存器的偏移地址:, p: I+ W9 {" z- a* {9 x _IO uint16_t ODR; /*!< GPIO port output data register, Address offset: 0x14 */' J) ^6 V$ Y" Z4 s0 U$ t7 v+ g ODR的地址偏移了0x14,也就是20,也是对的。F4都可以用位带操作,F3却用不了,就觉得很奇怪。放了一段时间,不死心,继续查找问题。调试,看汇编代码,在位带操作IO那里打断点( t( k5 T2 N- b/ O2 N) r Q; S5 A0 H% c$ ~! F& j ' S6 ?7 a1 M" T 1 H7 N& t) ?3 N! m7 c! { 可以看到,操作寄存器的地址是0X42010290,查M3的GPIO地址, #define GPIOC_BASE (AHB2PERIPH_BASE + 0x0800)5 m& s3 D" n/ U #define AHB2PERIPH_BASE (PERIPH_BASE + 0x08000000)$ [" I* s) B2 o) ~ #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也是一样。3 N7 a: t7 t/ A8 ^, m) ^. }4 a " D9 Y7 \4 l0 x% T+ {: R( m2 h |
基于STM32F334的数字电源
STM32F3DISCOVERY + UCGUI3.90A的移植(源码+视频)
基于STM32F303双电机FOC驱动: 无感原理图/BOM表/代码等开源...
【基于STM32F3的电机控制】_给力外围之 OPAMP
在 STM32 F0、 F2、 F3、 F4 和 L1 系列MCU 中使用硬件实时时钟 (RTC)
基于STM32F334的BUCK同步降压数字电源设计
ST FOC4.3 库关于 STM32F30x 系列 ICS采样代码的修改
STM32F334 上的 ADC 管脚和 DAC 管脚复用问题
如何使用USART或LPUART将STM32F0/F3/L0/L4微控制器从低功耗模式唤醒
在 STM32 F0、 F2、 F3、 F4 和 L1 系列 MCU 中使用硬件实时时钟 (RTC)
还有最后是F1 M3系列吗?不知道还有M1