⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cputimer.c

📁 一个关于交通灯的程序(TMS320F2812)付完整的程序说明
💻 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 + -