今天笔试题里面有一个关于UART驱动的伪代码实现,实在是没有仔细看过,直接拿来就用了
回来打开VDSP里面UART实现的源码分析了一下,学习学习
- /*******************************************************************
- * Function: PutChar
- * Description: Writes a character to the UART.
- *******************************************************************/
- int PutChar(const char cVal)
- {
- int nStatus = 0;
- unsigned int count = 0;
-
- do
- {
- if( (*pUART0LSR & UARTTHRE) )
- {
- *pUART0THR = cVal;
- nStatus = 1;
- break;
- }
-
- count++;
-
- } while( count < 0x100000 );
- return nStatus;
- }
*pUART0LSR & UARTTHRE表示uart0通道空闲可用 UART0_THR Empty
返回1
如果尝试0x100000次无法获得UART,就放弃返回0
- /*******************************************************************
- * Function: GetChar
- * Description: Reads a character from the UART.
- *******************************************************************/
- int GetChar(char *const cVal)
- {
- int nStatus = 0;
- unsigned int count = 0x0;
-
- do{
- if( 1 /*UARTDR == (*pUART0LSR & UARTDR)*/ )
- {
- *cVal = (char)*pUART0RBR;
- nStatus = 1;
- break;
- }
-
- /*count++;*/
-
- }while( count < 0x100000 );
- return nStatus;
- }
同样,getchar从寄存器*pUART0RBR中读取数据,这些都是在没有中断没有DMA的情况下使用UART的函数
如果要判断读取时是UARTDR位表示Data Ready
上层的调用程序会判断读取的是否为0,不为0则继续进行
- while(UARTflag)
- {
- if( 1 == GetChar( &Testputchar ) )
- {
- if( 0 != Testputchar&&Testputchar==TST_CHAR[i])
- {
- UARTflag=0;
- // DEBUG_STATEMENT( "\nUartGerChar" );
- // DEBUG_PRINT("\nTestputchar is %c ",Testputchar);
- OK_number++;
- }
- else if( 'z' == Testputchar )
- break;
- }
-
- }
上层会忽视取回来是0的字符,这样就可以等到有用数据并且保存在Testputchar里
阅读(1651) | 评论(0) | 转发(0) |