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

📄 main.c

📁 昨天上传的有点问题
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
** mcu123.com add keil
********************************************************************************************************/
#include "config.h"
#include "stdlib.h"
#include "queue.h"
#define	TaskStkLengh	64			//Define the Task0 stack length 定义用户任务0的堆栈长度
OS_STK	TaskStk [TaskStkLengh];		//Define the Task0 stack 定义用户任务0的堆栈
OS_STK	TaskStk1 [TaskStkLengh];		//Define the Task1 stack 定义用户任务1的堆栈
OS_STK  TaskStk2 [TaskStkLengh];    //串口发送任务堆栈
OS_STK  TaskStk3 [TaskStkLengh];
OS_EVENT *sem;
OS_EVENT *sem1;
OS_EVENT *uartsem; 
CirQueue uartqueue; 
extern void UART1_Handler(void);
extern Install_IRQ( uint32 IntNumber, void *HandlerAddr, uint32 Priority );

void 	Task0(void *pdata);			//Task0 任务0
void 	Task1(void *pdata);			//Task1 任务1
void 	Task2(void *pdata);			//Task0 任务2
void 	Task3(void *pdata);
unsigned char temp;
struct uart
{
   unsigned int td_len;
   unsigned int rd_len;
   unsigned int td_maxlen;
   unsigned int rd_maxlen;
   unsigned char RecBuf[128];
   unsigned char SenBuf[1010];

}uart1;

void UART1_Exception(void)
{	
	extern unsigned char temp;
	uint8 IIR;

    //OS_ENTER_CRITICAL();
    while(((IIR = U1IIR) & 0x01) == 0)
    {                                                   /* 有中断未处理完 */
        switch (IIR & 0x0e)
        {
            case 0x02:                                  /* THRE中断    */
                       U1IER = U1IER & (~0x02);        /* 队列空,则禁止发送中断 */
                break;
			case 0x0c:
			while((U1LSR&0x01) == 1)                  /* 通知接收任务 */
				{
				   EnQueue(&uartqueue,U1RBR);
				   //Uartbuf[i++] = U1RBR;

				}
				OSSemPost(uartsem);
                break;
            case 0x04:                                 /* 接收数据可用 */
                while((U1LSR&0x01) == 1)                  /* 通知接收任务 */
				{
				   EnQueue(&uartqueue,U1RBR);

				}
				OSSemPost(uartsem);
                break;
            case 0x06:                                  /* 接收线状态   */
                temp = U1LSR;
                break;

            default :
                break;
        }
    } 
    VICVectAddr = 0;            // 通知中断控制器中断结束
    //OS_EXIT_CRITICAL();
}

void UART_Init(void)
{ 
  PINSEL0 &= ~0xC0000000;
  PINSEL0 |=  0x40000000;             /* Enable TxD1 pin                     */
  PINSEL1 &= ~0x00000003;
  PINSEL1 |=  0x00000001;             /* Enable RxD1 pin                     */

  U1LCR = 0x83;                       /* 8 bits, no Parity, 1 Stop bit       */
  U1DLM = 0;
  U1DLL = 7;                          /* 115200 Baud Rate                    */
  U1FDR = 0x67;                       /* Fractional Divider                  */
  U1LCR = 0x03;                       /* DLAB = 0                            */
  U1IER = 0x03;                       /* Enable RDA and THRE interrupts      */
  U1FCR = 0x41;  					  /* FIFO为8字节触发                     */
  InitQueue(&uartqueue);
}

/******************串口发送一个数据****************************/
void UART1SendChar(uint8 data)
{
    if ((U1LSR & 0x20) != 0)
	U1THR = data;
	U1IER = U1IER | 0x02;
}

/**/
void UART0Putch(uint8 *Data,uint16 len)
{
    uint8 i,err;
	OSSemPend(sem1,0,&err);
    if ((U1LSR & 0x00000020) != 0)
    {                                               /* UART0发送保持寄存器空 */
       	if (len <= 4)
		{
		  for (i=0; i<len; i++)
          {
		   U1THR = *Data;
		   Data++;}
           U1IER = U1IER | 0x02;                       /* 允许发送中断 */
		}
		else
		{
		  do{
		      for (i=0; i<4; i++)
              {
		       U1THR = *Data;
		       Data++;
		      }
               U1IER = U1IER | 0x02;                       /* 允许发送中断 */
			  while ((U1LSR & 0x00000020) == 0);
			  len -= 4;
		    }while(len>4);
			if (len > 0)
			{
			  for (i=0; i<len; i++)
              {
		        U1THR = *Data;
		        Data++;
			  }
              U1IER = U1IER | 0x02;                       /* 允许发送中断 */
			  while ((U1LSR & 0x00000020) == 0);
		   }
		}
    }
	OSSemPost(sem1);
    
} 

int main (void)
{
    INT16U i;
	OSInit ();																										
	OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 5);	
	OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 6);
	OSTaskCreate (Task2,(void *)0, &TaskStk2[TaskStkLengh - 1], 7);
	OSTaskCreate (Task3,(void *)0, &TaskStk3[TaskStkLengh - 1], 4);
	  uart1.td_len = 10;
	  for (i=0; i<10; i++)
	     uart1.SenBuf[i] = 0x30+i;
	  for (i=10; i<1000; i++)
	  uart1.SenBuf[i] = 'a';

	sem = OSSemCreate(0);
	sem1 = OSSemCreate(1);
	uartsem = OSSemCreate(0);
	OSStart ();
	return 0;															
}
/*********************************************************************************************************
**                            Task0 任务0
********************************************************************************************************/

void Task0	(void *pdata)
{
    INT8U a;//,err;
	a = 0x55;
	
	TargetInit ();
	UART_Init(); 
	Install_IRQ(7,(void *)UART1_Handler,2);
	while (1)
	{
	    
		FIO2CLR|=0x000000FF;
		UART0Putch(&a,1);
		OSTimeDly(100);
	}
}
/*********************************************************************************************************
**                            Task1 任务1
********************************************************************************************************/

void Task1	(void *pdata)
{	
	pdata = pdata;
	while (1)
	{
		FIO2SET |= 0x0ff;
		OSTimeDly(200);

	}
}
/**********************************************************************************
**                           Task2 任务2 串口发送
***********************************************************************************/

void Task2 (void *pdata)
{
    INT8U err;
	pdata = pdata;
	while(1)
	{
	  OSSemPend(sem,0,&err);
	  UART0Putch(uart1.SenBuf,1000);
	}
}
/**********************************************************************************
**                            Task3 串口接收数据   
***********************************************************************************/
void Task3 (void *pdata)
{
    INT8U err,a[QueueSize],i=0;
    pdata = pdata;
	while(1)
	{	 
	  OSSemPend(uartsem,0,&err);

	  while(QueueEmpty(&uartqueue) == 0)
      a[i++]=DeQueue(&uartqueue); 
	  UART0Putch(a,i);
	  i = 0;
	}
}
/**********************************************************************************
**                              Task4
**********************************************************************************/

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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