如果您愛好微控制器,如何以及為何閱讀資料表

如果您愛好微控制器,如何以及為何閱讀資料表

由於神奇的Arduino,微電子成為近年來的時尚愛好。 但問題是:只要有足夠的興趣,您很快就可以超越 DigitalWrite(),但下一步該做什麼並不完全清楚。 Arduino 開發人員投入了大量精力來降低進入其生態系統的門檻,但在其生態系統之外,仍然存在著一片由嚴酷電路組成的黑暗森林,業餘愛好者無法進入。

例如,數據表。 似乎他們擁有一切,拿走並使用它。 但他們的作者顯然並沒有為自己設定普及微控制器的任務;他們的目標是普及微控制器。 有時 看來他們在描述簡單事物時故意濫用難以理解的術語和縮寫,以盡可能地迷惑外行人。 但並非一切都那麼糟糕;如果需要的話,棺材可以打開。

在本文中,我將分享一位人文學科專家出於業餘愛好而與資料表進行交流的經驗。 本書是針對那些從 Arduino 褲子中長大的業餘愛好者;它假定讀者對微控制器的工作原理有一定的了解。

我將從傳統開始

Arduino 上的 LED 閃爍

並立即給出代碼:

void setup() {
DDRB |= (1<<5);
}

void loop() {
PINB = (1<<5);
for (volatile uint32_t k=0; k<100000; k++);
}

“這是什麼? ——有經驗的讀者會問。 – 為什麼要向 PINB 輸入暫存器寫入內容? 僅供閱讀!” 真的嗎, Arduino 文件與互聯網上的大多數教育文章一樣,聲明該寄存器是唯讀的。 我自己也是這麼認為的,直到我重讀它 數據表 Atmega328p,準備這篇文章。 還有:

如果您愛好微控制器,如何以及為何閱讀資料表

這是一個相對較新的功能,它不在 Atmega8 上,不是每個人都知道它,或者由於向後相容性的原因沒有提及。 但它非常適合展示數據表值得閱讀的想法,以便使用晶片的所有功能,包括鮮為人知的功能。 這並不是唯一的原因。

為什麼還要閱讀數據表?

通常,Arduino 工程師在對 LED 和 AnalogWrites 玩夠了之後,開始將各種模組和晶片連接到板上,這些模組和晶片已經編寫了庫。 遲早,圖書館會出現無法正常運作的狀況。 然後業餘愛好者開始學習它,然後...

那裡發生了一些完全無法理解的事情,所以你必須去谷歌,閱讀大量教程,提取某人合適的程式碼的一部分,最終實現你的目標。 這給人一種強烈的成就感,但實際上這個過程就像透過逆向工程摩托車重新發明輪子一樣。 而且,對這輛自行車如何運作的理解並沒有增加。 我知道,因為我自己也這樣做了很長一段時間。

如果我不花幾天時間研究 Atmega328 文檔,而不是進行這項令人興奮的活動,我會節省大量時間。 畢竟,這是一個相當簡單的微控制器。

因此,您至少需要閱讀資料表才能想像微控制器通常如何運作以及它可以做什麼。 並進一步:

  • 檢查和優化其他人的庫。 它們通常是由重新發明輪子的業餘愛好者編寫的。 或者,相反,作者故意讓它們過於簡單。 讓它大三倍,慢一點,但肯定能行;

  • 能夠在沒有人編寫函式庫的專案中使用晶片;

  • 讓您更輕鬆地從一個 MK 系列遷移到另一個 MK 系列;

  • 最終優化不適合 Arduino 的舊程式碼;

  • 了解如何直接透過暫存器控制任何晶片,而無需費心研究其庫的結構(如果有)。

為什麼有HAL和LL就直接寫暫存器呢?

詞彙表
HAL,高抽象層 – 用於控制具有高抽象層級的微控制器的程式庫。 如果您需要使用 SPI1 接口,您只需配置並啟用 SPI1,無需考慮哪些寄存器負責什麼。
LL,低階 API – 包含具有暫存器位址的巨集或結構的庫,可讓您按名稱存取它們。 Atmega 上的 DDRx、PORTx、PINx 為 LL。

關於 Habré 的評論中經常出現關於「HAL、LL 或寄存器」主題的爭議。 不聲稱可以獲得星體知識,我只是分享我的業餘經驗和想法。

在或多或少了解了 Atmega 並閱讀了有關 STM32 奇妙之處的文章後,我購買了六塊不同的板 - Discovery 和 Blue Pills,甚至只是用於我自製產品的晶片。 它們都在一個盒子裡收集了兩年的灰塵。 有時我對自己說:“就是這樣,這個週末我要掌握 STM”,啟動 CubeMX,生成 SPI 設置,查看生成的文本牆,慷慨地添加 STM 版權,並認為這有點太多了。

如果您愛好微控制器,如何以及為何閱讀資料表

當然,你可以弄清楚CubeMX這裡寫了什麼。 但同時很明顯,記住所有措辭然後手寫是不切實際的。 為了調試這個,如果我不小心忘記選中立方體中的複選框,那完全沒問題。

兩年過去了,我還在舔嘴唇 ST MCU 查找器 各種好吃的,但超出我理解的薯條,無意間碰到了 精彩的文章,雖然是關於STM8。 和 突然 我意識到我一直在敲一扇敞開的門:STM 的寄存器的排列方式與任何其他 MK 的寄存器相同,而 Cube 不需要與它們一起工作。 有可能嗎?...

HAL(特別是 STM32CubeMX)是為與 STM32 晶片密切合作的專業工程師提供的工具。 主要特徵是高度抽象,能夠快速從一個 MCU 遷移到另一個 MCU,甚至從一個內核遷移到另一個內核,同時保持在 STM32 系列範圍內。 愛好者很少遇到這樣的問題- 我們對微控制器的選擇通常僅限於速賣通品種,而且我們經常在完全不同的晶片之間遷移- 我們從Atmega 遷移到STM,從STM 遷移到ESP,或我們中國朋友的任何新事物扔向我們。 HAL 在這裡沒有幫助,研究它會佔用很多時間。

LL 仍然存在 - 但從它到暫存器還有半步。 就我個人而言,我發現用寄存器地址編寫巨集很有用:我更仔細地研究數據表,我思考我將來需要什麼和我絕對不需要什麼,我更好地構建我的程序,總的來說,克服有助於記憶。

此外,流行的STM32F103還有一個細微差別——它有兩個不相容的LL版本,一個來自STM官方,另一個來自Leaf Labs,用於STM32duino專案。 如果你寫一個開源庫(而且我確實有 這樣的任務),您必須製作兩個版本,或直接存取暫存器。

最後,在我看來,消除 LL 可以簡化遷移,特別是如果您從專案一開始就計劃這樣做的話。 誇張的例子:讓我們在Atmel Studio中寫沒有LL的Arduino Blink:

#include <stdint.h>

#define _REG(addr) (*(volatile uint8_t*)(addr))

#define DDR_B 0x24
#define OUT_B 0x25

int main(void)
{
    volatile uint32_t k;

    _REG(DDR_B) |= (1<<5);

    while(1)
    {
        _REG(OUT_B) |= (1<<5);
        for (k=0; k<50000; k++);
        _REG(OUT_B) &= ~(1<<5);
        for (k=0; k<50000; k++);
    } 
}

為了讓此程式碼在帶有 STM8(來自 ST Visual Desktop)的中國板上閃爍 LED,只需更改其中的兩個位址:

#define DDR_B 0x5007
#define OUT_B 0x5005

是的,我使用了將 LED 連接到特定板上的功能,它會閃爍得很慢,但它會發生!

有哪些類型的資料表?

在俄語和英語的文章和論壇中,「數據表」是指晶片的任何技術文檔,我在本文中也是如此。 從形式上來說,它們只是此類文件的一種類型:

規格書 – 性能特徵、戰術和技術特徵。 對於任何電子元件都是強制性的。 保留在手邊的背景資訊很有用,但其中沒有太多值得深思熟慮的內容。 然而,較簡單的晶片通常僅限於資料表,以免產生不必要的文件; 在這種情況下 參考手冊 包含在這裡。

參考手冊 – 說明書本身,一本 1000 多頁的健康書。 詳細描述了晶片中填充的所有內容的工作原理。 掌握單晶片的主要文件。 不像 數據表,指令是為各種 MK 編寫的;它們包含有關您的特定型號中不可用的周邊設備的大量資訊。

編程手冊指令集手冊 – 獨特的微控制器指令的說明。 專為使用彙編語言程式設計的人而設計。 編譯器作者積極使用它來最佳化程式碼,因此一般情況下我們不需要它。 但查看此處對於一般理解、退出中斷等某些特定命令以及主動使用調試器很有用。

應用註解 – 解決特定問題的有用技巧,通常會附有程式碼範例。

勘誤表 – 非標準晶片行為情況的描述以及解決方案選項(如果有)。

數據表中有什麼內容

直接到 規格書 我們可能需要以下部分:

設備摘要 – 資料表的第一頁簡要描述了該裝置。 當您在某處發現晶片(在商店中看到它、焊接它、偶然提及)並想了解它是什麼時,這非常有用。

概述 – 此系列晶片功能的更詳細描述。

引腳分配 – 所有可能的晶片封裝的引腳圖(哪個引腳位於哪個引腳上)。

引腳說明 – 每個引腳的用途和功能的描述。

內存映射 – 我們不太可能需要記憶體中的位址映射,但有時它還包括暫存器區塊位址表。

註冊地圖 – 通常,暫存器區塊的位址表位於資料表中,並且在 參考手冊 – 僅輪班(地址偏移量).

電氣特性 – 在本節中我們主要感興趣的是 絕對最大額定值,列出每個晶片的最大負載。 與堅不可摧的 Atmega328p 不同,大多數 MK 不允許您將嚴重負載連接到引腳,這對 Arduinists 來說是一個令人不快的驚喜。

包裝信息 – 可用案例的圖紙,在設計您自己的電路板時很有用。

參考手冊 結構上由專門針對標題中所示的特定外圍設備的部分組成。 每章可分為三部分:

概述, 簡介, 功能 – 週邊設備功能概述;

功能描述, 使用指南 或只是該部分的主要部分 - 外圍設備原理及其使用方法的詳細文字描述;

寄存器 – 控制暫存器的描述。 在簡單的情況下,例如 GPIO 或 SPI,這可能足以開始使用外設,但通常您仍然需要閱讀前面的部分。

如何閱讀數據表

出於習慣,數據表的數量和大量難以理解的單字會嚇到你。 事實上,如果你知道一些生活小技巧,一切都沒有那麼可怕。

好的PDF閱讀器。 數據表是按照紙質說明書的光榮傳統編寫的;它們非常適合列印、插入塑膠書籤和縫紉。 其中的超文本是微量的。 幸運的是,至少文件的結構是用書籤設計的,所以一個合適的、易於導航的閱讀器是非常必要的。

該資料表不是 Stroustrup 的教科書;它包含 無需閱讀所有內容。 如果您使用了先前的建議,只需在書籤欄中找到所需的部分即可。

數據表,特別是 參考手冊,可以描述不是特定晶片的功能,但是 整條線。 這意味著一半甚至三分之二的資訊與您的晶片無關。 在研究TIM7暫存器之前,先檢查一下 概述, 你有嗎?

要知道 английский 足夠了 基本水平。 資料表由一半普通母語人士不熟悉的術語和一半簡單的連接結構組成。 中文英文中也有優秀的中文資料表,其中一半也是術語,後半部是一組隨機單字。

如果你遇見 不熟悉的詞,不要嘗試使用英俄字典來翻譯它。 如果你感到困惑 磁滯現象,那麼翻譯「滯後」不會讓你更溫暖。 使用 Google、Stack Overflow、維基百科、論壇,其中所需的概念將在其中 用簡單的語言和例子解釋.

理解你所讀內容的最好方法是 檢查行動。 因此,請隨身攜帶您熟悉的調試板,或者最好是兩個,以防您仍然誤解某些內容並看到魔法煙霧。

當您使用資料表時,將資料表放在手邊是一個好習慣 閱讀某人的教程 或研究別人的圖書館。 您很有可能會在其中找到更優化的解決方案來解決您的問題。 反之亦然 - 如果您無法從數據表中了解寄存器的實際工作原理,請用谷歌搜尋:很可能,有人已經用簡單的文字描述了所有內容,或者在 GitHub 上留下了清晰的程式碼。

詞彙表

一些有用的單字和符號可幫助您快速熟悉資料表。 這兩天想到的,歡迎補充和指正。

Электричество
VCC, 電壓 – “加”,食物
VS, V型 – “減”,地球
當前 - 目前的
電壓 - 電壓
灌電流 – 作為外部負載的“接地”
電源電流 – 為外部負載供電
高灌/源引腳 – 增加了負載「公差」的引腳

IO
H,高 – 在 Vcc 腳位上
L,低 – 在 Vss 腳位上
高阻抗, 高阻抗, 漂浮的 – 引腳上沒有任何東西,“高電阻”,外界幾乎看不到它。
弱上拉, 弱下拉 – 內建上拉/下拉電阻,大約相當於 50 kOhm(請參閱資料表)。 例如,它用於防止輸入引腳懸在空中,導致誤報。 - 因為很容易「打斷」他。
推拉 – 引腳輸出模式,在該模式下切換 и – Arduino 的常規輸出。
漏極開路 – 輸出模式的指定,其中引腳可以是 高阻抗/浮動。 此外,這幾乎總是不是「真正的」開漏;有保護二極體、電阻器等等。 這只是接地/無模式的指定。
真正的漏極開路 - 但這是真正的開漏:如果引腳開路,則引腳直接接地,如果引腳閉合,則保持處於不穩定狀態。 這意味著,如果需要,可以通過大於 Vcc 的電壓,但最大值仍然在資料表中指定 絕對最大額定值/電壓.

接口
系列中 – 串聯
連鎖 – 使用序列連接將晶片組裝成鏈,增加輸出數量。
– 移位,通常表示位移位。 分別, 移入 и 移出 – 逐位接收和傳輸資料。
– 當位元通過緩衝區移位時覆蓋緩衝區的鎖存器。 傳輸完成後,閥門打開,鑽頭開始工作。
打卡上班 – 執行逐位傳輸,將所有位移到正確的位置。
雙緩衝, 影子寄存器, 預載暫存器 – 歷史指定,此時寄存器必須能夠接受新數據,但將其保留到某個時刻。 例如,為了使 PWM 正確工作,其參數(佔空比、頻率)在當前週期結束之前不應更改,但新參數已經可以傳輸。 因此,當前的保持在 影子寄存器,新的落入 預載暫存器,被寫入對應的晶片暫存器。

各種各樣的事情
預分頻器 – 頻率預分頻器
設定一點 – 將位元設為 1
清除/重置一點 – 將位元重設為 0 (重置 – STM 資料表功能)

下一步是什麼

總的來說,這裡計劃了一個實踐部分,演示了 STM32 和 STM8 上的三個項目,這些項目是使用數據表專門為本文製作的,包括燈泡、SPI、定時器、PWM 和中斷:

如果您愛好微控制器,如何以及為何閱讀資料表

但文字較多,所以項目發到第二部分。

閱讀資料表的技能將有助於您的愛好,但它不太可能取代在論壇和聊天中與其他愛好者的即時交流。 為此,你首先還是需要提升你的英語能力。 因此,讀完的人將獲得特別獎勵:使用代碼支付首筆費用即可獲得兩節Skyeng免費課程 HABR2.

來源: www.habr.com

添加評論