📄 uart.c
字号:
#include "config.h"
#include "hc595.h"
extern OS_MEM *memUart0Partition;
extern OS_EVENT *uart0RcvMsgQueue;
extern OS_EVENT *uart0Mbox;
extern uint8 rxCount;
/***
***/
uint8 initUart0(uint32 baud, UARTMODE set)
{
uint32 bak;
/* 参数过滤 */
if( (0==baud)||(baud>115200) ) return(0);
if( (set.datab<5)||(set.datab>8) ) return(0);
if( (0==set.stopb)||(set.stopb>2) ) return(0);
if( set.parity>4 ) return(0);
/* 设置串口波特率 */
U0LCR = 0x80; // DLAB位置1
bak = (Fpclk>>4)/baud;
U0DLM = bak>>8;
U0DLL = bak&0xff;
/* 设置串口模式 */
bak = set.datab-5; // 设置字长度
if(2==set.stopb) bak |= 0x04; // 判断是否为2位停止位
if(0!=set.parity) {set.parity = set.parity-1; bak |= 0x08;}
bak |= set.parity<<4; // 设置奇偶校验
U0LCR = bak;
return(1);
}
void uart0SendBytes(uint8 *buffer)
{
INT8U i;
for(i=0; i<8; i++)
U0THR=*(buffer+i);
while( (U0LSR&0x20)==0 ); // 等待数据发送
}
void uart0SendByte(uint8 toSend)
{
U0THR=toSend;
while((U0LSR&0X40)==0);
}
void uart0SendMultiBytes(uint8 *buffer,uint8 length)
{
INT8U loop;
U0FCR=0X00;
for(loop=0;loop<length;loop++)
{
uart0SendByte(*(buffer+loop));
}
U0FCR=0X81;
}
/****************************************************************************
* 名称:IRQ_UART0()
* 功能:串口UART0接收中断。
****************************************************************************/
void Uart0_Exception(void)
{
INT8U i;
INT8U intSource;
static INT8U *queuePoint;
static INT8U *queuePointBack;
INT8U err;
INT8U counter=0;
OS_ENTER_CRITICAL(); //以第三种方式进行中断屏蔽
VICIntEnClr|=1<<INTINDEXUART0;
intSource=U0IIR&0X0F;
VICVectAddr = 0x00;
switch(intSource)
{
case 0x02://THRE 中断
{
break;
}
case 0x04: /***RDA FIF0 filled 因为设置的是8字节所以***/
{
queuePoint=OSMemGet(memUart0Partition,&err);
queuePointBack=queuePoint;
for(i=0;i<8;i++)
{
*queuePoint++=U0RBR;
}
//OSMboxPost(uart0Mbox,msg);
OSQPost(uart0RcvMsgQueue,(void *)queuePointBack);
//U0IER=0X00;
break;
}
case 0x0c: /***CTI***/
{
queuePoint=OSMemGet(memUart0Partition,&err);
queuePointBack=queuePoint;
queuePoint++;
while(U0LSR&0X01) //FIFO中存在有效数据
{
*queuePoint++=U0RBR;
counter++;
}
//OSMboxPost(uart0Mbox,msg);
*(queuePoint-counter)=counter;
OSQPost(uart0RcvMsgQueue,(void *)queuePointBack);
//U0IER=0X00;
break;
}
case 0X06://RX线状态/错误;系统应该读取UOLSR以复位中断
{
intSource=U0IIR;
intSource=U0LSR;
break;
}
default:break;
}
VICIntEnable|=1<<INTINDEXUART0;
OS_EXIT_CRITICAL();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -