📄 fpga.c
字号:
#include <excalibur.h>
#include <math.h>
#include "flash.c"
//定义接收缓冲区的大小
#define RXBUFSIZE 512
//基地址量
#define BASE_ADD 0x800
#define FLASH_BASE_ADD 0X200000
#define FLASH_BASE_ADD_bake 0x3f0000
#define TIME 50000000 //50000000 50M对应1秒
//赋值临时变量
unsigned char jj;
//接收缓冲区
unsigned char RxBuf[RXBUFSIZE];
int RxHead=0;
int RxTail=0;
//第一次使用双口ram的标志
int First=0;
//重新启动的次数
unsigned int* ResetNumber;
//路口编号,主机路口编号,主从标志
unsigned char Parameter[5]={0,0,0,0,0};
//0x23 0x24地址
unsigned char* WriteGate1;
unsigned char* WriteGate2;
//透明性标志量
int RevStatus=0;
int BeginBitContent=0;
//临时更新标志
unsigned char f_temp=0,f_tem=0;;
//接收标志寄存器
unsigned int Now_MarkRx_Number=0;
//crc校验后的结果
int Data_Number=0;
unsigned short CheckByte_Write;
unsigned char CheckByte_Read;
//经过透明性检测后的原始数据
unsigned char CheckData[300];
unsigned char Test_Package_Data[14];
//尾地址寄存器
unsigned char* Now_Tail_High;
unsigned char* Now_Tail_Low;
//临时使用的双口ram的数据
unsigned int Now_Tail_Add;
unsigned int Now_Head_Add;
unsigned char* Now_Ram_Write_Add;
unsigned char* Now_Ram_Read_Add;
unsigned char* Now_Ram_Read_End_Add;
//接收地址寄存器
unsigned char* Rx_Head_High[6];
unsigned char* Rx_Head_Low[6];
unsigned char* Rx_Tail_High[6];
unsigned char* Rx_Tail_Low[6];
unsigned char* Tx_Head_High[6];
unsigned char* Tx_Head_Low[6];
unsigned char* Tx_Tail_High[6];
unsigned char* Tx_Tail_Low[6];
//接收地址间接赋值变量
unsigned char Rx_Head_High_test;
unsigned char Rx_Head_Low_test;
unsigned char Rx_Tail_High_test;
unsigned char Rx_Tail_Low_test;
unsigned char Now_Tail_High_test;
unsigned char Now_Tail_Low_test;
//发送标志寄存器
unsigned char* MarkTx[6];
//接收标志寄存器
unsigned char* MarkRx[6];
//flash基地址变量
unsigned short* Conf_Phase1_Address_Flash;
unsigned short* Conf_Phase2_Address_Flash;
unsigned short* Conf_Stage_Address_Flash;
unsigned short* Conf_Controlstage_Address_Flash;
unsigned short* Conf_Daydesign_Address_Flash;
unsigned short* Conf_Daydesigntable_Address_Flash;
unsigned short* Conf_YaoKong_Address_Flash;
unsigned short* Conf_CurNumber_Address_Flash;
unsigned short* Conf_Solution_Address_Flash;
//flash各区域对应的缓冲区地址
unsigned char Conf_Phase1_Address_Buffer[288];
unsigned char Conf_Phase2_Address_Buffer[288];
unsigned char Conf_Stage_Address_Buffer[98];
unsigned char Conf_Controlstage_Address_Buffer[41];
unsigned char Conf_Daydesign_Address_Buffer[74];
unsigned char Conf_Daydesigntable_Address_Buffer[60];
unsigned char Conf_YaoKong_Address_Buffer[8];
unsigned char Conf_CurNumber_Address_Buffer[32];
unsigned char Conf_Solution_Address_Buffer[40];
//flash个区域对应的备份基地址
unsigned short* Conf_Phase1_Address_Backup;
unsigned short* Conf_Phase2_Address_Backup;
unsigned short* Conf_Stage_Address_Backup;
unsigned short* Conf_Controlstage_Address_Backup;
unsigned short* Conf_Daydesign_Address_Backup;
unsigned short* Conf_Daydesigntable_Address_Backup;
unsigned short* Conf_YaoKong_Address_Backup;
unsigned short* Conf_CurNumber_Address_Backup;
unsigned short* Conf_Solution_Address_Backup;
//flash中的流量存储变量地址
unsigned short* Flow_Information_Base;
unsigned short* Flow_Information_End;
unsigned short* Now_Flow_Information_Add;
//unsigned short* Flow_Information_Backup_Base;
//unsigned short* Now_Flow_Information_Backup_Add;
//flash头地址、尾地址
unsigned char* Now_Read_Add;
unsigned char* Now_Read_End;
//两个地址之间的字节数的计算函数
int length(unsigned char* begin,unsigned char* end);
unsigned char WrRamTimePhase;
//接收标志量
unsigned char Receive_From=0;
unsigned char Finished_Receive=0;
//透明性检测的标志
volatile unsigned char Transmit_Number;
int transparence;
int transparence_valid;
unsigned char Valid_Data;
unsigned char Valid_Data_Number;
unsigned char Test_Bit;
int Direct_Now_Data_Length;
unsigned short Check_Temp;
unsigned char Add_Bit;
int Add_transparence;
int Add_transparence_valid;
unsigned char Flash_Bit;
//串口标志
np_uart* uart_use;
//经过串口发送的函数
void TransmitComm(np_uart* uartbase);
void Transmit485();
void TransmitEnternet();
int ReceiveComm();
int Receive485();
int ReceiveEnternet();
//经过串口发送的数据包
void TransmitTestPackage(np_uart* uartbase);
void Transmit_Mistake_Package(np_uart* uartbase,unsigned char mistake_mark);
void Transmit_Answer_Package(np_uart* uartbase,unsigned char answer_mark);
void Transmit_Query_Package(np_uart* uartbase,unsigned char query_mark);
void Transmit_Flow_Package(np_uart* uartbase);
//针对标志进行对各个包处理的函数
int Check_Tx_Mark_Bit();
void Write_Flash();
void Write_Comm(np_uart* uartbase);
void Write_Ram();
void Write_Flash_Flow();
void Handle_Para();
void SelfAlgorith();
//透明性检测的函数
void Check_Transparence();
void Check_Frame();
//crc校验的函数
unsigned short Cal_Crc(unsigned char *ptr, unsigned int len);
void Write_Comm_to_Ram(); //写双口RAM
void Add_transparences();
//串口接收函数
void ReceiveISRUart1(int context);
void ReceiveISRUart2(int context);
void myisr(int context);
void myisr2(int context);
int leddata=0x8;
int leddd=0x0000;
int ledd[4]={0x0008,0x0004,0x0002,0x0001};//0:面板灯4 1:面板灯3 2:面板灯2 1:面板灯4
volatile int nnn=0;
volatile int mmm=0;
volatile int ddd=0;
//流量数据包
unsigned char flow_data[69];
volatile int T_number=0;
void Transmit();
//测试包函数 每15秒发送一次数据包,测试
void myisr(int contextin)
{
// na_timer_dram->np_timercontrol = 0;
leddd=(leddd&0x000e)|ledd[3];
na_led_pio->np_piodata=leddd;
ledd[3]=(~ledd[3])&0x0001;
nnn++;
ddd++;
if(nnn==15)
{
TransmitTestPackage(uart_use);
nnn=0;
}
if(ddd==5)
{
ddd=0;
Data_Number=7;
CheckData[0]=0x00;
CheckData[1]=0x00;
CheckData[2]=0x00;
CheckData[3]=0x00;
CheckData[4]=0x82;
CheckData[5]=0x00;
CheckData[6]=0x00;
Finished_Receive=1;
// Finished_Receive=Receive_From;
Write_Comm_to_Ram();
}
na_timer1->np_timerstatus=0;
// na_timer_dram->np_timercontrol = np_timercontrol_start_mask | np_timercontrol_cont_mask | np_timercontrol_ito_mask;
}
void myisr2(int contextin)
{
leddd=(leddd&0x000d)|ledd[2];
na_led_pio->np_piodata=leddd;
ledd[2]=(~ledd[2])&0x0002;
// na_uart1->np_uarttxdata=0xff;
//Transmit();
na_timer_dram->np_timerstatus=0;
// na_timer1->np_timercontrol = np_timercontrol_start_mask | np_timercontrol_cont_mask | np_timercontrol_ito_mask;
}
//双口ram读写越界检测函数
void Check_Ram_Write();
void Check_Ram_Read();
//延迟函数
void delay(int number);
//自适应算法使用的变量
unsigned short* Flash_Add_Sh;
unsigned char Phase_Number;
unsigned char Time_Phase;
unsigned char Green_Phase[17];
//方案缓冲区
unsigned char Flash__Scheme_First[24];
unsigned short aaa,bbb;
//流量标志变量
unsigned char flow_data_last=0;
unsigned short even_flow=0;
int flow=0;
//读写流量函数
unsigned long read_flow_add();
unsigned long read_flow_add_bake();
unsigned long read_last_flow_add();
void write_flow_add();
void copy_flow_add();
void Accept_Far_Info(); //接受主机发送来的控制信息
unsigned short read_even_flow();
unsigned char read_flow_data_last();
//用于测试的变量函数
unsigned long mytemp;
unsigned long mytempbake;
unsigned short Flash_Mark_Address;
unsigned char* oonchipdata;
void getdataflow();
int now_flow_add=0;
unsigned long valid_flow_add;
//新增加的新中新标志
unsigned char Synjones_flag;
unsigned char Synjones_detail;
unsigned char Main_Flag;
int main()
{
int count=0;
unsigned char* p_Rx;
unsigned char* p_Tx;
int context1=0;
int context2=0;
int context3=0;
int lednumber=0;
int i=0;
int j=0;
int k=0;
int m=0;
int n=0;
int u;
int y;
int flag;
int num;
int mark=0;
int data_82=0;
unsigned short* data1;
unsigned short* data2;
//初始化接收缓冲区
for(y=4;y<300;y++)
{
CheckData[y]=0;
}
//初始化定时器 定时器间隔 1秒
na_timer1->np_timerperiodl=(short)((TIME) & 0X0000FFFF);
na_timer1->np_timerperiodh=(short)(((TIME)>>16) & 0X0000FFFF);
nr_installuserisr(na_timer1_irq,myisr,context2);
na_timer1->np_timerstatus=0;
na_timer1->np_timercontrol = np_timercontrol_start_mask | np_timercontrol_cont_mask | np_timercontrol_ito_mask;
//初始化定时器2 定时器2间隔 5秒
na_timer_dram->np_timerperiodl=(short)(TIME*5 & 0X0000FFFF);
na_timer_dram->np_timerperiodh=(short)((TIME*5>>16) & 0X0000FFFF);
nr_installuserisr(na_timer_dram_irq,myisr2,context3);
na_timer_dram->np_timerstatus=0;
na_timer_dram->np_timercontrol = np_timercontrol_start_mask | np_timercontrol_cont_mask | np_timercontrol_ito_mask;
//初始化接收标志
Receive_From=0;
Finished_Receive=0;
//初始化crc校验变量
CheckByte_Write=0;
CheckByte_Read=0;
//初始化0x23 0x24指针
WriteGate1=(unsigned char*)(BASE_ADD+0x23);
WriteGate2=(unsigned char*)(BASE_ADD+0x24);
//初始化0x23 0x24寄存器
*WriteGate1=0;
*WriteGate2=0;
//用于测试
here: if((*WriteGate1!=0) && (*WriteGate2!=0))
{
nr_uart_txstring("0x23 0x24 is wrong!555555");
*WriteGate1=0;
*WriteGate2=0;
goto here;
}
//初始化尾地址指针
Now_Tail_High=(unsigned char*)(BASE_ADD+0x21);
Now_Tail_Low =(unsigned char*)(BASE_ADD+0x22);
//初始化尾地址寄存器
*Now_Tail_High=(unsigned char)(0x80>>8 & 0x00ff);
*Now_Tail_Low =(unsigned char)(0x80 & 0x00ff);
//赋值测试
Now_Tail_High_test=*Now_Tail_High;
Now_Tail_Low_test=*Now_Tail_Low;
//初始化双口ram读写变量
Now_Head_Add=((unsigned int)(*Now_Tail_High)<<8)+(unsigned int)(*Now_Tail_Low);
Now_Tail_Add=Now_Head_Add;
Now_Ram_Write_Add=(unsigned char*)(BASE_ADD+0x80);
Now_Ram_Read_Add=(unsigned char*)(BASE_ADD+0x80);
Now_Ram_Read_End_Add=(unsigned char*)(BASE_ADD+0x80);
//初始化关于FLASH的三个地址
Conf_Phase1_Address_Flash=(unsigned short*)(FLASH_BASE_ADD+0x00);
Conf_Phase2_Address_Flash=(unsigned short*)(FLASH_BASE_ADD+0x120);
Conf_Stage_Address_Flash=(unsigned short*)(FLASH_BASE_ADD+0x242);
Conf_Controlstage_Address_Flash=(unsigned short*)(FLASH_BASE_ADD+0xe82);
Conf_Daydesign_Address_Flash=(unsigned short*)(FLASH_BASE_ADD+0x13a2);
Conf_Daydesigntable_Address_Flash=(unsigned short*)(FLASH_BASE_ADD+0x1ce2);
Conf_YaoKong_Address_Flash=(unsigned short*)(FLASH_BASE_ADD+0X1D20);
Conf_CurNumber_Address_Flash=(unsigned short*)(FLASH_BASE_ADD+0x1d28);
Conf_Solution_Address_Flash=(unsigned short*)(FLASH_BASE_ADD+0x1d48);
//初始化关于flash的三个备份地址
Conf_Phase1_Address_Backup=(unsigned short*)(FLASH_BASE_ADD_bake+0x00);
Conf_Phase2_Address_Backup=(unsigned short*)(FLASH_BASE_ADD_bake+0x120);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -