导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→KEIL+ULINKII+LPC2378+UCOS 串口调试

* 49832: KEIL+ULINKII+LPC2378+UCOS 串口调试出问题

   salonydeny 
salonydeny发表的帖子 

 KEIL+ULINKII+LPC2378+UCOS 串口调试出问题
我用的是LPC2300芯片,在调试外部中断0的时候信号量能够正常工作,我建立两个任务,一个是让LED灯灭,一个是让LED灯亮,LED灯亮前等待外部中断的信号量,如果我在这个任务中不加串口向外发数据OSSemPend(sem,0,&err);
FIO2SET|=0x000000FF;就这两句的话,任务能够正常执行。在按一下,灯亮一下,但是我加上这个 OSSemPend(sem,0,&err);
        FIO2SET|=0x000000FF;
        UART0Putch(0x55);
这样一来,我第一次按,灯亮,然后灭,串口也能收到'U',再按一键,LED亮,串口收到数据,但不会再灭了,不知道为什么。以下是我的程序,有哪位大哥帮我看下,谢谢啦!


#include "config.h"
#include "stdlib.h"

#define    TaskStkLengh    64        

OS_STK    TaskStk [TaskStkLengh];        //Define the Task0 stack 定义用户任务0的堆栈
OS_STK    TaskStk1 [TaskStkLengh];        //Define the Task1 stack 定义用户任务1的堆栈
OS_EVENT *sem;
OS_EVENT *Uart0Sem;
void     Task0(void *pdata);            //Task0 任务0
void     Task1(void *pdata);            //Task1 任务1
extern void UART1_Handler(void);
unsigned char temp;
void UART1_Exception(void)
{    
    uint8 IIR;
    
    OS_ENTER_CRITICAL();
    while(((IIR = U1IIR) & 0x01) == 0)
    {                                       /* 有中断未处理完 */
        switch (IIR & 0x0e)
        {
            case 0x02:                      /* THRE中断    */
                        U1THR = temp;
                        U1IER = U1IER & (~0x02)
                break;
            case 0x04:                     /* 接收数据可用 */
                OSSemPost(Uart0Sem);      /* 通知接收任务 */
                U1IER = U1IER & (~0x01); /* 禁止接收及字符超时中断 */
                break;
            case 0x06:                    /* 接收线状态   */
                temp = U1LSR;
                break;
            case 0x0c:                    /* 字符超时指示 */
                OSSemPost(Uart0Sem);      /* 通知接收任务 */
                U1IER = U1IER & (~0x01); /* 禁止接收及字符超时中断 */
                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 @ 12MHz PCLK Clock */
  U1FDR = 0x67;             /* Fractional Divider                  */
  U1LCR = 0x03;             /* DLAB = 0                       */
  U1IER = 0x03;            /* Enable RDA and THRE interrupts      */
  U0FCR = 0x87;
  VICVectAddr7 = (uint32 )UART1_Exception;/* Set Interrupt Vector  */
  VICVectCntl7 = 7;               /* use it for UART1 Interrupt   */
  VICIntEnable  = (1    <  < 7);     /* Enable interrupt   */
  Uart0Sem = OSSemCreate(0);
}


void UART0Putch(uint8 Data)
{


    OS_ENTER_CRITICAL();
    if ((U1LSR & 0x00000020) != 0)
    {                                     /* UART0发送保持寄存器空 */
        U1THR = Data;
        U1IER = U1IER | 0x02;             /* 允许发送中断 */
    }
    OS_EXIT_CRITICAL();

void UART0Write(uint8 *Data, uint16 NByte)
{
    OS_ENTER_CRITICAL();
    while (NByte-- >   0)
    {
        UART0Putch(*Data++);
    }
    OS_EXIT_CRITICAL();
}

uint8 UART0Getch(void)
{
    uint8 err;

    OS_ENTER_CRITICAL();
    if ((U1LSR & 0x00000001) == 0)
    {                                           /* 没有收到数据 */
        U1IER = U1IER | 0x01;                   /* 允许接收中断 */
        OSSemPend(Uart0Sem, 0, &err);           /* 等待接收数据 */
    }
    err = U1RBR;                            /* 读取收到的数据 */
    OS_EXIT_CRITICAL();
    return err;
}

int main (void)
{
    OSInit ();
    UART_Init();                                                                                                        
    OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 2);    
    OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 3);        
    OSStart ();
    return 0;                                                            
}
/*********************************************************************************************************
**                            Task0 任务0
********************************************************************************************************/

void Task0    (void *pdata)
{
    pdata = pdata;
    TargetInit ();
    
    while (1)
    {
        FIO2CLR|=0x000000FF;
        OSTimeDly(500);
    }
}
/*********************************************************************************************************
**                            Task1 任务1
********************************************************************************************************/

void Task1    (void *pdata)
{    INT8U  err;
    pdata = pdata;

    while (1)
    {
        OSSemPend(sem,0,&err);
        FIO2SET|=0x000000FF;
        UART0Putch(0x55);

    }
}   


发表时间:2008年10月23日12:03:22

  
回复该帖

本主题共有 1 帖,分页:>>>>>该主题的所有内容[1]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:[灌水]伟京电子有限公司是一家专业产品开发和生产的公司,能根据客户的需求,提供电子产品设计、原理图及
[下一篇帖子]:彩色液晶显示开发 比你想象的更简单!为了便于从事液晶显示开发工作的朋友方便快捷的工作,特别