
凡事都要腳踏實地去做,不弛于空想,不騖于虛聲。努力只能做到合格,用心才能做到優秀。
這次一起來學習一下單片機開發時必備技術——位運算和寄存器編程。
(相關資料圖)
目前已經發布了幾篇文章,文章多為個人觀點,可能會有錯誤。歡迎朋友們指正錯誤或提出寶貴建議,必有重謝!
一、位運算符號
常用的位運算符有:
符號 | 結合方向 | 功能 |
---|---|---|
& | 向右 | 按位與 |
向右 | ||
^ | 向右 | 按位異或 |
~ | 向左 | 按位取反 |
<< | 向右 | 數據左移 |
>> | 向右 | 數據右移 |
二、單片機開發為什么需要學習位運算?
單片機開發常用的編程方法有:寄存器法 和 庫函數法。其中基于寄存器編程是一種通用型的方法,即所有的單片機都可以采用寄存器方法進行編程。
那么寄存器又是什么?
初學者可以這樣理解:
1.寄存器是在單片機中真實存在的(有明確的地址)、有明確功能的“開關”或者“指示器”。
一個單片機中一般含有大量的、功能各異的寄存器,這些寄存器都有自己獨立的空間,分別控制著單片機的不同功能。3.當需要控制單片機實現某種功能 或者 需要獲取單片機的工作狀態時,就必須要操作到對應的寄存器。
4.對于不同位數的單片機,其寄存器的位數也不同,并且一個寄存器可能通過不同的位來控制不同的功能。
總結:位運算在單片機開發中主要用途是操作寄存器,是單片機編程的基礎!其重要性可見一斑。
三、位運算的重點內容
假設下表中的X是單片機中某個寄存器。
功能 | 表達式 |
---|---|
將寄存器第n位置位 | X |
一共就4行,非常好記。但知識點僅記住是沒用的,得實踐!現在我們基于一款單片機的手冊來模擬實操一下。有條件的朋友建議購買一套單片機套件,邊學邊練,效果加倍!
四、實例演示位運算
下方是一款單片機的一個寄存器表,來源于主流單片機型號STM32F1xx的參考手冊。圖中這個寄存器的功能是配置IO引腳的方向,比如配置引腳是作為輸入還是輸出。
若需要將單片機的PB4引腳配置為通用推挽輸出,那應該如何配置此寄存器呢?
Step1,結合引腳正確表示出該寄存器。由于操作的引腳是PB4,屬于GPIOB,故該寄存器寫作GPIOB->CRL。
Step2,閱讀表格中關于位功能的說明,找出需要操作該寄存器的哪些位。
由于待操作引腳序號為4,所以應操作該寄存器的第19~16位(因為這些位對應的功能是CNF4和MODE4,匹配該引腳)。
Step3,結合注釋部分,確定待操作位的值。從圖中可以看出MODE4(即第17、16位)可以配置為“01”以實現輸出模式;CNF4(即第19、18位)可以配置為“00”以實現通用推挽輸出模式。
Step4,將位運算與上一步結合,寫出代碼。
GPIOB- >CRL &=~(1< <19);GPIOB- >CRL &=~(1< <18);GPIOB- >CRL &=~(1< <17);GPIOB- >CRL |= (1< <16);化簡上方四行位運算,整理得:GPIOB- >CRL &=~(0xF< <16);//清零[19:16]GPIOB- >CRL |= (0x1< <16);
ps: 以上代碼僅是實現PB4引腳輸出數據的部分代碼。
若需要實現完整功能,還需要配置其他寄存器。
標簽: