📄 uart.c
字号:
#include <p30f4011.h>
//**************************************************************************//
#define XTFREQ 8000000 //On-board Crystal frequency
#define PLLMODE 16 //On-chip PLL setting
#define Fcy XTFREQ*PLLMODE/4 //Fcy = 32MHz
#define BAUDRATE 19200
#define BRGVAL ((Fcy/BAUDRATE)/16)-1
#define RECV_FIFO_SIZE 96
volatile unsigned char recv_fifo[RECV_FIFO_SIZE];
volatile unsigned char *recv_fifo_head;
volatile unsigned char *recv_fifo_tail;
volatile unsigned char recv_fifo_byte_count;
volatile int sFTXREG,sFRXREG;
//**************************************************************************//
void __attribute__ ((interrupt, no_auto_psv)) _U2RXInterrupt(void) {
unsigned char temp;
if(recv_fifo_byte_count < RECV_FIFO_SIZE)
{
temp = U2RXREG;
*recv_fifo_head = temp;
recv_fifo_head++;
if(recv_fifo_head == (recv_fifo + RECV_FIFO_SIZE))
recv_fifo_head = recv_fifo;
recv_fifo_byte_count++;
IFS1bits.U2RXIF = 0;
}
else{
IEC1bits.U2RXIE = 0;
IFS1bits.U2RXIF = 0;
}
}
//**************************************************************************//
unsigned char uart2_getc(void)
{
unsigned char value;
value = 0;
if(recv_fifo_byte_count > 0)
{
value = *recv_fifo_tail++;
if(recv_fifo_tail == (recv_fifo + RECV_FIFO_SIZE))
recv_fifo_tail = recv_fifo;
recv_fifo_byte_count--;
IEC1bits.U2RXIE = 1;
}
return(value);
}
//**************************************************************************//
void __attribute__ ((interrupt, no_auto_psv)) _U2TXInterrupt(void) {
sFTXREG=0;
IFS1bits.U2TXIF = 0;
while(U2STAbits.UTXBF)
;
}
//**************************************************************************//
void InitUART2(){
TRISF = 0xC;
/*** configure U2MODE ***/
//U2MODEbits.UARTEN = 1; // Bit15 TX, RX DISABLED, ENABLE at end of func
//U2MODEbits.notimplemented; // Bit14 Unimplemented: Read as
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -