• 正文
    • 為什么需要學(xué)習(xí)寄存器?
    • 不學(xué)寄存器行不行?
    • 如何學(xué)習(xí)寄存器?
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

學(xué)單片機(jī),有必要寄存器嗎?

15小時(shí)前 來源:strongerHuang
531
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

有小伙伴好奇,現(xiàn)在有很多工具,可以“一鍵生成工程”,還有必要學(xué)習(xí)和了解寄存器嗎?

今天就來簡單聊聊這個(gè)話題。

為什么需要學(xué)習(xí)寄存器?

學(xué)單片機(jī),為什么需要學(xué)習(xí)寄存器?

網(wǎng)上有一部分人,其實(shí)在吐槽HAL等庫函數(shù)執(zhí)行效率低、難理解、代碼量大、占用內(nèi)存多等一系列問題。

那么,直接操作寄存器在一定程度上就能解決這些問題。反過來說,學(xué)習(xí)寄存器就有與之對應(yīng)的諸多好處:

1、直接控制硬件

使用寄存器可以直接控制硬件,這個(gè)在早期的單片機(jī)(比如51、MSP430等)特別明顯,大多數(shù)都是直接寄存器編程。

比如51點(diǎn)燈直接操作寄存器:

#include?<reg51.h>
sbit led = P1^0;
void?main(void){while(1)	{		led =?0;	}}

2、理解底層原理

還是那點(diǎn)燈、關(guān)燈來說,很多做上層應(yīng)用、或者小程序、物聯(lián)網(wǎng)開發(fā)的工程師,他只知道發(fā)一條指令控制燈泡開/關(guān)。但你要問他燈泡究竟是如何實(shí)現(xiàn)開和關(guān)的,他其實(shí)是不知道的。

如果你學(xué)了寄存器、學(xué)了電子電路,你就能很輕松的回答這個(gè)問題。

學(xué)習(xí)寄存器能幫助你理解單片機(jī)如何工作(例如中斷如何觸發(fā)、定時(shí)器如何計(jì)數(shù)),這對調(diào)試復(fù)雜問題(如時(shí)序沖突、資源競爭)至關(guān)重要。

3、優(yōu)化代碼

如果你單片機(jī)的Flash、RAM資源有限,你會(huì)發(fā)現(xiàn)使用寄存器的多么的重要。

直接操作寄存器可以繞過庫函數(shù)的中間層,減少代碼體積、提升執(zhí)行效率,這在資源受限的嵌入式系統(tǒng)中尤為重要。

使用過SMT32CubeMX的小伙伴應(yīng)該知道,它的庫函數(shù)有HAL和LL兩種,你會(huì)發(fā)現(xiàn)LL庫生成的代碼量要比HAL小很多

之前我還分享過一篇文章:STM32 LL 為什么比 HAL 高效?

4、更加靈活和可控

單片機(jī)的某些高級(jí)功能(如特定時(shí)序生成、低功耗模式配置)可能無法通過庫函數(shù)實(shí)現(xiàn),直接操作寄存器就能實(shí)現(xiàn)。

也就是說,直接操作寄存器可以“定制化”一些需要的功能,即更加靈活和可控。

不學(xué)寄存器行不行?

寄存器是單片機(jī)的關(guān)鍵,如果不學(xué),就掌握不到單片機(jī)的精髓。

1、業(yè)余愛好者可以不學(xué)

如果你只是一個(gè)臨時(shí)的業(yè)余愛好,只是想快速完成一個(gè)簡單項(xiàng)目(如點(diǎn)亮LED、驅(qū)動(dòng)顯示屏),可以使用現(xiàn)成的庫函數(shù)(如Arduino、STM32 HAL庫)快速上手,可以不用深入理解寄存器。

2、單片機(jī)開發(fā)者一定要學(xué),且要深入

用單片機(jī)做過大型項(xiàng)目的工程師,絕大多數(shù)都是學(xué)習(xí)過寄存器的,而且深入掌握寄存器底層原理。

為什么這么說?有很多bug是需要理解并掌握寄存器才能解決的,過來人才會(huì)更加理解其中的道理。包括上面說的執(zhí)行效率低、難理解、代碼量大、占用內(nèi)存多等這些問題。

如何學(xué)習(xí)寄存器?

以前51單片機(jī)的寄存器相對較少,現(xiàn)在Cortex-M內(nèi)核單片機(jī)的寄存器很多,學(xué)不完、背不完,該怎么辦?

寄存器不需要我們死記硬背,在你需要的時(shí)候查閱手冊即可。

1、要學(xué)會(huì)查閱單片機(jī)手冊(Datasheet)

比如STM32參考手冊,手冊中會(huì)詳細(xì)描述每個(gè)寄存器的功能、位定義和操作等。

2、掌握C語言位操作

掌握位掩碼(Bit Mask)、移位(Shift)、與或非操作等。

比如:以STM32為例,將PA5設(shè)置為輸出模式

GPIOA->MODER &= ~(0x3 <<?10); // 清空原有配置GPIOA->MODER |= ?(0x1 << 10); // 設(shè)置為輸出模式

3、學(xué)會(huì)調(diào)試查看寄存器

使用調(diào)試器(如J-Link、ST-Link)實(shí)時(shí)查看寄存器值,驗(yàn)證配置是否正確等。

最后

1、如果你想堅(jiān)持走單片機(jī)開發(fā)這條路線,你一定要學(xué),而且要深入理解。這對你將來解決復(fù)雜硬件問題能起到關(guān)鍵作用。同時(shí),這也是你的一項(xiàng)核心競爭力。

2、如果你只是簡單玩玩,又想快速上手,可以選擇性的學(xué)習(xí)和了解寄存器。

3、如果你做上層應(yīng)用開發(fā),只是發(fā)送指令控制底層硬件,可以不用深入理解寄存器。

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計(jì)資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

作者黃工,從事嵌入式軟件開發(fā)工作8年有余,高級(jí)嵌入式軟件工程師,業(yè)余維護(hù)公眾號(hào)『strongerHuang』,分享嵌入式軟硬件、單片機(jī)、物聯(lián)網(wǎng)等內(nèi)容。