⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 一个DSP2812的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*******************************************************************************
  Copyright (c) 2005,2006 北京中盛华旭电子科技有限公司(VSUNTEK, Ltd.)
  FileName: TESTTerminal.C
  Author: 王在东
  Date: 2008.05.25
  Version: 1.0
  Description:主函数完成信号的采集发送,中断处理等 .
  History:
    <Author>wzd
  <Date>  
  <Ver>    
  <Desc>  
  Todo:
*******************************************************************************/
#define GLOBAL_Q    27     /* Set the Local Q value */

#include "DSP281x_Device.h"     // DSP281x Headerfile Include File
#include "DSP281x_Examples.h"   // DSP281x Examples Include File
#include "SJA1000T.h"
//#include "stdio.h"
#define   F2812       1
#define   NUM         62
#define   FREQ_PARA   4
#define   DEBUG       0
long  GlobalQ = GLOBAL_Q;

//===================timer struct================
struct DS1390Timer{
            Uint16       Mssec  ;
		    Uint16       Sec    ;	    //秒
		    Uint16       Minute	;	    //分
		    Uint16       Hour	;	    //小时
		    Uint16       Day  	;	    //星期
		    Uint16		 Data	;		//日
		    Uint16       Mouth	;	    //月
		    Uint16       Year	;	    //年
	       };


struct DS1390Timer   Clock;
//#pragma CODE_SECTION(InitXintf,"ramfuncs");

// RAM Count - This counter will be stored in RAM,  to compare with that stored
// in XINTF.
//#pragma DATA_SECTION(RamInterruptCount,"ramdata");


// 中断服务程序原型
interrupt void adc_isr(void);
interrupt void Xint1_isr(void);
interrupt void Xint2_isr(void);
interrupt void Xint13_isr(void);
//interrupt void Timerint_isr(void);

// 本程序中的全局变量
Uint32  MessageTransmitedCount = 0;
Uint32  LoopCount = 0;
Uint32  AdIntCount = 0;
Uint32  Sample_Over = 0;

float32  fInputSignal[NUM];
float32  fSwitch1[16],fSwitch2[16],fSwitch3[16];
Uint32   OnOff_Value = 0;
Uint32   Addr = 0;
Uint32   DataBuff[NUM];
Uint32   *SourceAddr;
unsigned char  ReceiveDataBuf_CAN1[13];
unsigned char  ReceiveDataBuf_CAN2[13];
Uint32   CAN1TXCounter;
Uint32   CAN2TXCounter;
float32   RunTime = 0;
float32  FreqValue = 0;
Uint32  SaveData = 0;
Uint32  FreqCounter = 0;

 //电压转换偏移量
float32  adclo = 0.02;
//float32  view[16];
// eCAN 控制寄存器读/写访问要用 32-bits.  
// 定义一个32位临时寄存器
struct ECAN_REGS ECanaShadow;

main()
{
   Uint16  i,temp;
   Uint32  *p;
//   Uint32  temp;   

//初始化系统控制
   InitSysCtrl();

//CPU中断不使能
   DINT;

//初始化PIE控制寄存器
   InitPieCtrl();

// 不使能CPU中断,清除CPU中断标志
   IER = 0x0000;
   IFR = 0x0000;

// 初始化PIE中断向量表
   InitPieVectTable();
//初始化外部存储接口
   InitXintf();
//初始化外部中断
   InitXIntrupt();

   //初始化GPIO
   InitGpio();
   GpioDataRegs.GPBSET.all = 0xFFFF;

    // 初始化AD
   InitAdc();
   InitSci();
   InitSpi();

       
// 指向AD中断服务程序
   EALLOW;  // This is needed to write to EALLOW protected register
  // SysCtrlRegs.SCSR = BIT2;
   PieVectTable.ADCINT = &adc_isr;
   PieVectTable.XINT1 = &Xint1_isr;
   PieVectTable.XINT2 = &Xint2_isr;
   PieVectTable.XINT13 = &Xint13_isr;
   //PieVectTable.TINT0 = &Timerint_isr;
   EDIS;    // This is needed to disable write to EALLOW protected registers

//   TimerCount = 0;
   
   //初始化eCAN
   InitECan();
   FEED_WATCHDOG;
   Init_SJA1000_HardWare(); 
   Init_SJA1000_Soft(CAN1);
   Init_SJA1000_Soft(CAN2);
   InitCpuTimers();
   EnableInterrupts();
   IER |= (M_INT1 | M_INT13 | M_INT9); // 使能CPU中断1,13,9
   EINT;          // 使能全局中断 INTM
   ERTM;          // 使能全局实时中断 DBGM

   LoopCount = 0;
   MessageTransmitedCount = 0;
   SourceAddr = ZONE2_BASE;

// 配置 EVA
   EvaRegs.T1CNT = 0x0;                    //定时器初值
   EvaRegs.T1CMPR = 0x0008;               // 设置计数器T1比较值
   EvaRegs.T1PR = 0x00FF;                 // 设置计数器周期
   EvaRegs.GPTCONA.bit.T1TOADC = 1;       // 使能EVASOC 
   EvaRegs.T1CON.all = 0x1002;            // 使能 timer 1 比较 (upcount mode)
   //EvaRegs.EXTCONA.bit.EVSOCE = 1;
//CAP set up
 //  EvaRegs.CAPCONA.all = 0x36FC;
  // EvbRegs.CAPCONB.all = 0x26C0;
//初始化时钟
	Clock.Year = 0x08;
	Clock.Mouth = 0x06;
	Clock.Data = 0x01;
	Clock.Day = 0x01;
	Clock.Hour = 0x00;
	Clock.Minute = 0x00;
	Clock.Sec = 0x00;
	Clock.Mssec = 0x00;
	SCK1_L;
	CS1_H;
	CS1_L;
	SPI1_WriteByte(0x8D);                        // write memory command
	SPI1_WriteByte(0x18);
	SCK1_L;
	CS1_H;
	DS1390_Write(0x80,8,Clock);     
// 等待ADC中断
   while(1)
   {
    
     WORK_INDICATION;
	 FEED_WATCHDOG;
// switch select
     if(AdIntCount < 16)
	 {

         BusLine_Direct_Set(OUTPUT); 
	     SWITCH1_CS_L;
	     SWITCH2_CS_L;
	     SWITCH3_CS_L;
		 BUS_LINE = (BUS_LINE & 0xFF00)| AdIntCount;
	     SWITCH1_CS_H;
	     SWITCH2_CS_H;
	     SWITCH3_CS_H;
	     EvaRegs.T1CON.bit.TENABLE = 1;            //计数器使能
	 }
     else
        AdIntCount = 0;

//CAN 接收邮箱判断       
     if(ECanaRegs.CANRMP.bit.RMP31 == 1 )   // Wait for all RMPn to be set..
	{           

    	ECanaRegs.CANRMP.all = 0xFFFF0000;	   // Clear all RMPn bits and start 

		SaveData = ECanaMboxes.MBOX31.MDL.all; 

	}
//CAN 接收信息丢失判断
    if(ECanaRegs.CANRML.bit.RML31 == 1)
	{
	    ECanaShadow.CANOPC.all = ECanaRegs.CANOPC.all;
		ECanaShadow.CANOPC.bit.OPC31 = 1;
	    ECanaRegs.CANOPC.all = ECanaShadow.CANOPC.all;
    }
     		                                  
//采集完成数据发送
    if(Sample_Over == 0x55)
	{	       	
	  
	 	 PieCtrlRegs.PIECRTL.bit.ENPIE = 0; 
		 FEED_WATCHDOG;
//开关量信息采集     
   
         BusLine_Direct_Set(INPUT); 
		 ON_OFF_CS_L;
         OnOff_Value = BUS_LINE & 0x00FF;
		 ON_OFF_CS_H;
         BusLine_Direct_Set(OUTPUT); 
//读系统时钟
      while(1)
	  {
        DS1390_Read(0,8,(Uint16 *)&Clock);
        bcd2ascii((unsigned char)Clock.Sec);
	    scia_xmit(':');
        bcd2ascii((unsigned char)Clock.Minute);
	    scia_xmit(':');
        bcd2ascii((unsigned char)Clock.Hour);
	    scia_xmit(':');
        bcd2ascii((unsigned char)Clock.Data);
	    scia_xmit('/');
        bcd2ascii((unsigned char)Clock.Mouth);
	    scia_xmit('/');
        bcd2ascii((unsigned char)Clock.Year);
	    scia_xmit(0x0A);
	    scia_xmit(0x0D);
	   }
        RunTime = bcd2decimal(Clock.Hour) + bcd2decimal(Clock.Minute)/60;

        for(i=0;i<16;i++)
		{
          fInputSignal[i+13] = fSwitch1[i];
          fInputSignal[i+29] = fSwitch2[i];
		}
        for(i=0;i<8;i++)
		{
          fInputSignal[i+44] = fSwitch3[i];
          temp = OnOff_Value & 0x01;
          OnOff_Value = OnOff_Value >> 1;
          fInputSignal[i+52] = temp;
		}
        fInputSignal[60] = FreqValue;
        fInputSignal[61] = RunTime;

//故障数据判断
		temp = JudgeFault(fInputSignal);
		temp = ((temp & 0x01)<<6)|((temp & 0x40)>>6)|((temp & 0x02)<<4)|((temp & 0x20)>>4)|((temp & 0x04)<<2)|((temp & 0x10)>>2)|(temp & 0x08);
		BusLine_Direct_Set(OUTPUT);
		LED1_CS_L;
		BUS_LINE = (BUS_LINE & 0xFF00)| temp;
		LED1_CS_H;

		for(i=0;i< NUM;i++)
		{
         DataBuff[i] = (Uint32)fInputSignal[i];
		}

		//存储数据 
       if(SaveData == 0x55)
	   {
			if((0xFFFF - Addr)>= NUM)
			{  
			FM25L512_Write(Addr,NUM,DataBuff);

			Addr += NUM;
			}
			else
			{
			Addr = 0;
			FM25L512_Write(Addr,NUM,DataBuff);
			}

	   }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -