今天刚拿到板子,马上焊了最小系统,连上JATG程序下载正常,利用系统的时钟编写了一个定时器中断交替点亮2个LED的程序。程序在瑞泰2812实验箱上运行正常,可以在LED的驱动引脚上得到一个方波信号。说明程序运行正常,可以驱动LED灯闪烁运行。程序下载到开发板运行,给DSP供电的电源芯片ASM1117-5开始温度升高。运行程序,灯没有被驱动。发现2812芯片,与2812芯片供电电源芯片ASM1117-5温度升高到烫手,给外设供电的ASM1117-5没有发现温度大幅升高。给发迅速停止程序运行,芯片温度降低。可以推测为在2812开始运行时,电源芯片电流急剧增大。<br />附录程序<br />#include "DSP281x_Device.h" // DSP281x Headerfile Include File<br />#include "DSP281x_Examples.h" // DSP281x Examples Include File<br /><br />// 中断服务程序函数原型声明<br />interrupt void cpu_timer0_isr(void);<br /><br />//*定义的各个外设寄存器的地址*//<br />#define LEDS *(int *)0xc0000 <br />//#define CTRGR *(int *)0x108000<br />//#define CTRLCDCMDR *(int *)0x108001<br />//#define CTRKEY *(int *)0x108001<br />//#define CTRLCDCR *(int *)0x108002<br />//#define CTRCLKEY *(int *)0x108002<br />//#define CTRLCDLCR *(int *)0x108003<br />//#define CTRLCDRCR *(int *)0x108004<br />//#define CTRLA *(int *)0x108005<br />//#define CTRLR *(int *)0x108007<br />#define LED1_ON GpioDataRegs.GPFDAT.bit.GPIOF6=0<br />#define LED1_OFF GpioDataRegs.GPFDAT.bit.GPIOF6=1<br />#define LED2_ON GpioDataRegs.GPFDAT.bit.GPIOF7=0<br />#define LED2_OFF GpioDataRegs.GPFDAT.bit.GPIOF7=1<br /><br />void Gpio_select(void);<br /><br />//声明全局变量<br />int i=0,nCount;<br />unsigned int uLBD,z;<br /><br />void main(void)<br />{ <br /> <br />// unsigned int uPort8000;<br /><br /> InitSysCtrl(); //初始化cpu<br /><br /> DINT; //关中断<br /><br /> InitPieCtrl(); //初始化pie寄存器<br /> <br /><br /> IER = 0x0000; //禁止所有的中断<br /> IFR = 0x0000; //清除所有的中断标志CPU级<br /><br /><br /> InitPieVectTable(); //初始化pie中断向量表,使中断指向可知状态<br /><br /><br /> EALLOW; // This is needed to write to EALLOW protected registers<br /> PieVectTable.TINT0 = &cpu_timer0_isr; //指定中断服务子程序<br /> EDIS; // This is needed to disable write to EALLOW protected registers<br /><br /> CpuTimer0.RegsAddr = &CpuTimer0Regs; <br /> CpuTimer0Regs.PRD.all = 0xffff; //定时计数器最大周期<br /> CpuTimer0Regs.TPR.all = 0x0010; //定时器预定标寄存器,4分频<br /> CpuTimer0Regs.TIM.all = 0; //定时计数器<br /> CpuTimer0Regs.TPRH.all = 0; //定时器预定标寄存器<br /> // 确定定时器停止:<br /> CpuTimer0Regs.TCR.bit.TSS = 1; //定时器停止状态位,停止<br /> CpuTimer0Regs.TCR.bit.SOFT = 1; //CPU定时器仿真模式(自由运行)<br /> CpuTimer0Regs.TCR.bit.FREE = 1; //CPU定时器仿真模式(自由运行)<br /> // 重新使能定时器:<br /> CpuTimer0Regs.TCR.bit.TRB = 1; //定时器重新装载控制位<br /> CpuTimer0Regs.TCR.bit.TIE = 1; //定时器中断使能位<br /> // 初始化定时器中断计数器:<br /> CpuTimer0.InterruptCount = 0; //定时器中断计数器 <br /><br /><br /> StartCpuTimer0(); //启动定时器0<br /><br />// Enable CPU INT1 which is connected to CPU-Timer 0:<br /> IER |= M_INT1;<br /><br />// Enable TINT0 in the PIE: Group 1 interrupt 7<br /> PieCtrlRegs.PIEIER1.bit.INTx7 = 1;<br /><br />// Enable global Interrupts and higher priority real-time debug events:<br /> EINT; // Enable Global interrupt INTM<br /> ERTM; // Enable Global realtime interrupt DBGM<br /> //CTRGR=0; // 初始化ICETEK-CTR<br /> //CTRGR=0x80;<br /> //CTRGR=0;<br /> //CTRLR=0; // 关闭东西方向的交通灯<br /> //CTRLR=0x40; // 关闭南北方向的交通灯<br /> //uPort8000=CTRCLKEY;<br />// Gpio_select(); // Toggle I/Os using DATA register for ever<br /> <br /> while ( 1 )<br /> {<br /> Gpio_select(); // Toggle I/Os using DATA register for ever <br /> }<br /><br />} <br /><br /><br />//interrupt void cpu_timer0_isr(void)<br />//{ //int j,k; <br />// z = CpuTimer0.InterruptCount++;<br /><br /> // Acknowledge this interrupt to receive more interrupts from group 1<br />// PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //清除中断标志<br />// CpuTimer0Regs.TCR.bit.TIF = 1; //重启,计数器递减到零时会置位,定时器中断标志<br />// CpuTimer0Regs.TCR.bit.TRB = 1; //定时器重新装载PRD寄存器周期值,<br /> //并且PSC装载定时器分频寄存器TDDR中的值<br />// if ( nCount==0 ) <br />// {<br />// LEDS=uLBD;<br />// uLBD++; uLBD%=16;<br />// }<br />// nCount++; nCount%=194; //取余运算<br /><br />//}<br /><br />void Gpio_select(void)<br />{<br /> EALLOW;<br /> <br /> GpioMuxRegs.GPAMUX.all= 0x0330; //设置GPIOA9,8,5,4为外设功能,4,5为PWM,8,9为编码器解码;<br /> GpioMuxRegs.GPBMUX.all= 0x0300; //设置GPIOB8,9为外设功能,8,9为编码器解码; <br /> GpioMuxRegs.GPDMUX.all= 0x0000; //设置为GPIO<br /> GpioMuxRegs.GPFMUX.all= 0x003F; //设置GPIOF5,4为SCI,设置GPIOF3,2,1,0为SPI; <br /> GpioMuxRegs.GPEMUX.all= 0x0000; //设置为GPIO<br /> GpioMuxRegs.GPGMUX.all= 0x0030; //设置GPIOG5,4为SCI;<br /> <br /> GpioMuxRegs.GPADIR.all= 0; // GPIO作为输出口<br /> GpioMuxRegs.GPBDIR.all= 0x0012; // GPIOB2,4作为输入口 <br /> GpioMuxRegs.GPDDIR.all= 0;<br /> GpioMuxRegs.GPEDIR.all= 0x0003; // GPIOE0,1作为输入口<br /> GpioMuxRegs.GPFDIR.all= 0; <br /> GpioMuxRegs.GPGDIR.all= 0;<br /><br /> GpioMuxRegs.GPAQUAL.all= 0; // Set GPIO input qualifier values<br /> GpioMuxRegs.GPBQUAL.all= 0; <br /> GpioMuxRegs.GPDQUAL.all= 0;<br /> GpioMuxRegs.GPEQUAL.all= 0;<br /> <br /> EDIS;<br /> <br />} <br />//===========================================================================<br />// No more.<br />//========================================<br />//实验现象:LED灯约每0.1S变化一下状态<br />unsigned int Led_Flag;<br /><br />interrupt void cpu_timer0_isr(void)<br />{<br /> CpuTimer0.InterruptCount++;<br /> // Acknowledge this interrupt to receive more interrupts from group 1<br /> PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //清除中断标志<br /> CpuTimer0Regs.TCR.bit.TIF = 1; //重启,计数器递减到零时会置位,定时器中断标志<br /> CpuTimer0Regs.TCR.bit.TRB = 1; //定时器重新装载PRD寄存器周期值,<br /> //并且PSC装载定时器分频寄存器TDDR中的值<br /> if(Led_Flag == 1)<br /> {<br /> LED2_OFF;<br /> LED1_ON;<br /> Led_Flag = 0;<br /> }<br /> else<br /> {<br /> LED2_ON;// = 1;<br /> LED1_OFF;<br /> Led_Flag = 1;<br /> }<br />} |
|