第三章F2812的系統(tǒng)控制與中斷_第1頁(yè)
第三章F2812的系統(tǒng)控制與中斷_第2頁(yè)
第三章F2812的系統(tǒng)控制與中斷_第3頁(yè)
第三章F2812的系統(tǒng)控制與中斷_第4頁(yè)
第三章F2812的系統(tǒng)控制與中斷_第5頁(yè)
已閱讀5頁(yè),還剩126頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第三章F2812的系統(tǒng)控制與中斷3.1F2812的存儲(chǔ)器

F2812的存儲(chǔ)空間:Flash128kX16bOTP存儲(chǔ)器只能一次編程,不能擦除表4.1flash和OTP配置寄存器寄存器受EALLOW位保護(hù)(保護(hù)寄存器) 執(zhí)行EALLOW指令后,可將數(shù)據(jù)寫(xiě)入寄存器 執(zhí)行EDIS指令后,寫(xiě)操作禁止3.2時(shí)鐘

3.2.1時(shí)鐘單元基本結(jié)構(gòu)

TMS320F2812處理器內(nèi)部集成了振蕩器、鎖相環(huán)、看門(mén)狗及工作模式選擇等控制電路。振蕩器、鎖相環(huán)主要為處理器CPU及相關(guān)外設(shè)提供可編程的時(shí)鐘,每個(gè)外設(shè)的時(shí)鐘都可以通過(guò)相應(yīng)的寄存器進(jìn)行編程設(shè)置;

看門(mén)狗可以監(jiān)控程序的運(yùn)行狀態(tài),提高系統(tǒng)的可靠性。F2810和F2812內(nèi)部的各種時(shí)鐘和復(fù)位電路3.2.2鎖相環(huán)電路

鎖相環(huán)是一種控制晶振使其相對(duì)于參考信號(hào)保持恒定相位的電路,在數(shù)字通信系統(tǒng)中使用比較廣泛。目前微處理器或DSP集成的片上鎖相環(huán),主要作用則是通過(guò)軟件實(shí)時(shí)地配置片上外設(shè)時(shí)鐘,提高系統(tǒng)的靈活性和可靠性。此外,由于采用軟件可編程鎖相環(huán),所設(shè)計(jì)的系統(tǒng)處理器外部允許較低的工作頻率,而片內(nèi)經(jīng)過(guò)鎖相環(huán)微處理器提供較高的系統(tǒng)時(shí)鐘。

好處:可以有效地降低系統(tǒng)對(duì)外部時(shí)鐘的依賴和電磁干擾,提高系統(tǒng)啟動(dòng)和運(yùn)行的可靠性,降低系統(tǒng)對(duì)硬件的設(shè)計(jì)要求

。3.2.2鎖相環(huán)電路

TMS320F2812處理器的片上晶振和鎖相環(huán)模塊為內(nèi)核及外設(shè)提供時(shí)鐘信號(hào),并且控制器件的低功耗工作模式。片上晶振模塊允許使用2種方式為器件提供時(shí)鐘,即采用內(nèi)部振蕩器或外部時(shí)鐘源。

(1)使用內(nèi)部振蕩器,在Xl/XCLKIN和X2這兩個(gè)引腳之間連接一個(gè)石英晶體,一般選用30MHz。

(2)采用外部時(shí)鐘,將輸入的時(shí)鐘信號(hào)直接接到Xl/XCLKIN引腳上,而X2懸空,不使用內(nèi)部振蕩器。旁路鎖存器片上振蕩器晶體振蕩器及鎖相環(huán)模塊鎖相環(huán)配置模式PLL模式說(shuō)明SYSCLKOUTPLL禁止上電復(fù)位時(shí)通過(guò)將引腳拉低來(lái)調(diào)用。PLL模塊完全禁止。輸入到CPU的時(shí)鐘(CLKIN)由來(lái)自X1/XCLKIN引腳的時(shí)鐘信號(hào)直接驅(qū)動(dòng)。XCLKINPLL旁路如果PLL未處于禁止?fàn)顟B(tài),則為上電復(fù)位的默認(rèn)配置模式。PLL自身被旁路,但是從X1/XCLKIN引腳輸入的時(shí)鐘在送到CPU之前,先經(jīng)過(guò)PLL的‘/2’電路除以2。XCLKIN/2PLL使能通過(guò)給PLLCR寄存器寫(xiě)入一個(gè)非0的‘n’值來(lái)實(shí)現(xiàn)。時(shí)鐘在送到CPU之前,先經(jīng)過(guò)PLL的‘/2’電路除以2。(XCLKIN*n)/2處理器內(nèi)部時(shí)鐘電路鎖相環(huán)模塊除了為C28x內(nèi)核提供時(shí)鐘外,還通過(guò)系統(tǒng)時(shí)鐘輸出提供快速和慢速2種外設(shè)時(shí)鐘,而系統(tǒng)時(shí)鐘主要通過(guò)外部引腳XPLLDIS及鎖相環(huán)控制寄存器進(jìn)行控制。如果XPLLDIS為高電平,使能芯片內(nèi)部鎖相環(huán)電路,則可以通過(guò)控制寄存器PLLCR軟件設(shè)置系統(tǒng)的工作頻率。注意:1.在通過(guò)軟件改變系統(tǒng)的工作頻率時(shí),必須等待系統(tǒng)時(shí)鐘穩(wěn)定后才可以繼續(xù)完成其他操作。

2.可以通過(guò)外設(shè)時(shí)鐘控制寄存器使能外設(shè)時(shí)鐘。在具體的應(yīng)用中。為降低系統(tǒng)功耗,不使用的外設(shè)最好將其時(shí)鐘禁止。外設(shè)時(shí)鐘包括快速外設(shè)和慢速外設(shè)兩種,分別通過(guò)HISPCP和LOSPCP寄存器進(jìn)行設(shè)置。

CLKIN(經(jīng)過(guò)PLL后送往CPU的時(shí)鐘信號(hào))經(jīng)過(guò)CPU分發(fā),作為SYSCLKOUT送至各個(gè)外設(shè)。DSP將外設(shè)分成兩種:低速外設(shè):SCI,SPI,McBSP

高速外設(shè):EV,ADC兩種外設(shè)時(shí)鐘一起提供。給各個(gè)外設(shè)提供時(shí)鐘前,使能用到的外設(shè)的時(shí)鐘。不用的外設(shè)時(shí)鐘不使能。PCLKCR寄存器使能相應(yīng)的外設(shè)時(shí)鐘SysctrlRegs.PCLKCR.bit.SCIAENCLK=1;//使能SCIA時(shí)鐘

二其他外設(shè)時(shí)鐘

系統(tǒng)時(shí)鐘SYSCLKOUT經(jīng)過(guò)低速預(yù)定標(biāo)寄存器LOSPCP,產(chǎn)生低速外設(shè)時(shí)鐘LSPCLK提供給低速外設(shè)。系統(tǒng)時(shí)鐘SYSCLKOUT經(jīng)過(guò)高速預(yù)定標(biāo)寄存器HISPCP,產(chǎn)生高速外設(shè)時(shí)鐘HSPCLK提供給高速外設(shè)。LOSPCP寄存器HISPCP寄存器

二其他外設(shè)時(shí)鐘//為降低系統(tǒng)功耗,不使用的外設(shè)時(shí)鐘需要屏蔽。但如果使用外設(shè)必須首先使能相應(yīng)的外設(shè)時(shí)鐘voidInitsysctrl(){ uint16i; EALLOW; SysctrlRegs.WDCR=0x0068;//關(guān)看門(mén)狗

SysctrlRegs.PLLCR=0x0008;//初始化鎖相環(huán),系統(tǒng) 時(shí)鐘30MX4=120M

for(i=0;i<5000;i++){}

//HISPCP/LOSPCP預(yù)定標(biāo)寄存器設(shè)置 SysCtrlRegs.HISPCP.a11=0x0001; //HSPCLK=SYSCLKOUT/2; SysCtrlRegs.LOSPCP.a11=0x0002; //LSPCLK=SYSCLKOUT/4; //使能使用的外設(shè)時(shí)鐘

SysCtrlRegs.PCLKCR.bit.EVAENCLK=1; SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1; EDIS;}3.2.3時(shí)鐘單元寄存器寄存器名地址長(zhǎng)度(×16位)描述保留

0x7010~0x701910HISPCP

0x701A1HSPCLK時(shí)鐘的高速外設(shè)模塊時(shí)鐘預(yù)分頻寄存器LOSPCP0x701B1LSPCLK時(shí)鐘的低速外設(shè)模塊時(shí)鐘預(yù)分頻寄存器PCLKCR0x701C1外設(shè)模塊時(shí)鐘控制寄存器保留0x701D1LPMCR00x701E1低功耗工作模式控制寄存器0LPMCR10x701F1低功耗工作模式控制寄存器1保留0x70201PLLCR0x70211PLL控制寄存器?SCSR0x70221系統(tǒng)控制&狀態(tài)寄存器WDCNTR0x70231程序監(jiān)視器計(jì)數(shù)寄存器保留0x70241WDKEY0x70251程序監(jiān)視器復(fù)位密鑰寄存器保留0x7026~0x70283WDCR0x70291程序監(jiān)視器控制寄存器保留0x702A~0x702F6注意表中所有寄存器只有在執(zhí)行EALLOW指令后,才可以訪問(wèn)。PLL控制寄存器(PLLCR)只能被XRS信號(hào)復(fù)位到已知狀態(tài)。15141312111098ReservedECANENCLKReservedMCBSPENCLKSCIBENCLKSCIAENCLKReservedSPIENCLKR-0R/W-0R-0R/W-0R/W-0R/W-0R-0R/W-0743210ReservedADCENCLKReservedEVBENCLKEVAENCLKR-0R/w-0R-0R/W-0R/W-01.外設(shè)時(shí)鐘控制寄存器(PCLKCR)位15 Reserved保留位 位14 ECANENCLK如置1,將使能CAN外設(shè)模塊的時(shí)鐘。要進(jìn)入低功耗工作模式,用戶可以將該位清零或復(fù)位為0。位13 Reserved保留位 位12 MCBSPENCLK 如置1,使能McBSP外設(shè)模塊的低速時(shí)鐘(LSPCLK),要讓器件進(jìn)入低功耗工作模式,用戶可以將該位清零或復(fù)位。位11 SCIBENCLK 如置1,使能SCI-B外設(shè)模塊的低速時(shí)鐘(LSPCLK),要讓器件進(jìn)入低功耗工作模式,用戶可以將該位清零或復(fù)位。位10 SCIAENCLK如置1,使能SCI-A外設(shè)模塊的低速時(shí)鐘(LSPCLK),要讓器件進(jìn)入低功耗工作模式,用戶可以將該位清零或復(fù)位。位9 Reserved保留位位8 SPIAENCLK如置1,使能串行外設(shè)接口的低速時(shí)鐘(LSPCLK),要讓器件進(jìn)入低功耗工作模式,用戶可以將該位清零或復(fù)位。位7~4Reserved保留位位3 ADCENCLK如置1,使能模數(shù)轉(zhuǎn)換外設(shè)模塊的高速時(shí)(HSPCLK),要讓器件進(jìn)入低功耗工作模式,用戶可以將該位清零或復(fù)位。位2 Reserved保留位 位1 EVBENCLK如置1,使能事件管理EVB外設(shè)模塊的高速時(shí)鐘(HSPCLK),要讓器件進(jìn)入低功耗工作模式,用戶可以將該位清零或復(fù)位。位0 EVAENCLK如置1,使能事件管理EVA外設(shè)模塊的高速時(shí)鐘(HSPCLK),要讓器件進(jìn)入低功耗工作模式,用戶可以將該位清零或復(fù)位。153210ReservedHSPCLKR-0R/W-001位15~3 Reserved保留位2.高速外設(shè)時(shí)鐘寄存器(HISPCP)位2~0 HSPCLK配置與SYSCLKOUT相關(guān)的高速外設(shè)模塊時(shí)鐘(HSPCLK)頻率。000 高速時(shí)鐘=SYSCLKOUT/1001 高速時(shí)鐘=SYSCLKOUT/2(復(fù)位值)010 高速時(shí)鐘=SYSCLKOUT/4011 高速時(shí)鐘=SYSCLKOUT/6100 高速時(shí)鐘=SYSCLKOUT/8101 高速時(shí)鐘=SYSCLKOUT/10110 高速時(shí)鐘=SYSCLKOUT/12111 高速時(shí)鐘=SYSCLKOUT/14153210ReservedLSPCLKR-0R/W-010位15~3 Reserved保留位2.低速時(shí)鐘寄存器(LOSPCP)位2~0 LSPCLK配置與SYSCLKOUT相關(guān)的低速外設(shè)模塊時(shí)鐘(LSPCLK)頻率。000 低速時(shí)鐘=SYSCLKOUT/1001 低速時(shí)鐘=SYSCLKOUT/2010 低速時(shí)鐘=SYSCLKOUT/4(復(fù)位值)011 低速時(shí)鐘=SYSCLKOUT/6100 低速時(shí)鐘=SYSCLKOUT/8101 低速時(shí)鐘=SYSCLKOUT/10110 低速時(shí)鐘=SYSCLKOUT/12111 低速時(shí)鐘=SYSCLKOUT/1415

43

0ReservedDIVR-0R/W-0位15~4 Reserved保留位3.鎖相環(huán)控制寄存器(PLLCR)位3~0 DIV DIV位域控制是否旁路PLL,不旁路時(shí),用于設(shè)置PLL時(shí)鐘比率。0000 CLKIN=OSCCLK/2(PLL旁路)0001 CLKIN=(OSCCLK*1.0)/20010 CLKIN=(OSCCLK*2.0)/20011 CLKIN=(OSCCLK*3.0)/20100 CLKIN=(OSCCLK*4.0)/20101 CLKIN=(OSCCLK*5.0)/20110 CLKIN=(OSCCLK*6.0)/20111 CLKIN=(OSCCLK*7.0)/21000 CLKIN=(OSCCLK*8.0)/21001 CLKIN=(OSCCLK*9.0)/21010 CLKIN=(OSCCLK*10.0)/21011~1111 保留問(wèn)題如果要使系統(tǒng)時(shí)鐘為輸入時(shí)鐘的5倍頻,同時(shí)使能所有的外設(shè)時(shí)鐘,將高速外設(shè)的時(shí)鐘設(shè)置為系統(tǒng)時(shí)鐘的1/8,低速外設(shè)的時(shí)鐘設(shè)置為系統(tǒng)時(shí)鐘的1/10,應(yīng)該如何設(shè)置相關(guān)的寄存器?

PLLCR=0x000A;PCLKCR=0xFFFF;HISPCP=0x0004;LOSPCP=0x0005;3.3看門(mén)狗看門(mén)狗主要用來(lái)檢測(cè)軟件和硬件的運(yùn)行狀態(tài),當(dāng)內(nèi)部計(jì)數(shù)器溢出時(shí),將產(chǎn)生一個(gè)復(fù)位信號(hào)。為了避免產(chǎn)生不必要的復(fù)位,要求用戶定期對(duì)看門(mén)狗定時(shí)器進(jìn)行復(fù)位。如果不明的原因使CPU中斷程序,看門(mén)狗將產(chǎn)生一個(gè)復(fù)位信號(hào),使CPU復(fù)位,程序從系統(tǒng)軟件的開(kāi)始執(zhí)行。

看門(mén)狗有效地提高了系統(tǒng)的可靠性。程序監(jiān)視器

計(jì)數(shù)寄存器晶體振蕩器時(shí)鐘寬度程序監(jiān)視器

復(fù)位密鑰寄存器程序監(jiān)視器

控制寄存器程序監(jiān)視器復(fù)位信號(hào)系統(tǒng)控制和狀態(tài)寄存器程序監(jiān)視器中斷信號(hào)013.3.1看門(mén)狗的基本結(jié)構(gòu)或門(mén)3.3.2看門(mén)狗基本操作在看門(mén)狗8位加法計(jì)數(shù)器(WDCNTR)在WDCLK的時(shí)鐘下進(jìn)行加1計(jì)數(shù),計(jì)數(shù)達(dá)最大值時(shí)產(chǎn)生一個(gè)寬度512*OSCCLK的脈沖,使DSP復(fù)位。為了防止DSP復(fù)位1.禁止看門(mén)狗看門(mén)狗控制寄存器(WDCR)6位(WDDIS):看門(mén)狗使能位,寫(xiě)1無(wú)效,寫(xiě)0使能。5~3位(WDCHR):邏輯校驗(yàn)位,必須寫(xiě)1012~0位(WDPS):預(yù)定標(biāo)設(shè)置位。設(shè)置WDCLK時(shí)鐘。3.3.2看門(mén)狗基本操作

邏輯校驗(yàn)位(WDCHK):所有訪問(wèn)看門(mén)狗控制寄存器(WDCR)的寫(xiě)操作中,相應(yīng)的校驗(yàn)位(位5~3)必須是“101",否則將會(huì)拒絕訪問(wèn)并會(huì)立即觸發(fā)復(fù)位。

設(shè)置WDCLK時(shí)鐘:由WDCR寄存器的WDPS(2~0位)設(shè)置。看門(mén)狗的預(yù)定標(biāo)寄存器可以用來(lái)提高看門(mén)狗的計(jì)數(shù)溢出周期。2.周期性喂狗在WDCNTR溢出之前,通過(guò)軟件向WDKEY寫(xiě)0x55+0xAA時(shí),清除WDCNTR的值,使WDCNTR復(fù)位。寫(xiě)他任何值都會(huì)使系統(tǒng)復(fù)位。3.3.3看門(mén)狗寄存器1.看門(mén)狗控制寄存器WDCR看門(mén)狗控制寄存器的各位分配看門(mén)狗控制寄存器功能定義2.系統(tǒng)控制和狀態(tài)寄存器SCSR系統(tǒng)控制和狀態(tài)寄存器各位分配系統(tǒng)控制和狀態(tài)寄存器功能定義15870ReservedWDCNTRR-0R/W-0位15~8 Reserved保留位3.看門(mén)狗計(jì)數(shù)寄存器WDCNTR位7~0 WDCNTR 程序監(jiān)視器計(jì)數(shù)器的當(dāng)前值。8位計(jì)數(shù)器不斷地以WDCLK頻率增加。如果計(jì)數(shù)器上溢,則程序監(jiān)視器發(fā)出復(fù)位信號(hào)。如果寫(xiě)入了一個(gè)有效數(shù)據(jù)序列到WDKEY寄存器,則計(jì)數(shù)器復(fù)位到0。WDCLK頻率由WDCR寄存器配置。15870ReservedWDKEYR-0R/W-0位15~8Reserved保留位4.看門(mén)狗復(fù)位寄存器WDKEY位7~0WDKEY寫(xiě)入0x55后再寫(xiě)入0xAA將清零WDCNTR。寫(xiě)任何其它值都會(huì)立即使程序監(jiān)視器發(fā)出復(fù)位信號(hào)。讀取操作時(shí)返回WDCR寄存器值。3.3.4看門(mén)狗應(yīng)用

F2812上電后看門(mén)狗總是處于使能狀態(tài),如果不周期地控制看門(mén)狗就會(huì)觸發(fā)復(fù)位。因此,對(duì)于看門(mén)狗最簡(jiǎn)單的處理方法就是通過(guò)禁止位(WDDIS)禁止看門(mén)狗操作。但看門(mén)狗是系統(tǒng)穩(wěn)定運(yùn)行的一個(gè)保障,因此這種方法并不可取。在實(shí)際項(xiàng)目開(kāi)發(fā)過(guò)程中,一旦系統(tǒng)調(diào)試完畢獨(dú)立運(yùn)行就加入看門(mén)狗這個(gè)安全機(jī)制,從而保證系統(tǒng)的正常運(yùn)行。

//一一一一一一一一一一一一一一一一一一一一一一//看門(mén)狗應(yīng)用實(shí)例:Example28xWatchdog.c//一一一一一一一一一一一一一一一一一一一一一一//看門(mén)狗直接連接到PIE模塊的WAKEINT中斷,允許將CPU從掉電模式喚醒//程序代碼放在一個(gè)無(wú)限循環(huán)中,用戶可以選擇使用KickDog函數(shù)操作看門(mén)狗key寄存器//如果使用KickDog函數(shù)操作看門(mén)狗key寄存器,將不會(huì)產(chǎn)生WAKEINT中斷//如果不對(duì)key寄存器操作,將會(huì)產(chǎn)生WAKEINT中斷//觀察變量//LoopCount—無(wú)限循環(huán)次數(shù)計(jì)數(shù)//WakeCount—產(chǎn)生WAKEINT的中斷次序//Step0、包含需要的頭文件//DSP28_Device.h;采用#include包含器件使用的頭文件//DSP28_Example.h;本例程需要的特定的頭文件#include"DSP28_Device.h"http://函數(shù)原型聲明interruptvoidwakeint_isr(void);//全局變量聲明Uint32WakeCount;Uint32LoopCount;

voidmain(void){//Step1、初始化系統(tǒng)控制寄存器、PLL、看門(mén)狗、時(shí)鐘位默認(rèn)狀態(tài)//該函數(shù)在后面的DSP28_SysCtrl.c文件中查找InitSysCtrl();//Step2、GPI0初始化//InitGpio();//Step3、初始化中斷向量表(PIE向量表)//相應(yīng)中斷相量表請(qǐng)?jiān)谙旅娴腄SP28_DefaultIsr.c文件中查找//禁止和清除所有CPU中斷DINT;IER=0x0000;IFR=0x0000;//初始化PIE控制寄存器,參考DSP28_PieCtrl.c文件InitPieVectTable();//Step4、初始化外設(shè)//InitPeripherals();//Step5、用戶特定函數(shù),重新分配向量(可選擇),使能中斷//重新為WAKEINT分配PIE向量,并指向相應(yīng)的中斷服務(wù)程序EALLOW;PieVectTable.WAKEINT=&wakeint_isr;EDIS;//使能WAKEINT的中斷工INT1IER|=M_NT1;//使能WAKEINT:位于PIE的組1的第8中斷PieCtrlRegs.PIEIER1.bit.INTxB=1;//對(duì)整個(gè)程序狀態(tài)寄存器進(jìn)行操作,避免清除WDOVERRIDE標(biāo)識(shí)位EALLOW;SysCtrlRegs.SCSR.a11=BIT1;//#defineBIT10x0002EDIS;//計(jì)數(shù)器清零WakeCount=0;//中斷計(jì)數(shù)LoopCount=0;//循環(huán)計(jì)數(shù)//使能全局中斷,并配置位real一timedebug模式EINT;//使能全局中斷INTMERTM;//使能全局realtime中斷DBGM//Step6、主循環(huán)for(;;){LoopCount++;//使用KickDog操作看門(mén)狗Key寄存器,避免產(chǎn)生WAKEINT中斷//通常情況下為了保證程序正常運(yùn)行,需要在主程序循環(huán)或定時(shí)中斷服務(wù)程序中對(duì)Key進(jìn)行操作//KickDog();}}//Step7、中斷服務(wù)程序interruptvoidwakeint_isr(void){WakeCount++;//響應(yīng)中斷

PieCtrlRegs.PIEACK.a11=PIEACK_GROUP1;}//系統(tǒng)初始化voidInitSysCtrl(void){{Uint16i;EALLOW;//禁止看門(mén)狗模塊

//SysCtrlRegs.WDCR=0x0068;//本例中不使用

//初始化鎖相環(huán)

SysCtrlRegs.PLLCR=0xA;//等待鎖相環(huán)穩(wěn)定

for(i=0;i<5000;i++){}//HISPCP/LOSPCP預(yù)定標(biāo)寄存器設(shè)置

SysCtrlRegs.HISPCP.a11=0x0001;SysCtrlRegs.LOSPCP.a11=0x0002;//使能選擇的外設(shè)時(shí)鐘

//對(duì)于不用的時(shí)鐘,一般情況下為了降低功耗,提高系統(tǒng)的穩(wěn)定性,須禁止相應(yīng)的中斷

SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;SysCtrlRegs.PCLKCR.bit.SCIENCLKA=1;//SysCtrlRegs.PCLKCR.bit.SCIENCLKH=1;EDIS;}//一一一一一一一一一一一一一一一一一一一//KickDog;//一一一一一一一一一一一一一一一一一一一//該函數(shù)復(fù)位看門(mén)狗定時(shí)器voidKickDog(void){EALLOW;SysCtrlRegs.WDKEY=0x0055;SysCtrlRegs.WDKEY=Ox00AA;EDIS;}3.4CPU定時(shí)器3.4.1定時(shí)器基本操作F2810和F2812器件上有3個(gè)32位的CPU定時(shí)器:

TIMER0;

TIMER1;

TIMER2。定時(shí)器1定時(shí)器2CPU定時(shí)器0用戶可以使用。用于實(shí)時(shí)操作系統(tǒng)(RTOS)注:CPU定時(shí)器與事件管理模塊(EVA,EVB)中的通用(GP)定時(shí)器是不同的?;蚧蚺c或CPU定時(shí)器功能框圖工作過(guò)程:計(jì)算定時(shí)時(shí)間,給周期寄存器PRDH:PRD賦值。啟動(dòng)定時(shí)器時(shí),PRDH:PRD的值裝載進(jìn)計(jì)數(shù)寄存器TIMH:TIM,每TIMCLK計(jì)數(shù)寄存器減1,直至計(jì)數(shù)為0,產(chǎn)生中斷信號(hào)。一個(gè)周期后,PRDH:PRD的值重新裝入TIMH:TIM進(jìn)行減1計(jì)數(shù)。定時(shí)時(shí)間:(PRDH:PRD+1)*TIMCLK若處理器采用30MHz的外部時(shí)鐘,經(jīng)過(guò)鎖相環(huán)10/2倍頻后,系統(tǒng)的時(shí)鐘工作在150MHz。定時(shí)器選擇SYSCLKOUT作為定時(shí)器時(shí)鐘,工作頻率也是150MHz。一旦定時(shí)器被使能(TCR-Bit4=0)先給分頻器TDDRH:TDDR賦值,后裝載進(jìn)預(yù)定標(biāo)器PSCH:PSC,每SYSCLKOUT脈沖,PSCH:PSC的值減1,直至計(jì)數(shù)為0,輸出一個(gè)TIMCLK。下一個(gè)時(shí)鐘周期開(kāi)始前TDDRH:TDDR重新載入PSCH:PSC。

TIMCLK=(TDDRH:TDDR+1)*SYSCLKOUT計(jì)算一下:假設(shè)系統(tǒng)時(shí)鐘SYSCLKOUT為x(MHZ)TIMH:TIM計(jì)數(shù)器每減1,時(shí)間:TIMCLK=(TDDRH:TDDR+1)/xCpu定時(shí)器定時(shí)時(shí)間:T=(TDDRH:TDDR+1)*(PRDH:PRD+1)/x定時(shí)時(shí)間到,定時(shí)器向cpu發(fā)送中斷請(qǐng)求。定時(shí)器中斷結(jié)構(gòu)寄存器地址長(zhǎng)度(×16位)描述TIMER0TIM0x0C001CPU定時(shí)器0,計(jì)數(shù)寄存器TIMER0TIMH0x0C011CPU定時(shí)器0,計(jì)數(shù)寄存器高位字TIMER0PRD0x0C021CPU定時(shí)器0,周期寄存器TIMER0PRDH0x0C031CPU定時(shí)器0,周期寄存器高位字TIMER0TCR0x0C041CPU定時(shí)器0,控制寄存器保留0x0C051TIMER0TPR0x0C061CPU定時(shí)器0,前定標(biāo)寄存器TIMER0TPRH0x0C071CPU定時(shí)器0,前定標(biāo)寄存器高位字TIMER1TIM0x0C081CPU定時(shí)器1,計(jì)數(shù)寄存器TIMER1TIMH0x0C091CPU定時(shí)器1,計(jì)數(shù)寄存器高位字TIMER1PRD0x0C0A1CPU定時(shí)器1,周期寄存器3.4.2定時(shí)器寄存器定時(shí)器配置和控制寄存器

寄存器地址長(zhǎng)度(×16位)描述TIMER1PRDH0x0C0B1CPU定時(shí)器1,周期寄存器高位字TIMER1TCR0x0C0C1CPU定時(shí)器1,控制寄存器保留0x0C0D1TIMER1TPR0x0C0E1CPU定時(shí)器1,前定標(biāo)寄存器TIMER1TPRH0x0C0F1CPU定時(shí)器1,前定標(biāo)寄存器高位字TIMER2TIM0x0C101CPU定時(shí)器2,計(jì)數(shù)寄存器TIMER2TIMH0x0C111CPU定時(shí)器2,計(jì)數(shù)寄存器高位字TIMER2PRD0x0C121CPU定時(shí)器2,周期寄存器TIMER2PRDH0x0C131CPU定時(shí)器2,周期寄存器高位字TIMER2TCR0x0C141CPU定時(shí)器2,控制寄存器保留0x0C151TIMER2TPR0x0C161CPU定時(shí)器2,前定標(biāo)寄存器TIMER2TPRH0x0C171CPU定時(shí)器2,前定標(biāo)寄存器高位字保留0x0C18~0x0C3F40TIMERxTCR寄存器(x=0,1,2)15141312111098TIFTIEReservedFREESOFTReservedR/W-0R/W-0R-0R/W-0R/W-0R-0765430ReservedTRBTSSReservedR-0R/W-0R/W-0R-0位13~12 Reserved保留位位9~6 Reserved保留位位3~0 Reserved保留位位15 TIF CPU定時(shí)器中斷標(biāo)志位。當(dāng)定時(shí)器減到0時(shí),置位該標(biāo)志。該位可以通過(guò)程序?qū)懭?清零,但是它只能由定時(shí)器計(jì)數(shù)到0時(shí)置位。向該位寫(xiě)入0無(wú)效。位14 TIE CPU定時(shí)器中斷使能位。如果定時(shí)器減到0,并且該位置1,則定時(shí)器將產(chǎn)生中斷請(qǐng)求。如果FREE位為1,則在軟件斷點(diǎn)時(shí),定時(shí)器繼續(xù)運(yùn)行(也就是自由運(yùn)行)。在此情況下,不管SOFT的狀態(tài)。如果FREE為0,則SOFT將起作用。如果SOFT=0,則定時(shí)器停止下一次TIMH:TIM減計(jì)數(shù)。如果SOFT=1,則當(dāng)TIMH:TIM減計(jì)數(shù)到0時(shí),定時(shí)器停止。位11FREE位10SOFT這兩位是專(zhuān)門(mén)的仿真位,決定了在高級(jí)語(yǔ)言仿真中遇到斷點(diǎn)時(shí)定時(shí)器的狀態(tài)。CPU定時(shí)器仿真模式位。FREE SOFT 定時(shí)器仿真模式0 0 在TIMH:TIM的下一次減 計(jì)數(shù)后停止(硬件停止)0 1 在TIMH:TIM減計(jì)數(shù)到0后 停止(軟件停止)1 0 自由運(yùn)行1 1 自由運(yùn)行注:在前面的軟件停止模式中,定時(shí)器在關(guān)閉之前會(huì)產(chǎn)生一個(gè)中斷(因?yàn)榈竭_(dá)0滿足中斷的產(chǎn)生條件)。位5 TRB CPU定時(shí)器重裝載位。向TRB位寫(xiě)入1時(shí),TIMH:TIM將重新裝載PRDH:PRD中的值,前定標(biāo)分頻計(jì)數(shù)器(PSCH:PSC)重新裝載定時(shí)器分頻值寄存器(TDDRH:TDDR)中的值。讀TRB位時(shí),值為0。位4 TSS CPU定時(shí)器停止?fàn)顟B(tài)位。TSS為停止或起動(dòng)定時(shí)器的一個(gè)標(biāo)志位。 向TSS寫(xiě)入1,將會(huì)停止定時(shí)器; 寫(xiě)入0將會(huì)起動(dòng)或重新開(kāi)始定時(shí)器。 復(fù)位時(shí),TSS清零,定時(shí)器立即起動(dòng)。定時(shí)器預(yù)定標(biāo)寄存器TIMERxTPR(x=0,1,2)15870PSCTDDRR-0R/W-0位15~8 PSC CPU定時(shí)器前定標(biāo)分頻計(jì)數(shù)器。保存定時(shí)器的當(dāng)前前分頻計(jì)數(shù)值。對(duì)于每一個(gè)定時(shí)器時(shí)鐘源周期,PSCH:PSC值大于0,PSCH:PSC減1計(jì)數(shù)。在PSCH:PSC到0之后的一個(gè)定時(shí)器時(shí)鐘周期(定時(shí)器預(yù)分頻器的輸出),PSCH:PSC重新裝載TDDRH:TDDR的值,而定時(shí)器計(jì)數(shù)器(TIMH:TIM)減1。當(dāng)軟件置定時(shí)器重裝載位(TRB)為1時(shí),也會(huì)重裝載PSCH:PSC。PSCH:PSC可以通過(guò)讀該寄存器來(lái)檢查,但是它不能直接被設(shè)置。它必須從定時(shí)器分頻值寄存器(TDDRH:TDDR)中取值。復(fù)位時(shí),PSCH:PSC為0。位7~0 TDDR CPU定時(shí)器分頻位域。每(TDDRH:TDDR+1)個(gè)定時(shí)器時(shí)鐘源周期,定時(shí)器計(jì)數(shù)寄存器(TIMH:TIM)減1。復(fù)位時(shí),TDDRH:TDDR位為0。為了以整數(shù)因子增加所有計(jì)數(shù)器計(jì)數(shù),寫(xiě)該因子減1的數(shù)到TDDRH:TDDR位。當(dāng)前分頻計(jì)數(shù)器(PSCH:PSC)值為0時(shí),一個(gè)定時(shí)器時(shí)鐘周期后,TDDRH:TDDR重新裝載PSCH:PSC的值,TIMH:TIM減1。當(dāng)軟件置定時(shí)器重裝載位(TRB)為1時(shí),TDDRH:TDDR也重新裝載到PSCH:PSC。15870PSCHTDDRHR-0R/W-0定時(shí)器預(yù)定標(biāo)寄存器TIMERxTPRH(x=0,1,2)TIMERxTIM寄存器(x=0,1,2)150TIMR/W-0位15~0 TIMCPU定時(shí)器計(jì)數(shù)寄存器(TIMH:TIM)。TIM寄存器:保存定時(shí)器的當(dāng)前32位計(jì)數(shù)值的低16位。TIMH寄存器保存定時(shí)器的當(dāng)前32位計(jì)數(shù)值的高16位。TIMH:TIM每(TDDRH:TDDR+1)個(gè)時(shí)鐘減1。TDDRH:TDDR為定時(shí)器前定標(biāo)分頻值。當(dāng)TIMH:TIM減到0時(shí),TIMH:TIM寄存器重新裝載PRDH:PRD寄存器保存的周期值,并產(chǎn)生定時(shí)器中斷信號(hào)()。150TIMHR/W-0位15~0 TIMHTIMERxTIMH寄存器(x=0,1,2)150PRDR/W-0位15~0 PRD定時(shí)器周期寄存器(PRDH:PRD)。TIMERxPRD寄存器(x=0,1,2)

PRD寄存器:保存32位周期值的低16位。PRDH寄存器保持32位周期值的高16位。當(dāng)TIMH:TIM減到0時(shí),在下一個(gè)定時(shí)器輸入時(shí)鐘(預(yù)分頻器的輸出)開(kāi)始時(shí),TIMH:TIM寄存器重新裝載PRDH:PRD寄存器中的周期值。當(dāng)定時(shí)器控制寄存器(TCR)中的定時(shí)器重裝載位(TRB)置位時(shí),PRDH:PRD的值也將裝載到TIMH:TIM。150PRDHR/W-0位15~0 PRDHTIMERxPRDH寄存器(x=0,1,2)

3.4.5定時(shí)器中斷應(yīng)用舉例定時(shí)器中斷的例程文件結(jié)構(gòu)如圖所示。========//文件名稱:Example_281xCpuTimer.c//功能描述:采用CPUTimer0定時(shí),在定時(shí)器中斷服務(wù)程序中//記錄中斷的次數(shù)//觀察的變量:CpuTimer0.InterruptCount#include"DSP281xDevice.h"http://DSP281xHeaderfileIncludeFile#include"DSP281x_Examples.h"http://DSP281xExamplesIncludeFile//函數(shù)聲明interruptvoidcpu_timer0_isr(void);voidmain(void){//Step1、初始化系統(tǒng)控制寄存器、PLL、看門(mén)狗、時(shí)鐘位默認(rèn)狀態(tài)//該函數(shù)在后面的DSP28_SysCtrl.c文件中查找

InitSysCtrl();//Step2,GPIO初始化(本例中不使用)//InitGpio();//Step3、清除所有中斷并初始化PIE中斷向量表,禁止所有CPU中斷

DINT;//初始化PIE控制寄存器為其默認(rèn)狀態(tài)(所有PIE中斷被禁止并且標(biāo)志被清除)InitPieCtrl();//禁止所有CPU中斷并清除所有中斷標(biāo)志

IER=0x0000;IFR=0x0000;//初始化PIE控制寄存器,參考DSP28_PieCtrl.c文件

InitPieVectTable();//將本例程所使用的中斷向量重新映射,使其指向中斷服務(wù)相應(yīng)的程序

EALLOW;PieVectTable.TINT0=&cpu_timer0_isr;EDIS;//Step4、初始化所有外設(shè)(本例中不需要)//InitPeripherals();InitCpuTimers();//在本例程中僅初始化Cpu定時(shí)器//配置CPU–Timer0每間隔1s產(chǎn)生1次中斷//150MHzCPU頻率,周期為1s(采用us的形式描述)ConfigCpuTimer(&CpuTimer0,100,1500000);StartCpuTimer0();//Step5、用戶特定代碼,使能中斷//使能連接到CPU–Timer0的CPUINT1IER|=M_INT1;//使能位于PIE中的組1的第7個(gè)中斷TINT0PieCtrlRegs.PIEIER1.bit.INTx7=1;//使能全局中斷,并配置為real-timedebug模式

EINT;//使能全局中斷INTMERTM;//使能全局實(shí)時(shí)中斷DBGM//Step6、IDLEloop等待產(chǎn)生中斷

for(;;);}interruptvoidcpu_timer0_isr(void){CpuTimer0.InterruptCount++;//響應(yīng)中斷并準(zhǔn)備接收更多的中斷

PieCtrlRegs.PIEACK.a11=PIEACKGROUP1;}========//文件名稱:DSP281x_CpuTimers.c//功能描述:DSP281xCPU32位定時(shí)器初始化及相關(guān)函數(shù)//#include"DSP281x_Device.h"http://包含的DSP281x頭文件#include"DSP281x_Examples.h"http://DSP281xExamples頭文件structCPUTIMER_VARSCpuTimer0;//CpuTimer1的CpuTimer2保留,由DSPBIOS及其他RTOS使用//structCPUTIMER_VARSCpuTimer1;//structCPUTIMER_VARSCpuTimer2;//初始化CPU定時(shí)器//該函數(shù)將3個(gè)定時(shí)器初始化為一個(gè)確定的狀態(tài)voidInitCpuTimers(void){//CPUTimer0//初始化各自定時(shí)器的寄存器指向相應(yīng)的地址

CpuTimer0.RegsAddr=&CpuTimer0Regs;//初始化定時(shí)器周期為最大值

CpuTimer0Regs.PRD.all=0xFFFFFFFF;//初始化預(yù)定標(biāo)計(jì)數(shù)器,分頻系數(shù)為1(時(shí)鐘:SYSCLKOUT)CpuTimer0Regs.TPR.all=0;CpuTimer0Regs.TPRH.all=0;//確認(rèn)定時(shí)器處于停止計(jì)數(shù)狀態(tài)

CpuTimer0Regs.TCR.bit.TSS=1;//使用周期寄存器的值裝載定時(shí)器計(jì)數(shù)寄存器

CpuTimer0Regs.TCR.bit.TRB=1;//復(fù)位中斷計(jì)數(shù)標(biāo)量InterruptCount=0CpuTimer0.InterruptCount=0;//CpuTimer1的CpuTimer2為DSPBIOS及其他RTOS保留//因此相應(yīng)的定時(shí)器初始化代碼被注釋//初始化各自定時(shí)器的寄存器指向相應(yīng)的地址//CpuTimer1.RegsAddr=&CpuTimer1Regs;//CpuTimer2.RegsAddr=&CpuTimer2Regs;//初始化定時(shí)器周期為最大值//CpuTimer1Regs.PRD.all=0xFFFFFFFF;//CpuTimer2Regs.PRD.all=0xFFFFFFFF;//確認(rèn)定時(shí)器處于停止計(jì)數(shù)狀態(tài)//CpuTimer1Regs.TCR.bit.TSS=1;//CpuTimer2Regs.TCR.bit.TSS=1;//使用周期寄存器的值裝載定時(shí)器計(jì)數(shù)寄存器//CpuTimer1Regs.TCR.bit.TRB=1;//CpuTimer2Regs.TCR.bit.TRB=1;//復(fù)位中斷計(jì)數(shù)標(biāo)量//CpuTimer1.InterruptCount=0;//CpuTimer2.InterruptCount=0;}//配置CPU定時(shí)器函數(shù)//該函數(shù)初始化指定定時(shí)器的周期和頻率voidConfigCpuTimer(structCPUTIMFR_VARS*Timer,floatFreq,floatPeriod){Uint32temp;//初始化周期

Timer->CPUFreqInMHz=Freq;Timer->PeriodInUSec=Period;temp=(long)(Freq*Period);Timer->RegsAddr->PRD.all=temp;//設(shè)置預(yù)定標(biāo)參數(shù)(SYSCLKOUT):Timer->RegsAddr->TPR.all=0;Timer->RegsAddr->TPRH.all=0;//初始化定時(shí)器控制寄存器Timer->RegsAddr->TCR.bit.TSS=1;//1=Stoptimer,0=Start/RestartTimerTimer->RegsAddr->TCR.bit.TRB=1;//1=reloadtimerTimer->RegsAddr->TCR.bit.SOFT=1;Timer->RegsAddr->TCR.bit.FREE=1;//TimerFreeRunTimer->RegsAddr->TCR.bit.TIE=1;//0=Disable/1=EnableTimerInterrupt//復(fù)位中斷計(jì)數(shù)Timer->InterruptCount=0;}3.5通用I/O3.5.1功能概述

F28x系列有56個(gè)獨(dú)立可編程復(fù)用的通用I/O(GPIO)引腳。其中絕大部分是通用I/O和專(zhuān)用功能復(fù)用引腳。通常情況下,TMS320F2812的大多數(shù)I/O引腳都用作專(zhuān)用功能引腳。F28x模塊圖通用I/O或?qū)S霉δ軘?shù)字量I/O端口模塊采用了一種靈活的配置方法控制復(fù)用引腳的功能:

GPIOMux功能選擇寄存器用來(lái)選擇F281x和C281x器件的引腳操作模式,可以通過(guò)該寄存器獨(dú)立設(shè)置每個(gè)引腳的功能(數(shù)字量I/O或外設(shè)專(zhuān)用I/O)。如果選擇數(shù)字量I/O模式,可以通過(guò)GPxDIR方向控制寄存器配置數(shù)字量I/O的方向,并通過(guò)輸入限定控制寄存器GPxQUAL進(jìn)一步消除數(shù)字量I/O引腳的噪聲信號(hào)。此外,處理器提供GPxSET和GPxCLEAR寄存器對(duì)數(shù)字量進(jìn)行置位或清零,還可以通過(guò)GPxDAT寄存器獨(dú)立讀/寫(xiě)I/O信號(hào)。3.5.2端口配置

TMS320F2812DSP對(duì)所有數(shù)字量I/O進(jìn)行分組,每組作為一個(gè)端口,分別是GPIO—A、B、D、E、F和G。A、B組各16個(gè),D組4個(gè),E組3個(gè),F(xiàn)組15個(gè),G組2個(gè)。

C28x的絕大多數(shù)引腳內(nèi)部都連接多個(gè)功能單元,但并不是所有功能單元都能同時(shí)工作。也就是說(shuō),一個(gè)物理引腳可以有多種不同的功能??梢酝ㄟ^(guò)軟件進(jìn)行功能設(shè)置,但在某一時(shí)刻只能用作一種功能。TMS320F2812復(fù)用引腳功能對(duì)照

TMS320F2812復(fù)用引腳功能對(duì)照

GPIO控制寄存器

所有GPIO端口由各自的GPxMUX復(fù)用寄存器控制,控制位設(shè)置為0時(shí),相應(yīng)引腳作為通用數(shù)字量I/O使用;設(shè)置為1時(shí),相應(yīng)引腳作為專(zhuān)用引腳使用。

EALLOW;GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=1;//將PWM1引腳設(shè)置為PWM波的輸出引腳GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=0;//將PWM1引腳設(shè)置為通用數(shù)字I/O口EDIS;

當(dāng)設(shè)置為數(shù)字量I/O功能時(shí),寄存器GPxDIR確定I/O端口的方向:控制位清零引腳配置為數(shù)字量輸入;置1配置為數(shù)字量輸出。

GpioMuxRegs.GPADIR.bit.GPIOA0=0;//輸入引腳端口A、B、D、E作為數(shù)字量輸入端口時(shí)具有輸入量化功能,使用該功能時(shí),輸入脈沖必須達(dá)到一定的時(shí)鐘周期長(zhǎng)度才被認(rèn)為是有效的輸入信號(hào),否則將被忽略。用戶可以定義量化時(shí)間長(zhǎng)度以消除不必要的干擾信號(hào)。GPxQUAL:輸入限定控制寄存器15~8:系統(tǒng)保留7~0:QUALPRD,指定受限制的輸入周期采樣

0x00無(wú)限制,與SYSCLKOUT同步

0x01QUALPRD=2個(gè)SYSCLKOUT周期

0x02QUALPRD=4個(gè)SYSCLKOUT周期 … 0xffQUALPRD=2*255個(gè)SYSCLKOUT周期復(fù)用功能引腳圖

處理器中GPIO內(nèi)部結(jié)構(gòu)圖1:指MGPxUX的值為1,0:指GPxMUX的值為0。3.5.3數(shù)字量I/O寄存器及其應(yīng)用

F2812處理器的所有外設(shè)寄存器全部分組為外設(shè)幀PF0、PF1和PF2,這些幀都映射到處理器的數(shù)據(jù)區(qū)。

外設(shè)幀PF0包括控制訪問(wèn)內(nèi)部Flash和SARAM速度的控制寄存器;

外設(shè)幀PF1包括絕大部分外設(shè)控制寄存器;

外設(shè)幀PF2主要用于CAN模塊的控制寄存器。外設(shè)幀存儲(chǔ)空間映射關(guān)系數(shù)字量控制寄存器1I/O復(fù)用寄存器及其應(yīng)用GPIO復(fù)用控制寄存器名稱地址空間大?。ā?6)寄存器功能描述GPAMUX0x70C01GPIOA復(fù)用控制寄存器GPADIR0x70C11GPIOA方向控制寄存器GPAQUAL0x70C21GPIOA輸入量化控制寄存器保留0x70C31GPBMUX0x70C41GPIOB復(fù)用控制寄存器GPBDIR0x70C51GPIOB方向控制寄存器GPBQUAL0x70C61GPIOB輸入量化控制寄存器保留0x70C7~0x70CB5名稱地址空間大小(×16)寄存器功能描述GPDMUX0x70CC1GPIOD復(fù)用控制寄存器GPDDIR0x70CD1GPIOD方向控制寄存器GPDQUAL0x70CE1GPIOD輸入量化控制寄存器保留0x70CF1GPEMUX0x70D01GPIOE復(fù)用控制寄存器GPEDIR0x70D11GPIOE方向控制寄存器GPEQUAL0x70D21GPIOE輸入量化控制寄存器保留0x70D31GPFMUX0x70D41GPIOF復(fù)用控制寄存器GPFDIR0x70D51GPIOF方向控制寄存器保留0x70D61保留0x70D71GPGMUX0x70D81GPIOG復(fù)用控制寄存器GPGDIR0x70D91GPIOG方向控制寄存器保留0x70DA~0x70DF6采用C/C++編程,GPIO復(fù)用寄存器的結(jié)構(gòu)體定義(在DSP281x_Gpio.h中)StuctGPIO_MUX_REGS{ union GPAMUX_REG GPAMUX; union GPADIR_REG GPADIR; unionGPAQUAL_REG GPAQUAL;Uint16 rsvd1; unionGPBMUX_REG GPBMUX; unionGPBDIR_REG GPBDIR; unionGPBQUAL_REG GPBQUAL; Uintl6 rsvd2[5]; unionGPDMUX_REG GPDMUX; unionGPDDIR_REG GPDDIR; unionGPDQUAL_REG GPDQUAL; Uintl6 rsvd3;

union GPEMUX_REGGPEMUX; union GPEDIR_REGGPEDIR; unionGPEQUAL_REGGPEQUAL; Uintl6 rsvd4; unionGPFMUX_REGGPFMUX; unionGPFDIR_REGGPFDIR; Uintl6 rsvd5[2]; unionGPGMUX_REGGPGMUX; unionGPGDIR_REGGPGDIR; Uintl6 rsvd6[2];};用結(jié)構(gòu)體定義后,對(duì)外部引腳進(jìn)行初始化操作。voidGpio_select(void){Uint16var1;Uint16var2;Uint16var3;//設(shè)置GPIOMux寄存器,使相關(guān)I/O工作在GPIO模式

var1=0x0000;//設(shè)置GPIODIR寄存器,使相關(guān)I/O工作在GPIO輸出模式

var2=0xFFFF;var3=0x0000;//配置量化功能EALLOW;GpioMuxRegs.GPAMUX.all=var1;GpioMuxRegs.GPBMUX.all=var1;GpioMuxRegs.GPDMUX.all=var1;GpioMuxRegs.GPFMUX.all=var1;GpioMuxRegs.GPEMUX.all=var1;GpioMuxRegs.GPGMUX.all=var1;//GPIOPORT配置為輸出GpioMuxRegs.GPADIR.all=var2;GpioMuxRegs.GPBDIR.all=var2;GpioMuxRegs.GPDDIR.all=var2;GpioMuxRegs.GPDDIR.all=var2;GpioMuxRegs.GPEDIR.all=var2;GpioMuxRegs.GPFDIR.all=var2;GpioMuxRegs.GPGDIR.all=var2;//配置量化器的值GpioMuxRegs.GPAQUAL.all=var3;GpioMuxRegs.GPBQUAL.all=var3;GpioMuxRegs.GPDQUAL.all=var3;GpioMuxRegs.GPEQUAL.all=var3;EDIS;}

由于引腳的輸出緩沖直接連接到輸入緩沖,當(dāng)前GPIO引腳上的任何信號(hào)都會(huì)同時(shí)傳送到外設(shè)模塊。

因此當(dāng)一個(gè)引腳配置為普通的數(shù)字I/O時(shí),必須禁止相應(yīng)的能產(chǎn)生中斷的外設(shè)模塊功能,否則可能產(chǎn)生意外的中斷。

由于所有多功能復(fù)用引腳都可以通過(guò)相應(yīng)的控制寄存器的位獨(dú)立配置,因此在使用時(shí)需要詳細(xì)了解各GPIO引腳對(duì)應(yīng)的控制位。表給出相關(guān)寄存器位對(duì)應(yīng)的被控引腳,并以C語(yǔ)言編程的結(jié)構(gòu)體定義為例給出了采用C/C++編程時(shí)的定義方法。以GPIOA復(fù)用為例介紹位結(jié)構(gòu)定義。表7.3GPIOA復(fù)用引腳功能分配表//GPIOA功能復(fù)用控制寄存器位結(jié)構(gòu)定義structGPAMUX_BITS{//位功能描述

Uint16PWM1_GPIOA0:1;//0 Uint16PWM2_GPIOA1:1;//1 Uint16PWM3_GPIOA2:1;//2 Uint16PWM4_GPIOA3:1;//3 Uint16PWMS_GPIOA4:1;//4 Uint16PWM6_GPIOA5:1;//5 Uint16T1PWM_GPIOA6:1;//6 Uint16T2PWM_GPIOA7:1;//7 Uint16CAP1Q1_GPIOA8:1;//8 Uint16CAP2Q2_GPIOA9:1;//9 Uint16CAP3QI1_GPIOA10:1;//10 Uint16TDIRAGPIOA11:1;//11 Uint16TCLKINA_GPIOA12:1;//12 Uint16C1TRIP_GPIOA13:1;//13 Uint16C2TRIP_GPIOA14:1;//14 Uint16C3TRIP_GPIOA15:1;//15例:點(diǎn)亮LED的實(shí)驗(yàn)。

6個(gè)貼片LED由GPIOF端口的GPIOF8~GPIOF13直接驅(qū)動(dòng)。令6個(gè)貼片LED中的DS2、4、6點(diǎn)亮,DS1、3、5熄滅。試編寫(xiě)程序。源程序編寫(xiě)如下:/***************************************************功能描述:令6個(gè)貼片LED中的2、4、6點(diǎn)亮,1、3、5熄滅***************************************************/#include"DSP28_Device.h"voidIOinit(){ EALLOW; //將GPIOF8~GPIOF13配置為一般I/O端口,輸出

GpioMuxRegs.GPFMUX.all=0xc0ff;GpioMuxRegs.GPFDIR.all=0x3f00; EDIS;}voidmain(void){InitSysCtrl();//系統(tǒng)初始化子程序,在DSP28_sysctrl.c中

DINT;//關(guān)閉總中斷

IER=0x0000;//關(guān)閉外設(shè)中斷

IFR=0x0000;//清中斷標(biāo)志

IOinit(); //I/O初始化子程序

while(1) { GpioDataRegs.GPFDAT.all=0xd500; }}注意:在CCS3.1的項(xiàng)目中應(yīng)包含以下文件:庫(kù)文件rts2800.lib;命令文件EzDSP_RAM_lnk.cmd;所有的*.h頭文件;C文件:DSP28_GlobalVariableDefs.c,DSP28_SysCtrl.c。2I/O數(shù)據(jù)寄存器及其應(yīng)用如果復(fù)用引腳配置為數(shù)字I/O模式,則可以直接利用數(shù)據(jù)寄存器對(duì)I/O操作(讀/寫(xiě)),也以利用其他輔助寄存器對(duì)各I/O進(jìn)行獨(dú)立操作,如數(shù)字I/O置位(GPxSET寄存器)、數(shù)字I/O清零(GPxCLEAR寄存器)及數(shù)字I/O電平轉(zhuǎn)換(GPxTOGGLE寄存器),如表所列。2I/O數(shù)據(jù)寄存器及其應(yīng)用數(shù)據(jù)寄存器(GPxDAT):I/O設(shè)成輸入,引腳有信號(hào)輸入,讀GPxDAT的值,可以讀引腳的高低電位。I/O設(shè)成輸出,寫(xiě)入GPxDAT的值,可以輸出高低電位。置位寄存器(GPxSET):把寄存器內(nèi)容置1清零寄存器(GPxCLEAR):把寄存器內(nèi)容清0取反寄存器(GPxTOGGLE):把寄存器內(nèi)容取反2I/O數(shù)據(jù)寄存器及其應(yīng)用只能寫(xiě),任何讀操作都返回0。只能寫(xiě)1,寫(xiě)0無(wú)效GpioDataRegs.GPADAT.bit.GPIOA0=0;GpioDataRegs.GPACLEAR.bit.GPIOA0=1;GpioDataRegs.GPATOGGLE.bit.GPIOA0=1;名稱地址空間大?。ā?6位)寄存器功能描述GPADAT0x70E01GPIOA數(shù)據(jù)寄存器GPASET0x70E11GPIOA置位寄存器GPACLEAR0x70E21GPIOA清零寄存器GPATOGGLE0x70E31GPIOA單獨(dú)觸發(fā)寄存器GPBDAT0x70E41GPIOB數(shù)據(jù)寄存器GPBSET0x70E51GPIOB置位寄存器GPBCLEAR0x70E61GPIOB清零寄存器GPBTOGGLE0x70E71GPIOB單獨(dú)觸發(fā)寄存器保留0x70E8~0x70EB4GPDDAT0x70EC1GPIOD數(shù)據(jù)寄存器GPDSET0x70ED1GPIOD置位寄存器GPDCLEAR0x70EE1GPIOD清零寄存器GPDTOGGLE0x70EF1GPIOD單獨(dú)觸發(fā)寄存器GPIO數(shù)據(jù)控制寄存器名稱地址空間大?。ā?6位)說(shuō)明GPEDAT0x70F01GPIOE數(shù)據(jù)寄存器GPESET0x70F11GPIOE置位寄存器GPECLEARL0x70F21GPIOE清零寄存器GPETOGGLE0x70F31GPIOE單獨(dú)觸發(fā)寄存器GPFDAT0x70F41GPIOF數(shù)據(jù)寄存器GPFSET0x70F51GPIOF置位寄存器GPFCLEAR0x70F61GPIOF清零寄存器GPFTOGGLE0x70F71GPIOF單獨(dú)觸發(fā)寄存器GPGDAT0x70F81GPIOG數(shù)據(jù)寄存器GPGSET0x70F91GPIOG置位寄存器GPGCLEAR0x70FA1GPIOG清零寄存器GPGTOGGLE0x70FB1GPIOG單獨(dú)觸發(fā)寄存器保留0x70FC~0x70FF4voidGpio_example1(void){while(1){

GpioDataRegs.GPADAT.all=0xAAAA; GpioDataRegs.GPBDAT.all=0xAAAA; GpioDataRegs.GPDDAT.all=0x0022; GpioDataRegs.GPEDAT.all=0x0022; GpioDataRegs.GPFDAT.all=0xAAAA; GpioDataRegs.GPGDAT.all=0x0020; delay_loop();例:使用數(shù)據(jù)寄存器設(shè)置I/0的輸出,或者通過(guò)數(shù)據(jù)寄存器讀取外部引腳的狀態(tài)信息

GpioDataRegs.GPADAT.all=0x55555; GpioDataRegs.GPBDAT.all=0x55555; GpioDataRegs.GPDDAT.all=0x0041;//只有4個(gè)I/0 GpioDataRegs.GPEDAT.all=0x0005;//只有3個(gè)I/0 GpioDataRegs.GPFDAT.all=0x5555; GpioDataRegs.GPGDAT.all=0x0010;//只有2個(gè)I/0 delay_loop();}}3.5.4數(shù)字量I/O應(yīng)用舉例GPIO_application文件結(jié)構(gòu)//#####################################################//文件名稱:GPIO_application.C//功能描述:DSP28GPIO-PortB7..B0:8-BitLED//CPUTimer0ISR周期50ms//看門(mén)狗使能,在定時(shí)器中斷及主程序的循環(huán)中處理//#######################################################include"DSP281x_Device.h"http://使用的函數(shù)原型聲明voidGpio_select(void);voidInitSystem(void)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論