印象中不止一次有人詢問STM32G4系列到底支不支持位帶操作。
其實,從STM32G4系列的參考手冊可以看到,該系列芯片是確定支持位帶操作的,下面為參考手冊中的相關描述截圖。
不過,在STM32G4系列參考手冊上關于Bitbanding的描述基本就上面這些了。這個位帶操作是否被支持終究跟內核有關,STM32G4系列是Cortex -M4核,相關內核手冊也有關于Bit banding的描述。見下圖,位帶區和位帶別名區的地址安排及映射關系有清晰的定義。
顯然,結合STM32參考手冊及ARM Cortex-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文章
5369瀏覽量
121275 -
STM32
+關注
關注
2273文章
10926瀏覽量
357770 -
GPIO
+關注
關注
16文章
1217瀏覽量
52434
原文標題:STM32G4系列是否支持位帶操作
文章出處:【微信號:stmcu832,微信公眾號:茶話MCU】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
對于STM32G4系列的MCU,其GPIO的位操作是否還支持位帶操作?
CH573到底支不支持mesh組網?
STM32G431不支持這種雙bank操作模式嗎?
openharmony不支持安卓嗎
STM32學習筆記:位帶操作(Bit_band Operations)
![<b class='flag-5'>STM32</b>學習筆記:<b class='flag-5'>位</b><b class='flag-5'>帶操作</b>(Bit_band Operations)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論