📄 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
McBSP1->SPSD = (1 << PCR_FSXM) | (1 << PCR_CLKXM)\
| (0 << PCR_FSXP) | (1 << PCR_CLKXP);//CLKXP=1
__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();
}
__nop();
__nop();
__nop();
__nop();
/*
McBSP1->SPSA = PCR;
McBSP1->SPSD &= ~(1 << PCR_FSXP);//FSX信号=0
__nop();
__nop();
McBSP1->SPSA = PCR;
McBSP1->SPSD |= (1 << PCR_FSXP);//FSX信号=1
__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 + -