⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dspbird.cpp

📁 dspled通讯程序样例
💻 CPP
字号:
/*-----------------------------------------
  DSP菜鸟的第1个定时器实战演示程序
HotPower@126.com 

2005.6.20        于西安大雁塔村队部

http://hotpower.21ic.org
-----------------------------------------*/
#include <cstdio> //C语言可以用stdio.h
#include <cstring>//C语言可以用string.h
#include "C5402DEF.h"//DSP菜鸟HotPower创建

volatile bool IOXF;
volatile unsigned int SystemRamTest;

extern "C" interrupt void Timer0Isr();
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();


/*-----------------------------------------
         LED数码字符定义
-------------------------------------------*/

//共阳极数码管(左移)

#define LedSegA  0x01
#define LedSegB  0x02
#define LedSegC  0x04
#define LedSegD  0x08
#define LedSegE  0x10
#define LedSegF  0x20
#define LedSegG  0x40
#define LedSegH  0x80

//

//共阳极数码管(右移)
/*
#define LedSegA  0x80
#define LedSegB  0x40
#define LedSegC  0x20
#define LedSegD  0x10
#define LedSegE  0x08
#define LedSegF  0x04
#define LedSegG  0x02
#define LedSegH  0x01
*/
//

#define LedChar0 (LedSegA + LedSegB + LedSegC + LedSegD + LedSegE + LedSegF          )
#define LedChar1 (          LedSegB + LedSegC										 )
#define LedChar2 (LedSegA + LedSegB           + LedSegD + LedSegE           + LedSegG)
#define LedChar3 (LedSegA + LedSegB + LedSegC + LedSegD                     + LedSegG)
#define LedChar4 (          LedSegB + LedSegC                     + LedSegF + LedSegG)
#define LedChar5 (LedSegA           + LedSegC + LedSegD           + LedSegF + LedSegG)
#define LedChar6 (LedSegA           + LedSegC + LedSegD + LedSegE + LedSegF + LedSegG)
#define LedChar7 (LedSegA + LedSegB + LedSegC										 )
#define LedChar8 (LedSegA + LedSegB + LedSegC + LedSegD + LedSegE + LedSegF + LedSegG)
#define LedChar9 (LedSegA + LedSegB + LedSegC + LedSegD           + LedSegF + LedSegG)
#define LedCharA (LedSegA + LedSegB + LedSegC           + LedSegE + LedSegF + LedSegG)
#define LedCharB (                    LedSegC + LedSegD + LedSegE + LedSegF + LedSegG)
#define LedCharC (LedSegA                     + LedSegD + LedSegE + LedSegF			 )
#define LedCharD (          LedSegB + LedSegC + LedSegD + LedSegE           + LedSegG)
#define LedCharE (LedSegA                     + LedSegD + LedSegE + LedSegF + LedSegG)
#define LedCharF (LedSegA                               + LedSegE + LedSegF + LedSegG)



class SystemObj {//系统类
public:
  SystemObj(void);
public:
//  inline 
  void SystemInit(void);
//  inline 
  void PllInit(void);
//  inline 
  void McBSP0Init(void);
//  inline 
  void McBSP1Init(void);
//  inline 
  void TIMER0Init(void);
//  inline 
  void TIMER1Init(void);
//  inline 
  void EintInit(void);
private:
  volatile unsigned int SystemRamTest;
public:
};

SystemObj::SystemObj(void)
{
  Disable();//关中断
  SREG->IMR = 0x0000;//
  SREG->IFR = 0xffff;
//设置0x0080为中断向量表首址,在第2个128页内。
  SREG->PMST = (0x01 << PMST_IPTR) | (1 << PMST_MP_MC) | (1 << PMST_OVLY);
//  SREG->PMST |= (1 << PMST_DROM);//数据可const. 
/*---------------------------------------------------------------------------
若:设置0x0100为中断向量表首址,在第3个128页内。
则:*.cmd文件应该改为:
     PAGE 0: VECS: origin=0x0100,  length=0x66
则:
  SREG->PMST = (0x02 << PMST_IPTR) | (1 << PMST_MP_MC) | (1 << PMST_OVLY);
----------------------------------------------------------------------------*/
  SystemInit();//系统初始化
}

void SystemObj::SystemInit(void)
{
  PllInit();//PLL初始化
  McBSP0Init();
  McBSP1Init();
  TIMER0Init();
  TIMER1Init();
  EintInit();
  if (::SystemRamTest != 0x55aa) {
    ::SystemRamTest = 0x55aa;
  }
  if (SystemRamTest != 0x55aa) {
    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 = (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 ++);//等待外设上电复位正常结束
}

void SystemObj::McBSP0Init(void)
{
  McBSP0->SPSA = SPCR1;
  McBSP0->SPSD = 0;
  McBSP0->SPSD &= ~(1 << SPCR1_RRST);//禁止串口接收
  McBSP0->SPSA = SPCR2;
  McBSP0->SPSD = 0;
  McBSP0->SPSD &= ~(1 << SPCR2_XRST);//禁止串口发送
  McBSP0->SPSA = PCR;
  McBSP0->SPSD = (1 << PCR_XIOEN) | (1 << PCR_RIOEN);//设置收发为IO接口,DX输出,DR,CLKS输入
  McBSP0->SPSD |= (1 << PCR_FSXM) | (1 << PCR_CLKXM);//设置FSX,CLKX可做IO输出
  McBSP0->SPSD |= (1 << PCR_FSRM) | (1 << PCR_CLKRM);//设置FSR,CLKR可做IO输出
}

void SystemObj::McBSP1Init(void)//SPI配置
{
  McBSP1->SPSA = SPCR1;
  McBSP1->SPSD = 0;
//  McBSP1->SPSD &= ~(1 << SPCR1_RRST);//禁止串口接收
  __nop();
  __nop();
  McBSP1->SPSA = SPCR2;
  McBSP1->SPSD = 0;
//  McBSP1->SPSD &= ~(1 << SPCR2_XRST);//禁止串口发送
  __nop();
  __nop();
  McBSP1->SPSA = SPCR1;
  McBSP1->SPSD = (0x03 << SPCR1_CLKSTP);//CLKSTP=11b
  __nop();
  __nop();
  McBSP1->SPSA = PCR;
//  McBSP1->SPSD = (1 << PCR_FSXM) | (1 << PCR_CLKXM)\
//               | (1 << PCR_FSXP) | (1 << PCR_CLKXP);//CLKXP=1,SS=1
  McBSP1->SPSD = (1 << PCR_FSXM) | (1 << PCR_CLKXM)\
                 | (0 << PCR_FSXP) | (1 << PCR_CLKXP);//CLKXP=1,SS=0
  __nop();
  __nop();
  McBSP1->SPSA = SRGR1;
  McBSP1->SPSD = (0x07 << SRGR1_FWID) | (0x80 << SRGR1_CLKGDV);
  __nop();
  __nop();
  McBSP1->SPSA = SRGR2;
  McBSP1->SPSD = (1 << SRGR2_CLKSM);
  __nop();
  __nop();
  McBSP1->SPSA = RCR1;
  McBSP1->SPSD = (0x00 << RCR1_RFRLEN1);//8BIT
  __nop();
  __nop();
  McBSP1->SPSA = XCR1;
  McBSP1->SPSD = (0x00 << XCR1_RFRLEN1);//BIT
  __nop();
  __nop();
  McBSP1->SPSA = RCR2;
  McBSP1->SPSD = (0x01 << RCR2_RDATDLY);
  __nop();
  __nop();
  McBSP1->SPSA = XCR2;
  McBSP1->SPSD = (0x01 << XCR2_RDATDLY);
  __nop();
  __nop();
  McBSP1->SPSA = SPCR2;
  McBSP1->SPSD |= (1 << SPCR2_GRST) | (1 << SPCR2_XRST) | (1 << SPCR2_FRST);
  __nop();
  __nop();
}   

void SystemObj::TIMER0Init(void)
{
  TIMER0->TCR |= (1 << TCR_TSS);//关闭定时器0
  TIMER0->PRD = 60000;//设置定时周期
  TIMER0->TCR &= ~(1 << TCR_TSS);//启动定时器0
  SREG->IMR |= (1 << IMR_TINT0);//允许TINT0中断
}

void SystemObj::TIMER1Init(void)
{
  TIMER1->TCR |= (1 << TCR_TSS);//关闭定时器1
  TIMER1->PRD = 55000;//设置定时周期
  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中断
}


class LedObj {//显示类
public:
  LedObj(void);
  void LedInit(void);
  void LedDisplay(unsigned char);
};

LedObj::LedObj(void)
{
  LedInit();
}

void LedObj::LedInit(void)
{
  LedDisplay(0);
}

void LedObj::LedDisplay(unsigned char cData)
{
static const unsigned char LedTab[] =
{
  ~LedChar0,
  ~LedChar1,
  ~LedChar2,
  ~LedChar3,
  ~LedChar4,
  ~LedChar5,
  ~LedChar6,
  ~LedChar7,
  ~LedChar8,
  ~LedChar9,
  ~LedCharA,
  ~LedCharB,
  ~LedCharC,
  ~LedCharD,
  ~LedCharE,
  ~LedCharF
};

  cData = LedTab[cData & 0xff];
  McBSP1->DXR1 = cData & 0xff;
  __nop();
  __nop();

  McBSP1->SPSA = SPCR2;
  while((McBSP1->SPSD & (1 << SPCR2_XRDY)) == 0) {
    __nop();
    __nop();
  }
}

SystemObj Sys;
LedObj Led;

int main(void)
{
static int ledcount = 0;
  Enable();//开中断
  while(1)
  {
    __nop();
//   SREG->ST1 ^= (1 << ST1_XF);
    __nop();

    if (::IOXF) {
      SREG->ST1 |= (1 << ST1_XF);
    }
    else {
      SREG->ST1 &= ~(1 << ST1_XF);
    }
//    Led.LedDisplay(ledcount & 1);
    ledcount ++;
    idle1();
  }
}

interrupt void Timer0Isr() {
static int count = 0;
static int ledcount = 0;
  count ++;
  if (count >= 4 * 250) {
    count = 0;
    ::IOXF = !::IOXF;//郁闷~~~中断中ST1被保护~~~
    McBSP0->SPSA = PCR;
    McBSP0->SPSD ^= (1 << PCR_DX_STAT);//取反DX信号
//    McBSP0->SPSA = PCR;
    McBSP0->SPSD ^= (1 << PCR_CLKXP);//取反CLKX信号
//    McBSP0->SPSA = PCR;
    McBSP0->SPSD ^= (1 << PCR_FSXP);//取反FSX信号

//    McBSP0->SPSA = PCR;
    McBSP0->SPSD ^= (1 << PCR_CLKRP);//取反CLKR信号
//    McBSP0->SPSA = PCR;
    McBSP0->SPSD ^= (1 << PCR_FSRP);//取反FSR信号

    Led.LedDisplay(ledcount & 0x0f);
    ledcount ++;

/*
    McBSP1->SPSA = PCR;
    McBSP1->SPSD ^= (1 << PCR_DX_STAT);//取反DX信号
//    McBSP1->SPSA = PCR;
    McBSP1->SPSD ^= (1 << PCR_CLKXP);//取反CLKX信号
//    McBSP1->SPSA = PCR;
    McBSP1->SPSD ^= (1 << PCR_FSXP);//取反FSX信号


//    McBSP1->SPSA = PCR;
    McBSP1->SPSD ^= (1 << PCR_CLKRP);//取反CLKR信号
//    McBSP1->SPSA = PCR;
    McBSP1->SPSD ^= (1 << PCR_FSRP);//取反FSR信号
*/
  }
}

interrupt void Timer1Isr() {//只运行1次
  TIMER1->TCR |= (1 << TCR_TSS);//关闭启动定时器1(自毁)
}

interrupt void Eint0Isr() {
//  McBSP1->SPSA = PCR;
//  McBSP1->SPSD |= (1 << PCR_DX_STAT);//设置DX信号
  SREG->IFR = (1 << IMR_INT0);//清除INT0中断标志
}

interrupt void Eint1Isr() {
//  McBSP1->SPSA = PCR;
//  McBSP1->SPSD |= (1 << PCR_FSXP);//设置FSX信号
  SREG->IFR = (1 << IMR_INT1);//清除INT1中断标志
}

interrupt void Eint2Isr() {
//  McBSP1->SPSA = PCR;
//  McBSP1->SPSD |= (1 << PCR_CLKXP);//设置CLKX信号
  SREG->IFR = (1 << IMR_INT2);//清除INT2中断标志
}

interrupt void Eint3Isr() {
//  McBSP1->SPSA = PCR;
//  McBSP1->SPSD &= ~(1 << PCR_DX_STAT);//清除DX信号
//  McBSP1->SPSD &= ~(1 << PCR_FSXP);//清除FSX信号
//  McBSP1->SPSD &= ~(1 << PCR_CLKXP);//清除CLKX信号
  SREG->IFR = (1 << IMR_INT3);//清除INT3中断标志
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -