extern void DSP28x_usDelay(Uint32 time);
該函數的定時仍然不夠精確,因此在文件DSP281x_Examples.h中做了如下的宏定義修正:
#define DELAY_US(A) DSP28x_usDelay(((((long double) A * 1000.0L) / (long double)CPU_RATE) - 9.0L) / 5.0L)
函數DSP28x_usDelay(Uint32 time)要想非常精確,必須在SARAM中運行,因此需要在運行時將其調入SARAM中。爲此,需要做如下工作:
首先,在DSP281x_usDelay.asm中使用
.sect "ramfuncs"
將該段代碼定義到段“ramfuncs”中,段ramfuncs的位置在編譯時指定,實際上由F2812.cmd文件中的如下語句來指定:
ramfuncs LOAD = FLASHD, PAGE = 0,
RUN = RAML0, PAGE = 1,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart)
第1行表示該段的裝載在PAGA0的FLASHD中(PAGA0和FLASHD的分段請見F2812.cmd文件,後文將有詳解);
第2行表示該段的運行地址在PAGE1的RAML0中(PAGA1和RAML0的分段請見F2812.cmd文件,後文將有詳解);
LOAD_ START(_RamfuncsLoadStart)令編譯器創建了一個變量RamfuncsLoadStart,http://tiyubisai.com/video_news/news_135561.html該變量指向段ramfuncs的裝載地址的首地址(LOAD_ START爲編譯僞指令,請見CCS的幫助文檔);
LOAD_ START(_RamfuncsLoadEnd)令編譯器創建了一個變量RamfuncsLoadEnd,該變量指向段ramfuncs的裝載地址的末地址(LOAD_ END爲編譯僞指令,請見CCS的幫助文檔);
LOAD_ START(_RamfuncsRunStart)令編譯器創建了一個變量RamfuncsRunStart,該變量指向段ramfuncs的運行地址的首地址(LOAD_ START爲編譯僞指令,請見CCS的幫助文檔);
從第1和2行可以看出,段ramfuncs中的函數DSP28x_usDelay()的裝載地址和運行地址是不同的,本程序中裝載在Flash的塊FLASHD中,而在SARAM L0中運行,這只是目標,實際運行時DSP並會自動將Flash中的代碼拷貝到SARAM中,因此需要手動添加代碼來完成。
在C函數中,爲了使用變量RamfuncsLoadStart、RamfuncsLoadEnd和RamfuncsRunStart,必須先聲明,本工程在文件DSP281x_GlobalPrototypes.h中做了如下聲明:
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
然後就可以使用了。在Main.c中,使用MemCopy()函數將段ramfuncs中的函數DSP28x_usDelay()的代碼從裝載地址RamfuncsLoadStart—RamfuncsLoadEnd拷貝到RamfuncsRunStart開始的SARAM空間中。之後在程序運行時,只要調用DSP28x_usDelay()函數,都會自動地指向SARAM中相應的函數入口地址,這一點是自動完成的。MemCopy()函數原型在MemCopy.c中,在DSP281x_GlobalPrototypes.h聲明。
注意:即使這樣,定時仍然可能不精確,因爲可能有中斷打斷DSP28x_usDelay()的運行,所以在調用之前要關中斷。
http://blog.csdn.net/xiaoxiongli/article/details/49619399 |
http://blog.csdn.net/xiaoxiongli/ |