📄 dtk_bpd_timer.c
字号:
/*SEED-DTK BPD */
/*SEED耿升辉*/
/*2004.12*/
#include "DSP28_Device.h"
#include "comm.h"
#include "ext_inf.h"
/*帧长度的设定*/
interrupt void ISRTimer2(void);
typedef struct _UartForDec5416{
unsigned int Length;
unsigned int Type;
unsigned int Mutul;
unsigned int Data[DataLongth];
unsigned int Check;
}UartForDec5416, *PuartForDec5416;
P_Timer_Frame precieve =0;
P_Timer_Frame psend=0;
unsigned int uart[0x104] ={0};
unsigned int uarts[0x104] = {0};
unsigned int uartsdata = 0;
unsigned int uarta_recbuff[1040];///*串口A接收缓冲区*/
unsigned int uartb_recbuff[1040];/*串口B接收缓冲区*/
int uart_s=0;
unsigned int sys_statbuff[32];
int uart_recive(void);
int uart_send(void);
int uart_t_send(void);
unsigned int i,j;
unsigned int timerset[3] = {0};//时分秒
void sys_reset(void);
unsigned int CommandSave=0;
void main(void)
{
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER = 0x0000;
IFR = 0x0000;
/*初始化PIE中断*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
/*初始化SCIA寄存器*/
InitSci();
/*初始化外设*/
InitPeripherals();
for(i= 0; i<0x104;i++)
{
uart[i] = 0x5555;
uarts[i] = 0x5555;
}
for(i=0;i<32;i++)
{
sys_statbuff[i]=0;//系统标志buff清0
}
CommandSave=0;
/*设置中断服务程序入口地址*/
EALLOW; // This is needed to write to EALLOW protected registers
PieVectTable.TINT2 = &ISRTimer2;
PieVectTable.RXAINT = &SCIRXINTA_ISR;
EDIS; // This is needed to disable write to EALLOW protected registers
/*开中断*/
IER |= M_INT9;
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
LED1_ON;
*LED3=0;
/*实验主控程序*/
psend = (P_Timer_Frame)(&uarts[0]);
precieve = (P_Timer_Frame)(&uart[0]);
for(;;)
{
uart_s =uart_recive();
/* 返回值 0:接受完成 */
/* 1:数据未准备好 */
/* 3: 较验出错 */
/*未完成*/
if(uart_s == 1)
{
continue;
}
/*接收从主机的数据*/
switch(precieve->Type)
{
case TIMESET: //0xA2//设置时间
for(i=0;i<3;i++)
timerset[i] = uart[i+1];
DINT;
/*设置CPU*/
ConfigCpuTimer(&CpuTimer2, 150, 1000000);
StartCpuTimer2();
/*开中断*/
IER |= M_INT14;
EINT;
precieve->Type=0;
break;
case TIMERESET: //0xA5
precieve->Type=0;
DINT;
/*停止计数*/
StopCpuTimer2();
/*关中断*/
IER &= 0xdfff;
EINT;
sys_reset();
break;
default:
break;
}
}
}
int uart_t_send(void)
{
unsigned int i;
unsigned int timeout = 0x4000;
for(i = 0; i<FRAMLONGTH; i++)
{
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(SciaTx_Ready() == 1)
{
/*发送数据*/
SciaRegs.SCITXBUF = uarts[i];
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
}
return 0;
}
int uart_send(void)
{
unsigned int i;
unsigned int send_datah;
unsigned int timeout = 0x4000;
unsigned int check = 0;
for(i = 0; i<FRAMLONGTH-1; i++)
{
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(SciaTx_Ready() == 1)
{
/*发送数据的高8位*/
send_datah = uarts[i];
check = check ^ (send_datah);
SciaRegs.SCITXBUF = send_datah>>8;
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(SciaTx_Ready() == 1)
{
/*发送数据的低8位*/
SciaRegs.SCITXBUF = uarts[i];
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
}
/*发送校验结果*/
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(SciaTx_Ready() == 1)
{
/*发送数据的高8位*/
send_datah = check;
SciaRegs.SCITXBUF = send_datah>>8;
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(SciaTx_Ready() == 1)
{
/*发送数据的低8位*/
SciaRegs.SCITXBUF = check;
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
/*发送冗余*/
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(SciaTx_Ready() == 1)
{
/*发送数据的高8位*/
send_datah = 0xabcd;
SciaRegs.SCITXBUF = send_datah>>8;
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
timeout = 0x4000;
for(;;)
{
timeout--;
/*上一次发送是否完成*/
if(SciaTx_Ready() == 1)
{
/*发送数据的低8位*/
SciaRegs.SCITXBUF = 0xabcd;
break;
}
/*检查是否超时*/
if(!(timeout))
{
return 0xFFFF;
}
}
/*reset sci */
SciaRegs.SCICTL1.all = 0x03;
SciaRegs.SCICTL1.all = 0x23;
uarts[FRAMLONGTH-1]=check;
return 0;
}
/* 返回值 0:接受完成 */
/* 1:数据未准备好 */
/* 3: 较验出错 */
int uart_recive(void)
{
/*数据未准备好*/
if(sys_statbuff[RECANEW] != 1)
{
return 1;
}
sys_statbuff[RECANEW]=0;//新帧标志位清零
return 0;
}
interrupt void ISRTimer2(void)
{
//更新时间
timerset[2]++;
if(timerset[2]>=60)
{
timerset[1]++;
timerset[2]=0;
}
if(timerset[1]>=60)
{
timerset[1]=0;
timerset[0]++;
}
if(timerset[0]>=24)
timerset[0]=0;
//发送时间帧
psend->Type=TIMEBACK;
psend->Hour=timerset[0];
psend->Minute=timerset[1];
psend->Second=timerset[2];
uart_t_send();
}
void sys_reset(void)
{
EALLOW;
SysCtrlRegs.WDCR= 0;
EDIS;
for(;;){};
}
//===========================================================================
// No more.
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -