1. 程式人生 > 其它 >C語言的位操作在STM32f1微控制器程式設計的具體應用

C語言的位操作在STM32f1微控制器程式設計的具體應用

技術標籤:微控制器stm32c語言

C語言的位操作在STM32f1微控制器程式設計的具體應用

前言:熟練掌握位操作是學習stm32入門的必備技術,位操作在微控制器程式設計中格外重要,下面我就分別詳細介紹C語言的幾種位操作在微控制器程式設計的具體用法:

一:按位與&(AND)
只有當兩位都為1時,結果才為1,否則都為0
例如:我們要改變GPIOA狀態,對它的CRL暫存器某些位的值用&來改變

GPIOA->CRL&=0XFFFFFF0F; //將第 4-7 位清 0

將此16進位制數換算成二進位制再進行&運算可知,F就是1111了,只有第四位到第七位的數全為0(2進位制是從第0位開始的),於是就得到新的值了。

二:按位異或^(XOR)
只有當兩位不同時,它的結果才是1,否則為0
例如假設我們要將暫存器所有位都進行取反

GPIOA->CRL^=0XFFFFFFFF; //所有位剛好相反

當原來位是1時變為0,原來位是0時變為1.

三:按位或|(OR)
為什麼我要放在第三個來說明呢?
因為這裡有個隱含的關係就是:|=&+^
進行OR操作時只有兩位都為0結果才是0,否則都為1,這樣我們通過簡單的數學邏輯就可以得出這個關係了,下面讓我們具體來看看按位操作的應用吧!

GPIOA->CRL|=0X00000040; //設定相應位的值,不改變其他位的值

這是在例1的按位與上進行的,第四到第七位都是0,其餘位都是1,這裡運算的最終結果就是其餘位還是1不變,第四到第七位中只有第六位變成了1。

四:移位:左移<< 右移>>
移位操作符最大的特點就是提高程式碼的可讀性,如果你想賦一個值,完全可以用最簡單易懂的方法直接用=去賦值,但為什麼要通過左移而不是直接設定一個固定的值呢?其實,這是為了提高程式碼的可讀性以及可重用性。
例如:我們將BSSR暫存器的第pipipink位(4,5位)設定為1的話,可以直接

GPIOx->BSRR =0x00000030;//第4,5位為1

但這樣的話要是想改變數值就很麻煩了。
不妨可以這樣做

GPIOx->BSRR = (((uint32_t)0x01) << pipipink);//把指定位設定為1

這樣的話就提高了程式的可讀性,並且容易操作位。

五:取反~
表示對其運算元進行求補運算,即0變為1,1變為0。
在微控制器程式設計中,假設我們要設定某一位為1,其餘位為0的話,同樣可以採取直接賦值的方法:
例如16位暫存器SR第0位為0,其餘位為1:

TIMx->SR=0xFFFE;//第0位為0。

但是這樣的作法同樣不好看,並且可讀性很差。看看用取反操作的方法:

#define TIM_FLAG_Update ((uint16_t)0x0001)//巨集定義
TIMx->SR = (uint16_t)~TIM_FLAG_Update;

這裡使用了巨集定義,把TIM_FLAG_Update初始數值第0位設定為了1,再取反操作,可讀性非常強。

熟練掌握位操作是學好微控制器的必要條件,行文至此。
後續將會陸續更新有關微控制器程式設計的部落格,敬請關注!