STM32G4系列到底支不支持位带操作

描述

印象中不止一次有人询问STM32G4系列到底支不支持位带操作。

其实,从STM32G4系列的参考手册可以看到,该系列芯片是确定支持位带操作的,下面为参考手册中的相关描述截图。

STM32

不过,在STM32G4系列参考手册上关于Bit banding的描述基本就上面这些了。这个位带操作是否被支持终究跟内核有关,STM32G4系列是Cortex -M4核,相关内核手册也有关于Bit banding的描述。见下图,位带区和位带别名区的地址安排及映射关系有清晰的定义。

STM32

显然,结合STM32参考手册及ARM Cortex-M4内核手册描述,STM32G4系列肯定是支持位带操作的。

可是,有人在试图利用位带操作对STM32G4系列的GPIO进行位操作时,根本成功不了。不知是硬件不支持还是自己的代码哪里有问题。

我们再结合上图看看,不难发现,只有落在0x20000000~0x200fffff的RAM才支持位带操作。对于外设寄存器来讲,只有落在0x40000000~0x400ffff空间的寄存器才支持位带操作。如果我们试图进行位操作的GPIO寄存器不落在这些区域自然没法做位带操作。

通过查看STM32G4参考手册,我们可以发现该系列的GPIO的各种寄存器的地址空间落在0x48000000~0x48001bff区域,根本就没落在位带区,也没落在位带别名区。

STM32

既然这样,我们没法针对STM32G4系列的GPIO寄存器使用位带操作。

那么,在STM32G4系列里,有没有其他外设可以支持位带操作呢?即相应外设寄存器地址空间位于0x40000000~0x400ffff区域。其实,也是有的。比方片内的部分TIMER外设,见下图。是否还有其它外设请细看手册确认。

STM32

当然,位于0x20000000~0x200fffff区间的RAM也支持位带操作。

下面我基于位带操作对TIM2->CR1寄存器的CEN位,即该寄存器的bit0,和地址为0x20000800的RAM单元的bit2进行写1、写0的操作。

我基于STM32G473及HAL库创建工程,组织代码。

STM32

TIM2_BASE在库中已经定义,这里就没有重复定义了。稍加调试后,我们可以基于位带操作对TIM2->CR1的CEN位置位或清零,让计数器时而计数时而暂停。我先将x20000800的RAM单元初始化为0xff,然后周期性修改为bit2,可以看到其值在0xff和0xfb两者间切换。下图为测试验证结果。

STM32

好,关于STM32G4位带操作的话题就聊到这里,上面主要是做些确认和解释,兼做提醒,免得走弯路浪费精力和时间。这玩意用不用,看个人喜好,其实也并非所有Cortex-M核都支持位带操作。

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分