一種嵌入式系統(tǒng)升級(jí)的設(shè)計(jì)和實(shí)現(xiàn)
本文引用地址:http://m.butianyuan.cn/article/150451.htm
SD卡中SPI模塊的讀操作包括讀單塊和讀多塊兩種。該系統(tǒng)僅實(shí)現(xiàn)了讀單塊功能。初始化的長(zhǎng)度為512字節(jié)。函數(shù)的實(shí)現(xiàn)分為4個(gè)步驟:①LPC2148向SD卡發(fā)送讀單塊命令(CMD17),SD卡響應(yīng)(Rl格式);②等待SD卡發(fā)送讀起始令牌;③判斷收到的令牌是否為0xFE;④從SD卡中讀取數(shù)據(jù)。
4.2 SD卡文件系統(tǒng)
SD卡完成底層驅(qū)動(dòng)后,可按照FAT32文件系統(tǒng)格式對(duì)SD卡上的數(shù)據(jù)進(jìn)行操作,進(jìn)而在SD卡上實(shí)現(xiàn)讀寫(xiě)文件等操作。FAT32文件系統(tǒng)是微軟FAT類文件系統(tǒng)中的最高版本.是現(xiàn)今Windows下最常用的硬盤(pán)文件系統(tǒng)。
當(dāng)讀取SD卡中的文件時(shí),首先要根據(jù)文件名查找該文件的信息結(jié)構(gòu)體。根據(jù)文件信息結(jié)構(gòu)體中的起始簇號(hào)即可找到數(shù)據(jù)區(qū)第1簇的內(nèi)容,也可在FAT表中找到第2個(gè)簇號(hào)。根據(jù)第2個(gè)簇號(hào)又能找到第2簇的內(nèi)容和FAT表中的第3個(gè)簇號(hào),直至遇到文件結(jié)束標(biāo)志。這樣,就可根據(jù)FAT表中的簇號(hào)讀取到全部文件數(shù)據(jù)。以圖5為例,說(shuō)明讀取SD卡文件的具體步驟:
(1)先在目錄項(xiàng)表中找到與文件名匹配的,如“Mvfile”,從“Myfile”所對(duì)應(yīng)的目錄項(xiàng)中可以讀到該文件的首簇號(hào)0004:
(2)根據(jù)首簇號(hào)0004訪問(wèn)FAT表,讀出首簇號(hào)對(duì)應(yīng)的FAT表項(xiàng)內(nèi)容0005,即第2個(gè)簇號(hào)。根據(jù)第2個(gè)簇號(hào)再訪問(wèn)FAT表,讀出其對(duì)應(yīng)的FAT表內(nèi)容,即第3個(gè)簇號(hào)0006…等。依次做下去,直到最后一個(gè)表項(xiàng)內(nèi)容為FFFF為止;
(3)由第(2)步可知,“Myfile這個(gè)文件占用了4個(gè)簇,這4個(gè)簇號(hào)形成一個(gè)簇鏈000dH一0005H一0006H一0008H,根據(jù)這些簇號(hào)所形成的簇鏈訪問(wèn)這4個(gè)簇號(hào)對(duì)應(yīng)的4個(gè)數(shù)據(jù)存儲(chǔ)區(qū)域.文件“Myfile”就分成4個(gè)部分分別存放在這4個(gè)存儲(chǔ)區(qū)域中161。
4.3 IAP功能的實(shí)現(xiàn)
IAP:In Application Programming 是指在應(yīng)用編程,即在程序運(yùn)行中編程,就是片子提供一系列的機(jī)制(硬件/軟件上的)當(dāng)片子在運(yùn)行程序的時(shí)候可以提供一種改變flash數(shù)據(jù)的方法。通俗點(diǎn)講,也就是說(shuō)程序自己可以往程序存儲(chǔ)器里寫(xiě)數(shù)據(jù)或修改程序。這種方式的典型應(yīng)用就是用一小段代碼來(lái)實(shí)現(xiàn)程序的下載,實(shí)際上單片機(jī)的ISP功能就是通過(guò)IAP技術(shù)來(lái)實(shí)現(xiàn)的,即片子在出廠前就已經(jīng)有一段小的boot程序在里面,片子上電后,開(kāi)始運(yùn)行這段程序,當(dāng)檢測(cè)到上位機(jī)有下載要求時(shí),便和上位機(jī)通信,然后下載數(shù)據(jù)到存儲(chǔ)區(qū)。
LPC2148支持多種方式對(duì)Flash進(jìn)行編程,用來(lái)寫(xiě)入用戶代碼或數(shù)據(jù)。第一種方式是通過(guò)內(nèi)置的串行JTAG接口進(jìn)行編程:第二種方式是通過(guò)UART0進(jìn)行在系統(tǒng)編程(ISP);第三種方式是通過(guò)在應(yīng)用編程(IAP)。IAP程序是thumb代碼,地址為0x7FFFFFF0。在使用IAP擦除、編程操作過(guò)程中,片內(nèi)Flash存儲(chǔ)器不可訪問(wèn)。當(dāng)用戶運(yùn)行應(yīng)用程序時(shí),用戶Flash區(qū)域的中斷向量有效.所以在調(diào)用Flash擦除、寫(xiě)IAP之前,用戶應(yīng)當(dāng)禁止中斷,確保用戶中斷向量在RAM中有效和中斷處理程序位于RAM中。IAP代碼不使用或禁止中斷??蓪D卡讀出的數(shù)據(jù)用C代碼燒入指定的Flash段中:
4.4 程序?qū)崿F(xiàn)跳轉(zhuǎn)到任意行代碼段執(zhí)行
現(xiàn)以下例來(lái)說(shuō)明這段程序,如果程序跳轉(zhuǎn)到絕對(duì)地址為0xFFFF0執(zhí)行,代碼如下:
typedef void(*run)();//定義一個(gè)無(wú)參數(shù),無(wú)返回類型的函數(shù)指針類型
run address=(run)0xFFFFO;//定義一個(gè)函數(shù)指針,指向跳轉(zhuǎn)的位置
address()://調(diào)用函數(shù)
在上述應(yīng)用程序中,根本沒(méi)有看到任何一個(gè)函數(shù)實(shí)體,但是卻執(zhí)行了函數(shù)調(diào)用;實(shí)際上它起到了軟重肩的作用,跳轉(zhuǎn)到CPU啟動(dòng)后第一條要執(zhí)行的指令位置,即實(shí)現(xiàn)了程序的跳轉(zhuǎn)。
5、結(jié)語(yǔ)
該設(shè)計(jì)方案以LPC2148為核心,通過(guò)SD卡驅(qū)動(dòng)、FAT32文件系統(tǒng)、IAP功能和程序跳轉(zhuǎn)實(shí)現(xiàn)了系統(tǒng)升級(jí)的模塊設(shè)計(jì),并用于實(shí)際開(kāi)發(fā)中。該設(shè)計(jì)增強(qiáng)了系統(tǒng)維護(hù),縮短了產(chǎn)品的開(kāi)發(fā)周期。節(jié)約了大量的人力、財(cái)力,增加了與用戶的交流力度。與傳統(tǒng)設(shè)計(jì)相比。在開(kāi)發(fā)時(shí)間、成本和靈活性等方面都占有優(yōu)勢(shì)性。該設(shè)計(jì)已經(jīng)調(diào)試成功,并作為一個(gè)功能模塊用于某電子產(chǎn)品上,在產(chǎn)品需要增加新功能和維護(hù)系統(tǒng)穩(wěn)定方面起到了巨大的作用。要注意的是,該程序設(shè)計(jì)是在Keil下編譯通過(guò)的,生成的HEX文件不能直接放入SD卡中,因?yàn)樵撐募c通過(guò)ISP燒寫(xiě)Flash的文件不一樣,要作一定的修改。另外,該方案不僅能用于系統(tǒng)升級(jí),也能用于為程序補(bǔ)丁和寫(xiě)入數(shù)據(jù)等,也可用于ARM9.因此該設(shè)計(jì)方案具有廣泛的應(yīng)用前景。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論