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

📄 rem_main.c

📁 我最初用TMS320F240芯片作开发
💻 C
📖 第 1 页 / 共 2 页
字号:
/*********************************************************************/
/* TMS320F2810 C Language File                                       */
/* The C Language File For REM Main Function     Version number: 1.0 */
/*                                                                   */
/* File name : REM_main.c                                            */
/* Date/Time created: Oct 27 2005                                    */
/* Author: Anakin.Lee                                                */
/*********************************************************************/

#include <stdio.h>
#include <string.h>
#include "TMS320F2810_REG.h"

// Global symbols defined in the linker command file
extern unsigned int secureRamFuncs_loadstart;
extern unsigned int secureRamFuncs_loadend;
extern unsigned int secureRamFuncs_runstart;

#define   CPUCLK      150000000               /* CPUCLK=150MHz */
#define   TIMER0L     0x3A98                  /* 定时器0的定时周期低位=3A98h */
#define   TIMER0H     0x0                     /* 定时器0的定时周期高位=0h */

#define   UP          1
#define   DOWN        2
#define   RIGHT       3
#define   LEFT        4
#define   ESC         5
#define   ENTER       6
#define   VIDEO       7

#define   PASSWORD    0                       /* 口令 */
#define   BAND        1                       /* 波特率 */
#define   STOP        2                       /* 停止位1/2位 */
#define   CHECK       3                       /* 无/奇偶校验 */
#define   LONG        4                       /* 数据长度7/8位 */
#define   ADDRESS     5                       /* 通信地址码 */

#define   AZ_CENTER   6                       /* 判断AZ顺逆限位中心角度 */
#define   EL_CENTER   7                       /* 判断EL上下限位中心角度 */
#define   AZ_STEP     8                       /* 方位手控步长选择 */
#define   EL_STEP     9                       /* 俯仰手控步长选择 */
#define   POL_STEP    10                      /* 极化手控步长选择 */

#define   POS_TAB     11                      /* 存储位置表首地址 */

unsigned int msec,programcyc,led_bit;
unsigned int t0int_flag;                      /* 声明t0int_flag为定时中断标志寄存器 */
unsigned int key_flag;                        /* 声明key_flag为按键计数标志寄存器 */
unsigned int keyin_tf;                        /* 声明keyin_tf为键入操作标志寄存器 */
unsigned int keyin_r[8]={2,0,0,0,0,0,0,0};    /* 定义含8个元素的数组,用于键入命令的缓存 */
unsigned int led_buf[32]={8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8};       /* 定义含20个元素的数组,用于显示内容的缓存 */
//unsigned int led_buf[20]={8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8};
unsigned int fault_number[28];                /* 故障号存储区 */
unsigned int az_speed;                        /* 方位速度 */
unsigned int el_speed;                        /* 俯仰速度 */
unsigned int pol_speed;                       /* 极化速度 */
unsigned int antenna_dir;                     /* 旋转方向寄存器 */

unsigned long fault_error;                    /* 定义32位的故障错误标志寄存器fault_error */
long az_position;                             /* 天线方位位置缓存 */
long az_object;                               /* 天线方位目标位置 */
long el_position;                             /* 天线俯仰位置缓存 */
long el_object;                               /* 天线俯仰目标位置 */

int pol1_position;                            /* 天线极化1位置缓存 */
int pol1_object;                              /* 极化1目标位置 */
int pol2_position;                            /* 天线极化2位置缓存 */
int pol3_position;                            /* 天线极化3位置缓存 */
int pol4_position;                            /* 天线极化4位置缓存 */

int all_R0;                                   /* 通用缓存0~3 */
int all_R1;
int all_R2;
int all_R3;

unsigned int para_limit[22]={0,9999,2400,38400,1,2,1,3,7,8,0,120,0,35999,0,8999,1,100,1,100,1,100};        /* 参数数值限制 */
int table[128];                               /* 定义含128个元素的数组,用于保存参数及位置表 */

/**********************************/
/****    Subprogram Function   ****/
/**********************************/
extern void Delay_us(unsigned long);          /* 该函数产生Xus的延时 */
extern void Vector_Table_Copy(void);          /* 该函数将PIE中断向量表拷贝进PIE中断向量RAM区 */
extern void Flash_Reg_Modify(void);           /* 该函数用于配置Flash寄存器 */

/****   Mod Function   ****/
int mod(unsigned long x,int y)                /* 该函数求整数x的:个,十,百,千,万....位的数字 */
{   unsigned long m;
    int n;

    do
    {m=x/10;
     n=x%10;
     x=m;
     y--;
    }
    while(y>=1);
    return(n);
}

/****   Index Function   ****/
unsigned long index(unsigned int x)                     /* 该函数用于求2的x次方 */
{    unsigned int j;
     unsigned long i;

     i=1;
     if(x==0) ;
     else
      for(j=1;j<=x;j++) i=i*2;

     return(i);
}

/****   Multiplication Function   ****/
long mul(long x,long y)
{    long l;

     l=x*y;
     return(l);
}

/****   Fault Number Save Function   ****/
unsigned int fault_number_func(void)
{    unsigned int a,m;
     unsigned long n;

     a=0;
     for(m=4;m<=26;m++)
      {n=index(m);
       if((fault_error & n)!=0)
        {fault_number[a]=m-4;
         a++;
        }
      }
     return(a);
}

/****   Read EEPROM Function   ****/
void Read_eeprom(void)                        /* 该函数将EEPROM的0页256B的8bit数读出到0x400为首地址的RAM */
{    unsigned int shift,device_address,word_address,reg;
     int m,n;
     int *p;

     p=&table[0];                             /* 将参数表首地址赋给指针 */
     device_address=0xA0;                     /* 第0位为0,表示写 */
     word_address=0x0;
     shift=0x80;

     *GPFDAT=*GPFDAT & 0xFFBF;                /* 设置24C08的SDA脚为低电平 */   /*****************/
     Delay_us(5);                                                              /* 产生START信号 */
     *GPFDAT=*GPFDAT & 0xFF7F;                /* 设置24C08的SCL脚为低电平 */   /*****************/
     Delay_us(5);

     for(n=7;n>=0;n--)                        /* 发送device_address */
     {if((device_address & shift)==0)
        *GPFDAT=*GPFDAT & 0xFFBF;             /* SDA输出0 */
      else *GPFDAT=*GPFDAT | 0x40;            /* SDA输出1 */
      *GPFDAT=*GPFDAT | 0x80;                 /* 设置24C08的SCL脚为高电平 */   /*******************/
      Delay_us(5);                                                             /* 产生CLK时钟信号 */
      *GPFDAT=*GPFDAT & 0xFF7F;               /* 设置24C08的SCL脚为低电平 */   /*******************/
      Delay_us(5);
      shift=shift/2;                          /* 即使移位控制位右移1位 */
     }

     EALLOW;                                  /* 允许访问 EALLOW 保护区域 */
     *GPFDIR=*GPFDIR & 0xFFBF;                /* 设置DSP的I/O脚为输入,准备接收ACK信号 */

     *GPFDAT=*GPFDAT | 0x80;                  /* 设置24C08的SCL脚为高电平 */   /************************/
     Delay_us(5);                                                              /* 第9个时钟产生ACK信号 */
     *GPFDAT=*GPFDAT & 0xFF7F;                /* 设置24C08的SCL脚为低电平 */   /************************/
     Delay_us(5);

     *GPFDIR=*GPFDIR | 0x40;                  /* 设置DSP的I/O脚为输出 */
     EDIS;

     shift=0x80;
     for(n=7;n>=0;n--)                        /* 发送word_address */
     {if((word_address & shift)==0)
        *GPFDAT=*GPFDAT & 0xFFBF;             /* 即SDA输出0 */
      else *GPFDAT=*GPFDAT | 0x40;            /* 即SDA输出1 */
      *GPFDAT=*GPFDAT | 0x80;                 /* 设置24C08的SCL脚为高电平 */   /*******************/
      Delay_us(5);                                                             /* 产生CLK时钟信号 */
      *GPFDAT=*GPFDAT & 0xFF7F;               /* 设置24C08的SCL脚为低电平 */   /*******************/
      Delay_us(5);
      shift=shift/2;
     }

     EALLOW;                                  /* 允许访问 EALLOW 保护区域 */
     *GPFDIR=*GPFDIR & 0xFFBF;                /* 设置DSP的I/O脚为输入,准备接收ACK信号 */

     *GPFDAT=*GPFDAT | 0x80;                  /* 设置24C08的SCL脚为高电平 */   /************************/
     Delay_us(5);                                                              /* 第9个时钟产生ACK信号 */
     *GPFDAT=*GPFDAT & 0xFF7F;                /* 设置24C08的SCL脚为低电平 */   /************************/
     Delay_us(5);

     *GPFDIR=*GPFDIR | 0x40;                  /* 设置DSP的I/O脚为输出 */
     EDIS;

     device_address=0xA1;                     /* 第0位为1,表示读 */
     shift=0x80;

     *GPFDAT=*GPFDAT & 0xFFBF;                /* 设置24C08的SDA脚为低电平 */   /*********************/
     Delay_us(5);                                                              /* 重新产生START信号 */
     *GPFDAT=*GPFDAT & 0xFF7F;                /* 设置24C08的SCL脚为低电平 */   /*********************/
     Delay_us(5);

     shift=0x80;
     for(n=7;n>=0;n--)                        /* 发送device_address */
     {if((device_address & shift)==0)
        *GPFDAT=*GPFDAT & 0xFFBF;             /* 即SDA输出0 */
      else *GPFDAT=*GPFDAT | 0x40;            /* 即SDA输出1 */
      *GPFDAT=*GPFDAT | 0x80;                 /* 设置24C08的SCL脚为高电平 */   /*******************/
      Delay_us(5);                                                             /* 产生CLK时钟信号 */
      *GPFDAT=*GPFDAT & 0xFF7F;               /* 设置24C08的SCL脚为低电平 */   /*******************/
      Delay_us(5);
      shift=shift/2;                          /* 即使移位控制位右移1位 */
     }

     EALLOW;                                  /* 允许访问 EALLOW 保护区域 */
     *GPFDIR=*GPFDIR & 0xFFBF;                /* 设置DSP的I/O脚为输入,准备接收ACK信号 */

     *GPFDAT=*GPFDAT | 0x80;                  /* 设置24C08的SCL脚为高电平 */   /************************/
     Delay_us(5);                                                              /* 第9个时钟产生ACK信号 */
     *GPFDAT=*GPFDAT & 0xFF7F;                /* 设置24C08的SCL脚为低电平 */   /************************/
     Delay_us(5);
     EDIS;

     for(m=0;m<=255;m++)
     {reg=0;
      shift=0x80;
      for(n=7;n>=0;n--)
      {*GPFDAT=*GPFDAT | 0x80;                /* 设置24C08的SCL脚为高电平 */
       Delay_us(5);                           /* 延时5us */
       if((*GPFDAT & 0x40)>0) 
        reg=reg+1;
       *GPFDAT=*GPFDAT & 0xFF7F;              /* 设置24C08的SCL脚为低电平 */
       Delay_us(5);
       if(n!=0) reg=reg*2;                    /* 即使reg每次循环左移1位 */
      }
      if(m!=255)
        {*GPFDAT=*GPFDAT | 0x80;              /* 设置24C08的SCL脚为高电平 */   /************************/
         Delay_us(5);                                                          /* 第9个时钟产生ACK信号 */
         *GPFDAT=*GPFDAT & 0xFF7F;            /* 设置24C08的SCL脚为低电平 */   /************************/
         Delay_us(5);
        }
      else
        {EALLOW;                              /* 允许访问 EALLOW 保护区域 */
         *GPFDIR=*GPFDIR | 0x40;              /* 设置DSP的I/O脚为输出,准备产生NO ACK信号 */
         *GPFDAT=*GPFDAT | 0x40;              /* 即SDA输出1 */

⌨️ 快捷键说明

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