STM32—位帶操作

筆者博客鏈接:蠟筆小新沒(méi)有博客
希望可以和志同道合的朋友多交流染突!
STM32中的位帶操作: 名字為位帶操作拒秘,實(shí)際上是對(duì)位的操作阔墩,位操作就是可以單獨(dú)的對(duì)一個(gè)比特位讀和寫(xiě)悼泌,這個(gè)在 51 單片機(jī)中非常常見(jiàn)。 51 單片機(jī)中通過(guò)關(guān)鍵字 sbit 來(lái)實(shí)現(xiàn)位定義涩赢, STM32 沒(méi)有這樣的關(guān)鍵字戈次,而是通過(guò)訪問(wèn)位帶別名區(qū)來(lái)實(shí)現(xiàn)。STM32 的全部寄存器都可以通過(guò)訪問(wèn)位帶別名區(qū)的方式來(lái)達(dá)到訪問(wèn)原始寄存器比特位的效果筒扒,這比 51 單片機(jī)強(qiáng)大很多怯邪。因?yàn)?51 單片機(jī)里面并不是所有的寄存器都是可以比特位操作,有些寄存器還是得字節(jié)操作花墩,比如 SBUF悬秉。

51單片機(jī)中的位操作:
51單片機(jī)中可以對(duì)寄存器實(shí)現(xiàn)單個(gè)位的操作,靠的就是關(guān)鍵字sbit冰蘑,如
sbit led=P1^0; led=1;就可實(shí)現(xiàn)對(duì)P1.0位置1的效果和泌。

為什么STM32不推崇直接進(jìn)行位操作?
本人認(rèn)為STM32是32位MCU祠肥,一次處理32位數(shù)據(jù)武氓,所以一次只處理一位的數(shù)據(jù)未必大材小用了,除非特殊情況仇箱,否則都以32位處理县恕。

如何處理STM32中要對(duì)某一位進(jìn)行操作時(shí)的情況?
要知道STM32中采用庫(kù)函數(shù)編程工碾,所以有很多的對(duì)位操作的任務(wù)都用具體的函數(shù)來(lái)完成,而這些函數(shù)都已經(jīng)做好了我們只需要知道怎么用就行百姓。但我們?nèi)匀豢梢宰约簩?shí)現(xiàn)位操作渊额,這種神操作就是位帶操作

位帶區(qū)與位帶區(qū)別名:
在 STM32 中,有兩個(gè)地方實(shí)現(xiàn)了位帶旬迹,一個(gè)是 SRAM 區(qū)的最低 1MB 空間火惊,令一個(gè)是外設(shè)區(qū)最低 1MB 空間。這兩個(gè) 1MB 的空間除了可以像正常的 RAM 一樣操作外奔垦,他們還有自己的位帶別名區(qū)屹耐,位帶別名區(qū)把這 1MB 的空間的==每一個(gè)位膨脹成32 位 (要知道 STM32 的系統(tǒng)總線是 32 位的,按照 4 個(gè)字節(jié)訪問(wèn)的時(shí)候是最快的椿猎,所以膨脹成 4 個(gè)字節(jié)來(lái)訪問(wèn)是最高效的惶岭。)==,當(dāng)訪問(wèn)位帶別名區(qū)的這些字時(shí)犯眠,就可以達(dá)到訪問(wèn)位帶區(qū)某個(gè)比特位的目的按灶。
位帶區(qū)就是就是可以進(jìn)行位帶操作的寄存器的映射地址。
位帶區(qū)別名可以理解為將位帶區(qū)每一個(gè)位都膨脹32倍(用一個(gè)字節(jié)代表一個(gè)位筐咧,以便于32位MCU操作)后的地址鸯旁。

如何實(shí)現(xiàn)位帶操作?
要進(jìn)行位帶操作需要知道被操作的位的地址量蕊,因?yàn)镾RAM和外設(shè)中都可以位帶操作铺罢,所以形式上可以將位帶操作歸納為倆個(gè)公式。
對(duì)于位帶區(qū)的某個(gè)比特残炮,記它所在字節(jié)的地址為 A,位序號(hào)為 n(0<=n<=7)韭赘,則其在位帶區(qū)別名地址為:

外設(shè):AliasAddr= =0x42000000+ (A-0x40000000)*8*4 +n*4
SRAM:AliasAddr= =0x22000000+ (A-0x20000000)*8*4 +n*4

==用外設(shè)解釋公式:0X42000000 是外設(shè)位帶別名區(qū)的起始地址, 0x40000000 是外設(shè)位帶區(qū)的起始地址吉殃,(A-0x40000000)表示該比特前面有多少個(gè)字節(jié)辞居,一個(gè)字節(jié)有 8 位,所以8蛋勺,一個(gè)位膨脹后是 4 個(gè)字節(jié)瓦灶,所以4, n 表示該比特在 A 地址的序號(hào)抱完,因?yàn)橐粋€(gè)位經(jīng)過(guò)膨脹后是四個(gè)字節(jié)贼陶,所以也*4。==
當(dāng)然巧娱,也可以將倆個(gè)公式合二為一:

 // 把“位帶地址+位序號(hào)”轉(zhuǎn)換成別名地址的宏
AliasAdd = (addr & 0xF0000000)+0x02000000+((addr &0x00FFFFFF)<<5)+(bitnum<<2)

知曉了位帶區(qū)別名的地址碉怔,然后將此地址轉(zhuǎn)換為指針類型就可以通過(guò)位帶操作對(duì)原始的為進(jìn)行操作。
附上野火的位帶操作代碼:

#include "stm32f10x.h"
#include "./led/bsp_led.h"

#define PCout(n) (*(unsigned int*)(((GPIOC_BASE+0x0c) & 0xF0000000)+0x02000000+(((GPIOC_BASE+0x0c) &0x000FFFFF)<<5)+(n<<2)))
#define PBout(n) (*(unsigned int*)(((GPIOB_BASE+0x0c) & 0xF0000000)+0x02000000+(((GPIOB_BASE+0x0c) &0x000FFFFF)<<5)+(n<<2)))

void delay(uint32_t count)
{
    for(; count!=0; count--);
}

int main(void)
{
    LED_GPIO_Config();  //LED初始化函數(shù)
    
    while(1)
    {
        PCout(2) = 1;
        //GPIO_SetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
        delay(0xfffff);
        PCout(2) = 0;
        //GPIO_ResetBits(LED1_GPIO_PORT, LED1_GPIO_PIN);
        delay(0xfffff);
        
        PCout(3) = 1;
        //GPIO_SetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
        delay(0xfffff);
        PCout(3) = 0;
        //GPIO_ResetBits(LED2_GPIO_PORT, LED2_GPIO_PIN);
        delay(0xfffff);
    }
    

代碼簡(jiǎn)述:用宏定義的方法來(lái)操作GPIOC中的ODR寄存器和IDR寄存器中的某一位來(lái)實(shí)現(xiàn)led燈的亮滅

#define PCout(n) (*(unsigned int*)(((GPIOC_BASE+0x0c) & 0xF0000000)+0x02000000+(((GPIOC_BASE+0x0c) &0x000FFFFF)<<5)+(n<<2)))

文章部分參考:【野火?】《零死角玩轉(zhuǎn)STM32》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末禁添,一起剝皮案震驚了整個(gè)濱河市撮胧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌老翘,老刑警劉巖芹啥,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锻离,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡墓怀,警方通過(guò)查閱死者的電腦和手機(jī)汽纠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)傀履,“玉大人虱朵,你說(shuō)我怎么就攤上這事〉稣耍” “怎么了碴犬?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)官扣。 經(jīng)常有香客問(wèn)我翅敌,道長(zhǎng),這世上最難降的妖魔是什么惕蹄? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任蚯涮,我火速辦了婚禮,結(jié)果婚禮上卖陵,老公的妹妹穿的比我還像新娘遭顶。我一直安慰自己,他們只是感情好泪蔫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布棒旗。 她就那樣靜靜地躺著,像睡著了一般撩荣。 火紅的嫁衣襯著肌膚如雪铣揉。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天餐曹,我揣著相機(jī)與錄音逛拱,去河邊找鬼。 笑死台猴,一個(gè)胖子當(dāng)著我的面吹牛朽合,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饱狂,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼曹步,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了休讳?” 一聲冷哼從身側(cè)響起讲婚,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎俊柔,沒(méi)想到半個(gè)月后筹麸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體纳猫,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年竹捉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尚骄。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡块差,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出倔丈,到底是詐尸還是另有隱情憨闰,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布需五,位于F島的核電站鹉动,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宏邮。R本人自食惡果不足惜泽示,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜜氨。 院中可真熱鬧械筛,春花似錦、人聲如沸飒炎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)郎汪。三九已至赤赊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間煞赢,已是汗流浹背抛计。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耕驰,地道東北人爷辱。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像朦肘,于是被迫代替她去往敵國(guó)和親饭弓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容