打印

利用定时器0做一个秒表,芯片为28027,数码管不能显示

[复制链接]
1086|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xpfshawn|  楼主 | 2016-1-10 11:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xpfshawn 于 2016-1-11 18:30 编辑

程序编译没有错误,但是数码管不能刷新显示。在Debug 的时候按下暂停键就会刷新一下显示最新的计数值CpuTimer0.InterruptCount。求大神解答,程序如下
#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File
// Prototype statements for functions found within this file.
interrupt void cpu_timer0_isr(void);
interrupt void cpu_timer1_isr(void);
interrupt void cpu_timer2_isr(void);
void InitTimerGpio(void);
interrupt void spiTxFifoIsr(void);
interrupt void spiRxFifoIsr(void);
void spi_fifo_init(void);
void delay_loop(void);

Uint16 Led_lib[] = {0x42, 0xf3, 0x86, 0xa2, 0x33, 0x2a, 0x0a, 0xf2, 0x02, 0x22, \
                                        0x40, 0xf1, 0x84, 0xa0, 0x31, 0x28, 0x08, 0xf0, 0x00, 0x20, \
                                        0x1e, 0x0e, 0x0f, 0xbf, 0x23, 0x9b, 0x8b}; //小LED字库
Uint16 Voltage1[512];
Uint16 Voltage2[512];
Uint32 Voltage = 0;
Uint16 Adc_Isr_Count;
Uint16 sdata[2];     // Send data buffer
Uint16 rdata[2];     // Receive data buffer
Uint16 rdata_point;  // Keep track of where we are
                     // in the data stream to check received data
Uint16 sdata_point;
Uint16 sdata_point_unm;
int m=0;

void main(void)
{
        int i;
// Step 1. Initialize System Control:
// PLL, WatchDog, enable Peripheral Clocks
// This example function is found in the DSP2802x_SysCtrl.c file.
   InitSysCtrl();

// Step 2. Initalize GPIO:
// This example function is found in the DSP2802x_Gpio.c file and
// illustrates how to set the GPIO to it's default state.
// InitGpio();  // Skipped for this example
   InitTimerGpio();
   InitSpiaGpio();
// Step 3. Clear all interrupts and initialize PIE vector table:
// Disable CPU interrupts
   DINT;

// Initialize the PIE control registers to their default state.
// The default state is all PIE interrupts disabled and flags
// are cleared.
// This function is found in the DSP2802x_PieCtrl.c file.
   InitPieCtrl();

// Disable CPU interrupts and clear all CPU interrupt flags:
   IER = 0x0000;
   IFR = 0x0000;

// Initialize the PIE vector table with pointers to the shell Interrupt
// Service Routines (ISR).
// This will populate the entire table, even if the interrupt
// is not used in this example.  This is useful for debug purposes.
// The shell ISR routines are found in DSP2802x_DefaultIsr.c.
// This function is found in DSP2802x_PieVect.c.
   InitPieVectTable();

   spi_fifo_init();

// Interrupts that are used in this example are re-mapped to
// ISR functions found within this file.
   EALLOW;  // This is needed to write to EALLOW protected registers
   PieVectTable.TINT0 = &cpu_timer0_isr;
EDIS;    // This is needed to disable write to EALLOW protected registers

   EALLOW;        // This is needed to write to EALLOW protected registers
   PieVectTable.SPIRXINTA = &spiRxFifoIsr;
   PieVectTable.SPITXINTA = &spiTxFifoIsr;
   EDIS;   // This is needed to disable write to EALLOW protected registers
   PieCtrlRegs.PIECTRL.bit.ENPIE = 1;   // Enable the PIE block
   PieCtrlRegs.PIEIER6.bit.INTx1=1;     // Enable PIE Group 6, INT 1
   PieCtrlRegs.PIEIER6.bit.INTx2=1;     // Enable PIE Group 6, INT 2
   IER |= 0x20;                         // Enable CPU INT6
//   EINT;                                                          // Enable Global interrupt INTM
//   ERTM;                                                          // Enable Global realtime interrupt DBGM

// Step 4. Initialize the Device Peripheral. This function can be
//         found in DSP2802x_CpuTimers.c
   InitCpuTimers();   // For this example, only initialize the Cpu Timers

#if (CPU_FRQ_60MHZ)
// Configure CPU-Timer 0, 1, and 2 to interrupt every second:
// 60MHz CPU Freq, 1 second Period (in uSeconds)

   ConfigCpuTimer(&CpuTimer0, 60, 1000000);
#endif


// To ensure precise timing, use write-only instructions to write to the entire register. Therefore, if any
// of the configuration bits are changed in ConfigCpuTimer and InitCpuTimers (in DSP2802x_CpuTimers.h), the
// below settings must also be updated.

   CpuTimer0Regs.TCR.all = 0x4001; // Use write-only instruction to set TSS bit = 0

// Step 5. User specific code, enable interrupts:
// Enable CPU int1 which is connected to CPU-Timer 0, CPU int13
// which is connected to CPU-Timer 1, and CPU int 14, which is connected
// to CPU-Timer 2:
   IER |= M_INT1;


// Enable TINT0 in the PIE: Group 1 interrupt 7
   PieCtrlRegs.PIEIER1.bit.INTx7 = 1;

   EINT;   // Enable Global interrupt INTM
   ERTM;   // Enable Global realtime interrupt DBGM

// Step 6. IDLE loop. Just sit and loop forever (optional):
   for(;;)
   {
           if(CpuTimer0.InterruptCount>m)
           {
                   Voltage=CpuTimer0.InterruptCount;
                   sdata[1] = (Led_lib[Voltage%100/10])*256 + Led_lib[Voltage%10];
                   sdata[0] = (Led_lib[(Voltage/1000)])*256 + Led_lib[Voltage%1000/100];
                   delay_loop();
                   if(CpuTimer0.InterruptCount==0xFFFF)
                   {
                           CpuTimer0.InterruptCount=0;
                   }
                   m=CpuTimer0.InterruptCount;
           }

   }

}

void delay_loop()
{
    long      i;
    for (i = 0; i < 10000; i++) {}
}

interrupt void cpu_timer0_isr(void)
{
   CpuTimer0.InterruptCount++;

   GpioDataRegs.GPATOGGLE.bit.GPIO0 = 1;

   GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;

   // Acknowledge this interrupt to receive more interrupts from group 1
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

void InitTimerGpio(void)
{
        EALLOW;
        GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0;
        GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1;

        GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
        GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;

        GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0;
        GpioCtrlRegs.GPADIR.bit.GPIO1 = 1;

        GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 0;
        GpioCtrlRegs.GPADIR.bit.GPIO2 = 1;
        EDIS;
}

void spi_fifo_init()
{
// Initialize SPI FIFO registers
   SpiaRegs.SPICCR.bit.SPISWRESET=0; // Reset SPI

   SpiaRegs.SPICCR.all=0x000F;       //16-bit character, Loopback mode
   SpiaRegs.SPICTL.all=0x0017;       //Interrupt enabled, Master/Slave XMIT enabled
   SpiaRegs.SPISTS.all=0x0000;
   SpiaRegs.SPIBRR=0x0063;           // Baud rate
   SpiaRegs.SPIFFTX.all=0xC022;      // Enable FIFO's, set TX FIFO level to 2
   SpiaRegs.SPIFFRX.all=0x0022;      // Set RX FIFO level to 2
   SpiaRegs.SPIFFCT.all=0x00;
   SpiaRegs.SPIPRI.all=0x0010;

   SpiaRegs.SPICCR.bit.SPISWRESET=1;  // Enable SPI

   SpiaRegs.SPIFFTX.bit.TXFIFO=1;
   SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;
}

interrupt void spiTxFifoIsr(void)
{
         Uint16 i;
         GpioDataRegs.GPADAT.bit.GPIO19 = 1;
         for(i=0;i<2;i++)
         {
                 SpiaRegs.SPITXBUF=sdata;      // Send data
         }
         GpioDataRegs.GPADAT.bit.GPIO19 = 0;

//    sdata_point++;

    SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;  // Clear Interrupt flag
        PieCtrlRegs.PIEACK.all|=0x20;                  // Issue PIE ACK
}

interrupt void spiRxFifoIsr(void)
{
    Uint16 i;
    for(i=0;i<2;i++)
    {
            rdata=SpiaRegs.SPIRXBUF;                // Read data
        }

//        rdata_point++;
        SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1;  // Clear Overflow flag
        SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1;         // Clear Interrupt flag
        PieCtrlRegs.PIEACK.all|=0x20;       // Issue PIE ack
}

相关帖子

沙发
jayzah| | 2016-1-10 13:54 | 只看该作者
动态的能显示么?

使用特权

评论回复
板凳
xpfshawn|  楼主 | 2016-1-10 13:58 | 只看该作者
jayzah 发表于 2016-1-10 13:54
动态的能显示么?

就是动态的不能显示

使用特权

评论回复
地板
豆腐块| | 2016-1-10 21:44 | 只看该作者
动态显示,多长时间扫描一次

使用特权

评论回复
5
wbaoj123| | 2016-1-11 14:55 | 只看该作者
SpiaRegs.SPITXBUF=sdata; 不是应该为sdata[i]?

使用特权

评论回复
6
xpfshawn|  楼主 | 2016-1-11 18:31 | 只看该作者
wbaoj123 发表于 2016-1-11 14:55
SpiaRegs.SPITXBUF=sdata; 不是应该为sdata?

是我发帖时的显示问题。。。

使用特权

评论回复
7
xpfshawn|  楼主 | 2016-1-11 18:37 | 只看该作者
豆腐块 发表于 2016-1-10 21:44
动态显示,多长时间扫描一次

一秒。。。计时器0中断一次,CpuTimer0.InterruptCount加一,我根据中断之后的值进行判断。设置了一个m参数,部分程序如下
for(;;)         //主循环
   {
           if(CpuTimer0.InterruptCount>m)       //当CpuTimer0.InterruptCount大于m,此时m的值是CpuTimer0.InterruptCount--的值
           {
                   Voltage=CpuTimer0.InterruptCount;
                   sdata[1] = (Led_lib[Voltage%100/10])*256 + Led_lib[Voltage%10];
                   sdata[0] = (Led_lib[(Voltage/1000)])*256 + Led_lib[Voltage%1000/100];
                   delay_loop();
                   if(CpuTimer0.InterruptCount==0xFFFF)//当计数达到显示最大值时清零
                   {
                           CpuTimer0.InterruptCount=0;
                   }
                   m=CpuTimer0.InterruptCount;       //将CpuTimer0.InterruptCount的值赋给m
           }
定时器中断
interrupt void cpu_timer0_isr(void)
{
   CpuTimer0.InterruptCount++;         //中断次数加一

   GpioDataRegs.GPATOGGLE.bit.GPIO0 = 1;

   GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1;

   // Acknowledge this interrupt to receive more interrupts from group 1
   PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

使用特权

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

本版积分规则

24

主题

76

帖子

3

粉丝