?? dspbird.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 + -