2410裸板調試筆記之 5 (未整理的,可能還有錯誤)

接上之前的繼續

    使用MDK 工具包中自帶的FLASH編程算法,可以實現對nor或者nand操作,我開發板上的nand爲 k9f 1208 64MB的nand
MDK自帶的flash算法中不包括着款,可以自己新增一個針對K9F1208的編程算法,但要放在 ../Flash目錄下

    該flash燒寫的project層次如下:
        Device Description
                FlashDev.c
        Program Functions
                FlashPrg.c
                FlashHW.c

   層次還算清晰,但是我有個疑問:
        我看到 FlashDev.c 和 FlashPrg.c都包含一個頭文件flashos.h
在flashos.h中主要包含一些全局變量的設置,數據結構建立,一些nand操作的函數聲明
而我們使用MDK上flash下載功能時,爲什麼MDK就通過ulink2操作nand了呢?在這過程中
MDK通過什麼機制來調用nand的一些函數來操作nand呢?
        個人猜測:MDK通過FlashOS.h文件,這個FlashOS.h直接和MDK掛鉤,具體如何實現待查。

    我重新改寫了nandflash的編程算法,但現在發現仍然出現Flash Timeout的錯誤提示,經過利用led定位方法,我查到是在 FindBlock() 函數裏的 CheckBlock_HW() 出現了問題,其一直返回不了 NAND_OK, 但看了CheckBlock_HW(addr)也沒有發現問題,經瞭解,sumsung的nand保證block開始的1stblock肯定不會是壞塊。
    增加串口顯示功能,這樣可以有更豐富的調試信息,便於我定位問題;

    問題已經得到解決,經分析,肯定是自帶flash編程算法有問題,因爲 nandflash 能保證 Block0 肯定是好塊 , 即block0的page0或者page1的第517個字節肯定爲0xFF,但現在查block0其仍然爲壞塊。明顯是有問題的,通過對比 datasheet發現自帶的程序中都把NFDATA當做32位寄存器來處理,但其實NFDATA是16位的,且低8位有效。所以需要把NFDATA當做 uchar來處理,按照這種思路處理後,燒寫nand正常了。
    (但存在一個問題,在我使用FULL CHIP ERASE時,當進行到一定地址的時候出現 FLASH TIMEOUT錯誤)

    但是我的跑馬燈程序燒寫到nand之後運行並不正常,其一直亮着(應該有規律閃動的),估計原因應該是啓動代碼裏出問題???(缺少把RW和ZI區數據搬運到RAM中的過程)
我們來分析一下:
Vectors      LDR     PC, Reset_Addr         //上電後PC指針指向的1st位置 放置RESET向量
                LDR     PC, Undef_Addr              
                LDR     PC, SWI_Addr
                LDR     PC, PAbt_Addr
                LDR     PC, DAbt_Addr
                NOP                            ; Reserved Vector
                LDR     PC, IRQ_Addr
                LDR     PC, FIQ_Addr
如果是在SDRAM(0x30000000)中調試運行,啓動後PC指向0x30000000,那麼在0x30000000放上Reset向量地址,在0x30000004放上Undef向量地址,依次類推(這句好像不對)。

IntVTAddress    EQU    0x33FFFF20

一旦進入調試狀態後SP = 0x31000480?爲什麼會是這個數值呢?

在MDK下調試時,發現該工具有個缺點,因爲在RAM中調試運行時,事先需要設計個調試配置腳本,裏面需要加AXF文件,但是如果其axf文件路徑設置不正確的話,其編譯和debug的時候竟然沒有任何錯誤提示音。這對於用戶
來說很不方面,總需要花時間在查錯上面?希望MDK可以改進一下。

現在在調試UART,暫且先用2410裏的測試程序,開發板上的UART0,1 均運行正常。
[
    1. 在這個基礎上,研讀一下UART程序,瞭解原理(使用什麼mode)。
    2. 整理好這個UART模塊,作爲以後的SDK一部分。
    3. 增加UART的輸入響應功能,比如按鍵p--代表開始編程 等等
    4. 掌握其可變參函數"
Uart_Printf(...)"的寫法  (網上文摘: http://blog.csdn.net/ZhouHM/archive/2004/04/07/14721.aspx)
]

因爲據我瞭解往開發板上的nand燒寫boot.bin的方法有好幾種,通過MDK的自動方式只是其中一種,現在我來實現通過在SDRAM中運行的nandPro程序來燒寫nandflash,燒寫過程中使用UART0來打印過程信息,燒錄完成後
且校驗OK後,打印“nand(k9f 1208)program done ok”
目前遇到個問題,查看第一個block是否爲壞塊的時候返回結果竟然又是BadBlock,這肯定是錯誤。難道I/O沒有配置好。
靠仔細檢查了下代碼,還是沒有查出原因,繼續查找原因。。。。。。
這個問題的原因已經找到了,果然是NAND 控制寄存器都忘記配置,運行已經OK!!!


但是讓我有點欣慰的是 2410init.s + led.c的程序生成的bin文件下載到nand的block0後,可以運行了(脫離ULINK2運行,但是這個程序很小,1.55KB)~。。~

我接着感覺把2410的 mon.bin(34KB)下載到nand中,在校驗的時候在 0x4000處提示contents missmatch錯誤,注意這裏的0x4000地址正好爲16384 = 512 * 32,這之間有什麼聯繫嗎?待查
難道超過一個block尺寸的bin文件,用MDK燒錄都會出現這個問題,flash編程算法還有缺陷嗎?或者是MDK軟件的版權限制了燒錄功能?NND

隔了一個禮拜未調2410,我現在又回來了!!!現在公司,手頭沒帶開發板,只能靠找了。決定還是依靠UART打印程序信息的方式來調試
之前已經由LED顯示,現在再把串口設置也加到編程算法中,加個宏定義。
在添加串口的過程中,發現如果添加了
void Uart_Printf(char *fmt,...)可變參函數,則編譯時報錯“L6967E: entry point(0x00000000) points to a THUMB instruction but is not a valid THUMB code pointer”暫時不知道爲什麼,
所以暫時不添加這個可變參函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章