ADS1.2的工程建立與配置以及其中一些文件的分析

原文出處:http://blog.csdn.net/cangencong/article/details/6977028

一、ADS1.2的工程建立與配置

①     新建工程類型爲 ARM Excuteable Image。用於由 ARM 指令的代碼生成一個 ELF 格式的可以執行映象文件。

②     再把lib與inc文件夾拷貝到所建工程的文件夾中,inc文件夾中包含了很多.h文件,其中.c文件在lib中。(後面將對這些文件的作用與含義進行分析)。

③     把需要用到的函數所在的.c文件添加到工程中,在簡單的現在默認工程中我們要添加這三個文件,

2440init.s(是對板子的啓動初始化,有內存配置,中斷初始化,棧空間的分配,中斷時入棧與出棧的方式寄存器的保存——這部分與具體的板子芯片都十分相關也是系統移植時需要關注的),並且要注意在初始化時跳入C語言的入口點BL Main (在後面自己寫函數時,一定要寫爲Main不要寫成main,不然將找不到入口)。

2440lib.c文件(裏面包含了對芯片的常規初始化,主要是IO的初始化與時鐘頻率初始化要使用到的函數,有時候會有Uart需要的一些函數,但是沒有的時候可以自己在內部加入,因此自己要寫一些十分基本和常用的函數時,可以把這些函數寫入到這個.c文件中,但是是針對某個特殊芯片的的函數,eg:NAND FLASH,IIS,IIC等的操作,最好要在另外建立他的.c文件,這樣文件結構會更加清楚)

2440slib.s文件主要是對CP15這個協處理的配置(內存管理器),配置結束後使內存,cache,CPU協調工作,最開始也對LCD的一些內存區進行了分配等。

④     建立自己的主函數文件。(文件名字可以是main.c但是裏面的函數一定是Main

⑤     寫好自己的主函數後,再進行Debug setting,主要設置的有五項:

Target settings,其中有 Target Name (當前目標設置)Linker(默認,是表示使用什麼連接器),post-Linker是鏈接後生成什麼文件,設置爲ARM from ELF(exe load flash)。

ARM Assembler 與ARM C compiler 都把芯片型號配置爲ARM920T(即你開發板的型號),如果用到C++代碼,也要將ARM C++ compiler作相同的設置。

ARM Linker -> Output

設置RO Base爲0x30000000,該地址爲mini2440開發板的內存起始地址。

ARM Linker -> Layout

Object/Symbol設置爲2440init.o,Section設置爲init。

ARM from ELF 中設置輸出文件的名字:xxx.bin。到此一個完整的工程與配置都已經完成。

 

二、對一個最簡單工程中的頭文件與一些函數作用的分析。

在main.c中一般要包含一下幾個頭文件

(def.h) 定義了一些數據類型,eg:#define U8 char 。目的是增強可移植性。

(option.h) RAM,中斷,棧的基地址定義,與系統時鐘的定義

(2440addr.h) 定義了各種寄存器的地址。

(2440lib.h) 申明瞭2440lib.c中使用的函數,與其中用到的宏定義。

(2440slib.h) 申明瞭2440slib.s中使用到的函數。

函數 Port_Init()中就是對A-J的端口進行了一般的初始化。要修改時可以對照着用戶手冊進行對應的修改。

下面還包括了四個與系統時鐘有關的函數,

[html] view plaincopy
  1. <span style="font-size:18px;">void ChangeMPllValue(int mdiv, int pdiv, int sdiv)  //對MPLL這個鎖相環進行配置  
  2. {  
  3. Rmpllcon  = (mdiv << 12) | (pdiv <<4) | sdiv;  
  4. }  
  5. </span>  


 

[html] view plaincopy
  1. <span style="font-size:18px;">void ChangeClockDivider(int hdivn_val, int pdivn_val),  
  2. {  
  3.     int hdivn=2pdivn=0;  
  4.       
  5.      // hdivn_val (FCLK:HCLK)ratio hdivn  
  6.      // 11           1:1       (0)  
  7.      // 12           1:2       (1)  
  8.      // 13           1:3       (3)   
  9.      // 14           1:4       (2)  
  10.      // pdivn_val (HCLK:PCLK)ratio pdivn  
  11.      // 11           1:1       (0)  
  12.      // 12           1:2       (1)  
  13.     switch(hdivn_val) {  
  14.         case 11: hdivn=0; break;  
  15.         case 12: hdivn=1; break;  
  16.         case 13:  
  17.         case 16: hdivn=3; break;  
  18.         case 14:   
  19.         case 18: hdivn=2; break;  
  20.     }  
  21.       
  22.     switch(pdivn_val) {  
  23.         case 11: pdivn=0; break;  
  24.         case 12: pdivn=1; break;  
  25.     }  
  26.       
  27.     rCLKDIVN = (hdivn<<1) | pdivn;  
  28.   
  29.     switch(hdivn_val) {  
  30.         case 16:        // when 1, HCLK=FCLK/8.  
  31.             rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<8);   
  32.         break;   
  33.         case 18:    // when 1, HCLK=FCLK/6.  
  34.             rCAMDIVN = (rCAMDIVN & ~(3<<8)) | (1<<9);   
  35.         break;  
  36.     }  
  37.       
  38.     if(hdivn!=0)  
  39.         MMU_SetAsyncBusMode();  
  40.     else   
  41.         MMU_SetFastBusMode();  
  42. }  
  43. </span>  


 

[html] view plaincopy
  1. <span style="font-size:18px;">void ChangeUPllValue(int mdiv, int pdiv, int sdiv)    //對UPLL這個鎖相環的配置  
  2. {  
  3. rUPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;  
  4. }  
  5. </span>  

[html] view plaincopy
  1. <span style="font-size:18px;">static void cal_cpu_bus_clk(void)  
  2. {  
  3.     U32 val;  
  4.     U8 m, p, s;  
  5.       
  6.     val = rMPLLCON;             //MPLL控制寄存器  
  7.     m = (val>>12)&0xff;           //獲得MDIV的值  
  8.     p = (val>>4)&0x3f;            //獲得PDIV的值  
  9.     s = val&3;                  //獲得SDIV的值  
  10.   
  11.     //(m+8)*FIN*2 不要超出32位數!  
  12.     FCLK = ((m+8)*(FIN/100)*2)/((p+2)*(1<<s))*100;  //MPLL與FCLK應該等同  
  13.       
  14.     val = rCLKDIVN;             //時鐘分頻器控制寄存器  
  15.     m = (val>>1)&3;               //獲取HDIVN的值,控制HCLK與FCLK的關係(FCLK被分頻多少)  
  16.     p = val&1;                  //控制PCLK與HCLK之間的關係  
  17.     val = rCAMDIVN;             //攝像頭時鐘分頻寄存器  
  18.     s = val>>8;                   //與HDIVN共同控制HCLK與FCLK的關係  
  19.       
  20.     switch (m) {  
  21.     case 0:  
  22.         HCLK = FCLK;  
  23.         break;  
  24.     case 1:  
  25.         HCLK = FCLK>>1;  
  26.         break;  
  27.     case 2:               
  28.         if(s&2)  
  29.             HCLK = FCLK>>3;//右移3位 == 除以8  
  30.         else  
  31.             HCLK = FCLK>>2;//右移2位 == 除以4  
  32.         break;  
  33.     case 3:  
  34.         if(s&1)  
  35.             HCLK = FCLK/6;  
  36.         else  
  37.             HCLK = FCLK/3;  
  38.         break;  
  39.     }  
  40.       
  41.     if(p)  
  42.         PCLK = HCLK>>1;  
  43.     else  
  44.         PCLK = HCLK;  
  45.       
  46.     if(s&0x10)      //取DIVN_UPLL的值,0:FCLK = MPLL clock  1:FCLK = HCLK  
  47.         cpu_freq = HCLK;  
  48.     else  
  49.         cpu_freq = FCLK;  
  50.           
  51.     val = rUPLLCON;     //UPLL控制寄存器  
  52.     m = (val>>12)&0xff;       //獲取MDIV  
  53.     p = (val>>4)&0x3f;        //獲取PDIV  
  54.     s = val&3;          //獲取SDIV  
  55.     UPLL = ((m+8)*FIN)/((p+2)*(1<<s));    //計算出UPLL  
  56.     UCLK = (rCLKDIVN&8)?(UPLL>>1):UPLL;       //控制UCLK與UPLL的關係  
  57. }  
  58. </span>  


對這幾個函數使用方式:

 

[html] view plaincopy
  1. <span style="font-size:18px;">//給出了能產生  200M,300M,400M,440M幾種頻率的算法,設定好mpll_val與key  
  2. //再通過函數ChangeMPllValue與ChangeClockDivider把他們傳遞進去  
  3. //最後再進行cal_cpu_bus_clk,()時鐘的最後確定  
  4.     i = 2 ; //don't use 100M!  
  5.         //boot_params.cpu_clk.val = 3;  
  6.     switch ( i ) {  
  7.     case 0: //200  
  8.         key = 12;  
  9.         mpll_val = (92<<12)|(4<<4)|(1);  
  10.         break;  
  11.     case 1: //300  
  12.         key = 13;  
  13.         mpll_val = (67<<12)|(1<<4)|(1);  
  14.         break;  
  15.     case 2: //400  
  16.         key = 14;  
  17.         mpll_val = (92<<12)|(1<<4)|(1);  
  18.         break;  
  19.     case 3: //440!!!  
  20.         key = 14;  
  21.         mpll_val = (102<<12)|(1<<4)|(1);  
  22.         break;  
  23.     default:  
  24.         key = 14;  
  25.         mpll_val = (92<<12)|(1<<4)|(1);  
  26.         break;  
  27.     }  
  28.       
  29.     //init FCLK=400M, so change MPLL first  
  30.     ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);  
  31.     ChangeClockDivider(key, 12);  
  32.     cal_cpu_bus_clk();  
  33. </span>  


對於上述知識自己也瞭解不是很透,作爲筆記內容記錄,在有更深入的瞭解後再改動,也希望高手們指出其中的錯誤。

發佈了22 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章