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

📄 main.c

📁 用串口来显示和操作的基于ucos的以sd卡为存储介质的mp3源码
💻 C
字号:
#define IN_MAIN
#include "User.h"

#define  TASK_STK_SIZE                 64

OS_STK  	TaskLEDStk[TASK_STK_SIZE];
OS_STK		TaskMP3PlayStk[TASK_STK_SIZE*40];	

OS_EVENT *SD_INIT;
OS_EVENT *Uart0RecData;

INT8U SDKardState;
INT8U Int0Tdata;
INT8U MP3Handle;
volatile INT8U UART0_FIFO[16];

void  Task_LED(void *pdata);
void  MP3Play(void *pdata);
void  TaskStart(void );

int main(void)
{
	OSInit();     /* Initialize uC/OS-II          */
	TaskStart();
    OSStart();
    return 0;
}

void  TaskStart (void)
{

    OSTaskCreate(Task_LED, NULL, &TaskLEDStk[TASK_STK_SIZE - 1], 10);
    OSTaskCreate(MP3Play, NULL, &TaskMP3PlayStk[TASK_STK_SIZE*40 - 1], 11);
}

void SD_Scan(void)
{
	INT8U err;
	static INT8U SD_Insert_flag;
	
	if(((IO0PIN & SD_Insert) != 0) && (SD_Insert_flag == 1))
	{
		SD_Insert_flag = 0;
		SDKardState = 0;
		err = OSSemPost(SD_INIT);
	}
	else if(((IO0PIN & SD_Insert) == 0) && (SD_Insert_flag == 0))
	{
		 
		SD_Insert_flag = 1;
		SDKardState = 1;
		err = OSSemPost(SD_INIT);
	}
}

void  Task_LED (void *pdata)
{
	pdata = pdata;
	TargetInit();
	OSStatInit();                /* Initialize uC/OS-II's statistics         */
	
	PINSEL2 = PINSEL2 & (~0x08); //P1[25-16]设置为GPIO
	IO1DIR |= LED;		         //设置IO口为输出口
    while(1)
    {
        if((IO1SET & LED) == 0)
        	IO1SET = LED;
        else
        	IO1CLR = LED;
        SD_Scan();	                
        OSTimeDly(OS_TICKS_PER_SEC/2);  //延时1/2秒                                                    
    }
}


void UartPrint(const INT8U *ch) 
{			 
  while(*ch != '\0')
  {
  	if (*ch == '\n') 
  	{
    	while (!(U0LSR & 0x20));
   		 U1THR = CR;              	  
  	}
 	while (!(U0LSR & 0x20));
 	U0THR = *ch;
 	ch++;
  }
}

void UartPutchar(const INT8U ch) 
{			 
  	while (!(U0LSR & 0x20));
 	U0THR = ch;
}

/*INT8U uar_getchar()
{
	while (!(U0LSR & 0x01));
    return (U0RBR);
}*/

void INT0Init(void)
{
	PINSEL1 |= 0x01;				//选择EINT0
	VICIntSelect &=(~ (1 << 14));	//分配为IRQ中断
	EXTMODE |= (1 << 0);			//边沿触发
	EXTPOLAR &=(~ (1 << 0));		//下降沿
}

void UART0_INT_Init(void)
{
	U0IER |= 1 << 0; 	//允许接收中断
    U0FCR = 0x11;    	//使能接收FIFO,接收中断触发深度为1字节
}


void MP3Play(void *pdata)
{
   extern INT32U ReadFlen;
   const INT8U SD_Find_Str[]={"SDKard found\n"};
   const INT8U SD_REM_Str[]={"SDKard remove\n"};
  
   INT8U *Receive_data;
   INT8U StopFlag=0;
   INT32U temp;
   
   pdata = pdata;

   UART0_INT_Init();
   INT0Init();
   DiskInit();
   SD_INIT = OSSemCreate(0); 
   Uart0RecData = OSMboxCreate(NULL);
   VS_Drive(MP3CMD_InitVS1003);
   MP3Handle = 0;
   while(1)
   {
     	if(OSSemAccept(SD_INIT) > 0)
        {
        	if(SDKardState == 0)
        	{
        		UartPrint(SD_REM_Str);
        		RemoveFileDriver('A');
        	}
        	else
        	{
        		SD_Init();
        		OSTimeDly(OS_TICKS_PER_SEC/5);
        		SD_Init();
        		UartPrint(SD_Find_Str);
        		AddFileDriver('A', SDKardCMD);
        	}
        }
        if(SDKardState == 1)
        {
     		Receive_data = (INT8U *) OSMboxAccept(Uart0RecData);
     		if(Receive_data != NULL)
     		{
     	 		FileOperation(*Receive_data);
     		}
			
			temp = GetFileSize() - 128;
			if(ReadFlen > temp)
			{
				MP3Handle = MP3CMD_Stop;
				if(StopFlag == 0)
				{
					UartPrint((void *)("\nStop"));
					StopFlag = 1;
				}
				ReadFlen = 0;
			}
			VS_Drive(MP3Handle);
     	}
    
   }
}


void Uart0_Exception(void)
{
	INT8U err,i;
	switch(U0IIR & 0x0f)
	{ 
		case 0x04:
		case 0x0c:
			for(i=0;i<1;i++)
				UART0_FIFO[i]=U0RBR;
			err = OSMboxPost(Uart0RecData,(void *)&UART0_FIFO);
			
	}
	VICVectAddr = 0; 
}

void INT0_Exception(void)
{
	
	
	EXTINT |= 1 << 0;
	Int0Tdata = 'r';
	OSMboxPost(Uart0RecData,(void *)&Int0Tdata);
	VICVectAddr = 0;
}

⌨️ 快捷键说明

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