打印
[ZLG-ARM]

KEIL+Ulink+LPC2300+UCOS2 调试串口出问题

[复制链接]
1549|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
salonydeny|  楼主 | 2008-10-23 11:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的是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);

    }
}   

相关帖子

沙发
salonydeny|  楼主 | 2008-10-23 14:35 | 只看该作者

问题已经解决,但不知道根本原因

谢谢关注,问题已经解决,现在能够实现按一次键向外发送一个数据,并且,LED灯亮。改动的地方如下:
VICVectAddr7 = (uint32 )UART1_Exception; /* Set Interrupt Vector    */
VICVectCntl7 = 7;      /* use it for UART1 Interrupt          */
VICIntEnable  = (1  << 7);   /* Enable Interrupt               */

把我写的这个去掉了
然后用的这个(去掉了些注释)
uint32 Install_IRQ( uint32 IntNumber, void *HandlerAddr, uint32 Priority )
{
    uint32 *vect_addr;
    uint32 *vect_cntl;
      
    VICIntEnClr = 1 << IntNumber;    /* Disable Interrupt */
    if ( IntNumber >= VIC_SIZE )
    {
        return ( FALSE );
    }
    else
    {
         vect_addr = (uint32 *)(VIC_BASE_ADDR + VECT_ADDR_INDEX + IntNumber*4);
    vect_cntl = (uint32 *)(VIC_BASE_ADDR + VECT_CNTL_INDEX + IntNumber*4);
    *vect_cntl = Priority;
    VICIntEnable = 1 << IntNumber;    /* Enable Interrupt */
    return( TRUE );
    }
}

在寄存器写完之后,去掉我上面提到的,然后调用了这个函数,
Install_IRQ(7,(void *)UART1_Handler,2);

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

148

帖子

1

粉丝