📄 rem_main.c
字号:
/*********************************************************************/
/* 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 + -