|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
波特率自適應(yīng)技術(shù)在DSP5402上的應(yīng)用之C++接收程序 |
| 作者:hotpower 欄目:DSP技術(shù) |
/*------------------------------------------------ 波特率自適應(yīng)技術(shù)在DSP5402上的應(yīng)用之C++接收程序 菜農(nóng) HotPower@126.com 2005.6.30 23:30 于西安大雁塔村隊部 菜地: http://hotpower.21ic.org ------------------------------------------------*/ #include <cstdio> //C語言可以用stdio.h #include <cstring>//C語言可以用string.h #include "C5402DEF.h"//DSP菜鳥HotPower創(chuàng)建 #include "class.h" #define ccsdebug 1//1--IO模擬SPI; 0--硬件McBSP模塊 extern "C" interrupt void Timer0Isr();//注意加extern "C" extern "C" interrupt void Timer1Isr(); extern "C" interrupt void Eint0Isr(); extern "C" interrupt void Eint1Isr(); extern "C" interrupt void Eint2Isr(); extern "C" interrupt void Eint3Isr(); SystemObj::SystemObj(void) { Disable();//關(guān)中斷 SREG->IMR = 0x0000;// SREG->IFR = 0xffff;//清除 //設(shè)置0x0080為中斷向量表首址,在第2個128頁內(nèi)。 SREG->PMST = (0x01 << PMST_IPTR) | (1 << PMST_MP_MC) | (1 << PMST_OVLY); // SREG->PMST |= (1 << PMST_DROM);//數(shù)據(jù)可const. /*--------------------------------------------------------------------------- 若:設(shè)置0x0100為中斷向量表首址,在第3個128頁內(nèi)。 則:*.cmd文件應(yīng)該改為: PAGE 0: VECS: origin=0x0100, length=0x66 則: SREG->PMST = (0x02 << PMST_IPTR) | (1 << PMST_MP_MC) | (1 << PMST_OVLY); ----------------------------------------------------------------------------*/ SystemInit();//系統(tǒng)初始化 } void SystemObj::SystemInit(void) { PllInit();//PLL初始化 TIMER0Init(); TIMER1Init(); EintInit(); /*-------------------------------------------------------- 注意以下2個變量的作用域的不同 --------------------------------------------------------*/ if (::SystemRamTest != 0x55aa) {//全局變量SystemRamTest ::SystemRamTest = 0x55aa;//改寫全局變量 } if (SystemRamTest != 0x55aa) {//類成員變量SystemRamTest SystemRamTest = 0x55aa;//改寫類成員變量 } ::IOXF = 0; } void SystemObj::PllInit(void) { volatile unsigned int start; SREG->SWWSR = 0x2000; do { SREG->CLKMD = 0; __nop(); } while(SREG->CLKMD & (1 << CLKMD_PLLSTATUS)); // SREG->CLKMD = (0 << CLKMD_PLLMUL) | (30 << CLKMD_PLLCOUNT) | (1 << CLKMD_PLLONOFF) | (1 << CLKMD_PLLNDIV) | (1 << CLKMD_PLLSTATUS);//10M SREG->CLKMD = (9 << CLKMD_PLLMUL) | (30 << CLKMD_PLLCOUNT) | (1 << CLKMD_PLLONOFF) | (1 << CLKMD_PLLNDIV) | (1 << CLKMD_PLLSTATUS);//100M // SREG->CLKMD = (14 << CLKMD_PLLMUL) | (30 << CLKMD_PLLCOUNT) | (1 << CLKMD_PLLONOFF) | (1 << CLKMD_PLLNDIV) | (1 << CLKMD_PLLSTATUS);//150M for (start = 0; start < 10000; start ++);//等待外設(shè)上電復(fù)位正常結(jié)束 } void SystemObj::TIMER0Init(void) { TIMER0->TCR = (1 << TCR_TSS);//關(guān)閉定時器0 TIMER0->PRD = 60000;//設(shè)置定時周期 TIMER0->TIM = 60000;//設(shè)置定時計數(shù)器 TIMER0->TCR &= ~(1 << TCR_TSS);//啟動定時器0 SREG->IMR |= (1 << IMR_TINT0);//允許TINT0中斷 } void SystemObj::TIMER1Init(void) { TIMER1->TCR = (1 << TCR_TSS);//關(guān)閉定時器1 TIMER1->PRD = 0xffff;//設(shè)置定時周期 TIMER1->TIM = 0xffff;//設(shè)置定時計數(shù)器 // TIMER1->TCR &= ~(1 << TCR_TSS);//啟動定時器1 // SREG->IMR |= (1 << IMR_TINT1);//允許TINT1中斷 } void SystemObj::EintInit(void) { SREG->IMR |= (1 << IMR_INT0);//允許INT0中斷 SREG->IMR |= (1 << IMR_INT1);//允許INT1中斷 SREG->IMR |= (1 << IMR_INT2);//允許INT2中斷 SREG->IMR |= (1 << IMR_INT3);//允許INT3中斷 } LcdObj::LcdObj(void) { LcdInit(); } void LcdObj::LcdSpiSetup(void) { #if (ccsdebug == 0) /*----------------------------------------------------------- 硬件McBSP模塊配置為SPI接口 實驗?zāi)康模?br> 演練硬件McBSP模塊配置為SPI接口的應(yīng)用。 ------------------------------------------------------------*/ McBSP1->SPSA = SPCR1; McBSP1->SPSD = 0; // McBSP1->SPSD &= ~(1 << SPCR1_RRST);//禁止串口接收 _delay_loop_(1);//延時等待 McBSP1->SPSA = SPCR2; McBSP1->SPSD = 0; // McBSP1->SPSD &= ~(1 << SPCR2_XRST);//禁止串口發(fā)送 _delay_loop_(1);//延時等待 McBSP1->SPSA = SPCR1; McBSP1->SPSD = (0x02 << SPCR1_CLKSTP);//CLKSTP=10b _delay_loop_(1);//延時等待 McBSP1->SPSA = PCR; McBSP1->SPSD = (1 << PCR_FSXM) //設(shè)置FSX引腳為輸出,控制LCD12864的片選信號SS | (0 << PCR_FSXP) //FSX引腳平時輸出低電平(LCD12864的片選信號SS無效) | (1 << PCR_CLKXM) //設(shè)置CLKX引腳為輸出 | (1 << PCR_CLKXP);//CLKXP引腳平時輸出高電平 _delay_loop_(1);//延時等待 McBSP1->SPSA = SRGR1; McBSP1->SPSD = (0x07 << SRGR1_FWID) //0x00~0x07~0xff | (0x80 << SRGR1_CLKGDV);//速率0x80 _delay_loop_(1);//延時等待 McBSP1->SPSA = SRGR2; McBSP1->SPSD = (1 << SRGR2_CLKSM);// _delay_loop_(1);//延時等待 McBSP1->SPSA = RCR1; McBSP1->SPSD = (0x00 << RCR1_RFRLEN1);//8BIT _delay_loop_(1);//延時等待 McBSP1->SPSA = XCR1;//延時等待 McBSP1->SPSD = (0x00 << XCR1_RFRLEN1);//8BIT _delay_loop_(1);//延時等待 McBSP1->SPSA = RCR2; McBSP1->SPSD = (0x02 << RCR2_RDATDLY);//0x01 _delay_loop_(1);//延時等待 McBSP1->SPSA = XCR2; McBSP1->SPSD = (0x02 << XCR2_RDATDLY);//0x01 _delay_loop_(1);//延時等待 McBSP1->SPSA = SPCR2; McBSP1->SPSD |= (1 << SPCR2_GRST) | (1 << SPCR2_XRST) | (1 << SPCR2_FRST); _delay_loop_(1);//延時等待 #else /*----------------------------------------------------------- 硬件McBSP模塊配置為普通IO軟件模擬SPI時序 實驗?zāi)康模?br> 演練硬件McBSP模塊配置為普通IO的應(yīng)用.以備IO緊缺時急用。 ------------------------------------------------------------*/ McBSP1->SPSA = SPCR1; McBSP1->SPSD = 0; McBSP1->SPSD &= ~(1 << SPCR1_RRST);//禁止串口接收 McBSP1->SPSA = SPCR2; McBSP1->SPSD = 0; McBSP1->SPSD &= ~(1 << SPCR2_XRST);//禁止串口發(fā)送 &nb |
| 2樓: | >>參與討論 |
| 作者: computer00 于 2006/7/1 2:04:00 發(fā)布:
頂一個~~~~~~~~ |
|
| 3樓: | >>參與討論 |
| 作者: hotpower 于 2006/7/1 10:22:00 發(fā)布:
革命尚未成功,同志仍需努力~~~ 接收程序可達(dá)57600穩(wěn)定. 正在考慮發(fā)送程序~~~ 要做到全雙工真夠暈的~~~ |
|
| 4樓: | >>參與討論 |
| 作者: tjsheep 于 2006/7/1 10:44:00 發(fā)布:
不錯不錯,不過 如果有點注釋或者說明會更加好點,另外為什么要用c++呢?先給條褲衩吧,天熱了,呵呵 另外在28xx的dsp上就自帶波特率自適應(yīng)硬件,很方便哦 * - 本貼最后修改時間:2006-7-1 10:46:09 修改者:tjsheep |
|
| 5樓: | >>參與討論 |
| 作者: hotpower 于 2006/7/1 11:30:00 發(fā)布:
哈哈,首先的想法是將ARM/DSP編程書寫歸一 這樣就可使ARM/DSP的入門門檻降低~~~ 本人的愿望是也做個DSP的尿童版來供各位"尿友"玩賞~~~ http://blog.21ic.com/more.asp?name=hotpower&id=20504 * - 本貼最后修改時間:2006-7-1 13:29:10 修改者:hotpower |
|
| 6樓: | >>參與討論 |
| 作者: hotpower 于 2006/7/1 12:07:00 發(fā)布:
不下地獄難升天堂 本無意介入DSP5402,因為搞工控的應(yīng)該做DSP2812之類的DSP. 由于工作原因而不得不為之~~~ 也好,借道5402再2812也是一個不錯的選擇,到底5402的寄存器遠(yuǎn)比2812少的多. 雖說無標(biāo)準(zhǔn)串口,倒也提供了研究波特率自適應(yīng)的好機(jī)會~~~ 對流行的DSP的C書寫習(xí)慣不敢恭維~~~真想讓DSP的書寫像種菜一樣.http://blog.21ic.com/more.asp?NAME=hotpower&id=19871 |
|
| 7樓: | >>參與討論 |
| 作者: hotpower 于 2006/7/1 22:36:00 發(fā)布:
準(zhǔn)備做2812菜鳥~~~感覺TI對2812的支持很到位~~~ 不過什么都沒有,不知如何玩~~~暈菜~~~玩水吧~~~ 感覺DSP2812與LPCARM有很多共同之處,簡直"不學(xué)都明白"~~~ 其手法有些地方幾乎相同~~~但是IO應(yīng)該比LPCARM高~~~ 中斷向量可變幾乎都一樣~~~ 定時器和多緩存串口也不需學(xué)了,基本與5402一樣~~~ 本想學(xué)下2407,看來代碼兼容還是先當(dāng)2812菜鳥好受點~~~~~ |
|
| 8樓: | >>參與討論 |
| 作者: tjsheep 于 2006/7/4 8:50:00 發(fā)布:
現(xiàn)在開始用還是28起手好點。除非對價格很關(guān)注 對于c++的好處,贊同 但是對于在嵌入系統(tǒng),尤其象dsp這種代碼量很少,但效率至上的地方,c++是不是不利于代碼優(yōu)化呢?mcu系統(tǒng)也許要對整體代碼優(yōu)化,才能提高系統(tǒng)的效率,但是dsp可能只要優(yōu)化10%的代碼,就可以給系統(tǒng)帶來質(zhì)的變化。這個才是關(guān)鍵吧? 另外數(shù)據(jù)的封裝對于結(jié)構(gòu)的完整,移植都是非常有好處的,但是dsp很多地方為了效率,完全采用全局?jǐn)?shù)據(jù)共享的辦法,這個在c++里應(yīng)該不推薦的吧? 我覺得ccs的編譯器應(yīng)該還是對c的優(yōu)化更好點的 呵呵 |
|
| 9樓: | >>參與討論 |
| 作者: hotpower 于 2006/7/4 20:45:00 發(fā)布:
C++全局類的成員變量都是"全局?jǐn)?shù)據(jù)共享"的 如果不愿共享就聲明為私有成員變量,其他類無權(quán)訪問. 至于優(yōu)化,C/C++基本一樣,C++不過多了構(gòu)造等函數(shù)的運(yùn)行部分... 用DSP首要追求的就是效率,這個可以用匯編來完成,不過程序框架還是應(yīng)該由C/C++或OS等非匯編語句來完成為好. 入門確實28較好,本人也想...這個只是被逼做5402菜鳥~~~ 不過沒28的開發(fā)板確實不好玩~~~ |
|
| 10樓: | >>參與討論 |
| 作者: tjsheep 于 2006/7/5 0:36:00 發(fā)布:
在運(yùn)行效率上,c++的程序肯定是比不上c的 在c++中,不是不建議把數(shù)據(jù)設(shè)為public,而是把方法public給大家調(diào)用么? 另外,在c++里每個對象的構(gòu)造構(gòu)析函數(shù)不可缺少,但是很多都是空函數(shù),這個在反復(fù)生成對象和撤銷對象的時候,還是對效率有影響吧? 在c寫的程序中,也可以利用文件來達(dá)到打包的目的,何必要用c++? 沒有庫的c++,在dsp編程中有何特別的意義? 呵呵,我沒有反對用非匯編語言,但是我覺得用c++不好,最后我敢說,不考慮人工或編程習(xí)慣,用c++出來的程序一定沒有c出來的程序在效率和體積上有優(yōu)勢,呵呵, 知道你是編程牛牛,所以抬抬杠 另外5402很經(jīng)典的,價格便宜量又足…… |
|
| 11樓: | >>參與討論 |
| 作者: hotpower 于 2006/7/6 22:06:00 發(fā)布:
哈哈,效率應(yīng)該是一樣的,可以根據(jù)匯編代碼看出~~~ |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |