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

📄 irq.c

📁 SPCE061通过串口接收和播放语音程序
💻 C
字号:
//*******************************************************************//
//Interrupt Service Routine For C language
//*******************************************************************//
#include	"SPCE061V004.H"
#define StartAddr   0xA000
extern unsigned int Addr,PlayFlag,StopFlag,StopAddr;
int uiDataLow,uiDataHigh,count=0,check=0,StartFlag;
__asm(".external	F_FIQ_Service_SACM_S480");
void BREAK(void) __attribute__ ((ISR));
void BREAK(void)
{
}
void FIQ(void) __attribute__ ((ISR));
void FIQ(void)
{
	if(*P_INT_Ctrl&0x2000)						//定时器A中断
	{						
		*P_INT_Clear=C_FIQ_TMA;		 			//清除中断标志位
		__asm("call F_FIQ_Service_SACM_S480");	//调用S480中断服务函数    
	}
	else if(*P_INT_Ctrl&0x0800)					//定时器B中断
		*P_INT_Clear=C_FIQ_TMB;                 //清除中断标志位
	else										//PWM中断
		*P_INT_Clear=C_FIQ_PWM;					//清除中断标志位
}

void IRQ0(void) __attribute__ ((ISR));
void IRQ0(void)
{
}
void IRQ1(void) __attribute__ ((ISR));
void IRQ1(void)
{
}
void IRQ2(void) __attribute__ ((ISR));
void IRQ2(void)
{
}
void IRQ3(void) __attribute__ ((ISR));
void IRQ3(void)
{
}
void IRQ4(void) __attribute__ ((ISR));
void IRQ4(void)
{
}
void IRQ5(void) __attribute__ ((ISR));
void IRQ5(void)
{
}
void IRQ6(void) __attribute__ ((ISR));
void IRQ6(void)
{
}
void IRQ7(void) __attribute__ ((ISR));
void IRQ7(void)//UART的中断不需要清除,而是由硬件自动清零
{
	check++;                  //标记中断进入次数
	
	/*当所接收到的数据达到一定值后,暂时定为190,设置播放标志,让S480放音*/
	if(check==190)            
	{
		PlayFlag=1;
	}
	
	/*UART每次传送的是一个8位的数,而Flash中和S480队列都
	需要一个16位的数,所以要将奇数次和偶数次收到的数据拼
	接成一个16位的数据。按照凌阳的数据顺序需要将两次收到
	的数据进行顺序交换,如:两次收到的数据分别为0xAA,
	0x55,则在拼接后为0x55AA,以便写入Flash和S480放音需要*/
	//现在假设所传送的数据以0xFFFFFFFF结尾
	//以下程序为数据拼接和判断结束部分
	if(count==0)                   // 当收到的数据为奇数次数据时  
	{
		uiDataLow=*P_UART_Data;    //将收到的数据保存
		count++;				   //标记下一个收到的数据为偶数次数据
	}
	else                           //当收到的数据为偶数次数据时
	{
		uiDataHigh=*P_UART_Data;   //将收到的数据保存
		
		//将奇偶两次收到的数据按照前面所述规则拼接
		uiDataLow=uiDataLow|(uiDataHigh<<8);
		
	    /*以下的if,else判断是否连续两次拼接后的数据为0xFFFF,表示数传送结束,
	    当StopFlag为2时,表示发送结束,关闭UART中断*/
		if(uiDataLow==0xffff)
		{
			StopFlag++;									//收到一次0xFFFF
			if(StopFlag==2)
			{	
				StopAddr=Addr;							//结束地址指向当前地址
			    *P_UART_Command1=0x000C;				//关闭UATR接收中断
			}
		}
		else
		{
			//不是连续接收时,将接到的一次0xFFFF认为是数据,而非结束标志
			StopFlag=0;								    
		}		
		
		F_FlashWrite1Word(Addr,uiDataLow);         //将拼接后的数据写入Flash
		Addr++;									   //将写入地址位下移1位
		count=0;								   //标记下一个收到的数据为奇数次数据
	}

	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -