打印

第一个DSP程序,欢迎拍砖

[复制链接]
5643|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
datreexia|  楼主 | 2010-12-2 11:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
datreexia|  楼主 | 2010-12-2 11:06 | 只看该作者
本帖最后由 datreexia 于 2010-12-2 11:16 编辑

主程序#include "DSP281x_Device.h"
#include "CommDefine.h"
#include "CommVariable.h"
//#include "IQmathLib.h"


int main()
{
    if(WDGEN)
        KickDog();
    CsmUnlock();
    InitSysCtrl();
    if(FLASHRUN)
    {                   //Caution: modify the FLASHRUN value if want to run in flash
        extern unsigned int ramfuncs_loadstart;
        extern unsigned int ramfuncs_loadend;
        extern unsigned int ramfuncs_runstart;

        memcpy( &ramfuncs_runstart,
                &ramfuncs_loadstart,
                &ramfuncs_loadend - &ramfuncs_loadstart);               // Copy the secureRamFuncs section
       InitFlash();
    }
    DelayUs(10000);

    // 禁止和清除所有CPU 中断:
    DINT;   
    IER = 0x0000;
    IFR = 0x0000;

    InitPieVectTable();   // 向量表配置,中断函数入口配置
    InitPieCtrl();        // 中断向量寄存器配置,开放哪些中断


    InitXintf();         // 外部接口配置
    InitGpio();          // 通用IO配置
    InitSci();           // 串口配置
    InitEv();            // 定时器等,,

    ConfigIsrTable();    // 配置自己定义的中断函数,也可以不要此函数,直接在InitPieVectTable做

    EnableInterrupts();   // Enable the PIE
    EINT;                 // Enable Interrupts at the CPU level
    ERTM;                 // 全局中断屏蔽使能

    while (1)
    {
        KickDog();
        if(!RhythmFlag)
            continue;
        RxTask();
        DealTask();
        TxTask();
        RhythmFlag = 0;
    }



}

使用特权

评论回复
板凳
datreexia|  楼主 | 2010-12-2 11:08 | 只看该作者
定时器中断,10ms一次,作为节拍
//  FILE: CommIsr.c
#include <DSP281x_Device.h>
#include <CommDefine.h>
#include <CommVariable.h>

Uint16   RhythmFlag = 0;
interrupt void T2PINT_isr() //改成小写isr
{
    LEDRUN_TOG();
    RhythmFlag = 1;
    EvaRegs.EVAIFRB.all = BIT0;
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP3;
}

使用特权

评论回复
地板
ayb_ice| | 2010-12-2 11:13 | 只看该作者
看不出来这程序和DSP有啥关系

使用特权

评论回复
5
datreexia|  楼主 | 2010-12-2 11:13 | 只看该作者
// 串口接收任务,接收一组数据后触发数据处理,置位接收数据标志
// 连续5个节拍(50ms)没有收到数据认为一组数据接收完毕。

Uint16 RxFlag = 0;
void RxTask(void)
{
    static Uint16  NoRxTime;   

    if(SciaRegs.SCIRXST.bit.RXERROR == 1)
    {
        SCIA_fifoInit();
        return;
    }
    else if(SciaRegs.SCIFFRX.bit.RXFFOVF == 1)
    {
        SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1;
        SCIA_fifoInit();
        return;
    }
    if (SciaRegs.SCIFFRX.bit.RXFIFST)
    {
        NoRxTime = 0;
        RxBuffA.In(&RxBuffA, SciaRegs.SCIRXBUF.bit.RXDT);  
    }
    else
    {
        NoRxTime++;
        if (NoRxTime == 5)  //50ms
        {
            RxFlag = 1;
        }
        else if (NoRxTime > 5)
        NoRxTime = 6;
    }  
}

使用特权

评论回复
6
datreexia|  楼主 | 2010-12-2 11:15 | 只看该作者
4# ayb_ice 是啊,当单片机使的,先运行起来再说

使用特权

评论回复
7
datreexia|  楼主 | 2010-12-2 11:23 | 只看该作者
/*********************************************
** 数据处理任务,判断接收来的数据是否符合格式
** 根据接收数据情况触发显示
** 计算时先将ASCII码转化成Uint8
*********************************************/

Uint32 Result = 0;
void DealTask()
{
    static Uint16  Step = 0;
    Uint8  ByteCnt;
    Uint8  Erro;
    Uint8  PartData;
    static Uint32 DataA = 0;  
    static Uint32 DataB = 0;  

    if (RxFlag) // 一组数据发送完毕开始处理
    {
            RxFlag = 0;
        ByteCnt = 0;
        Erro    = 0;
        switch (Step)
        {
            case(0):
                        {
                            while (RxBuffA.Get(&RxBuffA, &PartData)) ; //清空缓冲区
                            PostSend(S_A);
                            Step = 1;
                        } break;
            case(1):
            {
                DataA = 0;
                while (RxBuffA.Get(&RxBuffA, &PartData))  // 全部读出
                {
                    if ((PartData >= 0x30) && (PartData <= 0x39))
                    {
                        PartData -= 0x30;
                        DataA *= 10;
                        DataA += PartData;
                        if (++ByteCnt > 4)
                        {
                            Erro = 1;
                            break;
                        }
                    }
                    else
                    {
                        Erro = 1;      
                        break;
                    }
                }
                if (!Erro)
                {
                    Step = 2;
                    PostSend(S_B);
                }
                else
                {
                    PostSend(S_ERRO);
                }
            } break;
            
            case 2:
            {
                DataB = 0;
                while (RxBuffA.Get(&RxBuffA, &PartData))
                {
                    if ((PartData >= 0x30) && (PartData <= 0x39))
                    {
                        PartData -= 0x30;
                        DataB *= 10;
                        DataB += PartData;
                        if (++ByteCnt > 4)
                        {
                            Erro = 1;
                            break;
                        }
                    }
                    else
                    {
                        Erro = 1;
                        break;
                    }
                }
                if (!Erro)
                {
                    Step = 3;
                    PostSend(S_O);
                }
                else
                {
                    PostSend(S_ERRO);
                }
            } break;
            
            case 3:
            {
                while (RxBuffA.Get(&RxBuffA, &PartData)) // 最后符号有效
                {
                    if (PartData == '+')
                        Result = DataA + DataB;
                    else if (PartData == '-')
                        Result

使用特权

评论回复
8
datreexia|  楼主 | 2010-12-2 11:23 | 只看该作者
本帖最后由 datreexia 于 2010-12-2 11:37 编辑

// 竟然显示不全,续上
            case 3:
            {
                while (RxBuffA.Get(&RxBuffA, &PartData)) // 最后符号有效
                {
                    if (PartData == '+')
                        Result = DataA + DataB;
                    else if (PartData == '-')
                        Result = DataA - DataB;
                    else if (PartData == '*')
                        Result = DataA * DataB;
                    else if ((PartData == '/') && (DataB!=0))
                        Result = DataA / DataB;
                    else
                        Erro = 1;
                }
                if (Erro)
                    PostSend(S_ERRO);
                else
                {   
                    Step = 0;
                    PostSend(S_R);
                }
            } break;
                        default:
                            Step = 0;
        }
    }  
}

使用特权

评论回复
9
datreexia|  楼主 | 2010-12-2 11:33 | 只看该作者
/*********************************************
** 显示任务,1、显示字符串,
**2、将10进制数据各位提取显示
**
*********************************************/

char CharArryErro[]       = {"Data erro,input again!!\n\r "};
char CharArryDataA[]      = {"Input the first Num:   \n\r "};
char CharArryOperater[]   = {"Input the operator:    \n\r "};
char CharArryDataB[]      = {"Input the Second Num:  \n\r "};
char CharArryResult[]     = {"The Result is:         \n\r "};



Uint8 TxState = 0;
void PostSend(Uint8 Type)
{
    TxState = Type;
}
void TxTask()
{
    static Uint8 TxCntLog = 0;
    Uint32 i;
    Uint8  Data;

    switch (TxState)
    {
        case S_NOP: TxCntLog = 0; break;
        case S_ERRO:
        {
            Scia_TX(CharArryErro[TxCntLog]);
            if (++TxCntLog>25)
                TxState = 0;
        } break;
        case S_A:
        {
            Scia_TX(CharArryDataA[TxCntLog]);
            if (++TxCntLog>25)
                TxState = 0;
        } break;
        case S_B:
        {
            Scia_TX(CharArryDataB[TxCntLog]);
            if (++TxCntLog>25)
                TxState = 0;
        } break;
                case S_O:
        {
            Scia_TX(CharArryOperater[TxCntLog]);
            if (++TxCntLog>25)
                TxState = 0;
        } break;
        case S_R:
        {
            i = 1;
            while (Result > 10*i)    // 从高到底,逐位显示
            {
                i *= 10;
            }
            while (i)               // i为局部变量,故使用while,发送缓冲区16字节,够用,不会出现死等
            {
                Data = Result/i;
                Scia_TX(Data+0x30);
                Result -= Data*i;
                                i /=10;
                        }
            TxState = 0;
        } break;
    }
%0

使用特权

评论回复
10
Wxy8030| | 2010-12-2 12:20 | 只看该作者
顶一下,有空看看

原来曾先学学DSP的,学习板、彷真器......都买了,结果被那些N多的初始化程序就吓回去了......嘿嘿......

有空还是要捡起来搞搞!

使用特权

评论回复
11
ddtx| | 2010-12-2 13:20 | 只看该作者
顶,来学过

使用特权

评论回复
12
shizaigaole| | 2010-12-2 13:52 | 只看该作者
2812 确实比较麻烦.
主要要搞清楚启动过程,中断向量表的初始化和CMD文件。

有CM3了,
2812就算了吧,
已经没什么意思了,还贵!

使用特权

评论回复
13
liang7143| | 2010-12-2 14:17 | 只看该作者
:)支持下LZ

使用特权

评论回复
14
shiwilson| | 2010-12-2 14:34 | 只看该作者
支持

使用特权

评论回复
15
zzz1367| | 2010-12-2 15:16 | 只看该作者
顶! 天下芯片一般黑。:P
没学过dsp,估计也是差不多的。
下次 学的时候,可以看看这个。
谢谢

使用特权

评论回复
16
一心爱你| | 2010-12-2 16:59 | 只看该作者
支持   我也计划近期学DSP

使用特权

评论回复
17
无限星空| | 2010-12-2 17:17 | 只看该作者
支持,成功一小步
1# datreexia

使用特权

评论回复
18
yuyi21ic| | 2010-12-2 18:40 | 只看该作者
xiaren
!!!!!!!!!

使用特权

评论回复
19
eydj2008| | 2010-12-3 07:57 | 只看该作者
C 语言写的 程序 都差不多  所以 根本无法 看出来 是啥核心。
重要的是硬件配置操作。

使用特权

评论回复
20
eydj2008| | 2010-12-3 07:58 | 只看该作者
DSP 现在太贵  只有极少数地方 才会用到它  如果价格下来 用的地方就多了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

91

帖子

0

粉丝