音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(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++接收程序
/*------------------------------------------------
  波特率自適應(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
頂一個~~~~~~~~
 
3樓: >>參與討論
hotpower
革命尚未成功,同志仍需努力~~~
接收程序可達(dá)57600穩(wěn)定.
正在考慮發(fā)送程序~~~

要做到全雙工真夠暈的~~~

4樓: >>參與討論
tjsheep
不錯不錯,不過
如果有點注釋或者說明會更加好點,另外為什么要用c++呢?先給條褲衩吧,天熱了,呵呵
另外在28xx的dsp上就自帶波特率自適應(yīng)硬件,很方便哦

* - 本貼最后修改時間:2006-7-1 10:46:09 修改者:tjsheep

5樓: >>參與討論
hotpower
哈哈,首先的想法是將ARM/DSP編程書寫歸一
這樣就可使ARM/DSP的入門門檻降低~~~

本人的愿望是也做個DSP的尿童版來供各位"尿友"玩賞~~~

http://blog.21ic.com/more.asp?name=hotpower&id=20504



* - 本貼最后修改時間:2006-7-1 13:29:10 修改者:hotpower

6樓: >>參與討論
hotpower
不下地獄難升天堂
本無意介入DSP5402,因為搞工控的應(yīng)該做DSP2812之類的DSP.
由于工作原因而不得不為之~~~

也好,借道54022812也是一個不錯的選擇,到底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
準(zhǔn)備做2812菜鳥~~~感覺TI對2812的支持很到位~~~
不過什么都沒有,不知如何玩~~~暈菜~~~玩水吧~~~

感覺DSP2812與LPCARM有很多共同之處,簡直"不學(xué)都明白"~~~

其手法有些地方幾乎相同~~~但是IO應(yīng)該比LPCARM高~~~

中斷向量可變幾乎都一樣~~~

定時器和多緩存串口也不需學(xué)了,基本與5402一樣~~~

本想學(xué)下2407,看來代碼兼容還是先當(dāng)2812菜鳥好受點~~~~~

8樓: >>參與討論
tjsheep
現(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
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
在運(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
哈哈,效率應(yīng)該是一樣的,可以根據(jù)匯編代碼看出~~~
 
參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
拜托放棄位域效率低下的習(xí)慣吧~~~
視頻處理
2407程序運(yùn)行時芯片發(fā)燙
求助
請大家推薦幾款FLASH,容量為128M或者256M都可以,急???
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號