有小伙伴好奇,現(xiàn)在有很多工具,可以“一鍵生成工程”,還有必要學(xué)習(xí)和了解寄存器嗎?
今天就來(lái)簡(jiǎn)單聊聊這個(gè)話題。
為什么需要學(xué)習(xí)寄存器?
學(xué)單片機(jī),為什么需要學(xué)習(xí)寄存器?
網(wǎng)上有一部分人,其實(shí)在吐槽HAL等庫(kù)函數(shù)執(zhí)行效率低、難理解、代碼量大、占用內(nèi)存多等一系列問(wèn)題。
那么,直接操作寄存器在一定程度上就能解決這些問(wèn)題。反過(guò)來(lái)說(shuō),學(xué)習(xí)寄存器就有與之對(duì)應(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)燈來(lái)說(shuō),很多做上層應(yīng)用、或者小程序、物聯(lián)網(wǎng)開(kāi)發(fā)的工程師,他只知道發(fā)一條指令控制燈泡開(kāi)/關(guān)。但你要問(wèn)他燈泡究竟是如何實(shí)現(xiàn)開(kāi)和關(guān)的,他其實(shí)是不知道的。
如果你學(xué)了寄存器、學(xué)了電子電路,你就能很輕松的回答這個(gè)問(wèn)題。
學(xué)習(xí)寄存器能幫助你理解單片機(jī)如何工作(例如中斷如何觸發(fā)、定時(shí)器如何計(jì)數(shù)),這對(duì)調(diào)試復(fù)雜問(wèn)題(如時(shí)序沖突、資源競(jìng)爭(zhēng))至關(guān)重要。
3、優(yōu)化代碼
如果你單片機(jī)的Flash、RAM資源有限,你會(huì)發(fā)現(xiàn)使用寄存器的多么的重要。
直接操作寄存器可以繞過(guò)庫(kù)函數(shù)的中間層,減少代碼體積、提升執(zhí)行效率,這在資源受限的嵌入式系統(tǒng)中尤為重要。
使用過(guò)SMT32CubeMX的小伙伴應(yīng)該知道,它的庫(kù)函數(shù)有HAL和LL兩種,你會(huì)發(fā)現(xiàn)LL庫(kù)生成的代碼量要比HAL小很多
之前我還分享過(guò)一篇文章:STM32 LL 為什么比 HAL 高效?
4、更加靈活和可控
單片機(jī)的某些高級(jí)功能(如特定時(shí)序生成、低功耗模式配置)可能無(wú)法通過(guò)庫(kù)函數(shù)實(shí)現(xiàn),直接操作寄存器就能實(shí)現(xiàn)。
也就是說(shuō),直接操作寄存器可以“定制化”一些需要的功能,即更加靈活和可控。
不學(xué)寄存器行不行?
寄存器是單片機(jī)的關(guān)鍵,如果不學(xué),就掌握不到單片機(jī)的精髓。
1、業(yè)余愛(ài)好者可以不學(xué)
如果你只是一個(gè)臨時(shí)的業(yè)余愛(ài)好,只是想快速完成一個(gè)簡(jiǎn)單項(xiàng)目(如點(diǎn)亮LED、驅(qū)動(dòng)顯示屏),可以使用現(xiàn)成的庫(kù)函數(shù)(如Arduino、STM32 HAL庫(kù))快速上手,可以不用深入理解寄存器。
2、單片機(jī)開(kāi)發(fā)者一定要學(xué),且要深入
用單片機(jī)做過(guò)大型項(xiàng)目的工程師,絕大多數(shù)都是學(xué)習(xí)過(guò)寄存器的,而且深入掌握寄存器底層原理。
為什么這么說(shuō)?有很多bug是需要理解并掌握寄存器才能解決的,過(guò)來(lái)人才會(huì)更加理解其中的道理。包括上面說(shuō)的執(zhí)行效率低、難理解、代碼量大、占用內(nèi)存多等這些問(wèn)題。
如何學(xué)習(xí)寄存器?
以前51單片機(jī)的寄存器相對(duì)較少,現(xiàn)在Cortex-M內(nèi)核單片機(jī)的寄存器很多,學(xué)不完、背不完,該怎么辦?
寄存器不需要我們死記硬背,在你需要的時(shí)候查閱手冊(cè)即可。
1、要學(xué)會(huì)查閱單片機(jī)手冊(cè)(Datasheet)
比如STM32參考手冊(cè),手冊(cè)中會(huì)詳細(xì)描述每個(gè)寄存器的功能、位定義和操作等。
2、掌握C語(yǔ)言位操作
掌握位掩碼(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ī)開(kāi)發(fā)這條路線,你一定要學(xué),而且要深入理解。這對(duì)你將來(lái)解決復(fù)雜硬件問(wèn)題能起到關(guān)鍵作用。同時(shí),這也是你的一項(xiàng)核心競(jìng)爭(zhēng)力。
2、如果你只是簡(jiǎn)單玩玩,又想快速上手,可以選擇性的學(xué)習(xí)和了解寄存器。
3、如果你做上層應(yīng)用開(kāi)發(fā),只是發(fā)送指令控制底層硬件,可以不用深入理解寄存器。