印象中不止一次有人询问STM32G4系列到底支不支持位带操作。
其实,从STM32G4系列的参考手册可以看到,该系列芯片是确定支持位带操作的,下面为参考手册中的相关描述截图。
不过,在STM32G4系列参考手册上关于Bitbanding的描述基本就上面这些了。这个位带操作是否被支持终究跟内核有关,STM32G4系列是Cortex -M4核,相关内核手册也有关于Bit banding的描述。见下图,位带区和位带别名区的地址安排及映射关系有清晰的定义。
显然,结合STM32参考手册及ARMCortex-M4内核手册描述,STM32G4系列肯定是支持位带操作的。
可是,有人在试图利用位带操作对STM32G4系列的GPIO进行位操作时,根本成功不了。不知是硬件不支持还是自己的代码哪里有问题。
我们再结合上图看看,不难发现,只有落在0x20000000~0x200fffff的RAM才支持位带操作。对于外设寄存器来讲,只有落在0x40000000~0x400ffff空间的寄存器才支持位带操作。如果我们试图进行位操作的GPIO寄存器不落在这些区域自然没法做位带操作。
通过查看STM32G4参考手册,我们可以发现该系列的GPIO的各种寄存器的地址空间落在0x48000000~0x48001bff区域,根本就没落在位带区,也没落在位带别名区。
既然这样,我们没法针对STM32G4系列的GPIO寄存器使用位带操作。
那么,在STM32G4系列里,有没有其他外设可以支持位带操作呢?即相应外设寄存器地址空间位于0x40000000~0x400ffff区域。其实,也是有的。比方片内的部分TIMER外设,见下图。是否还有其它外设请细看手册确认。
当然,位于0x20000000~0x200fffff区间的RAM也支持位带操作。
下面我基于位带操作对TIM2->CR1寄存器的CEN位,即该寄存器的bit0,和地址为0x20000800的RAM单元的bit2进行写1、写0的操作。
我基于STM32G473及HAL库创建工程,组织代码。
TIM2_BASE在库中已经定义,这里就没有重复定义了。稍加调试后,我们可以基于位带操作对TIM2->CR1的CEN位置位或清零,让计数器时而计数时而暂停。我先将x20000800的RAM单元初始化为0xff,然后周期性修改为bit2,可以看到其值在0xff和0xfb两者间切换。下图为测试验证结果。
好,关于STM32G4位带操作的话题就聊到这里,上面主要是做些确认和解释,兼做提醒,免得走弯路浪费精力和时间。这玩意用不用,看个人喜好,其实也并非所有Cortex-M核都支持位带操作。
- 寄存器
+关注
关注
31文章
5225浏览量
118951 - STM32
+关注
关注
2253文章
10779浏览量
351610 - GPIO
+关注
关注
16文章
1164浏览量
51404
原文标题:STM32G4系列是否支持位带操作
文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。
发布评论请先登录
相关推荐
评论