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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

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

编程问答

DSP2812程序执行过程

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

開(kāi)始程序,從main()開(kāi)始運(yùn)行

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

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

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

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

?

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

1、禁止看門(mén)狗DisableDog();

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

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

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

WDDIS=1:使看門(mén)狗模塊無(wú)效。

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

WDPS(2-0)=000:配置看門(mén)狗計(jì)數(shù)器的時(shí)鐘。寫(xiě)000(或001)時(shí)WDCLK=OSSCCLK/512/1。

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

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

讓我把這個(gè)函數(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)

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

程序里for(iVol= 0; iVol<4096; iVol++);語(yǔ)句的意思是PLL的設(shè)置須要一定的時(shí)間,這里寫(xiě)這句來(lái)確保PLL順利啟動(dòng)。

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

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

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

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

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

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

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

void InitPieCtrl(void) {DINT; //禁止CPU級(jí)中斷 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中斷擴(kuò)展寄存器里的PIECTRL(中斷控制寄存器)里的最后一位,它的意思是從PIE塊中取回向量使能。該位置0,PIE無(wú)效。

總之,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ù)位,在沒(méi)有初始化PIE前,換句話(huà)說(shuō)還沒(méi)有將ENPIE設(shè)為1時(shí),使用的是BROM向量。因此,在DSP復(fù)位和程序引導(dǎo)完成之后,用戶(hù)必須對(duì)PIE向量表進(jìn)行初始化,然后由應(yīng)用程序使能PIE向量表,這樣CPU響應(yīng)中斷時(shí),就從PIE中斷向量表中所指出的位置上取出中斷向量,即取出中斷服務(wù)子程序的地址。

這就是這兩條語(yǔ)句的意思。

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

?

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

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

?

Step2:初始化GPIO。設(shè)置GPIO到它的默認(rèn)狀態(tài)只須要一條語(yǔ)句(函數(shù))InitGpio();本例跳過(guò)這個(gè)設(shè)置,因?yàn)橛貌坏紾PIO作為實(shí)時(shí)I/O口。

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

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

?

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定時(shí)器1周期寄存器寫(xiě)初值0xFFFF;T1CMPR定時(shí)器1計(jì)數(shù)的比較值設(shè)有0x03C0;T1CNT定時(shí)器1當(dāng)前計(jì)數(shù)值設(shè)為0x0000;這三步稱(chēng)為初始化EVA Timer1。

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

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

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

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

5、使能PWM1~PWM6,三條語(yǔ)句:

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

——沒(méi)查到這三個(gè)寄存器賦值的意思 - -!

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

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

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

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

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

?

總結(jié):

?

?

?

?

?

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

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

與50位技術(shù)專(zhuān)家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

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

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