写在前边的话:前段时间感冒了,现在终于好了,又可以研究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.只是简单实现,未作进一步处理,先看看效果吧:
}
}
4.接下来准备进一步晚上这个uart通信,然后用vc6.0做一个串口通信小软件,用来进行上下位机通信和监控;
用户1628221 2012-8-25 17:39
用户647327 2010-12-8 10:02