通過CCS燒寫FLASH的方法

 求助:FLASH的燒寫工具在CCS中無法顯示!

答:  步驟:右擊CCS2圖標-----屬性----查找目標---找到一個comp_mgr的文件(就是CCS圖標類似,但是頭上有個喇叭的)雙擊打開----Texas Instruments----把那個加號打開,在ON-chip  flash programme,前面選中就好了
 

通過CCS燒寫FLASH的方法

TI公司提供了一個燒寫FLASH的軟件,但是那需要將程序編譯後生成的OUT文件再轉換成ROM格式;或者是先將應用程序編譯後導出到一個二進制文件中,再通過CCS編程序從這個二進制文件中一個一個的讀入並寫進FLASH。

筆者要介紹的方法與上述兩個方法不同。根據SST39VF160的時序,編寫一個搬運程序,注意與DSP的BOOT程序的區別,這裏的搬運程序是將在CCS中打開的工程的內容原封不動的搬到FLASH中,如此完成FLASH的燒寫。根據這個思想,需要編寫兩個工程:一個主程序工程(即用戶應用程序,其中包括二次引導程序),一個搬運程序工程搬移程序不能使用與主程序的程序空間和中斷向量表重合的物理空間,以免覆蓋。燒寫時,同時打開主程序和搬移程序的PROJECT,先LOAD主程序,再LOAD搬移程序,然後執行搬移程序,燒寫OK!

分別編寫project(項目本身用)和writer(燒寫用)兩個工程,並且通過CCS進行load後,就可以實現了。但是project的內容比較少,所以project和writer都可以放在RAM中,而我的問題在於project很大,RAM放不下project和writer,怎麼辦?

該方法應該是最簡單的方法,只要在搬運程序中合理的調用下面列出的子程序,即可完成FLASH的擦除與編程。

 

1)FLASH擦除子程序 

FLASH編寫之前,應對FLASH進行擦除,使其每個數據位恢復1狀態,即全FF狀態。

void erase_flash()

{

              *(unsigned volatile char*)FLASH_ADR1=0x00aa;

              *(unsigned volatile char*)FLASH_ADR2=0x0055;

              *(unsigned volatile char*)FLASH_ADR1=0x0080;

              *(unsigned volatile char*)FLASH_ADR1=0x00aa;

              *(unsigned volatile char*)FLASH_ADR2=0x0055;

              *(unsigned volatile char*)FLASH_ADR1=0x0010;

              delay();

}

  這裏FLASH_ADR1代表0x64005555、FLASH_ADR2代表0x64002AAA。

 

 

2) FLASH單字編程子程序

void Program_One_Word (BYTE SrcWord,    BYTE *Dst)

{

              BYTE *DestBuf;

              BYTE *Temp;

              DestBuf = Dst;

 

              Temp =  (BYTE *)((WORD)FLASH_START+(0x5555));    

              *Temp = 0xAA;                

   

              Temp =  (BYTE *)((WORD)FLASH_START+(0x2AAA));

              *Temp = 0x55;               

 

              Temp =  (BYTE *)((WORD)FLASH_START+(0x5555));

             *Temp = 0xA0;               

 

              *DestBuf = SrcWord;           

              Check_Toggle_Ready(DestBuf);  

 }

 

void Check_Toggle_Ready (BYTE *Dst)

{

               BYTE Loop = TRUE;

               BYTE PreData;

               BYTE CurrData;

               unsigned long TimeOut = 0;

 

               PreData = *Dst;

               PreData = PreData & 0x4040;

               while ((TimeOut< 0x07FFFFFF) && (Loop))

               {

                   CurrData = *Dst;

                   CurrData = CurrData & 0x4040;

                   if (PreData == CurrData)

                    Loop = FALSE;  

                   PreData = CurrData;

                   TimeOut++;

               }

}

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