/*
* main.c
*/
#include "6655_PLL.h"
#include "6655_DDR3.h"
#include "6655_CACHE.h"
#include "6655_INTERRUPT.h"
#include "6655_NORFLASH.h"
#include "6655_GPIO.h"
#include "6655_EDMA3.h"
#include "6655_SPI.h"
#include "6655_TIMER.h"
#include "6655_UART.h"
#include "6655_UPP.h"
#include "6655_MCBSP.h"
#include "USER.h"
#include "c6x.h"
#include "string.h"
//=====================================================================
// main使用的变量
//=====================================================================
//=====================================================================
// 图像使用的变量
//=====================================================================
//图像接收缓存对齐
#pragma DATA_ALIGN(camera0_recv_1, 8) // 对应Camera0
#pragma DATA_ALIGN(camera0_recv_2, 8)
#pragma DATA_ALIGN(camera0_recv_3, 8)
#pragma DATA_ALIGN(camera1_recv_1, 8) // 对应Camera1
#pragma DATA_ALIGN(camera1_recv_2, 8)
#pragma DATA_ALIGN(camera1_recv_3, 8)
//图像发送缓存对齐
#pragma DATA_ALIGN(camera_send_1, 8)
#pragma DATA_ALIGN(camera_send_2, 8)
#pragma DATA_ALIGN(camera_send_3, 8)
#pragma SET_DATA_SECTION(".cacheddr3")
//图像接收缓存申请
unsigned short camera0_recv_1[UPP_FRAME_SIZE]; // 对应Camera0
unsigned short camera0_recv_2[UPP_FRAME_SIZE];
unsigned short camera0_recv_3[UPP_FRAME_SIZE];
unsigned short camera1_recv_1[UPP_FRAME_SIZE]; // 对应Camera1
unsigned short camera1_recv_2[UPP_FRAME_SIZE];
unsigned short camera1_recv_3[UPP_FRAME_SIZE];
//图像发送缓存申请
unsigned short camera_send_1[UPP_FRAME_SIZE * 2]; // Camera0在前,Camera1在后
unsigned short camera_send_2[UPP_FRAME_SIZE * 2];
unsigned short camera_send_3[UPP_FRAME_SIZE * 2];
#pragma SET_DATA_SECTION()
//处理行所用到的内存对齐
#pragma DATA_ALIGN(ReadData, 8);
#pragma DATA_ALIGN(WriteData, 8);
#pragma DATA_ALIGN(ReadData1, 8);
#pragma DATA_ALIGN(WriteData1, 8);
//处理行所用到的内存申请
#pragma SET_DATA_SECTION(".dataReadWrite")
unsigned short ReadData[UPP_LINE_SIZE];
unsigned short WriteData[UPP_LINE_SIZE];
unsigned short ReadData1[UPP_LINE_SIZE];
unsigned short WriteData1[UPP_LINE_SIZE];
#pragma SET_DATA_SECTION()
//图像传输用到的参数
// 接收通道参数
uPPDMAConfig transposeParA;
// 发送通道参数
uPPDMAConfig transposeParB;
// 图像通道标志
unsigned int Camera_Recchannel = 0; // 0:Camera0 1:Camera1
//UPP传输标识
UPP_FLAG Upp_Flag;
//UPP接收buff访问标识
UPP_BUFF_RECV_FLAG Upp_Recv_Buff_Flag;
//UPP发送buff访问标识
UPP_BUFF_SEND_FLAG Upp_Send_Buff_Flag;
//流程复位标识
volatile int pyl_ResetFlag = 0; // 为1时,复位
//=====================================================================
//=====================================================================
//加载使用的标识
//=====================================================================
//加载标识
unsigned int load_flag;
//串口加载控制变量
extern DDR_OPRATION DDR_Value;
//=====================================================================
//=====================================================================
//定时器标识
//=====================================================================
volatile int flag_40ms;
//=====================================================================
//=====================================================================
// 用户行所用到的定义变量
//=====================================================================
//----------------------------------------------------
//注意:此处用到的变量为每次用户取一行数据所用的内存申请
//处理行所用到的内存对齐
#pragma DATA_ALIGN(ReadData, 8);
#pragma DATA_ALIGN(WriteData, 8);
#pragma DATA_ALIGN(ReadData1, 8);
#pragma DATA_ALIGN(WriteData1, 8);
//处理行所用到的内存申请
#pragma SET_DATA_SECTION(".dataReadWrite")
unsigned short ReadData[UPP_LINE_SIZE];
unsigned short WriteData[UPP_LINE_SIZE];
unsigned short ReadData1[UPP_LINE_SIZE];
unsigned short WriteData1[UPP_LINE_SIZE];
#pragma SET_DATA_SECTION()
//----------------------------------------------------
//=====================================================================
// 主函数(程序入口)
//=====================================================================
void main(void)
{
int ID;
int i;
int j;
// int m;
ID = DNUM;
if(ID == 0) // 核0
{
ALL_INIT(115200,0,115200,0,0x7a1200); // 初始化
load_flag = Load_Code(); // 加载
// load_flag = 9;
if(9 == load_flag)
{
// 通知FPGA,DSP准备完毕
DSP_Ready();
Timer_Start();
while(1)
{
if(flag_40ms == 1)
{
flag_40ms = 0;
for(i=0;i<UPP_LINE_COUNT;i++)
{
read_edma3(0, i, ReadData); // 从0开始算
for(j=0;j<UPP_LINE_SIZE;j++)
{
WriteData[j] = ReadData[j];
}
write_edma3(0, i, WriteData); // 从0开始算
}
for(i=0;i<UPP_LINE_COUNT;i++)
{
read_edma3(1, i, ReadData); // 从0开始算
for(j=0;j<UPP_LINE_SIZE;j++)
{
WriteData[j] = ReadData[j];
}
write_edma3(1, i, WriteData); // 从0开始算
}
}
//传输异常处理函数
Image_Reset();
}
}
while(1)
{
//加载完成出现的提示
// UARTCharPut(SOC_UART_0_REGS, '5');
}
}
else // 其它核
{
while(1);
}
}
//=====================================================================
// RS232串口1接收中断服务函数
//=====================================================================
void UART_0_Isr()
{
unsigned int int_id = 0;
unsigned char rxData = 0;
// 确定中断源
int_id = UARTIntStatus(SOC_UART_0_REGS);
// 清除 UART2 系统中断
CICClearSystemEvent(SOC_CIC_0_REGS, 164);
// 接收中断
if(UART_INTID_RX_DATA == int_id)
{
rxData = UARTCharGetNonBlocking(SOC_UART_0_REGS);
UARTCharPutNonBlocking(SOC_UART_0_REGS, rxData);
}
// 接收错误
if(UART_INTID_RX_LINE_STAT == int_id)
{
while(UARTRxErrorGet(SOC_UART_0_REGS))
{
// 从 RBR 读一个字节
UARTCharGetNonBlocking(SOC_UART_0_REGS);
}
}
return;
}
//=====================================================================
// RS232串口2接收中断服务函数
//=====================================================================
void UART_1_Isr()
{
unsigned char rxData1 = 0;
unsigned int int_id = 0;
// 确定中断源
int_id = UARTIntStatus(SOC_UART_1_REGS);
// 清除 UART2 系统中断
CICClearSystemEvent(SOC_CIC_0_REGS, 40);
// 接收中断
if(UART_INTID_RX_DATA == int_id)
{
rxData1 = UARTCharGetNonBlocking(SOC_UART_1_REGS);
UARTCharPutNonBlocking(SOC_UART_1_REGS, rxData1);
}
// 接收错误
if(UART_INTID_RX_LINE_STAT == int_id)
{
while(UARTRxErrorGet(SOC_UART_1_REGS))
{
// 从 RBR 读一个字节
UARTCharGetNonBlocking(SOC_UART_1_REGS);
}
}
return;
}
//=====================================================================
// 定时器中断Lsb1中断服务函数
// 函数原型:void TimerIsrLsb1(void)
// 实现功能:完成定时器中断1Lsb的相应操作
// 参数:
// 无
// 返回值:0 表示操作完成
//=====================================================================
void TimerIsrLsb1(void)
{
// 禁用定时器 / 计数器中断
TimerIntDisable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
// 清除中断标志
IntEventClear(66);
TimerIntStatusClear(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
// 此处增加服务操作
flag_40ms = 1;
// 使能 定时器 / 计数器 中断
TimerIntEnable(SOC_TMR_2_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
}