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控制器的指令寄存器

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

 


免責聲明!

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



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