DSP2812程序执行过程
開(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)題。
- 上一篇: HTML 5核心内容
- 下一篇: 环形缓冲区实现类(Delphi)