📄 cputimer.c
字号:
/************************************************************************************
版权(c) 2003- 北京合众达电子技术有限责任公司 *
* 设计者: 戴展波
*************************************************************************************/
#include "DSP28_Device.h"
#include "ext_inf.h"
Uint32 temp1 = 0,temp2 = 0,temp3 = 0,temp4 = 0;
void main(void)
{
/*初始化系统*/
InitSysCtrl();
/*关中断*/
DINT;
IER = 0x0000;
IFR = 0x0000;
// Led_Flag = 0;
/*初始化PIE*/
InitPieCtrl();
/*初始化PIE中断矢量表*/
InitPieVectTable();
/*初始化外设包含GPIO*/
InitPeripherals();
/*初始化GPIO*/
//InitGpio();
LED_State.all = 0x0000;
GpioDataRegs.GPADAT.all = LED_State.all;
EALLOW;
PieVectTable.TINT0 = &ISRTimer0; //TIME0
EDIS;
/*设置CPUTIMER*/
ConfigCpuTimer(&CpuTimer0, 150, 1000); //时间间隔=1000us= 1ms
StartCpuTimer0();
/*开中断*/
IER |= M_INT7;
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
for(;;);
}
interrupt void ISRTimer0(void)
{
BOOL temp;
temp = CheckDS4state();
if(temp)
temp3 = 1;
if((temp3 == 1)&&(temp2 <= T_INTERVAL3))
{
temp2++;
ConfigLEDstate(URGENT,0,0,0);
//CpuTimer0.InterruptCount = 0;
}
else
{
temp1 = CpuTimer0.InterruptCount++;
temp2 = 0;
temp3 = 0;
if((temp1 > 0)&&(temp1 <= T_INTERVAL1))
{
//第一组绿灯亮
ConfigLEDstate(GROUP1,R_LED_OFF,Y_LED_OFF,G_LED_ON);
ConfigLEDstate(GROUP2,R_LED_ON,Y_LED_OFF,G_LED_OFF);
}
if((temp1 > T_INTERVAL1)&&(temp1 <= (T_INTERVAL1 + T_INTERVAL2)))
{
//第一组黄灯亮
if((temp1%1000) <= 500)
{
ConfigLEDstate(GROUP1,R_LED_OFF,Y_LED_ON,G_LED_OFF);
}
else
{
ConfigLEDstate(GROUP1,R_LED_OFF,Y_LED_OFF,G_LED_OFF);
}
ConfigLEDstate(GROUP2,R_LED_ON,Y_LED_OFF,G_LED_OFF);
}
if((temp1 > (T_INTERVAL1 + T_INTERVAL2))&&(temp1 <= (2*T_INTERVAL1 + T_INTERVAL2)))
{
//第二组绿灯亮
ConfigLEDstate(GROUP1,R_LED_ON,Y_LED_OFF,G_LED_OFF);
ConfigLEDstate(GROUP2,R_LED_OFF,Y_LED_OFF,G_LED_ON);
}
if((temp1 > (2*T_INTERVAL1 + T_INTERVAL2))
&&(temp1 <= (2*T_INTERVAL1 + 2*T_INTERVAL2)))
{
//第二组黄灯亮
if((temp1%1000) <= 500)
{
ConfigLEDstate(GROUP2,R_LED_OFF,Y_LED_ON,G_LED_OFF);
}
else
{
ConfigLEDstate(GROUP2,R_LED_OFF,Y_LED_OFF,G_LED_OFF);
}
ConfigLEDstate(GROUP1,R_LED_ON,Y_LED_OFF,G_LED_OFF);
//计数器归零
CpuTimer0.InterruptCount = 0;
}
}
/*
if(Led_Flag == 1)
{
*LED2 = 0;
LED1_ON;
Led_Flag = 0;
}
else
{
*LED2 = 1;
LED1_OFF;
Led_Flag = 1;
}
*/
}
//当Group = URGENT 全红灯
void ConfigLEDstate(Uint16 Group, Uint16 R_State,Uint16 Y_State,Uint16 G_State)
{
//关掉其它无用的位
//LED_State.bit.Reserved1 = 0x01;
//LED_State.bit.Reserved2 = 0x01ff;
if(Group == GROUP1)
{
LED_State.bit.GROUP1_R_LED = R_State;
LED_State.bit.GROUP1_Y_LED = Y_State;
LED_State.bit.GROUP1_G_LED = G_State;
GpioDataRegs.GPADAT.all = LED_State.all;
}
else if(Group == GROUP2)
{
LED_State.bit.GROUP2_R_LED = R_State;
LED_State.bit.GROUP2_Y_LED = Y_State;
LED_State.bit.GROUP2_G_LED = G_State;
GpioDataRegs.GPADAT.all = LED_State.all;
}
else if(Group == URGENT)
{
LED_State.bit.GROUP1_R_LED = LED_ON;
LED_State.bit.GROUP1_Y_LED = LED_OFF;
LED_State.bit.GROUP1_G_LED = LED_OFF;
LED_State.bit.GROUP2_R_LED = LED_ON;
LED_State.bit.GROUP2_Y_LED = LED_OFF;
LED_State.bit.GROUP2_G_LED = LED_OFF;
GpioDataRegs.GPADAT.all = LED_State.all;
}
}
BOOL CheckDS4state(void)
{
Uint16 temp5 = 1;
BOOL temp6 = FALSE;
temp5 = GpioDataRegs.GPADAT.bit.GPIOA12;
if(temp5 == 0)
{
temp4++;
}
else
{
temp6 = FALSE;
temp4 = 0;
}
if(temp4 >= 50) //DS4按键50ms延时
{
temp6 = TRUE;
temp4 = 0;
}
return temp6;
}
//===========================================================================
// No more.
/*
测试
CPUTIMER的初始化是否正确,时间是否正确
GPIO初始化是否正确,尤其是DS4对应的PGIO14管脚
点灯的是否正确 置1亮还是置0亮?
逻辑是否正确
*/
//===========================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -