EDN首页   博客首页 用户登陆  |  注册
aaa
发表于 2008/5/10 20:02:32

0

关于投票

菜农上半年穿的一些技术"裤头"

hotpower 个人专辑

共发现124篇文章

刷新 PAGE 1 / 7 共124篇 首页 前页 后页 尾页
border
ID 主题 作者 阅读 时间
border 2953962 DSP2812串口FIFO设置及"手动触发"发送中断服务之C++程序 hotpower 13 2008-5-7 20:27:33
border 2951291 DSP281X变量地址数组定位方法 hotpower 13 2008-5-5 23:00:54
border 2951378 DSP2812串口状态机解码之C++程序 hotpower 16 2008-5-6 0:12:01
border 2951300 DSP2812读写SST39VF800A之C++程序源码 hotpower 15 2008-5-5 23:11:08
border 2954269 DSP2812菜鸟歇业笔记索引,欢迎大家喷口水~~~ hotpower 14 2008-5-8 0:00:31
border 2955397 DSP2812菜鸟非典灵光再现,想歇菜都难~~~ hotpower 14 2008-5-8 18:50:48
border 2954252 旧话重题:FLASH变量和FLASH计"次"器的构成 hotpower 23 2008-5-7 23:40:38
border 2939549 在DSP2812上的"零耗时键盘"演示C++程序 hotpower 108 2008-4-25 12:28:55
border 2873164 SPI实现单总线硬件控制器的理论研究和实现方法(菜农) hotpower 997 2008-2-29 21:13:51
border 2870313 1-Wire/HDQ16等单总线终被菜农倒塌,发帖自贺~~~ hotpower 411 2008-2-28 1:05:22
border 2872297 通用异步串口实现单总线硬件控制器的研究和实现方法(菜农) hotpower 589 2008-2-29 15:25:21
border 2863640 关于Keil最新版本(3.0X)的汉字注释紊乱改进问题 hotpower 663 2008-2-22 18:06:57
border 2866355 刘姥姥初进大观圆---十分的爽~~~就像农民进城 hotpower 351 2008-2-25 12:30:27
border 2853821 不声明为静态函数就得不到类的实际地址 hotpower 296 2008-2-10 0:35:22
border 2854692 STM32菜鸟之"零耗时键盘"及"疯狗"C++演示程序包 hotpower 605 2008-2-12 18:07:20
border 2853827 关于STM32中IAR环境下如何包含C++头文件及中断函数问题 hotpower 713 2008-2-10 1:02:12
border 2842401 LM菜鸟之"零耗时键盘"在LM上的基本实现C++裸奔程序 hotpower 320 2008-1-25 3:13:21
border 2843636 LM菜鸟"驳中断不能喂狗"的"经典谬论"之C++演示程序 hotpower 315 2008-1-26 4:20:31
border 2841256 不抛弃不放弃,在IAR环境下LM跑C++终成正果 hotpower 1458 2008-1-24 1:54:58
border 2833621 开漏双向IO在模拟串行通信和IO自检方面的优势 hotpower 922 2008-1-16 22:15:02
border
刷新 PAGE 1 / 7 共124篇 首页 前页 后页 尾页

系统分类: 单片机  |  用户分类: DSP2812  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(838) | 回复(0)

发表于 2008/5/8 18:52:21

0

关于投票

DSP2812菜鸟非典灵光再现,想歇菜都难~~~

hotpower 发表于 2008-5-8 18:50 DSP 技术 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: DSP2812菜鸟非典灵光再现,想歇菜都难~~~

菜农对DSP开发板Study-2812增强版的改动说明

雁塔菜农HotPower@126.com  2008.5.8 于雁塔菜地

1.CPLD的改动
对光盘内的Code-F2812\Ex21_HDL2\DEV2812.V进行了大改动
a.加入8个键盘测试
b.改进LCD的访问不好的习惯
c.改进74hc595的锁存信号为一次完成脉冲的发送且带密码访问
d.增加CPLD的版本号或密码的访问及动态改写
e.整理了已完成例程的Verilog语言规范,但实在不愿改写管脚不良的定义

2.改写或增加CMD文件

对F2812_EzDSP_RAM_lnk.cmd内的
PRAMH0     : origin = 0x3F8002, length = 0x000FFE
改写为:
PRAMH0     : origin = 0x3F8002, length = 0x001FFE

3.增加F2812_UserVariableDefs.cmd文件

4.增加F2812_UserVariableDefs.cpp文件

5.完整可用于实战的例程
由于开始建立工程时第1个例程是LCD,所以就起名LCD_DEMO
目前抽空完成的例程主要有:
LCD,SPI,TIMER,INT,KEY,LED,SCI,ADC等

6.非典再现

改写DSP281x_Adc.h,得到2种访问方式,不破坏原TI之习惯

struct ADC_REGS {
    union ADCTRL1_REG      ADCTRL1;       // ADC Control 1
    union ADCTRL2_REG      ADCTRL2;       // ADC Control 2
    union ADCMAXCONV_REG   ADCMAXCONV;    // Max conversions
    union ADCCHSELSEQ1_REG ADCCHSELSEQ1;  // Channel select sequencing control 1
    union ADCCHSELSEQ2_REG ADCCHSELSEQ2;  // Channel select sequencing control 2
    union ADCCHSELSEQ3_REG ADCCHSELSEQ3;  // Channel select sequencing control 3
    union ADCCHSELSEQ4_REG ADCCHSELSEQ4;  // Channel select sequencing control 4
    union ADCASEQSR_REG    ADCASEQSR;     // Autosequence status register
    Uint16                   ADCRESULT[16];
/*    
    Uint16                 ADCRESULT0;    // Conversion Result Buffer 0
    Uint16                 ADCRESULT1;    // Conversion Result Buffer 1
    Uint16                 ADCRESULT2;    // Conversion Result Buffer 2
    Uint16                 ADCRESULT3;    // Conversion Result Buffer 3
    Uint16                 ADCRESULT4;    // Conversion Result Buffer 4
    Uint16                 ADCRESULT5;    // Conversion Result Buffer 5
    Uint16                 ADCRESULT6;    // Conversion Result Buffer 6
    Uint16                 ADCRESULT7;    // Conversion Result Buffer 7
    Uint16                 ADCRESULT8;    // Conversion Result Buffer 8
    Uint16                 ADCRESULT9;    // Conversion Result Buffer 9
    Uint16                 ADCRESULT10;   // Conversion Result Buffer 10
    Uint16                 ADCRESULT11;   // Conversion Result Buffer 11
    Uint16                 ADCRESULT12;   // Conversion Result Buffer 12
    Uint16                 ADCRESULT13;   // Conversion Result Buffer 13
    Uint16                 ADCRESULT14;   // Conversion Result Buffer 14
    Uint16                 ADCRESULT15;   // Conversion Result Buffer 15
*/    
    union ADCTRL3_REG      ADCTRL3;       // ADC Control 3
    union ADCST_REG        ADCST;         // ADC Status Register
};

#define ADCRESULT0  ADCRESULT[0]
#define ADCRESULT1  ADCRESULT[1]
#define ADCRESULT2  ADCRESULT[2]
#define ADCRESULT3  ADCRESULT[3]
#define ADCRESULT4  ADCRESULT[4]
#define ADCRESULT5  ADCRESULT[5]
#define ADCRESULT6  ADCRESULT[6]
#define ADCRESULT7  ADCRESULT[7]
#define ADCRESULT8  ADCRESULT[8]
#define ADCRESULT9  ADCRESULT[9]
#define ADCRESULT10 ADCRESULT[10]
#define ADCRESULT11 ADCRESULT[11]
#define ADCRESULT12 ADCRESULT[12]
#define ADCRESULT13 ADCRESULT[13]
#define ADCRESULT14 ADCRESULT[14]
#define ADCRESULT15 ADCRESULT[15]

应用例如:
    for (int i = 0; i < sizeof(Result); i ++)
    {
        Result[i] = 0;
    }
    for (int i = 0; i < 16; i ++)
    {
        AdcRegs.ADCRESULT[i] = 0;
    }
    AdcRegs.ADCRESULT[0]  = 0;
    AdcRegs.ADCRESULT0    = 0;
    AdcRegs.ADCRESULT[1]  = 0;
    AdcRegs.ADCRESULT1    = 0;

此思路可在其他类型一致连续的结构中都可利用~~~
例如:
在DSP281x_ECan.h中

struct ECAN_MBOXES {
   struct MBOX MBOX0;
//..........................
   struct MBOX MBOX31;
};

改为:
struct ECAN_MBOXES {
   struct MBOX MBOXS[32];
};

#define MBOX0  MBOXS[0]
//.......................
#define MBOX31 MBOXS[31]


在DSP281x_SysCtrl.h中
/* Password locations */
struct  CSM_PWL {
   Uint16   PSWD0;  // PSWD bits 15-0
   Uint16   PSWD1;  // PSWD bits 31-16
   Uint16   PSWD2;  // PSWD bits 47-32
   Uint16   PSWD3;  // PSWD bits 63-48
   Uint16   PSWD4;  // PSWD bits 79-64
   Uint16   PSWD5;  // PSWD bits 95-80
   Uint16   PSWD6;  // PSWD bits 111-96
   Uint16   PSWD7;  // PSWD bits 127-112
};

可改为:
/* Password locations */
struct  CSM_PWL {
   Uint16   PSWD[8];  // PSWD bits 15-0
};

#define PSWD0 PSWD[0]
//...................
#define PSWD7 PSWD[7]

/* CSM Register File */
struct  CSM_REGS {
   Uint16           KEY0;    // KEY reg bits 15-0
   Uint16           KEY1;    // KEY reg bits 31-16
   Uint16           KEY2;    // KEY reg bits 47-32
   Uint16           KEY3;    // KEY reg bits 63-48
   Uint16           KEY4;    // KEY reg bits 79-64
   Uint16           KEY5;    // KEY reg bits 95-80
   Uint16           KEY6;    // KEY reg bits 111-96
   Uint16           KEY7;    // KEY reg bits 127-112
   Uint16           rsvd1;   // reserved
   Uint16           rsvd2;   // reserved
   Uint16           rsvd3;   // reserved
   Uint16           rsvd4;   // reserved
   Uint16           rsvd5;   // reserved
   Uint16           rsvd6;   // reserved
   Uint16           rsvd7;   // reserved
   union CSMSCR_REG CSMSCR;  // CSM Status & Control register
};

改为:
struct  CSM_REGS {
   Uint16           KEY[8];
//.................................   
};

#define KEY0 KEY[0]
//...........................
#define KEY7 KEY[7]

点击看大图

点击看大图

点击看大图

hotpower 发表于 2008-5-8 19:19 DSP 技术 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

5楼: 哈哈~~~再奉送3个非典改写头文件~~~

DSP281x_Adc.rar

DSP281x_SysCtrl.rar

DSP281x_ECan.rar

系统分类: DSP  |  用户分类: DSP2812  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(778) | 回复(0)

发表于 2008/5/7 20:14:39

0

关于投票

DSP2812串口FIFO设置及"手动触发"发送中断服务之C++程序

所谓"手动触发"发送中断祥见: 俺来非典非典---利用UDRIE实现"手动触发"

这次菜农又在DSP2812上再次倒塌成功,特发帖祝贺~~~

/*****************************************************

注: 引用此法(实际给出了一般和FIFO两种串口编程方法用SCI_FIFO_MODE区别)

切记是菜农倒塌的~~~

转载请注明: 雁塔菜地 HotPower@126.com  2008.5.7

*****************************************************/

1.设置

void UartObj::Init(void)
{
unsigned int i;
    for (i = 0; i < sizeof(ReceiveBuffer); i ++) {
        ReceiveBuffer[i] = 0;
    }
    for (i = 0; i < sizeof(SendBuffer); i ++) {
        SendBuffer[i] = 0;
    }
    ReceiveWritePtr = 0;
    ReceiveReadPtr = 0;
    ReceivePosition = 0;
    ReceiveCount = 0;
    SendWritePtr = 0;
    SendReadPtr = 0;
 SendBusy = false;
 State = 0;
  
 EALLOW;
    GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1;
    GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1;
 EDIS;

    SciaRegs.SCICCR.all = 0x0007;   // 1 stop bit,  No loopback
                                  // No parity,8 char bits,
                                  // async mode, idle-line protocol
    SciaRegs.SCICTL1.all = 0x0003;  // enable TX, RX, internal SCICLK,
                                  // Disable RX ERR, SLEEP, TXWAKE
    SciaRegs.SCICTL2.bit.TXINTENA =1;
    SciaRegs.SCICTL2.bit.RXBKINTENA =1;
    SciaRegs.SCIHBAUD = 0x0000;
//    SciaRegs.SCILBAUD = SCI_PRD;
    SciaRegs.SCILBAUD = SCI_BAUD(CBR_38400);
#if SCI_FIFO_MODE
//    SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
    SciaRegs.SCIFFTX.all=0xE061;
    SciaRegs.SCIFFRX.all=0x2028;
#else   
    SciaRegs.SCIFFTX.all=0xA000;
    SciaRegs.SCIFFRX.all=0x201F;
#endif
    SciaRegs.SCIFFCT.all=0x00;

    SciaRegs.SCICTL1.all =0x0023;     // Relinquish SCI from Reset
#if SCI_FIFO_MODE
 SciaRegs.SCICTL1.bit.SWRESET = 1;
//    SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;
    SciaRegs.SCIFFRX.bit.RXFIFORESET=1;
    PieCtrlRegs.PIECRTL.bit.ENPIE = 1;   // Enable the PIE block
#endif 
 PieCtrlRegs.PIEIER9.bit.INTx1 = 1;
 PieCtrlRegs.PIEIER9.bit.INTx2 = 1;

 /*设置中断服务程序入口地址*/
 EALLOW; // This is needed to write to EALLOW protected registers
 PieVectTable.TXAINT = &ISRTxUart;
 PieVectTable.RXAINT = &ISRRxUart;
 EDIS;   // This is needed to disable write to EALLOW protected registers

 /*开中断*/
 IER |= M_INT9;
}

2."手动触发"发送中断

void UartObj::putchar(const char dat)
{
char ch;
    ch = dat;
    SendBuffer[SendWritePtr ++] = ch;//写入发送缓冲区(并非FIFO!!!)
    SendWritePtr &= sizeof(SendBuffer) - 1;
    if ((!SendBusy) && (dat == 0x0a))
    {
     SendBusy = true;
#if SCI_FIFO_MODE
     SciaRegs.SCIFFTX.bit.TXFIFOXRESET=1;//.手动触发"发送中断

#else
  SciaRegs.SCITXBUF = SendBuffer[SendReadPtr ++];
  SendReadPtr &= sizeof(SendBuffer) - 1;
#endif  
    }
}

3.收发中断服务程序

interrupt void ISRTxUart(void)
{
#if SCI_FIFO_MODE//串口为FIFO中断模式
 for (int i = 14 - SciaRegs.SCIFFTX.bit.TXFFST; (i > 0) && (Uart.SendWritePtr != Uart.SendReadPtr); i --)
 {//最多发送14个字符,16个容易丢字符
  SciaRegs.SCITXBUF = Uart.SendBuffer[Uart.SendReadPtr ++];
  Uart.SendReadPtr &= sizeof(Uart.SendBuffer) - 1;
 }
 Uart.SendBusy = Uart.SendWritePtr != Uart.SendReadPtr;//判断缓冲区空

//注意下句是成功的关键!!!
 SciaRegs.SCIFFTX.bit.TXFIFOXRESET = Uart.SendBusy//缓冲区非空
                                  || SciaRegs.SCIFFTX.bit.TXFFST;//FIFO非空
 SciaRegs.SCIFFTX.bit.TXINTCLR = 1;
#else//串口为一般中断模式
 if (Uart.SendWritePtr != Uart.SendReadPtr)//缓冲区非空允许发送
 {
  SciaRegs.SCITXBUF = Uart.SendBuffer[Uart.SendReadPtr ++];
  Uart.SendReadPtr &= sizeof(Uart.SendBuffer) - 1;
 }
 Uart.SendBusy = Uart.SendWritePtr != Uart.SendReadPtr;//判断缓冲区空
#endif 
 PieCtrlRegs.PIEACK.bit.ACK9 = 1;
}


interrupt void ISRRxUart(void)
{
#if SCI_FIFO_MODE//串口为FIFO中断模式
 for (int i = SciaRegs.SCIFFRX.bit.RXFIFST; i > 0; i --)
 {
  Uart.ReceiveBuffer[Uart.ReceiveWritePtr ++] = SciaRegs.SCIRXBUF.all;
  Uart.ReceiveWritePtr &= sizeof(Uart.ReceiveBuffer) - 1;
 }
 SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1;
 SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;
#else//串口为一般中断模式
 Uart.ReceiveBuffer[Uart.ReceiveWritePtr ++] = SciaRegs.SCIRXBUF.all;
 Uart.ReceiveWritePtr &= sizeof(Uart.ReceiveBuffer) - 1;
#endif 
 PieCtrlRegs.PIEACK.bit.ACK9 = 1;
}

interrupt void ISRADC(void)
{
   Adc.Result[0] = AdcRegs.ADCRESULT0 >>4;
   Adc.Result[1] = AdcRegs.ADCRESULT1 >>4;

   // Reinitialize for next ADC sequence
   AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1;         // Reset SEQ1
   AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1;       // Clear INT SEQ1 bit
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;   // Acknowledge interrupt to PIE
}

有关帖图如下:

 

点击开大图

点击开大图

系统分类: DSP  |  用户分类: DSP2812  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(2619) | 回复(0)

发表于 2008/5/6 23:45:16

0

关于投票

DSP2812串口波特率正确和良好的设计方法

1.宏定义

//以下定义来自windows里的winbase.h并改造
#define CBR_110             11E1
#define CBR_300             3E2
#define CBR_600             6E2
#define CBR_1200            12E2
#define CBR_2400            24E2
#define CBR_4800            48E2
#define CBR_9600            96E2
#define CBR_14400           144E2
#define CBR_19200           192E2
#define CBR_38400           384E2
#define CBR_56000           56E3
#define CBR_57600           576E2
#define CBR_115200          1152E2
#define CBR_128000          128E3
#define CBR_256000          256E3


#define CPU_FREQ     150E6
#define LSPCLK_FREQ  CPU_FREQ/4
#define SCI_FREQ     CBR_38400//波特率38400
#define SCI_PRD     (LSPCLK_FREQ/(SCI_FREQ*8))-1//此法在头文件中应用时不清晰
//以下由菜农改编
#define SCI_BAUD(baud) (LSPCLK_FREQ/(baud*8))-1

2.设置波特率

          SciaRegs.SCIHBAUD = 0x0000;
          SciaRegs.SCILBAUD = SCI_PRD;//实际的BaudRate在头文件中
//或    SciaRegs.SCILBAUD = SCI_BAUD(CBR_38400);//此法较清晰,BaudRate=38400

系统分类: DSP  |  用户分类: DSP2812  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1130) | 回复(0)

发表于 2008/5/6 0:32:58

0

关于投票

DSP2812串口设置及中断服务之C++程序

interrupt void ISRTxUart(void)
{
    if (Uart.SendWritePtr != Uart.SendReadPtr)
    {
        SciaRegs.SCITXBUF = Uart.SendBuffer[Uart.SendReadPtr ++];
        Uart.SendReadPtr &= 0xff;
    }
    Uart.SendBusy = Uart.SendWritePtr != Uart.SendReadPtr;
    SciaRegs.SCIFFTX.bit.TXINTCLR = 1;
    PieCtrlRegs.PIEACK.bit.ACK9 = 1;
}


interrupt void ISRRxUart(void)
{
    Uart.ReceiveBuffer[Uart.ReceiveWritePtr ++] = SciaRegs.SCIRXBUF.all;
    Uart.ReceiveWritePtr &= 0xff;
    SciaRegs.SCIFFRX.bit.RXFFOVRCLR = 1;
    SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;
    PieCtrlRegs.PIEACK.bit.ACK9 = 1;
}

void UartObj::Init(void)
{
unsigned int i;
    for (i = 0; i < sizeof(ReceiveBuffer); i ++) {
        ReceiveBuffer[i] = 0;
        SendBuffer[i] = 0;
    }
    ReceiveWritePtr = 0;
    ReceiveReadPtr = 0;
    ReceivePosition = 0;
    ReceiveCount = 0;
    SendWritePtr = 0;
    SendReadPtr = 0;
    SendBusy = false;
    State = 0;
       
    EALLOW;
       GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1;
       GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1;
    EDIS;
    /* loopback   8 bit data */
    SciaRegs.SCICCR.all = 0x07;    // 1 bit stop, disable parity, idle mode, 8 bits data
   
    SciaRegs.SCICTL1.all = 0x03; // enable TX
    SciaRegs.SCICTL2.all = 0x03; //
   
    SciaRegs.SCIHBAUD = 0;
    SciaRegs.SCILBAUD = 0xf3;//SCI_PRD & 0xff;//0xF3;
   
    SciaRegs.SCICTL1.all = 0x23;
   
//    PieCtrlRegs.PIECRTL.bit.ENPIE = 1;   // Enable the PIE block
    PieCtrlRegs.PIEIER9.bit.INTx1 = 1;
    PieCtrlRegs.PIEIER9.bit.INTx2 = 1;

    /*设置中断服务程序入口地址*/
    EALLOW;    // This is needed to write to EALLOW protected registers
    PieVectTable.TXAINT = &ISRTxUart;
    PieVectTable.RXAINT = &ISRRxUart;
    EDIS;   // This is needed to disable write to EALLOW protected registers

    /*开中断*/
    IER |= M_INT9;
}

//KEY7压键事件处理
void KeyboardObj::Key17(void)
{
       System.BeepOn();
    Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端
    Lcd.Display("KEY7键单击事件!!");
    Uart.puts("KEY7键单击事件");
}

点击开大图

系统分类: DSP  |  用户分类: DSP2812  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(2160) | 回复(0)

发表于 2008/5/6 0:13:11

0

关于投票

DSP2812串口状态机解码之C++程序

#include "uart.h"


UartObj::UartObj(void)
{
    Init();
}

void UartObj::Init(void)
{
unsigned int i;
    for (i = 0; i < sizeof(ReceiveBuffer); i ++) {
        ReceiveBuffer[i] = 0;
        SendBuffer[i] = 0;
    }
    ReceiveWritePtr = 0;
    ReceiveReadPtr = 0;
    ReceivePosition = 0;
    ReceiveCount = 0;
    SendWritePtr = 0;
    SendReadPtr = 0;
 SendBusy = false;
 State = 0;
  
 EALLOW;
    GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4 = 1;
    GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5 = 1;
 EDIS;
 /* loopback   8 bit data */
 SciaRegs.SCICCR.all = 0x07; // 1 bit stop, disable parity, idle mode, 8 bits data
 
 SciaRegs.SCICTL1.all = 0x03; // enable TX
 SciaRegs.SCICTL2.all = 0x03; //
 
 SciaRegs.SCIHBAUD = 0;
 SciaRegs.SCILBAUD = 0xf3;//SCI_PRD & 0xff;//0xF3;
 
 SciaRegs.SCICTL1.all = 0x23;
 
//    PieCtrlRegs.PIECRTL.bit.ENPIE = 1;   // Enable the PIE block
 PieCtrlRegs.PIEIER9.bit.INTx1 = 1;
 PieCtrlRegs.PIEIER9.bit.INTx2 = 1;

 /*设置中断服务程序入口地址*/
 EALLOW; // This is needed to write to EALLOW protected registers
 PieVectTable.TXAINT = &ISRTxUart;
 PieVectTable.RXAINT = &ISRRxUart;
 EDIS;   // This is needed to disable write to EALLOW protected registers

 /*开中断*/
 IER |= M_INT9;
}

void UartObj::putchar(const char dat)
{
char ch;
    ch = dat;
    SendBuffer[SendWritePtr ++] = ch;//写入发送缓冲区(并非FIFO!!!)
    SendWritePtr &= 0xff;
    if ((!SendBusy) && (dat == 0x0a))
    {
     SendBusy = true;
  SciaRegs.SCITXBUF = SendBuffer[SendReadPtr ++];
  SendReadPtr &= 0xff;
//     asm(" TRAP #6");//73
//     SciaRegs.SCICTL2.bit.TXINTENA = 1;//自动触发
    }
}

void UartObj::putstr(const char *str)
{
    while (*str)
    {
        putchar(*str);
        str++;
    }
}

void UartObj::puts(const char *str)
{
    while (*str)
    {
        putchar(*str);
        str++;
    }
    putchar(0x0d);
    putchar(0x0a);//回车换行
}

void UartObj::puthex(unsigned long data)
{
signed char i;
char str[9];
unsigned char val;
    for (i = 7; i >= 0; i --)
    {
        val = data & 0x0f;
        data >>= 4;
        if (val <= 9)
        {
            val += '0';
        }
        else
        {
            val += 'A' - 10;
        }
        str[i] = val;
    }
    str[8] = 0;
    putstr (str);
}

void UartObj::puthex(unsigned int data)
{
signed char i;
char str[5];
unsigned char val;
    for (i = 3; i >= 0; i --)
    {
        val = data & 0x0f;
        data >>= 4;
        if (val <= 9)
        {
            val += '0';
        }
        else
        {
            val += 'A' - 10;
        }
        str[i] = val;
    }
    str[4] = 0;
    putstr (str);
}

void UartObj::putint(unsigned int data)
{
signed char i;
char str[6];
unsigned char val;
    for (i = 4; i >= 0; i --)
    {
        val = data % 10;
        data /= 10;
        if ((i < 4) && (val == 0) && (data == 0))
        {
            val = ' ';
        }
        else
        {
            val += '0';
        }
        str[i] = val;
    }
    str[5] = 0;
    putstr (str);
}

void UartObj::putint(unsigned long data)
{
signed char i;
char str[10];
unsigned char val;
    for (i = 8; i >= 0; i --)
    {
        val = data % 10;
        data /= 10;
        if ((i < 8) && (val == 0) && (data == 0))
        {
            val = ' ';
        }
        else
        {
            val += '0';
        }
        str[i] = val;
    }
    str[9] = 0;
    putstr (str);
}

void UartObj::putint(unsigned int data, signed char size)
{
signed char i;
char str[7];
unsigned char val;
    size = 5 - size;
    for (i = 5; i >= 0; i --)
    {
        if (i == size)
        {
            if (size == 5)
            {
                val = 0;
            }
            else
            {
                val = '.';
            }
        }
        else
        {
            val = data % 10;
            data /= 10;
            if ((i < size - 1) && (val == 0) && (data == 0))
            {
                val = ' ';
            }
            else
            {
                val += '0';
            }
        }
        str[i] = val;
    }
    str[6] = '\0';
    putstr (str);
}

void UartObj::Decode(void)
{
unsigned char ch;
unsigned int *Ptr;
 while (ReceiveWritePtr != ReceiveReadPtr) 
 {
  ch = ReceiveBuffer[ReceiveReadPtr++];
  ReceiveReadPtr &= 0xff;
  switch (State)
  {
   case 0://'$'搜索
    if (ch == '$')
    {
     State = 1;
     ReceiveCount = 0;
    }
    ReceivePosition = ReceiveReadPtr;
    break;
   case 1://命令
    if (ch == ':')
    {
     if (ReceiveCount == 5 &&
         ReceiveBuffer[ReceivePosition] == 'W' &&
         ReceiveBuffer[(ReceivePosition + 1) & 0xff] == 'r' &&
         ReceiveBuffer[(ReceivePosition + 2) & 0xff] == 'i' &&
         ReceiveBuffer[(ReceivePosition + 3) & 0xff] == 't' &&
         ReceiveBuffer[(ReceivePosition + 4) & 0xff] == 'e')
     {
      State = 2;//Write命令地址
     } 
     else if (ReceiveCount == 4 &&
         ReceiveBuffer[ReceivePosition] == 'R' &&
         ReceiveBuffer[(ReceivePosition + 1) & 0xff] == 'e' &&
         ReceiveBuffer[(ReceivePosition + 2) & 0xff] == 'a' &&
         ReceiveBuffer[(ReceivePosition + 3) & 0xff] == 'd')
     {
      State = 3;//Read命令地址
     } 
     else if (ReceiveCount == 5 &&
         ReceiveBuffer[ReceivePosition] == 'E' &&
         ReceiveBuffer[(ReceivePosition + 1) & 0xff] == 'r' &&
         ReceiveBuffer[(ReceivePosition + 2) & 0xff] == 'a' &&
         ReceiveBuffer[(ReceivePosition + 3) & 0xff] == 's' &&
         ReceiveBuffer[(ReceivePosition + 4) & 0xff] == 'e')
     {
      State = 4;//Erase命令地址
     }
     else
     {
      State = 0;
     }
     ReceiveCount = 0;
     ReceivePosition = ReceiveReadPtr;
     Address = 0;
     Data = 0;
    }
    else if (ch == ';')
    {
     if (ReceiveCount == 5 &&
         ReceiveBuffer[ReceivePosition] == 'R' &&
         ReceiveBuffer[(ReceivePosition + 1) & 0xff] == 'e' &&
         ReceiveBuffer[(ReceivePosition + 2) & 0xff] == 's' &&
         ReceiveBuffer[(ReceivePosition + 3) & 0xff] == 'e' &&
         ReceiveBuffer[(ReceivePosition + 4) & 0xff] == 't')
     {
      State = 0;
      for(;;);
     }
    }
    else//命令字符个数
    {
     ReceiveCount ++;
    }
    break;
   case 2://Write命令地址
   case 3://Read命令地址
   case 4://Erase命令地址
    if ((State == 2) && (ch == ','))
    {
     State = 5;//Write命令数据
    }
    else if ((State == 3) && (ch == ';'))
    {
     Ptr = (unsigned int*)Address;
     Data = *Ptr;
     if ((Address >= 0x80000) && (Address <= 0x8ffff))
     {
      putstr("FLASH数据读出:[");
     }
     else
     {
      putstr("RAM数据读出:[");
     }
     puthex(Address);
     putstr("]=");
     puthex(Data);
     puts("");
     State = 0;
    }
    else if ((State == 4) && (ch == ';'))
    {
     if ((Address >= 0x80000) && (Address <= 0x8ffff))
     {
      Flash.SectorErase((Address & 0xffff) >> 11);
      putstr("FLASE扇区擦除:[");
      puthex(Address & 0xfffff800);
      putstr("-");
      puthex(Address | 0x7ff);
      putstr("]");
      puts("");
     }
     State = 0;
    }
    else if ((ch >= '0') && (ch <= '9'))
    {
     Address <<= 4;
     Address |= ch - '0';
    }
    else if ((ch >= 'A') && (ch <= 'F'))
    {
     Address <<= 4;
     Address |= ch - 'A' + 10;
    }
    else if ((ch >= 'a') && (ch <= 'f'))
    {
     Address <<= 4;
     Address |= ch - 'a' + 10;
    }
    break;
   case 5://Write命令数据
    if (ch == ';')//命令结束字符
    {
     if ((Address >= 0x80000) && (Address <= 0x8ffff))
     {
      Flash.Write(FLASH[Address & 0xffff], Data);
      putstr("FLASH数据写入:[");
     }
     else
     {
      Ptr = (unsigned int*)Address;
      *Ptr = Data;
      putstr("RAM数据写入:[");
     }
     puthex(Address);
     putstr("]=");
     puthex(Data);
     puts("");
     State = 0;
    }
    else if ((ch >= '0') && (ch <= '9'))
    {
     Data <<= 4;
     Data |= ch - '0';     
    }
    else if ((ch >= 'A') && (ch <= 'F'))
    {
     Data <<= 4;
     Data |= ch - 'A' + 10;     
    }
    else if ((ch >= 'a') && (ch <= 'f'))
    {
     Data <<= 4;
     Data |= ch - 'a' + 10;     
    }
    break;
   default:
    State = 0;
    break;
  }
    }
}

点击看大图

系统分类: DSP  |  用户分类: DSP2812  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1033) | 回复(0)

发表于 2008/5/5 23:14:18

0

关于投票

DSP2812读写SST39VF800A之C++程序源码

hotpower 发表于 2008-5-5 23:11 DSP 技术 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: DSP2812读写SST39VF800A之C++程序源码

/*-----------------------------------------------------
    DSP2812读写SST39VF800A之C++程序源码
本演示程序在Study-2812增强版上通过运行测试

菜农HotPower@126.com  2008.5.5  于西安大雁塔菜地
------------------------------------------------------*/
#include "flash.h"

FlashObj::FlashObj(void)
{
  Init();   
  Test();
}

void FlashObj::Init(void)
{
  Active = false;
  Busy = false;
  MakerId = 0;
  DeviceId = 0;
  FlashReset();
  ReadId();
  Test();
}

void FlashObj::FlashReset(void)
{
  Busy = true;
  FLASH[0x5555] = 0xaa;  
  FLASH[0x2AAA] = 0x55;  
  FLASH[0x5555] = 0xf0;
  Wait(FLASH[0x5555]);
  Busy = false;
}

void FlashObj::ReadId(void)
{
  Busy = true;
  FLASH[0x5555] = 0xaa;  
  FLASH[0x2AAA] = 0x55;  
  FLASH[0x5555] = 0x90;
  Wait(FLASH[0x5555]);
  MakerId = FLASH[0x0000] & 0xff;
  DeviceId = FLASH[0x0001] & 0xff;
//SST39VF800A MakerId="0xBF" DeviceId="0x81"
  Active = (MakerId == 0xBF) && (DeviceId == 0x81);
  FlashReset();
  Busy = false;
}

void FlashObj::ChipErase(void)
{
  Busy = true;
  FLASH[0x5555] = 0xaa;  
  FLASH[0x2AAA] = 0x55;  
  FLASH[0x5555] = 0x80;
  FLASH[0x5555] = 0xaa;  
  FLASH[0x2AAA] = 0x55;  
  FLASH[0x5555] = 0x10;
  Wait(FLASH[0x5555]);
  Busy = false;
}

void FlashObj::SectorErase(unsigned int SectorNum)
{
  Busy = true;
  FLASH[0x5555] = 0xaa;  
  FLASH[0x2AAA] = 0x55;  
  FLASH[0x5555] = 0x80;
  FLASH[0x5555] = 0xaa;  
  FLASH[0x2AAA] = 0x55;  
  FLASH[SectorSize * SectorNum] = 0x30;
  Wait(FLASH[0x5555]);
  Busy = false;
}

void FlashObj::BlockErase(unsigned int BlockNum)
{
  Busy = true;
  FLASH[0x5555] = 0xaa;  
  FLASH[0x2AAA] = 0x55;  
  FLASH[0x5555] = 0x80;
  FLASH[0x5555] = 0xaa;  
  FLASH[0x2AAA] = 0x55;  
  FLASH[BlockSize * BlockNum] = 0x50;
  Wait(FLASH[0x5555]);
  Busy = false;
}

void FlashObj::Write(unsigned int & address, unsigned int val)
{
  Busy = true;
  FLASH[0x5555] = 0xaa;  
  FLASH[0x2AAA] = 0x55;  
  FLASH[0x5555] = 0xa0;
  address = val;
  Wait(address);
  Busy = false;
}

void FlashObj::Wait(unsigned int & address)
{
unsigned int temp, val;
  Busy = true;
  do
  {
    _delay_loop_(1);
    val = address;
    _delay_loop_(1);
    temp = address;
  }
  while(((val ^ temp) & BIT6) != 0);
  Busy = false;
}

void FlashObj::Test(void)
{
  Busy = true;
  if (Active)//SST39VF800A测试正常
  {
    FlashReset();
    ChipErase();
    FlashReset();
    Write(FLASH[0x0000], 0x1234);
    Write(FLASH[0x5555], 0x1234);
    Write(FLASH[0x2aaa], 0xabcd);
    FlashReset();
    SectorErase(0);
    FlashReset();
    Write(FLASH[0x0000], 0x8888);
    FlashReset();
    BlockErase(0);
    Write(FLASH[0x0000], 0x6666);
    FlashReset();
  }
  Busy = false;
}

下图是在SST39VF800A上实现的"FLASH二次写入"图例

系统分类: DSP  |  用户分类: DSP2812  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1310) | 回复(0)

发表于 2008/5/5 23:01:56

0

关于投票

DSP281X变量地址数组定位方法

hotpower 发表于 2008-5-5 23:00 DSP 技术 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: DSP281X变量地址数组定位方法

void FlashObj::ChipErase(void)
{
  Busy = true;
  FLASH[0x5555] = 0xaa;  
  FLASH[0x2AAA] = 0x55;  
  FLASH[0x5555] = 0x80;
  FLASH[0x5555] = 0xaa;  
  FLASH[0x2AAA] = 0x55;  
  FLASH[0x5555] = 0x10;
  Wait(FLASH[0x5555]);
  Busy = false;
}

在函数ChipErase中,Flash变量地址0x85555是用FLASH[0x5555]表达的.
这样用数组寻址比较直观~~~

实现方法如下:

1.在CMD文件中

MEMORY
{
PAGE 0:    /* Program Memory */

PAGE 1:    /* Data Memory */
   ERAM        : origin = 0x100000, length = 0x04000
   EFLASH      : origin = 0x080000, length = 0x10000
}

SECTIONS
{
   ERamRegsFile          : > ERAM,        PAGE = 1
   EFlashRegsFile        : > EFLASH,      PAGE = 1
}

2.在C/C++文件中
#pragma DATA_SECTION("ERamRegsFile")
volatile unsigned int RAM[0x4000];

#pragma DATA_SECTION("EFlashRegsFile")
volatile unsigned int FLASH[0x10000];

3.在应用程序中
extern unsigned int RAM[];
extern unsigned int FLASH[];



关于DSP281X变量地址定位问题

系统分类: DSP  |  用户分类: DSP2812  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(718) | 回复(0)

发表于 2008/4/25 12:26:22

1

关于投票

在DSP2812上的"零耗时键盘"演示C++程序

点击下载程序源码LCD_DEMO.RAR: rar

 

/*-----------------------------------------------------
      在DSP2812上的"零耗时键盘"演示C++程序
本演示程序在Study-2812增强版上通过运行测试

菜农HotPower@126.com  2008.4.25  于西安大雁塔菜地
------------------------------------------------------*/
#include "main.h"

class SystemObj System;
class TimerObj Timer;
class LcdObj Lcd;
class KeyboardObj Keyboard;

int main(void)
{
 Lcd.SetDisplayPos(0, 0);//汉字定位到上行左端
 Lcd.Display("汉字显示演示12");
 Lcd.SetDisplayPos(1, 0);//汉字定位到上行左端
 Lcd.Display("汉字显示演示34");
 Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端
 Lcd.Display("汉字显示演示56");
 Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端
 Lcd.Display("汉字显示演示78");

 EALLOW;
// PieCtrlRegs.PIEACK.all = 0xFFFF;//PIEACK_GROUP1;
 PieCtrlRegs.PIEACK.bit.ACK7 = 1;
 EDIS;
 
 EINT;   // Enable Global interrupt INTM
 ERTM; // Enable Global realtime interrupt DBGM
 for(;;)
 {
    asm(" nop");
 // Reset the watchdog counter
    KickDog();
 }
}

 

 

系统分类: DSP  |  用户分类: DSP2812  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1517) | 回复(0)

发表于 2008/4/17 2:25:33

0

关于投票

DSP281X之LCD12864 C++程序代码

hotpower 发表于 2008-4-17 02:24 DSP 技术 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: DSP281X之LCD12864 C++程序代码

//本程序在http://www.study-kit.com/list.asp?ProdId=NO052上通过测试
//HotPower@126.com 2008.4.17 2:28

#include "lcd.h"

LcdObj::LcdObj(void)
{
    Init();
}

void LcdObj::Init(void)
{
    SendCommand(0x30);//发送功能设定控制命令(8位)
    SendCommand(0x30);//发送功能设定控制命令(8位)
    SendCommand(0x01);//发送清除显示命令
    SendCommand(0x06);//发送进入点命令0x06
    SendCommand(0x0a);//发送开关显示关光标命令
    SendCommand(0x0c);//发送开显示关光标命令
    SendCommand(0x02);//发送位址归位命令,设定DDRAM位址计数器为0
      SendCommand(0x17);//游标或显示移位控制
    SendCommand(0x80);//发送设定DDRAM地址0x00命令,光标定位到(0,0)
    ClearBuffer();//清空LCD显示缓冲区
    DisplayBuffer();
}

void LcdObj::delay(unsigned int t)
{
      while(t>0)
      {
        t--;
        for (int i = 0; i < 150; i++);
    }
}

void LcdObj::SendCommand(char cCommand)
{
    LcdComH = cCommand;
    LcdComL = cCommand;
      if (cCommand == 0x01)//清除显示命令,需要等待时间相对较长
    {
        delay(1600);//st7920要求等待1.6mS
//        DSP28x_usDelay(1600);//st7920要求等待1.6mS
    }
      else
    {
        delay(72);//st7920要求等待72uS
//        DSP28x_usDelay(72);//st7920要求等待72uS
    }
}

void LcdObj::SendData(char cData)
{
    LcdDatH = cData;
    LcdDatL = cData;
    delay(72);//st7920要求等待72uS
//    DSP28x_usDelay(72);//st7920要求等待72uS
}

void LcdObj::ClearBuffer(void)
{
unsigned char i, j;
    for (i = 0;i < 4;i ++)
    {
        for (j = 0;j < 16; j ++)
        {
          Buffer[i][j] = ' ';
        }
        RowWriteEnable[i] = 1;//允许此行刷新汉字显示
    }
    Row = 0;
    Col = 0;
}

void LcdObj::DisplayBuffer(void)
{
unsigned char i, j;
      for (i = 0; i < 4; i ++)
      {//4行汉字
        if (RowWriteEnable[i])
        {//允许此行刷新汉字显示
              SendCommand(0x80 + (i & 1) * 16 + (i >> 1) * 8);//移动光标
              for (j = 0; j < 16; j ++)
              {//每行8个汉字16个字符
                SendData(Buffer[i][j]);//刷新显示字符
              }
              RowWriteEnable[i] = 0;//过后不允许此行刷新汉字显示
        }
      }
}

void LcdObj::SetDisplayPos(unsigned char row, unsigned char col)
{
    Row = row & 0x03;//4行
    Col = col & 0x0f;//16列
}

void LcdObj::Display(const char *string)
{
char len, i;
      len = strlen(string);
      if ((Row < 4) && ((Col + len) <= 16))
      {
        if (len == 0)
        {
              while(Col < 16)
              {
                  Buffer[Row][Col ++] = ' ';
              }
        }
        else
              for (i = 0; i < len; i ++) Buffer[Row][Col ++] = string[i];
        RowWriteEnable[Row] = 1;//需要显示刷新
      }
}

#include "main.h"

class SystemObj System;
class TimerObj Timer;//系统时间类
class LcdObj Lcd;
class KeyboardObj Keyboard;


int main(void)
{
    Lcd.SetDisplayPos(0, 0);//汉字定位到上行左端
    Lcd.Display("汉字显示演示12");
    Lcd.SetDisplayPos(1, 0);//汉字定位到上行左端
    Lcd.Display("汉字显示演示34");
    Lcd.SetDisplayPos(2, 0);//汉字定位到上行左端
    Lcd.Display("汉字显示演示56");
    Lcd.SetDisplayPos(3, 0);//汉字定位到上行左端
    Lcd.Display("汉字显示演示78");

    EALLOW;
//    PieCtrlRegs.PIEACK.all = 0xFFFF;//PIEACK_GROUP1;
    PieCtrlRegs.PIEACK.bit.ACK7 = 1;
    EDIS;
    
    EINT;   // Enable Global interrupt INTM
    ERTM;    // Enable Global realtime interrupt DBGM
    for(;;)
    {
       asm(" nop");
    // Reset the watchdog counter
       KickDog();
    }
}


interrupt void ISRTimer0(void)
{
    Lcd.DisplayBuffer();//定时刷新LCD显示(只刷新新行字符)
    PieCtrlRegs.PIEACK.bit.ACK7 = 1;
//    PieCtrlRegs.PIEIFR1.bit.INTx7 = 1;
//    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

* - 本贴最后修改时间:2007-6-2 2:50:09 修改者:hotpower

http://www.study-kit.com/list.asp?ProdId=NO052
点击看大图

系统分类: DSP  |  用户分类: DSP2812  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(995) | 回复(0)

发表于 2008/4/17 2:03:34

0

关于投票

DSP281X硬件SPI读写一体化C++函数(驱动74hc595)

hotpower 发表于 2008-4-17 02:01 DSP 技术 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: DSP281X硬件SPI读写一体化C++函数(驱动74hc595)

//菜农HotPower@126.com 2008.4.17 1:58
void SystemObj::InitSpi(void)
{

    EALLOW;
    GpioMuxRegs.GPFMUX.all |= 0x000F;    // Select GPIOs to be SPI pins     
                                     // Port F MUX - x000 0000 0000 1111
      EDIS;

// Initialize SPI FIFO registers
    SpiaRegs.SPIFFTX.all=0xE040;
    SpiaRegs.SPIFFRX.all=0x204f;
    SpiaRegs.SPIFFCT.all=0x0;

      SpiaRegs.SPICCR.all =0x0008;                 // Reset on, rising edge, 8-bit char bits  
      SpiaRegs.SPICTL.all =0x0006;                 // Enable master mode, normal phase,
                                                 // enable talk, and SPI int disabled.
      SpiaRegs.SPIBRR =0x007F;                                    
    SpiaRegs.SPICCR.all =0x009F;                 // Relinquish SPI from Reset   
    SpiaRegs.SPIPRI.bit.FREE = 1;                // Set so breakpoints don't disturb xmission
    
    //(CLKPOLARITY,CLK_PHASE )01 10支持74HC595,00或11不支持  测试通过
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 1;
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
    
      System.SpiReadWrite(0xff);//LED数码管灭
    //发送595锁存脉冲信号RCLK
      SpiRclkRegs = 0;
      SpiRclkRegs = 1;
}

//硬件SPI读写一体化函数
unsigned char SystemObj::SpiReadWrite(unsigned char cData)
{
      SpiaRegs.SPITXBUF = cData;
    // Wait until data is received
      while(SpiaRegs.SPIFFRX.bit.RXFFST !=1)
      {
//        KickDog();//喂狗测试
      }             
    // Check against sent data
      return SpiaRegs.SPIRXBUF;                
}



//数码管
#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)



interrupt void ISRTimer2(void)
{
//以下定义为共阳数码管
static const unsigned char LedTab[] =
{//显示字符表存放在ROM中
  LedChar0, LedChar1, LedChar2, LedChar3,
  LedChar4, LedChar5, LedChar6, LedChar7,
  LedChar8, LedChar9, LedCharA, LedCharB,
  LedCharC, LedCharD, LedCharE, LedCharF
};
    System.SpiReadWrite(~LedTab[Timer.Count2 & 0x0f]);//硬件SPI读写一体化函数
    Timer.Count2++;
//发送595锁存脉冲信号RCLK
    SpiRclkRegs = 0;
    SpiRclkRegs = 1;
}

//数码管
#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)

系统分类: DSP  |  用户分类: DSP2812  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1009) | 回复(0)

发表于 2008/4/17 1:37:27

1

关于投票

关于DSP281X变量地址定位问题

hotpower 发表于 2008-4-17 01:37 DSP 技术 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: 关于DSP281X变量地址定位问题

在结合硬件的编程中,有些变量需要特定地址.

一般可以采用指针变量.
例如:
unsigned int *LedReg   = (unsigned int *)0x5f00;//发光二极管地址
*LedReg = 0xFF;

但有些时候感觉不是太好时,可以像Keil那样

unsigned int LedReg at 0x5f00;//发光二极管地址
LedReg = 0xFF;

这样看着"比较顺眼"~~~
但在TIDSP的CCS环境下,不能采用at或__at等来定位地址.
不过CCS也提供了类似的手段,不过有些"麻烦".

具体实现:

1.在CMD文件中

MEMORY
{
PAGE 0:    /* Program Memory */

PAGE 1:    /* Data Memory */

   LED_REG     : origin = 0x005f00, length = 0x00001 /*发光二极管地址*/
   LCD_ComL    : origin = 0x005100, length = 0x00001
   LCD_ComH    : origin = 0x005200, length = 0x00001
   LCD_DatL    : origin = 0x005300, length = 0x00001
   LCD_DatH    : origin = 0x005400, length = 0x00001
   EINT_REG    : origin = 0x005c00, length = 0x00001
   KEY_REG     : origin = 0x005b00, length = 0x00001
   RCLK_REG    : origin = 0x005500, length = 0x00001 /*数码管锁存地址*/
}


SECTIONS
{
   LedDataRegsFile   : > LED_REG,     PAGE = 1
   LcdComlRegsFile   : > LCD_ComL,    PAGE = 1
   LcdComhRegsFile   : > LCD_ComH,    PAGE = 1
   LcdDatlRegsFile   : > LCD_DatL,    PAGE = 1
   LcdDathRegsFile   : > LCD_DatH,    PAGE = 1
   KeyRegsFile       : > KEY_REG,     PAGE = 1
   EintRegsFile      : > EINT_REG,    PAGE = 1
   RclkRegsFile      : > RCLK_REG,    PAGE = 1
}

2.在C/C++文件中


#ifdef __cplusplus
#pragma DATA_SECTION("LedDataRegsFile") /*C++语言格式*/
#else
#pragma DATA_SECTION(LedRegs,"LedDataRegsFile");/*C语言格式*/
#endif
volatile unsigned int LedRegs;

/*以下为C++语言格式*/

#pragma DATA_SECTION("LcdComlRegsFile")
volatile unsigned int LcdComL;
#pragma DATA_SECTION("LcdComhRegsFile")
volatile unsigned int LcdComH;
#pragma DATA_SECTION("LcdDatlRegsFile")
volatile unsigned int LcdDatL;
#pragma DATA_SECTION("LcdDathRegsFile")
volatile unsigned int LcdDatH;

#pragma DATA_SECTION("EintRegsFile")
volatile unsigned int EintRegs;

#pragma DATA_SECTION("KeyRegsFile")
volatile unsigned char KeyRegs;

#pragma DATA_SECTION("RclkRegsFile")
volatile bool SpiRclkRegs;


3.在应用程序中

extern unsigned int LedRegs;
extern volatile unsigned int EintRegs;
extern volatile unsigned char KeyRegs;
extern volatile bool SpiRclkRegs;
//............
LedRegs = 0xff;//这样就不需要指针变量的写法了
//..................

//HotPower@126.com 2008.4.17 1:34

系统分类: DSP  |  用户分类: DSP2812  |  标签: 无标签  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1418) | 回复(1)

Total , Page /