1211 views |0 replies
Last login 2024-10-18
Online Time 124 hours
Prestige 757 points
Points 576 points
Make DSP C++ programs as simple and clear as ARM/MCU
[Copy link]
/*----------------------------------------- DSP novice's first timer practical demonstration program -----------------------------------------*/ #include//C language can use stdio.h #include//C语言可以用string.h
#include "C5402DEF.h"//
volatile bool IOXF;
volatile unsigned int SystemRamTest;
extern "C" interrupt void Timer0Isr();
extern "C" interrupt void Timer1Isr();
class SystemObj {//系统类
public:
SystemObj(void);
public:
inline void SystemInit(void);
inline void PllInit(void);
private:
unsigned int SystemRamTest;
};
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初始化
if (::SystemRamTest != 0x55aa) {
::SystemRamTest = 0x55aa;
}
if (SystemRamTest != 0x55aa) {
SystemRamTest = 0x55aa;
}
IOXF = 0;
}
void SystemObj::PllInit(void)
{
volatile unsigned int start;
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 ++);//等待外设上电复位正常结束
}
SystemObj Sys;
int main(void)
{
DMA->DMSDI = 0;
DMA->DMPREC = 0;
TI_BASE_McBSP0->DXR10 = 0x00;
TI_BASE_McBSP0->SPSA0 = SPCR1;
TI_BASE_McBSP0->SPSD0 = 0x00;//SPCR1 = 0x00
McBSP0->DXR10 = 0x00;
McBSP0->SPSA0 = SPCR1;
McBSP0->SPSD0 = 0x00;//SPCR1 = 0x00
SREG->ST1 |= (1 << ST1_INTM);//应该用Disable();//关中断!!!否则无效!
__nop();
__nop();
SREG->ST1 &= ~(1 << ST1_INTM);//应该用Enable();//开中断!!!否则无效!
__nop();
__nop();
TIMER0->TCR |= (1 << TCR_TSS);//关闭启动定时器0
SREG->IMR = 0x0000;
SREG->IFR = 0xffff;
TIMER0->PRD = 50000;//设置定时周期
TIMER0->TCR &= ~(1 << TCR_TSS);//启动定时器0
SREG->IMR |= (1 << IMR_TINT0);//允许TINT0中断
TIMER1->TCR &= ~(1 << TCR_TSS);//启动定时器1
SREG->IMR |= (1 << IMR_TINT1);//允许TINT1中断
Enable();//开中断
while(1)
{
__nop();
// SREG->ST1 ^= (1 << ST1_XF);
__nop();
if (::IOXF) {
SREG->ST1 |= (1 << ST1_XF);
}
else {
SREG->ST1 &= ~(1 << ST1_XF);
}
idle1();
}
}
interrupt void Timer0Isr() {
static int count = 0;
count ++;
if (count >= 4 * 250) {
count = 0;
::IOXF = !::IOXF;//郁闷~~~中断中ST1被保护~~~
}
// SREG->ST1 ^= (1 << ST1_XF);//本想在此翻转,无奈被迫移入主程序中
/*
if (::IOXF) { SREG->ST1 |= (1 << ST1_XF); } else { SREG->ST1 &= ~(1 << ST1_XF); } */ // TIMER0->TCR |= (1 << TCR_TSS);//turn off start timer 0 } interrupt void Timer1Isr() {//run only once TIMER1->TCR |= (1 << TCR_TSS);//turn off start timer 1 (self-destruction) }