1. 程式人生 > >freescale飛思卡爾 HC9S12 系列微控制器 Flash擦寫詳解(一)之時鐘設定

freescale飛思卡爾 HC9S12 系列微控制器 Flash擦寫詳解(一)之時鐘設定

       Flash擦寫的內容,個人做HC9S12系列微控制器時覺得應該是各模組內容中最難而且是最麻煩的一步了。只有能夠對Flash進行擦寫以後,所做的Bootloader才有真正手段將串列埠或者其他通訊手段接收到的資料或者程式寫入Flash中進行程式或者資料的更新。當初做Flash的擦寫也遇到了很多問題,網上搜羅下來也沒有合適的帖子能夠詳細的將整個過程或者學習的思路以及最後實現的程式詳細的加以解析,而本博文就是基於這個出發點來寫的。技術本身應當是共享的才能真正讓社會進步,不是麼?

  關於微控制器Flash的基本內容,我在此前Bootloader相關的博文中也已經提及。Flash本身是非易失性儲存,可以通過程式設計的方式擦寫其中的內容,掉電後其內容不會丟失,一般是微控制器的程式儲存位置。微控制器執行時先將Flash中下一條執行的程式讀出,然後執行其內容,再讀出下一條指令,再執行迴圈往復。但是我們希望,能夠使我們開發的微控制器應用程式能夠有自動更新程式的功能。比方說我現在開發的一款共享單車智慧車鎖,在共享單車在大馬路上只能通過網路互動的時候,我希望能夠更新該車鎖中微控制器的程式以提供新的功能。這種時候,我們就需要擦寫Flash來完成這一目的。

  Flash擦寫操作最應該看的就是微控制器的或者Flash的手冊,認真的看,通篇閱讀後再嘗試用C語言去加以實現其功能。我們的講解也是在這個過程中逐漸展開的,當然,還是針對HC9S12G128系列的微控制器內建Flash而言。本次篇博文僅考慮了比較簡單的Flash擦除與Flash寫入操作,當然,在理解了Flash操作的基礎上,Flash的其他操作如防寫,解保護其實是一樣的道理。好了,下面我們就開始吧。

     G128系列微控制器的Flash儲存大小有128KB, 其全域性地址範圍為: 0x2_0000 - 0x3_FFFF。這篇文章中已經假設各位讀者已經對分頁地址,非分頁地址,邏輯地址,全域性地址已經有所理解,如果尚不明確其意義的,我在

freescale飛思卡爾 HCS12 系列微控制器bootloader詳解(二)這篇博文中做了解釋,理解了這些概念間的相互關係再來看本博文會比較有幫助。瞭解Flash擦寫前,根據我們手冊中的內容,Flash的控制體系是這樣的:

  在S12系列微控制器中,程式設計人員對Flash的操作並不是實際意義上對每個Flash儲存區直接進行操作的,而是通過這個Flash Interface進行的。通過對這個Flash Interface的暫存器進行配置,再由它對Flash進行直接的操作。這裡,我們稱Flash Interface為Flash操作控制器或者Flash控制器。那麼如何控制Flash控制器呢?手冊中已經給出了Flash操作控制相關的所有暫存器,如下圖所示,這些暫存器就是我們微控制器的暫存器,它們的操作與普通的暫存器沒有什麼兩樣,在微控制器暫存器定義標頭檔案中均可以找到。還有一點就是通過匯流排時鐘按照對應微控制器Flash控制器的要求設定時鐘分頻器

,給你使用的Flash控制器設定合適的時鐘頻率使其能夠正常工作。

HCS12G128微控制器部分Flash控制器相關的操作暫存器(不同型號微控制器會有所不同)

  首要的任務當然是設定Flash控制器的時鐘了,它以匯流排時鐘為時鐘源,通過設定FCLKDIV(Flash時鐘分頻暫存器)來對其進行設定。G128的FCLKDIV暫存器定義在手冊中的內容如下:

  在這頁手冊中可以看到,有三個暫存器需要處理FDIVLD,FDIVLCK,FDIV。先說FDIV暫存器,這個暫存器有六位,通過分頻將匯流排時鐘頻率分頻至1MHz以下從而使Flash控制器可以正常工作。FDIV的值與匯流排時鐘頻率有關,根據匯流排頻率的大小確定FDIV的值,其取值在手冊中也給出了下表:

  對於這個表,用法也非常簡單,假如當前我的匯流排頻率為15MHz,查表中15MHz在14.6與15.6之間,那麼FDIV的值就是0x0E了。當確定好Flash控制器的頻率後需要將其防寫以防誤操作修改了分頻暫存器,那麼對FDIVLCK寫1就好了,當FDIVLCK寫入1後,除非重啟,否則FDIV的值不能被修改,重啟後FDIVLCK的值將重新歸零。

  由此總結我們Flash控制器的時鐘設定步驟如下:

  1. 根據匯流排頻率設定分頻FDIV

  2. 對分頻進行保護,將FDIVLCK置為1

  這裡需要注意,當需要寫入FCLKDIV這個暫存器(也就是完成上面兩個操作時),一定要確保此時Flash控制器不在執行指令,那麼Flash控制器如何執行指令的呢?怎麼檢視它是在執行指令的呢?

  請看下節,Flash控制器的指令與執行

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