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