2016-12-27 68 views
0

我正在閱讀有關引導編程嵌入式系統 - 使用C和GNU開發工具,第二版(Michael Barr,Anthony Massa)的書中的微控制器,發行人:O'Reilly,然後我發現其中之一引導步驟是在啓動之前發生的硬件初始化和本書中關於硬件初始化的信息。是:。硬件初始化的功能

「最實際的硬件初始化發生在第二階段,在 這一點上,我們需要告知處理器有關的環境,這也是 初始化中斷控制器和其他重要的好地方外圍設備。 不太關鍵的硬件設備可以在相關聯的設備 驅動器啓動時進行初始化,通常從內主。

硬件初始化程序,hw_init,應通過初始化 存儲器接口配置啓動寄存器,以通知處理器大約 其他內存和外圍設備安裝在電路板上。通過 時間這個任務完成後,ROM和RAM地址的整個範圍將被啓用 ,所以你的軟件的剩餘部分可位於在ROM或RAM任何方便 地址。」

,但我搜索有關它在谷歌的更多信息,但只發現關於啓動代碼的結果和幾乎沒有關於硬件初始化,我想了解更多它是做什麼

+0

它爲微控制器所有的寄存器寫入一個初始值。因此,您需要獲取微控制器數據表,並決定要在每個寄存器中放置什麼值。 – user3386109

+0

幾乎從來沒有你需要觸摸永遠註冊,文檔顯示或應該後重置狀態,你不一定需要觸摸那些處於你想要的狀態,假設你的初始化後重置。如果不是,那麼最簡單的方法是塊的部分重置,然後觸摸你不喜歡默認的塊,最壞的情況是觸摸塊中的大部分寄存器。 –

+0

我曾經拆解過一個AVR程序,並且在啓動代碼之前沒有發現硬件初始化,那麼復位立即跳轉到啓動代碼,所以它寫在哪裏? –

回答

1

硬件初始化是特定於您的應用程序,所以沒有我已經給出了幾個例子:

其中一個我們製造的產品co帶有一個ARM微控制器,通過CAN總線與其他系統進行通信,並使用PWM來控制LED的亮度。這種情況下的硬件初始化意味着我們必須爲CAN總線的速度和設備的CAN ID設置CAN外設。我們還必須設置PWM的定時器。

我們通過SPI與GYRO傳感器進行對話。因此,該產品的硬件初始化還包括設置SPI並通過SPI發送消息來初始化GYRO傳感器。

PC的鍵盤內部的微控制器必須設置其GPIO引腳來掃描鍵盤的行和列,還必須初始化USB外設,以便可以與其連接的PC進行通信。

每個微控制器都有一些外圍設備。根據您的應用,您可以選擇一個微控制器。您的應用程序的引導代碼必須初始化(或設置)您需要的外設。

設置外設意味着將值寫入外設的寄存器以對其進行編程以執行所需的功能。

大多數微控制器都帶有一個軟件庫,可以爲您執行大部分硬件初始化。例如,它可以爲您設置一個串行端口。您只需告訴它您要使用哪種U(S)ART以及您需要的波特率。有關Arduino上的串行端口,請參閱here

+0

因此,我可以說硬件初始化的例子是在內存設備上應用內存映射,對內存和外設寄存器進行初始化和配置,以便能夠啓動和配置處理器,以便能夠與內存和外設連接,如啓用芯片選擇 –

+0

這是正確的。大多數微控制器都有內部存儲器,你告訴你的(交叉)編譯器什麼是內存類型和大小(RAM和ROM,主要是Flash)。 – NZD

+0

我曾經拆解過一個AVR程序,並且在啓動代碼之前沒有發現硬件初始化,所以復位立即跳轉到啓動代碼,所以這是因爲cav是一個簡單的系統,只需要熔絲位作爲其硬件初始化? –

1

arduino啓動代碼的來源是可用的,你可以漫步,看看他們在做什麼。

處理器(核心)啓動的方式對於該體系結構以及可能的版本或變體(avr系列有多種變體)非常具體。然後你可以在芯片周圍包裹一個芯片,像處理器那樣簡單,其中許多外圍設備和資源都在其他芯片中,或者像芯片上的微控制器或系統,其中許多(如果不是全部)資源在芯片上。 Arduinos上的芯片是微控制器,芯片上有相當數量的資源,但是如果沒有用戶界面(按鈕等)或顯示器,您可能非常滿意在芯片內部運行整個應用程序的意義。什麼使芯片對人類有用? (教育肯定,但最終你想要一些芯片接口)

隨着AVR,處理器核心和芯片公司是同一家公司,他們擁有/控制整個事情,以前atmel現在微芯片(希望他們不要破壞atmel),所以你可以去他們的網站獲取所有信息,處理器核心和芯片信息。芯片有望在家庭中類似。以ARM爲例,雖然ARM擁有處理器核心,但其他許多芯片公司都將自己的東西包裝在它們周圍,這意味着你必須去支持一些信息,剩下的芯片公司,以及兩個由於每個芯片供應商都不會與其他芯片公司兼容,因爲各種原因(包括對其IP的合法保護),武器纏繞的武器在基於武器的世界中差異很大。所以首先你必須瞭解處理器是如何啓動的,主要有兩種方法,一種是地址表,復位地址,中斷地址,可能是故障或其他中斷。程序員填寫這張表(它在某種非易失性存儲器中(通常但不一定是),如flash或rom),這些地址指向處理這些事件的代碼。

然後你編寫處理這些事件的代碼,你似乎要問的是重置事件。正如答案,它變得非常多的芯片和架構特定。通常情況下(但並非總是如此),這些例外是無窮無盡的,因爲並非所有架構和芯片的設計方式都完全相同,就像啓動一個模型一樣 - 即使它們都是四輪車,t也不同於啓動特斯拉)將堆棧指針設置爲指向您和芯片/系統設計人員知道地址的內存。基本的東西只是爲了讓處理器運行起來,你可能不得不初始化一些通用寄存器,但通常不會,也許設置一些處理器功能標誌等。也許你想打開一個緩存或其他東西。此代碼通常但不總是在非易失性存儲器中,只讀,所以您可能需要安裝RAM,有時不需要使用微控制器。然後,您可能需要設置一些時鐘,這些時鐘對於微控制器和處理器來說都很常見,但細節非常多芯片和系統特定。並非總是如此,但許多微控制器都內置RC振盪器(電阻器電容依賴於電子的速度,如果您願意,會產生振盪,永動機),但它們不是很準確,所以如果您需要精確度,您可以調整它們或者在調諧設置中使用熔絲,或者經常需要切換到晶振,但這是特定於電路板的,您必須遵循一些芯片特定的過程切換到該振盪器。如果芯片上有一個芯片可以使該振盪器的速度倍增,那麼也許還需要使用一個PLL,或許可以在芯片內將8Mhz的外部時鐘轉換爲48Mhz的時鐘。

因此,標誌,時鐘,內存,堆棧不一定按此順序。也許還有其他一些事情。接下來的外設,也許你的應用程序想要使用uart和spi控制器和兩個定時器。那麼你必須提出這些,都非常具體的芯片。有時您必須啓用外設的時鐘,這些外設在復位時被禁用以節省功耗。然後根據您想要使用這些通用ISA外設的模式,您必須根據您的應用程序進行設置。重複,直到所有這些設置。

然後你的應用程序可能需要做它需要初始化的東西,也許你在spi總線或總線上有一個溫度傳感器,一個顯示器和一個sd卡。您必須與這些人討論並根據他們的籌碼規則和程序初始化這些外圍設備。

最終數十到數萬行代碼後,您的應用程序可以開始做它的事情。

arduino有一個引導程序,它是avr芯片的一個特性,並且當然是由arduino設計人員和工具使用的。如果您使用其中一個引腳聲明的芯片來重置芯片,則會通過芯片中的功能將其引導加載程序加載爲應用程序。如果您以其他方式斷言該引腳然後重置,那麼它將從應用程序閃存引導,運行您的應用程序。至少在串行接口方面,AVR芯片系列有幾種不同的方式進入引導程序或邏輯,可用於重新編程應用程序閃存「在電路中」。舊的arduino時代,這是一個串行端口(uart)接口,帶有一個基於Atmel產品的簡單協議,但是如果您真正查看它們的引導加載程序並編寫自己的加載程序,而不是使用avrdude或Arduino沙箱。無論哪種方式,這是一個非常普遍的解決方案,微控制器往往有一種或多種方式進入芯片,然後在電路中進行編程,無論是引導加載程序還是邏輯或某種組合。

該引導加載程序本身就是一個完整的應用程序,其目的是提供一個接口來要求它爲您重新寫入閃存。作爲一個完整的應用程序,它必須完成應用程序的所有工作,可由處理器啓動,設置資源/外圍設備,然後繼續執行主應用程序代碼。

所以你可以去atmel站點,也許看看attiny avr微控制器的更簡單的,或者看看你的arduino,找到你擁有的芯片家族並下載資源。這些文檔的名稱因供應商而異,通常稱爲數據表的內容包括芯片引腳和引腳定義,器件的訂購信息(可包含引腳數量,閃存/ RAM數量等的器件型號選項)和電子信息。一些供應商的所有編程信息都在數據表中,數據表中有一些或沒有,您需要某種形式的參考手冊或用戶手冊或其他名稱,有時還有一個涵蓋處理器核心或所有可能的外設,然後數據表告訴你芯片有哪些可能的列表以及它們所處的位置(處理器地址)。

硬件初始化的相當一部分工作是研究,找到電路板的文檔,和/或閱讀原理圖,或者如果你的公司正在讓硬件工程師去問問他們的東西是否是硬件工程師不可理解或完整(通常沒有理由完全記錄它是否存在該人和你,在白板或skype消息或電子郵件上記錄的文件就足以滿足你不需要的冗長文件)。芯片供應商的文檔幾乎總是有錯誤,所以需要通過缺乏更好的術語來查看寄存器中的位是否符合文檔所說的內容,或者您​​是否可以通過戳他們或閱讀他們的示例代碼或其他開源代碼。除了非常特定的系統的特定應用程序之外,您將找到一個包含所有您需要的硬件init信息的地方。