⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uartctrl.c

📁 一个串口的完整FPGA工程
💻 C
字号:

#include "stdinc.h"
#include "fpgainc.h"
#include "uartctrl.h"

void uartInit (void)
{
	X_UCSRB = 0;
	
	X_UBRRL = 0x03;
	X_UBRRH = 0x00;
	
	X_UCSRC = (1<<UCSZ01) | (1<<UCSZ00);
	
//    X_UCSRC |= (1<<UPM01);
	X_UCSRB	= (1<<RXEN0) | (1<<TXEN0);
    
    X_UCSRB |= (1<<RXCIE0);
    X_UCSRB |= (1<<TXCIE0);
}


void uartPrint (char *pStr)
{
	char		c;
	
	X_UCSRA |= (1<<TXC0);
	
	while ( (c=*pStr++) != 0 ) {
	
		X_UDR = c;
		
		while ( (X_UCSRA & (1<<TXC0)) == 0);
		X_UCSRA |= (1<<TXC0);
	}
}

void uartSendChar (char  c)
{    
    while ( (X_UCSRA & (1<<UDRE0)) == 0); 
    X_UCSRA |= (1<<TXC0);
    X_UDR = c;
}

unsigned char   __GucUSCRA;
char uartGetChar (void)
{
	char		c;
	
	while ( (X_UCSRA & (1<<RXC0)) == 0 );
	__GucUSCRA = X_UCSRA;
    
    if (__GucUSCRA & 0x1C) {
        __GucUSCRA = 0;
    }
	c = X_UDR;
	
	return c;
}

unsigned char __GucTxDatBuf = 0;
BOOL __GbTxBufFull = FALSE;
void uartSendCharNoblock (char  c,  BOOL  bNewDat)
{
    if (bNewDat) {
        if (__GbTxBufFull) {
            __GucTxDatBuf = c;
            __GbTxBufFull = TRUE;
        } else {
            X_UDR = c;
        }
    } else {
        if (__GbTxBufFull) { 
            X_UDR = __GucTxDatBuf;
            __GbTxBufFull = FALSE;
        }
    }
}

#pragma vector=INT4_vect
__interrupt void int4_isr(void)
{
    unsigned char   ucUCSRB;
    char            c;
    
    ucUCSRB = X_UCSRB;
    
    if (ucUCSRB & (1 << RXCIE0)) {
        
        if (X_UCSRA & (1 << RXC0)) {
            c = X_UDR;
            
            uartSendCharNoblock(c, 1);
        }
    }
   
    if (ucUCSRB & (1 << TXCIE0)) {
        if (X_UCSRA & (1 << TXC0)) {
            uartSendCharNoblock (0, 0);
            
            X_UCSRA |= (1<<TXC0);
        }
    }
    
    if (ucUCSRB & (1 << UDRIE0)) {
        if (X_UCSRA & (1 << UDRE0)) {
            
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -