freescale飛思卡爾 HCS12 系列單片機bootloader詳解(二)


        在上一篇文章中我們做了對HC9S12系列單片機存儲空間的划分,但是相比於整個bootloader的工作而言,這只是非常基礎的一步,有很多基礎的概念在上一篇的操作中我們並沒有涉及到。比如較復雜單片機中單片機的存儲空間到底是什么樣的,具體怎么用C語言對它進行尋址。因為我們單片機的存儲空間一般由如下的構成,RAM,ROM以及EEPROM等等。比如在我在本篇中舉例介紹的9S12G128單片機,它的RAM空間有8KB,EEPROM有4KB,FLASH有128KB。如何將這幾個存儲空間合理的組織起來想必單片機的廠商花費了很大的精力,但是對於我們,我們只需要只要他們的結構是什么樣的,如何去使用這些空間就足夠了。

  首先先要復習一下RAM, EEPROM, FLASH的簡單概念。RAM是機器運行時的內存,單片機運行時可讀可寫,但是斷電后所有數據都會丟失。EEPROM是電擦除的可編程存儲,單片機運行時可以讀可以寫,斷電后數據不丟失。由於存儲空間小而且讀取速度快,因此一般作為數據存儲器。有很多程序運行時得到的參數希望下次重啟后還能夠再被使用,還有一些程序調試時的參數我們都可以將它們放在數據存儲器,方便程序參數的修改與保存,因此一般也將EEPROM稱作D-Flash。Flash也是電擦除的存儲設備,單片機運行時可讀可寫,斷電后數據不丟失,存儲空間大,但讀取速度相對較慢,一般作為程序存儲器也稱作P-Flash。但EEPROM與Flash比較還有就是一次擦寫或者寫入的數據量大小,一般EEPROM可以字節擦寫與寫入,但Flash是字段寫入與塊擦除。當然了,對於單片機存儲程序的開發,我們沒有必要涉及到Flash與EEPROM具體的寫入擦除控制,在存儲媒介上一般都做好了相關的接口,類似於HCS12VR系列的單片機,如圖所示是該系列下的Flash存儲器的接口架構。對Flash的控制只需要通過操作該Flash的控制器即可,在圖中的架構下,操作Flash只是設置好Flash控制器的操作時鍾,向單片機的相應寄存器按照命令的要求寫入相關數據即可。EEPROM的操作也是同理。

        除了基本的存儲器的知識外,HCS12的存儲空間的結構也是理解的關鍵。 要理解存儲結構,首先需要分清S12系列的邏輯地址與全局地址。所謂邏輯地址,就是單片機在運行時只要不涉及到顯式的對存儲器進行讀寫的地址都是邏輯地址,比如程序運行時每條指令存放的位置,在內存中數據的位置,只要不涉及到對存儲器內容的顯式編寫,通通都是邏輯地址。而邏輯地址的必要性也十分明顯,那就是相對於幾百KB甚至幾MB的存儲器,地址總線只有16bits,也就是CPU能直接尋址得到的地址只有64KB。為保證程序運行時地址的一致性,就將程序的各個存儲器地址分別映射到這64KB中,每次我只需要通過這64KB就可以訪問整個內存空間了(當然還有幾個寄存器的幫助才行,但這也總好過直接對存儲器進行操作了,這樣的話也單片機的設計也太不友好了)。前面的邏輯地址實際上可能會將相同物理媒介的地址分塊映射,但是全局地址基本上就可以理解為將各種存儲空間都統一進行一個編排,比如說將RAM放在一塊,EEPROM放在一塊,Flash放在一塊。可是,這些不同的物理存儲器在全局地址的角度看來都有統一的存儲格式,典型的S12系列內存映射圖如下圖所示:

  這張圖乍一看還是有點懵逼的,我這就帶你來理解理解。首先左邊就是邏輯地址的排布,邏輯地址就是正常運行時的地址,要是不做到Flash擦寫或者EEPROM的擦寫,你基本上不會用到全局地址。我們一般程序空間中使用的都是邏輯地址。注意:這里還沒有提到全局地址,所以說到的也都是邏輯地址。邏輯地址本身是其他存儲器的地址為了方便地址總線直接進行尋址,映射成64KB的地址的。上圖所示的邏輯地址起始於0x0000-0xFFFF共64KB。由於寄存器也映射到邏輯地址,而且訪問速度最快,邏輯地址0x0000-0x03FFF(共1KB, 如果需要16進制計算器,windows自帶計算器的程序員模式就好)如上圖為寄存器空間。這里注意,圖中的寄存器區結束不是0x0400,此地址已經是下一塊的起始地址了。寄存器的邏輯地址表在manual reference中都有,可以很方便的查看。從上圖中類似的,我們可以讀到,給EEPROM的邏輯地址為0x0400-0x05FF (512 B), RAM的邏輯地址為0x3800-0x3FFF(512B),ROM的邏輯地址為:0x0600-0x37FF(12KB), 0x4000-0x7FFF(16KB),0xC000-0xFFFF,以及有點特殊的0x8000-0xBFFF,可見ROM的邏輯地址已經被分成了好幾塊。

     而全局地址就是右邊的了,它將所有存儲的空間從0開始一直順序編碼。在右側我們可以看到,由於統一編碼,所以相比較而言就多了四個二進制位來表示。全局地址自0x0_0000-0x3_FFFF(256KB)(這樣的編碼只是為了將高位分開,實際上0x0_0000就是0x00000,0x3_FFFF就是0x3FFFF)。很顯然,這個地址空間完全可以將此單片機的所有物理存儲統一編址從而方便對於物理存儲空間的定位。從圖上,我們也可以看到,寄存器的全局地址為0x0_0000-0x0_03FF(1KB),EEPROM與RAM的全局地址共享0x0_0400-0x0_3FFF(15KB),0x3_0000-0x3-FFFF(64KB)為FLASH 的全局地址。至於中間的那部分全局地址用來做什么,目前可以理解為未分配,在此系列單片機中,沒有該全局地址對應的物理存儲,所以地址都是無效的。

  了解了邏輯地址與全局地址的基本概念后,就要說一下全局地址與邏輯地址是什么關系了。在此之前,就要說一下分頁存儲的概念了,由於一般而言地址總線不過16位或者8位。因此需要將存儲空間較大的Flash像我們的書本一樣分成一頁一頁的,通過頁碼來索引究竟是那一塊存儲空間。我們邏輯地址的0x8000到0xBFFF就是負責這樣的一個映射作用,通過一個PPAGE寄存器來記錄是存儲器上的哪一頁,再通過0x8000-0xBFFF間的邏輯地址來索引具體的存儲內容。在上圖右邊,Flash的全局地址按16KB為一頁分成0xC, 0xD, 0xE與0xF的四頁, 這個頁碼就是PPAGE寄存器的內容。從圖中我們可以理一下邏輯地址與全局地址的關聯:

                                       邏輯地址范圍                                                  全局地址范圍

                PPAGE: 0xC             0x8000 - 0xCFFF                                           0x3_0000 - 0x3_3FFF

                PPAGE:    0xD             0x8000 - 0xCFFF                                           0x3_4000 - 0x3_7FFF

  其余的頁面也都是如此,這里再次重申一下,只有專門讀寫存儲器的時候才會使用全局地址,一般情況下指令跳轉,內存中指針讀取數據,通通都是邏輯地址。希望大家在操作的時候能夠分清楚。Flash中的數據,通過邏輯地址尋址時只能讀取,只有編寫Flash的擦除寫入程序才能讀寫。

      這里也再總結一些本篇文檔的內容:

  1. 理解邏輯地址與全局地址在HC9S12系列單片機中的具體操作

       2. 理解邏輯地址與全局地址的對應關系,分頁地址的應用

      在有了這些基本的存儲概念后,我們才能能正式的進入內存中程序的跳轉,Flash的擦寫等工作中來。

     (未完待續)

      注: 本系列文章均為原創,如有轉載引用請標明來源                         

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM