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

📄 main.c

📁 ARM的串口源码
💻 C
字号:
   //*********************************************************************
   //				  VANDER  PROPRIETARY
   //		
   //		COPYRIGHT (c)   2006 BY VANDER ENGINEERING LTD.
   //              --  ALL RIGHTS RESERVED  --
   //
   //
   // File Name:	Main.c
   // Author:		Willie Hu
   // Created:		23 Mar 06
   // Modified:
   // Revision:		1.0
   // Description:  Mainloop control
   //*********************************************************************/

#include <LPC213X.H>
#include "common.h"
#include "tpbulk.h"
#include "HAL.H"
#include "SL811.H"
#include "HPI.H"
#include "FAT.H"

#define UART_BPS	57600
#define CRYSTAL		11059200

FLAGS bFlags;
extern unsigned char DBUF[BUFFER_LENGTH];
/////////////////////////////////////////////////
extern unsigned long DirStartCluster,DirStartCluster32;
unsigned long DirStartCluster32;
extern unsigned char UARTBUF[UARTBUF_LENGTH];
extern Command_Def Command;
extern SYS_INFO_BLOCK DeviceInfo;	
extern Response_Def Response;
extern unsigned char *WAVSEND;
extern WAVdata_Def WAVdata;
extern BG_Def BG;
extern Filelist_Def Filelist;
extern unsigned long setpointer;
extern unsigned short BCDcodeTemp;

void Init_Port(void)
{
	PINSEL0 |=(P0_0_TXD0  << P0_0_PINSEL) 			 //P0口功能设置
			| (P0_1_RXD0  << P0_1_PINSEL)
			| (P0_3_EINT1 << P0_3_PINSEL)
			| (P0_15_EINT2<< P0_15_PINSEL);
	PINSEL1 |=(P0_16_EINT0<< P0_16_PINSEL)
			| (P0_20_EINT3<< P0_20_PINSEL);
	PINSEL2 = __0;									 //P1口功能设置
	IO0DIR  |=(__1<<P0_2)							 //P0口方向设置
			| (__1<<P0_4)
			| (__1<<P0_5)
			| (__1<<P0_17)
			| (__1<<P0_18)
			| (__1<<P0_19)
			| (__1<<P0_21)
			| (__1<<P0_22);
	IO1DIR  = 0Xffff0000;							 //P1口方向设置
}

void Init_EINT(void)
{
	EXTMODE |=(1<<EXTMODE0)	 //EINT0,EINT1,EINT2为边沿触发,EINT3为电平触发
			| (1<<EXTMODE1)
			| (1<<EXTMODE2)
			| (1<<EXTMODE3); 
	EXTPOLAR |=(1<<EXTPOLAR0) //EINT0,EINT1,EINT2为上升沿出发,EINT3为高电平触发
			 | (1<<EXTPOLAR1)
			 | (1<<EXTPOLAR2)
			 | (1<<EXTPOLAR3); 
	EXTINT   = 0X0F;		//清空中断标志
}

void Init_VIC(void)
{
	VICIntSelect = (1<<VICIntSel_EINT2);		//设置I2S为FIQ中断,其他所有通道为IRQ中断
	VICVectCntl1 = VICIntSel_Enable |  VICIntSel_EINT1;
	VICVectAddr1 = (long)IRQ_EINT1;									  //设置INT1(FOR SL811)向量地址
	VICVectCntl3 = VICIntSel_Enable |  VICIntSel_EINT3;
	VICVectAddr3 = (long)IRQ_EINT3;	
	VICIntEnable |=(1<<VICIntSel_EINT1)
				 | (1<<VICIntSel_EINT3);		//使能所有中断中断
}
/*
void Init_UART0(void)
{
	unsigned short Fdiv;

	U0LCR = 0X83;			 //使能访问除数锁存
	Fdiv  = (CRYSTAL*5/4)/(16*UART_BPS);		 //设置除数
//	Fdiv  = CRYSTAL/(16*UART_BPS);		 //设置除数
	U0DLM = Fdiv/256;
	U0DLL = Fdiv%256;
	U0LCR = 0X03;			//禁止访问除数锁存
	U0IER = 0X01;			//使能UART0 RDA中断,即接收中断
}
*/
int main()
{
	unsigned long temp;
	unsigned long time_count;
	//初始化端口及中断
	Init_Port();
	Init_EINT();
	Init_VIC();
//	Init_UART0();
	enable_INT();

	IO0CLR = 1<<OE;			  //OE=0
	IO0SET = 1<<CON_CS;		  //CON_CS=1
	//RESET SL811
	IO0CLR = 1<<SL811_RST;	  //SL811_RST=0
	DelayMs(250);
	IO0SET = 1<<SL811_RST;	  //SL811_RST=1
	IO0CLR = 1<<SL811_CS;
	IO0CLR = 1<<MUTE; 
	
	SL811Write(cSOFcnt,0xae);	 //临时代码,解决了无法写入0X0E寄存器的问题,具体原因有待查证
	SL811Write(0x0e,0xe0);		 //
	ComSendByte(SL811Read(0x0e));// 
  
	SL811_Init();
	bFlags.bits.bUartInDone=0;	
	DirStartCluster=0;
	DirStartCluster32=0;
	BG.done = 1;
	BG.count = 1;
	Filelist.list.done = 0;
	bFlags.bits.SLAVE_FOUND = 0;
	bFlags.bits.SLAVE_IS_ATTACHED = 0;
	setpointer = 0;				//音档播放位置指针清零
	BCDcodeTemp = 0;			//把并口缓存数据清零

	for(temp=64;temp>0;temp--)
	DBUF[temp]=0;

	while(1)
	{
	    time_count++;
		if(!bFlags.bits.bUartInDone)   //防止读取楼层失败后无法清空并口缓存现象
		{
		 BCDcodeTemp = 0;
		}
		if(!Filelist.list.done)  //建立U盘中已有文件表格
	       {
		 	 if (bFlags.bits.SLAVE_IS_ATTACHED)  //检测U盘是否枚举成功
		 	 {
		   	  DelayMs(50);
		 	  Command.CLass = 0x00;
		 	  List();	//例举文件名
		 	  Filelist.list.number = Response.len>>5;	//计算文件数量
		 	  Filelist.list.done = 1;	//标示例举完成
			  }
	  	  	}
		if (time_count>10000)//检查接口状态,是否有设备插入或拔出
			{
			BCDcodeTemp = 0;
			disable_INT();
			time_count = 0;
			enable_INT();
			check_key_LED();		
			}
		if(bFlags.bits.SLAVE_FOUND){//如果有设备
			disable_INT();
			bFlags.bits.SLAVE_FOUND=FALSE;
 		    DelayMs(250);
			if(EnumUsbDev(1))				// enumerate USB device, assign USB address = #1
			{
			   	bFlags.bits.SLAVE_ENUMERATED = TRUE;	// Set slave USB device enumerated flag	
		   		DirStartCluster=0;
				DirStartCluster32=0;
			}
			enable_INT();	
			}
		if(bFlags.bits.SLAVE_REMOVED){//拔出U盘
			disable_INT();
			bFlags.bits.SLAVE_REMOVED = FALSE;
			bFlags.bits.SLAVE_ENUMERATED = FALSE;
			bFlags.bits.SLAVE_IS_ATTACHED = FALSE;
			Filelist.list.done = 0;
			enable_INT();	
			}
		if (bFlags.bits.SLAVE_IS_ATTACHED){
		 disable_INT();
		 DelayMs(1);		 
		 if(bFlags.bits.bUartInDone)
		 	{//有串口通讯
			 bFlags.bits.bUartInDone=0;
//			 if((Decode026()))
			 UartHandler();			//FAT16
			}
		 else		//若没有信号,则播放背景音乐
			Background();
		 IO0CLR = 1<<OE;			//OE = 0; 关闭CPLD
  		 VICIntEnClr = 1<<VICIntSel_EINT2;			//关闭CPLD的中断
		}
		if(bFlags.bits.bMassDevice){//判断是否为U盘
			disable_INT();
			bFlags.bits.bMassDevice=FALSE;
			if(EnumMassDev())
				{
				bFlags.bits.SLAVE_IS_ATTACHED = TRUE;				
				}
			else
				{				
				bFlags.bits.SLAVE_IS_ATTACHED = FALSE;				
				temp=SL811Read(IntStatus);
				if(!(temp & 0x40))	bFlags.bits.SLAVE_FOUND=TRUE;
				}		
			enable_INT();	
			}	
	}
}

⌨️ 快捷键说明

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