日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DSP2812程序执行过程

發(fā)布時間:2024/4/17 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 DSP2812程序执行过程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
DSP2812程序執(zhí)行過程

開始程序,從main()開始運行

Step1:執(zhí)行語句InitSysCtrl();

初始化系統(tǒng)控制模塊:包括PLL, WatchDog, enable Peripheral Control. 這些模塊的初始化在DSP281x_SysCtrl.c文件中。

? 讓我們來看看這個初始化系統(tǒng)函數(shù)的內(nèi)容,看看它具體是怎么實現(xiàn)的。

void InitSysCtrl(void) {DisableDog();//禁止看門狗InitPll(0x8);//設(shè)置系統(tǒng)時鐘=XCLKIN*8/2InitPeripheralClocks(); //設(shè)置外設(shè)時鐘DINT; // 關(guān)閉總中斷IER = 0x0000; // 關(guān)閉外設(shè)中斷IFR = 0x0000; // 清中斷標(biāo)志 InitPieCtrl(); //初始化PIE控制寄存器InitPieVectTable(); //使能PIE向量表 }

?

這個函數(shù)中可以看出:

1、禁止看門狗DisableDog();

來看一下禁止看門狗的步驟(這個內(nèi)容書上應(yīng)該很多了,這里想要一根線式的抓住DSP編程的脈絡(luò),所以在這里贅述一下)。 ?先是寫看門狗控制寄存器SysCtrlRegs.WDCR= 0x0068(要開EALLOW)

來看一下WDCR寫0x0068的含義(建議像我一樣的初學(xué)者也來邊查寄存器手冊邊學(xué)習(xí)),WDCR是一個16位的寄存器,其中15-8位是保留的。給它寫0x0068將這些位進行了設(shè)置:

WDFLAG=0:手冊上說這一位是看門狗復(fù)位狀態(tài)標(biāo)志位。如果該位置位,表示一個看門狗復(fù)位(WDRST)產(chǎn)生了復(fù)位條件。如果為0,則是一個外部器件加電復(fù)位條件。

WDDIS=1:使看門狗模塊無效。

WDCHK(位5-3)=101:只能寫101,寫其它值核立即復(fù)位。

WDPS(2-0)=000:配置看門狗計數(shù)器的時鐘。寫000(或001)時WDCLK=OSSCCLK/512/1。

2、接著設(shè)置系統(tǒng)時鐘InitPll(0x8);

同樣來看一下設(shè)置系統(tǒng)時鐘的步驟(這個函數(shù)帶一個參數(shù))。

讓我把這個函數(shù)帖在這里

1 void InitPll(Uint16 val) 2 { 3 volatile Uint16 iVol; 4 5 if (SysCtrlRegs.PLLCR.bit.DIV != val) 6 { 7 8 EALLOW; 9 SysCtrlRegs.PLLCR.bit.DIV = val; 10 EDIS; 11 12 for(iVol= 0; iVol<4096; iVol++); 13 } 14 } InitPll(0x8)

意思是說將PLLCR寫0x8。通過查寄存器表,PLLCR的15-4位是保留的。將3-0位寫1000的意思是CLKIN=(OSCCLK*8.0)/2。

程序里for(iVol= 0; iVol<4096; iVol++);語句的意思是PLL的設(shè)置須要一定的時間,這里寫這句來確保PLL順利啟動。

3、設(shè)置外設(shè)時鐘InitPeripheralClocks();首先設(shè)置分頻時鐘

SysCtrlRegs.HISPCP.all = 0x0001;//設(shè)置高速時鐘 2分頻SysCtrlRegs.LOSPCP.all = 0x0002;//設(shè)置低速時鐘 4分頻

然后設(shè)置外設(shè)時鐘PCLKCR,PCLKCR的15位是保留的,按位定義將EVAENCLK?EVBENCLK,SCIAENCLK,SCIBENCLK,MCBSPENCLK,SPIENCLK,ECANENCLK,ADCENCLK位全部置1,表示使能這些外設(shè)時鐘,這些外設(shè)有的用的是高速時鐘,有的用的是低速時鐘。

4、關(guān)閉總中斷。

5、關(guān)閉外設(shè)中斷。

6、清中斷標(biāo)志。

7、初始化PIE控制寄存器InitPieCtrl();

void InitPieCtrl(void) {DINT; //禁止CPU級中斷 PieCtrlRegs.PIECRTL.bit.ENPIE = 0;//屏蔽PIE中斷向量表//清除所有PIEIER寄存器PieCtrlRegs.PIEIER1.all = 0;PieCtrlRegs.PIEIER2.all = 0;PieCtrlRegs.PIEIER3.all = 0; PieCtrlRegs.PIEIER4.all = 0;PieCtrlRegs.PIEIER5.all = 0;PieCtrlRegs.PIEIER6.all = 0;PieCtrlRegs.PIEIER7.all = 0;PieCtrlRegs.PIEIER8.all = 0;PieCtrlRegs.PIEIER9.all = 0;PieCtrlRegs.PIEIER10.all = 0;PieCtrlRegs.PIEIER11.all = 0;PieCtrlRegs.PIEIER12.all = 0;// 清除所有PIEIFR寄存器PieCtrlRegs.PIEIFR1.all = 0;PieCtrlRegs.PIEIFR2.all = 0;PieCtrlRegs.PIEIFR3.all = 0; PieCtrlRegs.PIEIFR4.all = 0;PieCtrlRegs.PIEIFR5.all = 0;PieCtrlRegs.PIEIFR6.all = 0;PieCtrlRegs.PIEIFR7.all = 0;PieCtrlRegs.PIEIFR8.all = 0;PieCtrlRegs.PIEIFR9.all = 0;PieCtrlRegs.PIEIFR10.all = 0;PieCtrlRegs.PIEIFR11.all = 0;PieCtrlRegs.PIEIFR12.all = 0; } ENPIE這PIE中斷擴展寄存器里的PIECTRL(中斷控制寄存器)里的最后一位,它的意思是從PIE塊中取回向量使能。該位置0,PIE無效。

總之,4,5,6,7步貌似就是關(guān)閉一切中斷(外部中斷,CPU中斷,PIE中斷),清除一切中斷標(biāo)志。這樣做的目的應(yīng)該就是使系統(tǒng)初始化到一種已知的狀態(tài)。便于我們以后操作。

8、使能PIE向量表InitPieVectTable();

void InitPieVectTable(void) {int16 i;Uint32 *Source = (void *) &PieVectTableInit;Uint32 *Dest = (void *) &PieVectTable;EALLOW; for(i=0; i < 128; i++)*Dest++ = *Source++; EDIS;// 使能中斷向量表PieCtrlRegs.PIECRTL.bit.ENPIE = 1; }

值得注意的是,如果DSP芯片復(fù)位,在沒有初始化PIE前,換句話說還沒有將ENPIE設(shè)為1時,使用的是BROM向量。因此,在DSP復(fù)位和程序引導(dǎo)完成之后,用戶必須對PIE向量表進行初始化,然后由應(yīng)用程序使能PIE向量表,這樣CPU響應(yīng)中斷時,就從PIE中斷向量表中所指出的位置上取出中斷向量,即取出中斷服務(wù)子程序的地址。

這就是這兩條語句的意思。

Uint32 *Source = (void *) &PieVectTableInit; Uint32 *Dest = (void *) &PieVectTable;

?

中斷向量表的地址是2*16位的,也就是32位地址。

----初始化系統(tǒng)模塊就是這些內(nèi)容。

?

Step2:初始化GPIO。設(shè)置GPIO到它的默認(rèn)狀態(tài)只須要一條語句(函數(shù))InitGpio();本例跳過這個設(shè)置,因為用不到GPIO作為實時I/O口。

而只須要用到它的多功能引腳GPAMUX和GPBMUX作為PWM輸出引腳(將GPAMUX和GPBMUX都寫0x00FF即可,受EALLOW保護)。

Step3:清除所有中斷并初始化PIE向量表。這個過程怎么來來回回兩次了,不知道這個函數(shù)寫的是不是有問題,明天再看。

?

Step4:執(zhí)行init_eva(),init_evb()函數(shù),也就是輸出PWM波。

void init_eva() {// EVA Configure T1PWM, T2PWM, PWM1-PWM6 // Initalize the timers// Initalize EVA Timer1 EvaRegs.T1PR = 0xFFFF; // Timer1 periodEvaRegs.T1CMPR = 0x3C00; // Timer1 compareEvaRegs.T1CNT = 0x0000; // Timer1 counter// TMODE = continuous up/down// Timer enable// Timer compare enableEvaRegs.T1CON.all = 0x1042; // Initalize EVA Timer2 EvaRegs.T2PR = 0x0FFF; // Timer2 periodEvaRegs.T2CMPR = 0x03C0; // Timer2 compareEvaRegs.T2CNT = 0x0000; // Timer2 counter// TMODE = continuous up/down// Timer enable// Timer compare enableEvaRegs.T2CON.all = 0x1042; // Setup T1PWM and T2PWM// Drive T1/T2 PWM by compare logicEvaRegs.GPTCONA.bit.TCMPOE = 1;// Polarity of GP Timer 1 Compare = Active lowEvaRegs.GPTCONA.bit.T1PIN = 1;// Polarity of GP Timer 2 Compare = Active highEvaRegs.GPTCONA.bit.T2PIN = 2;// Enable compare for PWM1-PWM6EvaRegs.CMPR1 = 0x0C00;EvaRegs.CMPR2 = 0x3C00;EvaRegs.CMPR3 = 0xFC00;// Compare action control. Action that takes place// on a cmpare event// output pin 1 CMPR1 - active high// output pin 2 CMPR1 - active low// output pin 3 CMPR2 - active high// output pin 4 CMPR2 - active low// output pin 5 CMPR3 - active high// output pin 6 CMPR3 - active lowEvaRegs.ACTRA.all = 0x0666;EvaRegs.DBTCONA.all = 0x0000; // Disable deadbandEvaRegs.COMCONA.all = 0xA600;}

1、T1PR定時器1周期寄存器寫初值0xFFFF;T1CMPR定時器1計數(shù)的比較值設(shè)有0x03C0;T1CNT定時器1當(dāng)前計數(shù)值設(shè)為0x0000;這三步稱為初始化EVA Timer1。

2、通用定時器1控制寄存器T1CON=0x1042:將TMODE1、T2SWT1、TECMPR這三位置為1。

其中TMODE1~TMODE0=10,表示計數(shù)器工作在連續(xù)增模式。T2SWT1寫1表示使用T1CON的使能位。TECMPR寫1使能定時器1的比較操作。

3、接著初始化EVA的Timer2,然后設(shè)置T2CON=0x1042,注意,Timer2使用的是T1CON的使能位。

4、EvaRegs.GPTCONA.bit.TCMPOE = 1;使能定時器比較輸出。T1PIN = 1定時器1比較輸出低有效,T2PIN定時器2比較輸出高有效。

5、使能PWM1~PWM6,三條語句:

EvaRegs.CMPR1 = 0x0C00;
EvaRegs.CMPR2 = 0x3C00;
EvaRegs.CMPR3 = 0xFC00; ?

——沒查到這三個寄存器賦值的意思 - -!

6、EvaRegs.ACTRA.all = 0x0666;設(shè)置比較輸出引腳6,4,2低有效,5,3,1高有效。

DBTCONA死區(qū)定時器控制寄存器寫0x0000,不使能死區(qū)控制。

COMCONA比較控制寄存器A寫0xA600,使能比較操作,14~13位寫01表示當(dāng)T3CNT=0或T3CNT=T3PR(下溢或周期匹配)時,比較器寄存器CMPRx重載。12位為0,表示禁止空間向量PWM模式。

11~10位01,當(dāng)T3CNT=0或T3CNT=T3PR(即下溢或周期匹配)時控制寄存器重載。9位設(shè)為1,全比較輸出,PWM1~6由相應(yīng)的比較邏輯驅(qū)動。

——init_evb()與init_eva()的設(shè)置步驟相同。

?

總結(jié):

?

?

?

?

?

posted on 2014-03-31 21:37 ii沙漠 閱讀(...) 評論(...) 編輯 收藏

轉(zhuǎn)載于:https://www.cnblogs.com/shamoof/p/3636896.html

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的DSP2812程序执行过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。