原创 S3C2440串口0接收中断(二)

2009-12-3 23:10 4620 6 8 分类: MCU/ 嵌入式

写在前边的话:前段时间感冒了,现在终于好了,又可以研究S3C2440了;


今天主要成果:


1.修改了uartdrv中断驱动,使能接收中断和接收超时中断,自定义协议暂时规定UART0接收超时来判断一帧数据接收完毕;


/*******************************************************************************
Name        : Uart0_Exception
Copyright   : songzi&jingjing
Description : UART0中断服务函数
Input       : none
Output      : None
Return      : SUCCESS/FAILURE
*******************************************************************************/
void Uart0_Exception(void)
{
    U32 dwLoop;
 static portBASE_TYPE xTaskWoken;


    /*先禁止UART接收*/
    rINTSUBMSK |= (1 << BITPOS_SUBINT_RXD0);
 
 /*初始化*/
 xTaskWoken = pdFALSE;


    /*判断是否接收到数据*/
 if(rSUBSRCPND&BIT_SUB_RXD0)
    {
  if((rUFSTAT0 & BITMSK_UFSTAT_RXFIFOCNT) == BITMSK_UFSTAT_RXFIFOCNT)
  {
            /*接收FIFO满*/
   for(; (rUFSTAT0 & BITMSK_UFSTAT_RXFIFOCNT) > 0;)
   {
                stuUart0Buf.bBuf[stuUart0Buf.dwBufSize++] = rURXH0;
   }


   stuUart0Buf.enState = BUF_BUSY;
  }
  else
  {
            /*接收超时*/
   for(; (rUFSTAT0 & BITMSK_UFSTAT_RXFIFOCNT) > 0;)
   {
                stuUart0Buf.bBuf[stuUart0Buf.dwBufSize++] = rURXH0;
   }


   /*接收结束,发送数据帧*/
   stuUart0Buf.enState = BUF_READY;


   /* Unblock the task by releasing the semaphore. */
      xTaskWoken = xSemaphoreGiveFromISR( xSemaphore, xTaskWoken );
  }
  
 }


    /*clear UART0 INT flag*/
 rSUBSRCPND = rSUBSRCPND | (1 << BITPOS_SUBINT_RXD0);
 rSRCPND = rSRCPND|( 1 << BITPOS_INT_UART0);


 /*再使能UART0接收中断*/
 rINTSUBMSK &= ~(1 << BITPOS_SUBINT_RXD0);
 rINTPND = rINTPND;


 /*强制中断内切换*/
 portEXIT_SWITCHING_ISR(pdTRUE);


 return;
}


2.起了一个串口通信任务,专门处理UART0接收数据帧;


/*****************************************************************************
Name        : vTaskUartComm()
Description : UartComm任务函数
Input       : None
Output      : None
******************************************************************************/
void vTaskUartComm(void *pdata)
{
    U32 i = 0;
 
    /*防止编译警告*/
   pdata = pdata;
 
 for(; ;)
 {
  /*See if we can obtain the semaphore. If the semaphore is not available
      wait 10 ticks to see if it becomes free. */
  if( xSemaphoreTake( xSemaphore, ( portTickType ) 10 ) == pdTRUE )
  {
            BspRs232Printf("\r\nvTaskUartComm: %08d time(s), size: %d\r\n", i++, stuUart0Buf.dwBufSize);
   BspRs232Printf("Receive string: \r\n%s\r\n", stuUart0Buf.bBuf);


   /*清缓冲区,使能下次接收*/
   stuUart0Buf.dwBufSize = 0;
   stuUart0Buf.enState   = BUF_EMPTY;
   memset(stuUart0Buf.bBuf, 0, sizeof(stuUart0Buf.bBuf));


            /*清缓冲区*/
   //memset(stuUart0Buf, 0, sizeof(stuUart0Buf));
   
   if(0x1 == (i&0x1))
   {
    //BspBeepOn();
    BspLedOn(0);
   }
   else
   {
       //BspBeepOff();
    BspLedOff(0);
   }
  } 


3.只是简单实现,未作进一步处理,先看看效果吧:
 }6ed780f4-897d-4f95-bb2e-beefa3b28ecb.jpg


}


4.接下来准备进一步晚上这个uart通信,然后用vc6.0做一个串口通信小软件,用来进行上下位机通信和监控;

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户1628221 2012-8-25 17:39

时间久了,这个临时测试的工程找不到了,其实宏定义是有一定意义的,例如:BITPOS_SUBINT_RXD0,是指subint寄存器中代表UART0 Receive中断标志位的bit偏移量;

用户647327 2010-12-8 10:02

楼主可以把这个串口中断的完整例子发一份吗,里面有些宏定义看不太懂啊,谢谢啦!! 邮箱:ylh_mail@163.com
相关推荐阅读
用户1628221 2013-05-19 22:00
嵌入式系统软件优化方法(转载)
  出处: http://www.cnblogs.com/ljf181275034/archive/2011/09/21/2184521.html 嵌入式系统由于受功耗、成本和体积等因...
用户1628221 2012-08-15 20:24
基于lwip的TCP客户端同时连接双服务器问题
问题背景: 最近项目使用到lwip,需要作为客户端的设备同时连接两个服务器,连接成功后与其交互数据。 问题提出: 程序开始运行时,首先连接服务器1,连接成功后等待500ms后连接服务器...
用户1628221 2011-04-23 18:22
程序死在Freertos的vListInsert函数内for循环处的解决方法
近来项目需要使用FreeRTOS和Lwip以及can, 开发平台:LM3S8962/9B96 os版本:FreeRTOS6.1.0 lwip版本使用1.3.2   现象:移植完毕后,程序运行一会,网络...
用户1628221 2011-01-17 22:14
关于移植根文件系统时([\u@\h \W]\# )的处理方法(转)
作者:曹忠明,华清远见嵌入式学院讲师。 我们经常用busybox生成根文件系统,可是根文件系统起来以后命令行提示符只有一个“#”号,没有像linux发行版那样是[user@hostname curre...
用户1628221 2010-04-04 00:08
基于LPC2388移植和测试ZLGSD和ZLGFS
这两天调试ZLGSD和ZLGFS,我用的是盈玉工作室的LPC2388,板子布线很好,盈玉LPC2388 board缺点:1.文档粗糙;2.软件就直接用MCB2300的软件;3.就是硬件SD卡设计比较继...
用户1628221 2010-03-22 22:52
LPC2388经验总结之FastGPIO
最近在使用LPC2388开发产品,连开发板上的LED灯都闪不起来,问题如下:#include "config.h" #define BEEP   (1 << 27) // P0.7控制蜂鸣...
我要评论
2
6
关闭 站长推荐上一条 /3 下一条