5172|3

80

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

谢谢各位老鸟,帮我看看这个LPC2378基于UCOS-II 2.86 的UART0中断 [复制链接]

 麻烦各位老鸟指点下,我用的是UCOS_II官方提供的UCOS-II 2.86+TCP-IP 包,现在要用UART0 中断来接受和发送数据 ,主要代码如下,但调试时,只有第一次会进入中断里处理,之后用串口工具发数据,串口就进入中断中,出不来了,我发了数据,U0LSR 老是0x60.代码:#include "includes.h"
#include "Uart1.h"
extern void UART_Putc(unsigned char SendData);
#define  BIT0      0x01
#define  BIT1      0x02
#define  BIT2      0x04
#define  BIT3      0x08
#define  BIT4      0x10
#define  BIT5      0x20
#define  BIT6      0x40
#define  BIT7      0x80
uint32    Rcv_New = 0;                                                // 为1时表明接收到新数据
uint32    Snd_N   = 0;                                                // 记录接收数据完毕后,需发送数据的个数
uint8          Rcv_Buf[8];                                                // 字符接收数组

#if OS_CRITICAL_METHOD == 3                                             /* Allocate storage for CPU status register                 */
    OS_CPU_SR  cpu_sr    = 0;
#endif

void  OSView_RxTxISRHandler1 (void)
{
    volatile  INT8U  rx_data;
    volatile  INT8U  lsr;
    volatile  INT8U  iir;
        uint8          a_Buf[8]={0x01,0x02,0x03,0x04,0x05,0x06};
    uint32 i=0;
   
    OS_ENTER_CRITICAL();
   
    iir = U0IIR & 0x0F;
    while (iir != 1)
        {
        switch (iir)
                {         
                  case 0x02:                      /* THRE中断    */
                       // U0THR = temp;
                     //   U0IER = U0IER & (~0x02)        ;
                break;
            case 0x04:                     /* 接收数据可用 */
                //OSSemPost(uart0sem);      /* 通知接收任务 */
                //U0IER = U0IER & (~0x01); /* 禁止接收及字符超时中断 */
                  Rcv_New = 1;
                                  for (i = 0; i < 8; i++)        
                                    {
                                        Rcv_Buf = U0RBR;                // 读空FIFO,清除RDA中断
                                    }
                                    Snd_N = 8;                                        // 收到8个数据
                                break;
                                
            case 0x06:                    /* 接收线状态   */
                //temp = U0LSR;
                break;
            case 0x0c:                    /* 字符超时指示 */
                //OSSemPost(uart0sem);      /* 通知接收任务 */
                //U0IER = U0IER & (~0x01); /* 禁止接收及字符超时中断 */
                Rcv_New = 1;
                                for (i = 0; i < 8; i++)        
                                {
                                                 U0RBR = a_Buf;
                                        if ((U0LSR & 0x01) == 0x01)
                                        {
                                       
                                                Rcv_Buf = U0RBR;        // 读空FIFO,清除CTI中断
                                        }
                                        else
                                        {
                                                break;
                                        }
                                }
                                Snd_N         = i;                                // 在CTI中断里保存了i个有效数据
               
                        //        break;
            default :
                break;
        }
    }
    VICAddress = 0;            // 通知中断控制器中断结束
    OS_EXIT_CRITICAL();

}

/*
*********************************************************************************************************
*                                    INITIALISE uC/OS-View COM PORT
*
* Description: Initialize the hardware required for the OS to run. This will work on any target hardware,
*              but may have to be tailored a little (regarding the clock frequency). Of course the same
*              holds true if for some reason you choose to use another timer.
*
* Note(s)    : 1) This function assumes that a free running timer has been initialized.  The timer can
*                 either be a 16 bits or 32 bits timer.  Your application needs to provide a function
*                 called OSView_TmrRd() that reads the current counts of this timer.  The free running
*                 timer is initialized by the BSP function OSView_TmrInit().
*              2) The peripheral clock divider is set to 4 under the initialization for the specific
*                 UART. A divider of 4 is assumed during general purpose initialization when the baud rate
*                 divider is calculated.
*********************************************************************************************************
*/
void  OSView_uart1InitTarget (INT32U baud_rate)
{
    INT32U     div;   
    INT8U      divlo;
    INT8U      divhi;
    INT32U     pClkFreq;
    INT32U     cClkFreq;

                                            /* Compute divisor for desired baud rate                    */
    cClkFreq             =   BSP_CPU_ClkFreq();                         /* Get the CPU clock frequency                              */
    pClkFreq             =   cClkFreq / 4;                              /* Determine the peripheral clock frequency, see Note 2)    */

    div                  =  (((2 * pClkFreq / 16 / baud_rate) + 1) / 2);
    divlo                =   div & 0x00FF;                              /* Split divisor into LOW and HIGH bytes                    */
    divhi                =  (div >> 8) & 0x00FF;
    //lcr                  =   0x03;                                      /* 8 Bits, 1 Stop, No Parity                                */

   // OS_ENTER_CRITICAL();
    PCLKSEL0            &=  ~(3 << 6);   //外设时钟                               /* Clear the UART 0 clock divider bits such that div = 4    */

        PINSEL0 &= ~0x000000FF;
    PINSEL0 |=  0x00000050;             /* Enable TxD1 pin  */  

    U0LCR                =   0x83;                                      /* Set divisor access bit                                   */
    U0DLL                =   divlo;                                     /* Load divisor                                             */
    U0DLM                =   divhi;
    U0LCR                =   0x03;                                       /* Set line control register (Bit 8 is 0)                   */
    U0IER                =   0x01;                                      /* Disable both Rx and Tx interrupts                        */
    U0FCR                =   0x81;                                      /* Enable FIFO, flush Rx & Tx                               */
   // OS_EXIT_CRITICAL();
     
                                                                           /* VIC UART #0 Initialization                               */
           
    VICIntSelect        &= ~(1 << VIC_UART0);                       /* Enable                                         */
    VICVectAddr6         =  (INT32U)OSView_RxTxISRHandler1;              /* Set the vector address                                   */
    VICIntEnable         =  (1 << VIC_UART0);                           /* Enable Interrupts                                        */
    //uart0sem = OSSemCreate(0);

}

/*********************************************************************************************************
** 函数名称: UART_Putc
** 功能描述: UART发送函数。
** 输入参数: SendData        发送字符
**                        
** 输出参数: 无
********************************************************************************************************/
void UART1_Putc(unsigned char SendData)
{

//        OS_ENTER_CRITICAL();
   // if ((U0LSR & 0x00000020) != 0)
   // {                                     /* UART0发送保持寄存器空 */
        U0THR = SendData;
       while ((U0LSR & 0x40) == 0);
           // U0IER = U0IER | 0x02;             /* 允许发送中断 */
   // }
  //  OS_EXIT_CRITICAL();
}
/*********************************************************************************************************
** 函数名称: UART_SendData
** 功能描述: UART发送函数。
** 输入参数: SendBuf        发送缓冲区
**                         len                发送字节数
** 输出参数: 无
********************************************************************************************************/
void UART1_SendData(unsigned char *SendBuf, unsigned int len)
{
         
    uint32 i;
  
    //VICIntEnClear  |= (1 << VIC_UART0);                        // 保护字符接收数组不被其它中断破坏
   
        for (i = 0; i < len; i++)                                // 使用发送FIFO发送数据
        {
                U0THR     = SendBuf;
        }
        while ((U0LSR & 0x40) == 0);                        // 等待数据发送完毕

//        VICIntEnable  |= (1 << VIC_UART0);               

   

}

int  main  (void)  
{

        CPU_INT08U  err;
   
    NewVectorTableInit();

    BSP_IntDisAll();                                          /* Disable all interrupts until we are ready to accept them */

    OSInit();                                                   /* Initialize "uC/OS-II, The Real-Time Kernel"              */

        OSTaskCreate(DoTask1,(void*)0,&Task1Stack[1023],1);
    OSStart();                                                  /* Start multitasking (i.e. give control to uC/OS-II)       */
         return 0;

}

void DoTask1(void *argv)
{
   /*        int rxlen,txlen;
    char Rx[256];
    char Tx[256]="abcdefghijklmnopqrstyvwxyz";
        //test
           */
        INT8U err;
        // unsigned char         a=0x55 ;
        argv=argv;
         
   ///////////////////test uart0/////////////////
OSView_uart1InitTarget(9600)   ;


        
        while (1)
        {
                if (Rcv_New == 1)
                {
               
                        Rcv_New = 0;
                        UART1_SendData(Rcv_Buf, Snd_N);
                }
        }        
     
   

}

最新回复

用邮箱时,如果邮箱为空时,是不会被发送的,要进行处理,可以虚拟一个数在邮箱里,也可以直接读标志位.因为我这里要同步处理,所以选择中断处理后,判断标志位来处理.  详情 回复 发表于 2010-5-13 08:26
点赞 关注
 

回复
举报

65

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
OK 了
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
恭喜楼主;

分享下 经验啊,谢谢!谢谢! 呵呵!
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
用邮箱时,如果邮箱为空时,是不会被发送的,要进行处理,可以虚拟一个数在邮箱里,也可以直接读标志位.因为我这里要同步处理,所以选择中断处理后,判断标志位来处理.
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表