AT91RM9200處理器的內部啓動機制

 
1.引言在開發基於AT91RM9200處理器的嵌入式系統時,以何種方式啓動系統是一個首先要考慮的基本問題。慶幸的是,AT91RM9200處理器提供了各種各樣的啓動方式,總體上可分爲從外部的DATAFLASH、二線EEPROM或8位並行存儲器引導啓動和從內部的BOOTROM引導啓動兩種情況。當從外部存儲器啓動時,存儲器中的啓動代碼又是從那裏來的呢?有3種手段,可以直接通過編程器將啓動代碼寫入外部存儲器,也可以通過JTAG接口從主機下載到目標系統的閃存芯片,還可以由AT91RM9200處理器的內部BOOTROM啓動系統與主機建立通信並下載所需代碼再寫入閃存芯片。那麼當從內部的BOOTROM啓動時,所需的啓動代碼又是如何得到的呢?很簡單,芯片廠商在生產芯片時就嵌入了這段代碼。內嵌的啓動代碼被存儲在AT91RM9200處理器的片內ROM中,片內ROM的起始物理地址是0x0010_0000,片內SRAM的起始物理地址爲0x0020_0000。我們都知道ARM處理器啓動時會產生復位異常,程序計數器PC指向復位異常向量地址0x0000_0000,也就是說啓動時首先執行的是位於地址0x0000_0000處的指令。因此從0x0000_0000到0x0010_0000的1M的內部存儲區域(內部存儲區0)在上電啓動時的代碼將決定系統的啓動過程。那麼是應該由外部存儲器中的啓動代碼來佔據內部存儲區0以實現外部啓動,還是應該由位於0x0010_0000(內部存儲區1)處的ROM中的內嵌啓動代碼來佔據這一空間以實現內部啓動呢?這就需要一個仲裁機制來進行選擇。這就是AT91RM9200芯片的PA31/BMS引腳(在PQFP封裝中爲79腳,在BGA封裝中爲A10腳)。BMS即Boot Mode Select(啓動模式選擇),若BMS=1,則將內部存儲區1的數據映射至內部存儲區0,即從內部的ROM啓動;若BMS=0,則將外部存儲器的區域0映射至內部存儲區0,即從外部存儲器啓動。需要注意的是只有在上電啓動時,該引腳具有啓動模式選擇的功能,此後便成爲標準的I/O接口PA31。 令BMS=1進行啓動,則會在內部存儲區0和1中具有完全相同的代碼,即執行內部啓動程序。內部啓動程序主要包括兩大部分:BootLoader和Boot Uploader。
 2.BootLoader BootLoader首先被執行,它要做的第一件事就是進行設備初始化,主要包括: 通過設定PMC(Power Management Controller)中的相應寄存器得到主振盪器的頻率和用於PLLB(Phase Lock Loop B)的合適的分頻,從而使PLLB輸出一48MHz的時鐘信號,該信號是用於USB設備的必需時鐘。 爲各種ARM模式建立堆棧。 檢測主振盪器頻率。 設定中斷控制器。 初始化C變量。 跳轉到main函數執行。接下來BootLoader的任務就是在片外“非揮發”的存儲器中尋找有效的可執行代碼,這些有效代碼可以是應用程序也可以是第二級引導裝入程序。查找有效代碼的順序是先查找與SPI(Serial Peripheral Interface)的NPCS0連接的串行DATAFLASH,然後是與TWI(Two-Wire Interface)相連的串行EEPROM和連向EBI(External Bus Interface)的NCS0的8位並行存儲器。在查找串行DATAFLASH與串行EEPROM時需先發送一個讀指令,然後根據是否收到設備準備好的ACK(應答使能)信號決定是否繼續在該設備上查找。查找有效的可執行代碼的依據是分析相應存儲器的開始32字節的代碼,這是因爲如果某存儲器的代碼有效,則該存儲器的代碼將被下載到AT91RM9200處理器的片內SRAM的起始地址(0x0020_0000)處,隨後該地址就會被映射到0x0000_0000並執行。也就是說,外部存儲器的起始32字節的內容其實就是ARM的異常向量入口處應執行的代碼,通常情況下,該處內容應爲跳轉指令以使當ARM發生異常時轉向不同的處理程序進行處理。所以,如果某存儲器的起始32字節中是ARM的跳轉指令代碼或向PC寄存器裝入偏移地址的指令則認爲該存儲器中的代碼有效。下面是一個有效異常向量的例子: 00 ea00000b B 0x2c 04 e59ff014 LDR PC,[PC,20] 08 e59ff014 LDR PC,[PC,20] 0C e59ff014 LDR PC,[PC,20] 10 e59ff014 LDR PC,[PC,20] 14 00001234 LDR PC,[PC,20] 18 e51fff20 LDR PC,[PC,-0xf20] 1C e51fff20 LDR PC,[PC,-0xf20] 找到有效代碼後接下來就是將代碼下載到處理器的片內SRAM中,但是應該下載的代碼到哪個位置截止呢?也就是代碼的大小有多少呢?位於起始地址0x18處的一個字長(4字節)的代碼也就是重新映射後會成爲第6個異常向量的存儲單元中包含了所需的信息。其結構如下表所示: 31 17 16 13 12 8 7 0 存儲器頁面大小 頁面位數Nb 保留 要下載的塊(512字節)數例如,對於型號爲AT45DB642的DATAFLASH來說有11776字節代碼要下載,則其第6異常向量內容爲:0x0841A017(0000 10000 0100 0001 1010 0000 0001 0111b)含義爲:要下載的代碼大小:0x17×512字節=11776字節;存儲器頁面數(1101b):13 ==>213=8192 存儲器頁面大小(0000 10000 0100 000)=1056 對於串行EEPROM和8位並行FLASH,只需計算其需下載的代碼大小即可。對存儲器的異常向量分析並得到代碼大小的有關信息後,接下來BootLoader要做的就是將確定大小的代碼下載到處理器片內SRAM處(0x0020_0000),下載完畢則復位處理器外圍寄存器並進行存儲器的重新映射,重新映射可通過改寫MC_RCR(Memory Controller _ Remap Control Register)的RCB位爲1完成,通過重新映射使片內SRAM的內容映射到0x0000_0000處,然後通過將PC置0開始執行下載的應用代碼。在上述從AT91RM9200處理器內部ROM啓動然後在外部存儲器中找到有效的應用代碼並下載到片內SRAM進行執行的過程中有幾點應引起注意: 從片外存儲器下載的代碼大小應小於處理器片內SRAM的大小。 串行EEPROM在TWI總線上的物理地址必須爲0。 有效代碼總是從片外存儲器的0x0000_0000地址處下載到片內SRAM,在重新映射後下載代碼地址爲片內0x0000_0000處。 下載的代碼應與其所處存儲位置無關或可鏈接至地址0x0000_0000處。 DATAFLASH必須是與SPI的NPCS0相連。 8位並行FLASH必須是與EBI的NCS0相連。
 3.Boot Uploader 當BootLoader不能得到串行DATAFLASH和EEPROM的ACK應答或在外部存儲器中找不到有效的可執行代碼時,Boot Uploader便被激活執行。Boot Uploader的主要任務就是建立外部通信通道並從該通道上傳可執行代碼到0x0020_0000的片內SRAM起始位置處。AT91RM9200處理器的Boot Uploader提供了兩種通信的方式,即調試串口和USB設備接口。 Boot Uploader將調試串口初始化爲115200波特、8位數據、無奇偶校驗位、1位停止位並以發送字符“C”(0x43)的方式啓動Xmodem協議建立通信。任何運行該協議的終端都可用來向目標系統傳送應用代碼。在使用USB設備接口進行通信時需要一個48MHz的USB時鐘,這一點已經在設備初始化中通過對PLLB配置實現了,另外通信時使用的是DFU(Device Firmware Upgrade)協議,關於這一點請讀者參考相關的資料。考慮到內部啓動代碼及協議運行使用的變量和堆棧會佔用一部分SRAM,在通信建立後上傳時爲避免發生錯誤,應使上傳的應用代碼應比處理器片內SRAM的容量小至少3K。和從外部存儲器下載有效代碼之後相同,上傳完成後便開始復位外圍寄存器、關中斷並進行重新映射,映射後片內SRAM的起始地址成了0x0000_0000,片內ROM的地址爲0x0010_0000。接下來PC被置0,於是開始執行剛剛上傳的應用代碼。當目標系統採用移植操作系統等較大代碼時,僅僅由片內的有限的SRAM是不可能滿足運行的需要的,因此也不可能由Boot Uploader直接將這類代碼長傳並執行。一般的做法是先上傳一段由用戶自己開發的引導代碼,該代碼獨立於嵌入式操作系統且與目標應用程序無關,其主要作用是初始化硬件系統,特別是片外FLASH和RAM等存儲器和串行通信口或以太網接口,從而爲將龐大的嵌入式操作系統或應用程序進行可靠快速的上傳並能由足夠的空間運行或存儲提供先決條件。
參考文獻[1]吳明暉等編. 基於ARM的嵌入式系統開發與應用. 北京:人民郵電出版社,2004.6. 105-120 [2]毛德操 胡希明著. 嵌入式系統—採用公開源碼和StrongARM/Xscale處理器. 浙江:浙江大學出版社,2003.10. 563-603 [3]ATMEL. ARM920T-based Microcontroller AT91RM9200 Guide. 2003.8.85-96
發佈了3 篇原創文章 · 獲贊 0 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章