STM32微控制器位操作技巧 C語言

2021-10-20 07:07:22 字數 2523 閱讀 7403

主要是位操作的一些技巧,在文章最後,還補充了幾點其他的,比如ifdef的使用

1.把變數的某位清零。

//定義乙個變數 a = 1001 1111 

unsigned

char a =

0x9f

; a &=~

(1<<2)

;//括號中的 1 左移兩位,(1<<2)得二進位制數:0000 0100

//按位取反,~(1<<2)得 1111 1011

//所得的數與 a 作」位與&」運算,a = (1001 1111)&(1111 1011)

//經過運算後,a 的值 a=1001 1011

2.把變數的某幾個連續位清零

//若把 a 中的二進位制位分成 2 個一組

//即 bit0、bit1 為第 0 組,bit2、bit3 為第 1 組,

// bit4、bit5 為第 2 組,bit6、bit7 為第 3 組

//要對第 1 組的 bit2、bit3 清零

a &=~

(3<<2*

1)//括號中的 3 左移兩位,(3<<2*1)得二進位制數:0000 1100 b

//按位取反,~(3<<2*1)得 1111 0011 b

//假如 a 中原來的值為二進位制數: a = 1001 1111 b

//所得的數與 a 作」位與&」運算,a = (1001 1111 )&(1111 0011 ),

//經過運算後,a 的值 a=1001 0011 b

// a 的第 1 組的 bit2、bit3 被清零,而其它位不變。

//上述(~(3<<2*1))中的(1)即為組編號;如清零第 3 組 bit6、bit7 此處應為 3

//括號中的(2)為每組的位數,每組有 2 個二進位制位;若分成 4 個一組,此處即為 4

//括號中的(3)是組內所有位都為 1 時的值;若分成 4 個一組,此處即為二進位制數「1111 」,即十進位制f

//例如對第 2 組 bit4、bit5 清零

a &=~

(3<<2*

2);

3.對變數的某幾位進行賦值。

/*********************法1********************************/

//a = 1000 0011

//此時對清零後的第 2 組 bit4、bit5 設定成二進位制數「01 」

a |=(

1<<2*

2);//a = 1001 0011 b,成功設定了第 2 組的值,其它組不變

/*********************法2********************************/

gpioa-

>odr &

=0xff0f

;//將第 4-7 位清 0

gpioa-

>odr |

=0x0040

;//設定相應位的值,不改變其他位的值

4.對變數的某位取反

//a = 1001 0011 

//把 bit6 取反,其它位不變

a ^=(

1<<6)

;//異或 1<<6 = 0100 0000

//a = 1101 0011

5.設定某一位的值為 0,同時其他位都為 1

/********簡單的作法是直接給暫存器設定乙個值*********/

gpioa-

>odr =

0xfff7

;//這樣的作法設定第 3 位為 0

gpioa-

>odr=

(uint16_t)~

(1<<3)

;//設定 odr 暫存器的第 3 位為 0,其他位為 1

1.ifdef條件編譯

#ifdef 識別符號

程式段1

#else

程式段2

#endif

if——else是不執行if後的程式,就執行else後的程式,而這個是編譯,不編譯程式段1就編譯程式段2。

#ifdef apr

void

test_apr

(void

)#else

void

test_apr

(void

)//兩個函式是同名的

#endif

可以看到兩個函式是同名的,但是只會二選一編譯,所以不會報錯,只要加上#define apr就會執行第一段

2.__weak弱函式(兩個下劃線)

加上__weak 的函式,我們自己的檔案中重新定義乙個同名函式,編譯的時候,我們自己定義的函式,但如果我們沒有重新定義這個函式,就會執行帶__weak 的函式,編譯不會報錯。

weak函式與重寫的函式不能在同一檔案。

stm32mcuid規則 STM32微控制器命名規則

stm32 系列微控制器命名規則 stm32 f 103 c 8 t 6 1 2 3 4 5 6 7 8 產品系列名 固定為 stm32 和 產品系列 f 通用系列 0xx 入門級 mcu0x0 超值系列在傳統 位和位市場極具競爭力 0x1 實現了高度的功能整合,提供多種儲存容量和封裝的選擇,為成本...

微控制器 STM32庫開發

1.stm32庫開發是什麼?st公司推出的基於cortex m3核心的mcu 微控制器,也就是通常所說的微控制器 倡導使用韌體庫開發,僅通過呼叫庫裡面的api 應用程式介面 就可以迅速搭建乙個程式,寫出各種使用者需要的應用。庫開發方式自頂向下,可以避免對底層暫存器的繁瑣操作,能大大降低學習門檻和開發...

微控制器學習(一) 微控制器基礎 STM32

io四種輸入工作模式 io四種輸出工作模 stm32有8個16位定時器 stm32具有強大的異常響應系統,它把能夠打斷當前 執行流程的事件分為異常 exception 和中斷 interrupt 並把它們用乙個表管理起來,編號為 3 6的中斷向量定義為系統異常,編號從7到19的為外部中斷。中斷向量控...