手把手教你学DSP 28335学习笔记
本文轉載連接:?https://blog.csdn.net/nvh12138/article/details/79970985
?
DSPF28335學習筆記
1.?GPIO
GPxMUX(功能選擇寄存器),
? ? ? GPxMUX.bit=0配置為I/O功能。GPxMUX.bit=1配置為外設功能。復位時所有GPIO配置為I/O功能。
GPxDIR(方向選擇寄存器),0為輸入,1為輸出,復位時都為輸入。
GPxDAT(數據寄存器),
? ? ? 如果GPxDAT.bit=0,且設置為輸出功能,置相應的引腳為低電平;
? ? ? 如果GPxDAT.bit= 1,且設置為輸出功能,置相應的引腳為高電平。
GPxSET(設置寄存器),是只寫寄存器,任何讀操作都返回0。
? ? ?如果GPxSET.bit=0,沒有影響;
? ? ?如果GPxSET.bit=1,且引腳設置為輸出,將相應的引腳置成高電平。
GPxCLEAR(清除寄存器),是只寫寄存器,任何讀操作都返回0。
?????如果GPxCLEAR.bit=0,沒有影響;
?????如果GPxCLEAR.bit=1,且引腳設置為輸出,將相應的引腳置成低電平。
GPxTOGGLE(取反寄存器),是只寫寄存器,任何讀操作都返回0。
??????如果GPxTOGGLE.bit=0,沒有影響;
? ? ? 如果GPxTOGGLE.bit=1,且引腳設置為輸出,將相應的引腳取反,原來是低電平變成高電平,原來是高電平,變為低電平。?
2.?矩陣鍵盤
矩陣鍵盤掃描原理:GPIO48-50這三根線為行線,配置為輸出口。GPIO51-53這三根線為列線,配置為輸入口,用于檢測端口電平。先讓GPIO48輸出低電平,且49,50輸出高電平。檢測GPIO51、52、53的電平,看哪一個是低電平,則說明相應按鍵按下。比如此時GPIO52為低電平,則說明SW7按鍵按下了。同理,再讓49為低,且48,50為高;再50為低,48,49為高。這樣就實現了按鍵掃描。
3.??SPI控制數碼管顯示
? ? ? ?SPI接口是高速同步串行輸入輸出接口。F28335有一個專門的SPI模塊,?另外兩個McBSP也可以配置為SPI接口。SPI由12組控制寄存器控制,位于控制寄存器幀0x7040h開始的位置。所有的寄存器都為16bit寄存器。
?
?
數碼管控制原理:GPIO58-61這四個管腳控制數碼管的位碼,當他們為高電平的時候,三極管9013導通,此時相應位的數碼管點亮。芯片74HC164為串口轉并口芯片,A、B為串行數據輸入口,A、B是“與”的關系,這里他們連在一起,也就是說當GPIO54為“1”時,輸入與后為1,反之,當GPIO54為“0”時,輸入“與”后為0。CP是時鐘信號輸入。當MR為高電平,且在CP的上升沿期間,GPIO54口的數據進行一位位的轉換,第一位放在Q0,當第二位過來后,原來的Q0放到Q1,現在的數據又放在Q0,以此類推循環8次,當一次轉換結束后,8位數據經過并口輸出到數碼管,就實現了“串轉并”。
4.??SPI
? ? ? ?SPI即(Serial Peripheral Interface)是高速同步串行輸入輸出接口,,全雙工,同步的通信總線,并且在芯片的管腳上只占用四根線,四線制:SPISOMI(主輸入/從輸出引腳)、SPISIMO(主輸出/從輸入引腳)、SPISTE|(從片選)、SPICLK(時鐘引腳)。SPI接口數據傳輸時一共有3種模式:簡單模式、基本模式、增強FIFO模式。SPI接口要配置的寄存器有12個:SPI配置控制寄存器(SPICCR)、SPI操作控制寄存器(SPICTL)、SPI狀態寄存器(SPISTS)、SPI波特率設置寄存器(SPIBRR)、SPI仿真緩沖寄存器(SPIRXEMU)、SPI串行接收緩沖寄存器(SPIRXBUF)、SPI串行發送緩沖寄存器(SPITXBUF)、SPI串行數據寄存器(SPIDAT)、SPI FIFO發送寄存器SPIFFTX、SPI FIFO接收寄存器SPIFFRX、SPI FIFO控制寄存器SPIFFCT、SPI優先級控制寄存器(SPIPRI)。每個寄存器每一位的如何配置見書《手把手教你學DSP》353頁。
? ? 系統在上電復位時,SPI工作在標準SPI模式,禁止FIFO功能。FIFO的寄存器SPIFFTX、SPIFFRX、SPIFFCT不起作用。通過將SPIFFTX寄存器中的SPIFFEN的位置1,使能FIFO模式。SPIRST能在操作的任一階段復位FIFO模式。
5.?28BYJ-48步進電機
28BYJ-48步進電機(四相五線八拍電機):步進電機是一種將電脈沖轉化為角位移的執行機構。通俗一點講:當步進驅動器接收到?一個脈沖信號,它就驅動步進電機按設定的方向轉動一個固定的角度(及步進角)。你可以通過控制脈沖個數來控制角位移量,從而達到準確定位的目的;同時您可以通過控制脈沖頻率來控制電機轉動的速度和加速度,從而達到調速的目的。這里使用減速的步進電機,減速比為1:64,步進角為5.625/64度。如果需要轉動一圈,那么需要360/5.625*64=4096個脈沖信號。步進電機具有瞬間啟動、急速停止的優越特性,改變脈沖的順序,就可以改變轉動的方向。
?
工作原理:圖中的三極管SS8050相當于一個反相器,J39接口接步進電機,如果步進電機的第4腳需要輸入低電平,此時讓控制信號EPWM2A為高電平,則三極管Q12導通,步進電機第四腳就得到低電平。給它低電平,步進電機就高電平。
? ?明白幾個概念:
? ?步距角:表示控制系統每發一個步進脈沖信號,電機所轉動的角度。真正的步距角和驅動器有關。
???相數:產生不同對極N、S磁場的激磁線圈對數。常用m表示。
???拍數:完成一個磁場周期性變化所需脈沖數或導電狀態用n表示,或指電機轉過一個齒距角所需脈沖數,以四相電機為例,有四相四拍運行方式即AB-BC-CD-DA-AB,四相八拍運行方式即?A-AB-B-BC-C-CD-D-DA-A
? ?保持轉矩:是指步進電機通電但沒有轉動時,定子鎖住轉子的力矩。
6.?中斷系統(外部中斷)
? ? ? F28335內部有16個中斷線,包括2個不可屏蔽中斷(RESET和NMI)+14個可屏蔽中斷?!究善帘沃袛?#xff1a;可根據實際情況來設置優先級來決定要不要響應此類中斷。不可屏蔽中斷:只要接到中斷請求,就要做出中斷處理】在這14個可屏蔽中斷中,其中定時器1與定時器2產生的中斷請求通過INT13、INT14中斷線到達CPU,這兩個中斷已經預留給了實時操作系統,因此就剩下12個可屏蔽中斷。簡單來說就是PIE(外設中斷擴展模塊)通過12根線與28335核的12個中斷線相連。而PIE的另外一側有12*8根線分別連接到外設,如AD、SPI、EXINT等等。這樣PIE共管理12*8=96個外部中斷。
? ? ? 中斷系統各個寄存器的功用:
? ? ? ?PIE控制寄存器(PIECTRL):PIECTRL的0位是PIE向量表使能位,0:禁止PIE模塊,1:除復位之外的所有中斷向量取自PIE向量表,復位向量始終取自boot ?ROM。1-15位是PIE中斷向量。
? ? ? ?PIE中斷應答寄存器(PIEACK):PIE中斷響應標志位。
? ? ? ?PIE中斷標志寄存器(PIEIFRx):(激活or清除中斷)操作PIEIFRx(x=1~12)的低8位,表示相應的中斷是否被激活,當一個中斷被激活時,相應的寄存器為置“1”,當中斷響應后或向這些寄存器寫0時,對應的寄存器位被清零??梢酝ㄟ^讀取該值來確定哪個中斷有效或被掛起,訪問該寄存器時,硬件比CPU有更高的優先級。
? ? ? PIE中斷使能寄存器(PIEIERx):(確定大組下的小組)PIEIERx(x=1~12,這個x
指大組)中的低8位確定該中斷是這一組的第幾個中斷,位“1”為使能。位“0”
為禁止。
? ? ?CPU中斷標志寄存器(IFR):(激活or清除中斷)用于標志和清除被執行的中斷,具體配置見書113頁。
? ? ?CPU中斷使能寄存器(IER):(確定大組)確定每個中斷到底屬于哪一組大中斷,
就是12組里面的哪一組,位“1”為使能,位“0”為禁止。
? ? ?CPU調試中斷使能寄存器(DBGIER):CPU在實時仿真模式下暫停中需要中斷的時候就要用到CPU調試中斷使能寄存器。
? ?外部中斷控制寄存器(XINTnCR):
? ?外部NMI中斷控制寄存器(XNMICR):
? ?外部中斷x計數器(XINTxCTR):
? ?總的來說,CPU的所有中斷寄存器控制12組的中斷,PIE的所有中斷寄存器控制每組內8個的中斷。除此之外,我們用到哪一個外部中斷,相應的還有外部中斷的寄存器,DSP的GPIO口都可以配置為外部中斷口,需要注意的就是外部中斷的標志要自己通過軟件來清零。而PIE和CPU的中斷標志寄存器由硬件來清零。
?
? ? ?外部中斷程序例程里,將GPIO48配置為0,GPIO51、52則為外部中斷,GPIO51為外部中斷3,GPIO52為外部中斷4。程序現象:首先將Xint3count(中斷3發生中斷的次數計數器)和Xint4count(中斷4發生中斷的次數計數器)還有總中斷發生次數計數器Loopcount添加到觀察窗口中,依次按下SW4和SW7,每次按下按鍵時中斷計算器加1。
?
GPIOXINT3SEL寄存器配置見此圖
GpioIntRegs.GPIOXINT3SEL.bit.GPIOSEL?= 19; ??// Xint3 is GPIO51
? ?由上圖可得,32+19=51,所以=19就表示外部中斷3從GPIO51輸入。
7.?定時器
? ? ? ? TMS320F28335的CPU Time有三個,分別為Timer0,Timer1,Timer2,其中Timer2是為操作系統DSP/BIOS保留的,當未移植操作系統時,可用來做普通的定時器。這三個定時器的中斷信號分別為TINT0, TINT1, TINT2,分別對應于中斷向量INT1,INT13,INT14。
? ? ? ?對程序中幾句代碼的理解:
? ? ? ?CpuTimer0Regs.TCR.all?= 0x4001;?//啟動定時器。
? ? ? ?//4001中4是TIE位,代表中斷使能,該位置1時若計數器減到0,則中斷生效。再有Tss寫為0,開啟定時器。這個1毫無意義,如果寫成4000是一樣的。
? ? ? ?IER |= M_INT1;?????????????//開中斷1的意思。
? ? ? //“|=”是賦值位運算符號,意思就是IER= IER||M_INT1 IER賦值為IER和M_INT1位或,類似的還有?&= ^=。
? ? ? ?PieCtrlRegs.PIEACK.all?= PIEACK_GROUP1;//清ACK中斷,使得同組的其他中斷能響應。
? ? ? #if的使用說明
? ? ? #if的后面接的是表達式,如果表達式為1,則編譯#if下面的代碼
? ? ? #if (MAX==10)||(MAX==20)
? ? ? code...
? ? ? #endif
? ?它的作用是:如果(MAX==10)||(MAX==20)成立,那么編譯器就會把其中的#if?與?#endif之間的代碼編譯進去(注意:是編譯進去,不是執行!!)
8.?外部接口XINTF操作SRAM
? ? ? ?SRAM(Static Random Access Memory),即靜態隨機存取存儲器,掉電不能保存數據。SRAM具有較高的性能,功耗較小,但是SRAM也有它的缺點,即它的集成度較低,相同容量的DRAM內存可以設計為較小的體積,但是SRAM卻需要很大的體積。
? ? 外部接口XINTF采用非復用異步總線,可用于擴展SRAM、FLASH、ADC、DAC模塊等。擴展SRAM時,對應于DSP的映射存儲區域是ZONE0、ZONE6、ZONE7。讀寫過程包括:LEAD(引導)-------ACTIVE(使能)-------TRAIL(拖尾)三部分,每個區域可以配置單獨的讀寫訪問等待周期。通過XTIMING寄存器可以配置以上信息。每個區域有專用的片選信號,可以連接各種外部存儲器。讀寫訪問時刻基于內部的XTIMCLK時鐘,因此配置XINTF時,需要配置XTIMCLK與系統時鐘SYSCLKOUT的關系,通過XINTF-CN2寄存器中的XTIMCLK控制位可將XTIMCLK時鐘頻率設定為與SYSCLKOUT時鐘頻率相同或為其一半,默認情況為其一半。所有的XINTF的操作都由XCLKOUT的上升沿開始。
? ?下圖為外擴的SRAM存儲器,XRDn為讀控制信號,XWEn為寫控制信號,XZCS7n為片選信號。數據線為16位,地址線為19根,
?
? ? ?程序解讀:
#pragma?CODE_SECTION(cpu_timer0_isr,"xintffuncs");
//SECTION關鍵字把中斷服務程序放到"xintffuncs"段中去,也就是中斷服務程序最終是在外部接口映射區域ZONE7中執行
SECTION關鍵字在.CMD文件里,并申明四個全局變量,指定運行首地址,裝載長度。
?
MemCopy(&XintffuncsLoadStart, &XintffuncsLoadEnd,
&XintffuncsRunStart);
//把原地址代碼復制到目的地址,也就是把外部中斷代碼復制到ZONE7區域
asm(" RPT #7 || NOP");
//會執行N+1次NOP指令,占用N+1個指令周期,也就是執行8次NOP指令
?
void?init_zone7(void)?//?DSP的映射存儲區域ZONE7配置
{
????EALLOW;
????SysCtrlRegs.PCLKCR3.bit.XINTFENCLK?= 1;//開啟XINTF時鐘信號
????EDIS;
????InitXintf16Gpio();//初始化外部SRAM的地址線,數據線,片選線
????EALLOW;
????// All Zones---------------P書82------------------
XintfRegs.XINTCNF2.bit.XTIMCLK?= 0;//基準時鐘
XTIMCLK=SYSCLKOUT
????XintfRegs.XINTCNF2.bit.WRBUFF?= 3;//有三個寫緩沖器
????XintfRegs.XINTCNF2.bit.CLKOFF?= 0;//使能XCLKOUT
????XintfRegs.XINTCNF2.bit.CLKMODE?= 0;//XCLKOUT=XTIMCLK
?
????XintfRegs.XTIMING7.bit.XWRLEAD?= 1;//XTIMING7:XINTF區域7的時序寄存器,寫訪問的建立時間中等待周期個數設定位,區域7寫建立時間1b,周期為1x1=1,因為X2TIMING=0
????XintfRegs.XTIMING7.bit.XWRACTIVE?= 2;//寫訪問有效時間等待周期個數設定位,有效時間是10b,周期數為2X1=2.
????XintfRegs.XTIMING7.bit.XWRTRAIL?= 1;//跟蹤時間是1b,周期數為1.
????XintfRegs.XTIMING7.bit.XRDLEAD?= 1;//讀建立時間,1b,周期為1
????XintfRegs.XTIMING7.bit.XRDACTIVE?= 3;//有效時間是11b,周期是1
????XintfRegs.XTIMING7.bit.XRDTRAIL?= 0;//跟蹤時間是0
????XintfRegs.XTIMING7.bit.X2TIMING?= 0;
????XintfRegs.XTIMING7.bit.USEREADY?= 0;//忽略XREADY信號
????XintfRegs.XTIMING7.bit.READYMODE?= 0;//同步采樣
????XintfRegs.XTIMING7.bit.XSIZE?= 3;//16位數據總線模式
????EDIS;
???asm(" RPT #7 || NOP");//會執行N+1次NOP指令,占用N+1個指令周期,也就是執行8次NOP指令
}
該配置過程參考手把手書P80和網頁:
http://bbs.21ic.com/icview-1622920-1-1.html
9.?AD轉換實驗
?
ADC信號輸入端
TMS320F28335片上有一個12位A/D轉換器,前段為2個8選一的多路切換器和2個同時采樣/保持器,這兩個采樣保持器A、B?分別對應著DSP?引腳上的INA0~INA7?和INB0~INB7。構成16個模擬輸入通道,?這16?通道可以分為兩個8?通道的(獨立)和一個16通道的(級聯模式),模擬通道的切換由硬件自動控制。并將各模擬通道的轉換結果順序存入16個結果寄存器中。模擬量輸入范圍:0.0V~3.0V,輸入負壓或高于3V的電壓就會燒毀A/D模塊。?轉換率:在?25MHz 的?ADC 時鐘下為?80ns;
轉換結果=4095×(輸入的模擬信號-ADCLO)÷3;ADCL0是ADC轉化的參考電壓值,也就是板子上的ADCREFIN為0,那么轉換結果就是在0-3V的電壓范圍內,輸出是:0-4095
多種?A/D?觸發方式:軟件啟動、PWM?模塊和外部中斷?2?引腳;中斷方式:可以在每次轉換結束或每隔一次轉換結束觸發中斷;
?
?
?
?
?
?
?
?
?
1.如何查看CCS5.2中包含的源文件有哪些?以及他們的位置?
CCS5.2工程中C語言源文件有兩部分組成,一部分是在project路徑下的.c文件,另外一部分是通過連接添加到工程里的(.project文件中的<linkedResources></linkedResources>字段)。因此CCS5.2中的源文件一部分在工程目錄下,另外一部分在.project文件中的<linkedResources></linkedResources>字段包含的路徑下。
2.CCS中GEL文件的作用是什么?
ccs的gel語言是一種交互式的命令,它是解釋執行的,即不能被編譯成可執行文件。它的作用在于擴展了ccsstudio的功能,可以用gel來調用一些菜單命令,對DSP的存儲器進行配置等等。但是作者建議對于使用仿真器和DSP功能板的仿真環境用戶來說,這種GEL語言文件是沒必要加入到配置中的。gel語言的重要性在于針對計算機模擬環境的用戶,使用gel可以為其準備一個虛擬的DSP仿真環境,但也不是非用不可的。
3.引用例子中的源文件時要注意什么?
使用CCS5.2導入例子中的源文件時,最好不要選擇連接方式,而使用復制的方式,這樣必要時可以更改這些源文件,而不會影響其他的程序的使用。
4.CCS5.2如果沒有包含函數的聲名頭文件時也能運行但是結果會不正常,故當函數調用出現莫名其妙的問題時,要檢查聲名函數的頭文件是否包含。
5.CCS5.2開發DSP28335程序時如何設置程序堆棧的大小?
CCS5.2默認情況下堆棧的大小都為0x400,在Project->Properties->Build->C200 Linker->Basic Options下設置。設置完堆棧的大小后,還要在cmd文件中分配堆棧存儲空間的
段的位置和大小,??臻g的段名為.stack用于函數中的臨時變量,堆空間的段名為.sysmem用于c語言malloc函數分配內存,malloc最大可分配內存為Project->Properties->Build
->C200 Linker->Basic Options下設置的大小減2。cmd文件中的堆棧段的大小不能小于Project->Properties->Build->C200 Linker->Basic Options下設置的大小。一般來講不用
變動棧空間的大小和位置,如果函數中需要大的空間就申請堆空間。堆空間可以指定為外部內存,但要注意在第一次malloc函數調用之前一定要初始化外部內存。否則malloc能執行成功但是空間指向未定。
heap大小限制為32k word即0x10000。
6.相關參考網站
http://processors.wiki.ti.com/index.php
7.如何添加頭文件的相對路徑?
首先在Project->Properties->Build選項下,點擊Variables添加一個變量,然后就可以在Project->Properties->Build->C2000 Compiler->Include Options下用${}引用變
量。表示工程路徑的系統變量是PROJECT_ROOT,可以在Project->Properties->Build->C2000 Compiler->Include Options下直接引用。注意Project->Properties->Resource-
>Linked Resources下的變量在Project->Properties->Build->C2000 Compiler->Include Options下無效,只有Project->Properties->Build下Variables選項卡中的變量才能
用。
http://processors.wiki.ti.com/index.php/Include_paths_and_options
8.當程序燒寫到flash中運行時,設置斷點為什么總是出錯?
當程序燒寫到flash中時設置的斷點為硬件斷點,此斷點對C28x系列DSP只能設置兩個多的話就會報錯,另外有些函數有可能會占用硬件斷點,故設置斷點失敗時可查一下如何清理c函數的硬件斷點。
9.CCS5 Debug模式下Tool->Graphs的用法的要點?
·?進入CCS Debug模式,點擊debug按鈕右邊的小箭頭打開下拉列表,選中Debug Configurations,在target選項卡下選擇Realtime Options->Halt the target before any debugger access。如果不選此項當target running時,graph波形會是一條為0的直線。
·?在代碼中打斷點,運行到斷點處,因為只有運行在斷點處Graphs才能識別變量地址,才能在設定Start Address時使用數組名和&變量名的形式。
·?Graphs只能跟蹤全局變量,所以緩沖區要設置為全局變量。
參考網址:http://forum.eepw.com.cn/thread/214974/1
http://hi.baidu.com/chanceyue/item/af7ecddc744aa34eddf9bed8
/Article/CCS/Experience/201211/45940.html
10.如果ccs出現莫名其妙的問題時,請刪除.metadata
11.arm和dsp之間進行串口通信如果dsp先啟動,arm后啟動,通訊有異常,反之正常?
主要原因是arm啟動時會有一個導致BRKDT錯誤的信號出現,此時如果dsp已經啟動就會收到此錯誤,并停止工作,直到SW Rest或者DSP重啟。解決方法是當收到此錯誤時,SW Reset SCI模塊。
參考網址:http://www.deyisupport.com/question_answer/f/56/t/11621.aspx
總結
以上是生活随笔為你收集整理的手把手教你学DSP 28335学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消费类电子行业公司
- 下一篇: AD绘制原理图最基本的操作-第一张原理图