DSP56800開(kāi)發(fā)軟件包SDK使用經(jīng)驗點(diǎn)滴
Motorola的SDK(Soft wareDevelopment Kit)是從DSP56800的Metrowerks CodeWarrior開(kāi)發(fā)工具中發(fā)展而來(lái)的,SDK是一個(gè)API(Application Prograrmming Inter―face)、庫、服務(wù)、規則的集合體。它為DSP56800系列芯片的開(kāi)發(fā)應用提供了一個(gè)很好的平臺,使得開(kāi)發(fā)者可以脫離硬件的束縛,在軟件仿真的環(huán)境下進(jìn)行開(kāi)發(fā),縮短產(chǎn)品進(jìn)入市場(chǎng)的周期。SDK使得開(kāi)發(fā)者對設備的操作就象對文件的操作一樣,非常方便。
下面是筆者在開(kāi)發(fā)應用DSP56F807芯片過(guò)程中使用SDK對其開(kāi)發(fā)操作的一點(diǎn)經(jīng)驗。
1 對SDK中API函數的總體認識
使用API函數對片上集成模塊進(jìn)行操作時(shí)一般會(huì )經(jīng)過(guò)以下過(guò)程。
①在初始化配置文件appconfig.h中設置設備初始化的一些參數,這些參數的設定會(huì )影響片上設備的操作,甚至影響設備是否能夠成功打開(kāi)返回正確的設備句柄。
②打開(kāi)所要操作的設備,獲得返回的設備句柄,供進(jìn)一步的操作使用。
③根據設備句柄,對設備進(jìn)行操作。
④關(guān)閉設備。
不管對哪些片上設備進(jìn)行操作,都將經(jīng)過(guò)上面的幾個(gè)步驟。下面介紹主要使用的API函數。
(1)open函數
open(參數1,參數2,參數3)。
參數1是由SDK定義的設備名稱(chēng),如:BSP―DEVICE―NAME―ADC_O即片上集成的模數轉換模塊。實(shí)際上,這一串字符是有含義的,在SDK的頭文件中有一個(gè)稱(chēng)做bsp.h的頭文件,在這里面定義了各個(gè)片上模塊的名稱(chēng),所以會(huì )以BSP―DEVICE―NAME打頭,當然這不是絕對的,開(kāi)發(fā)人員也可以定義自己的bsp.h文件,定義自己的設備名。參數2標識打開(kāi)設備是只讀、只寫(xiě)還是讀寫(xiě)。參數3就是開(kāi)發(fā)人員定義的初始化參數的數組名,對有些需要初始化的設備,需要有專(zhuān)門(mén)的數組來(lái)存儲初始化的參數。
open函數的作用是打開(kāi)片上的設備,當打開(kāi)片上集成設備成功的話(huà),將返回一個(gè)正數,相反將返回“一1”。一般來(lái)說(shuō),如果設備打開(kāi)不成功,最大的可能是由于初始化的參數不正確。對于集成有A/D模塊的芯片來(lái)說(shuō),剛開(kāi)始使用的時(shí)候是會(huì )犯這種錯誤的。0pen函數最終會(huì )返回打開(kāi)設備的句柄供下面的操作使用。
(2)ioctl函數
ioctl(參數1,參數2,參數3)。
參數1是open函數返回的打開(kāi)設備的句柄。參數2是SDK定義的改變設備屬性的參數,即是對設備進(jìn)行操作的參數。參數3是在改變設備過(guò)程中需要的一些參數。
ioctl函數是SDK中最為重要的函數之一,它通過(guò)對參數2的設定來(lái)改變設備的屬性,從而對設備進(jìn)行操作。表1通過(guò)對A/D操作命令的說(shuō)明(即參數2),可以看出這個(gè)函數的作用。
由上面可以看出,通過(guò)使用這樣的API函數可以非常方便的對片上的設備進(jìn)行操作,避免了對大量寄存器的煩人操作,大大加快了開(kāi)發(fā)的速度,減輕了程序員的負擔。
(3)close函數
close(參數1)
參數1是open函數返回的打開(kāi)設備的句柄。
close函數較為簡(jiǎn)單,就是將已經(jīng)打開(kāi)的設備關(guān)閉。
上面是在SDK中最為常用的函數,在使用SDK的過(guò)程中也有可能會(huì )遇到和上面功能相同,但表達式不相同的函數。
2 對片上集成模塊操作的注意事項
2.1 對GPlO口操作
對GPIO口的操作除按照用戶(hù)手冊和SDK上的API函數說(shuō)明外,還應當特別注意對GPl0一X―PER(其中的X代表的是GPl0的A,B,D,E中的任何一組)進(jìn)行初始化操作,即將要操作的對應位置零??梢杂孟旅娴恼Z(yǔ)句,bf―clr#$0004,X:GPIO A PER。
另外,還必須包括名為56807.h的頭文件,因為GPIO一A_PER寄存器的名稱(chēng)就是在這里定義的,當然也可以使用SDK中定義的函數進(jìn)行初始化。
如果在對GPIO口的操作前不對這個(gè)寄存器進(jìn)行上述初始化,則GPIO口是無(wú)法對外進(jìn)行正常操作的。
2.2 對ADC的操作
對ADC的操作主要是在它初始化載入參數時(shí)進(jìn)行的。如果參數在初始化時(shí)設置不對,就很有可能連設備都不能成功打開(kāi)。下面舉例來(lái)說(shuō)明在設置ADC參數時(shí)應當注意的地方。
在DSP56F807上集成有2個(gè)模數轉換器,模數轉換器包括8個(gè)輸入通道和2個(gè)獨立的采樣保持電路,轉換精度為12位。比較可貴的地方是,在每個(gè)模數轉換器的8個(gè)輸入通道中有2個(gè)通道是可以同時(shí)采樣的,這對有些需要2個(gè)信號量在同一時(shí)間值下采樣(比如同一時(shí)刻的電壓電流值)的情況是非常有用的。ADC的初始化設置參數用了一個(gè)名為adol_sState的數組來(lái)表示。
在上面的參數中,第一個(gè)參數的含義是需要進(jìn)行操作的模數轉換通道。第二個(gè)參數比較重要,當時(shí)按照Mo―torola的幫助文檔給出的例子進(jìn)行設置,結果A/D始終無(wú)法成功的打開(kāi),后來(lái)發(fā)覺(jué)第二個(gè)參數要參照第一個(gè)參數的值來(lái)設置,參數2等于2的打開(kāi)通道數的次方,如表2所列。
筆者試過(guò)如果使用這個(gè)函數而不按表2設置參數,A/D將無(wú)法打開(kāi)。
下面給出對DSP56FS07芯片進(jìn)行A/D操作的簡(jiǎn)單程序。
numread=read(handle,Result, sizeof(Result);
//讀取A/D轉換數值 }
2.3對定時(shí)器的操作
在使用SDK中的SPI函數對定時(shí)器進(jìn)行操作時(shí),如果同時(shí)又在對quad timer模塊進(jìn)行操作,那么應當在appconfing.
h中定義:
#define INCLUDE_IJSER_TIMER_A_x 1
#define INCLUDE_USER_TIMER_B_x 1
#define INCLUDE_USER_TIMER_C_x 1
#define INCLUDE_LISER_TIMER_D_x 1
其中x代表O~4中的一個(gè)定時(shí)器,在缺省的時(shí)候只有TIMER_A是定義為1的,即打開(kāi)的。如果不對上面的幾組定時(shí)器進(jìn)行定義,那么在使用SDK定義的CLOCK_AUX3~CLOCK_AUX7時(shí)就可能會(huì )出現一些問(wèn)題。
2.4對鎖相環(huán)的操作
對鎖相環(huán)系數的操作應當在appconfig.h中進(jìn)行,也就是改變鎖相環(huán)的倍數,進(jìn)而可以改變DSP56F807的核心時(shí)鐘和IP時(shí)鐘的頻率,具體的操作方法如下:
#define PLL_MUL 20
PLL_MUL后面的系數最大可到50,這是DSP56F807運行的極限。
Motorola推薦的內部時(shí)鐘頻率為80 MHz。
2.5對PWM的操作
對PWM的操作可以完全按照手冊和SDK給出的API函數進(jìn)行操作,沒(méi)有需要特別注意的地方,只是在幫助文檔中有一處有誤,在設置是否中心/邊沿對齊方式時(shí),如果是設置邊沿對齊方式,參數應該為:PWM_EDG。
2.6對外部中斷的操作
由于SDK初始化的時(shí)候是將外部中斷打開(kāi)的,這有可能使得程序在初始化時(shí)就產(chǎn)生外部中斷,而此時(shí)還未指定中斷服務(wù)程序,這樣便會(huì )出錯,關(guān)掉外部中斷的方法是在appconfig.h中定義:
#define BSP_ENABLE_INTERRUPTS O
對其他部分的操作都可以按照手冊和sDK的幫助文檔進(jìn)行,在這里不再詳述了。DSP56F807是一款不錯的芯片,筆者在使用SDK對其開(kāi)發(fā)應用中學(xué)到了很多東西。
評論