M2440有三个串口,USRT0,UART1,UART3。
对串口的操作有三种:串口初始化,串口接收,串口发送
1 串口初始化
1)串口初始化函数
void Uart_Init(int pclk,int baud) // 此段为UART设置 可略过不看
{
int i; //定义一个参数
if(pclk == 0) //假定pclk的值为0
pclk = PCLK;
rUFCON0 = 0x0; //UART channel 0 FIFO control register, FIFO disable rUFCON1 = 0x0; //UART channel 1 FIFO control register, FIFO disable rUFCON2 = 0x0; //UART ch
annel 2 FIFO control register, FIFO disable rUMCON0 = 0x0; //UART chaneel 0 MODEM control register, AFC disable rUMCON1 = 0x0; //UART chaneel 1 MODEM control register, AFC disable //UART0
rULCON0 = 0x3; //Line control register : Normal,No parity,1 stop,8 bits //正常模式,无校验位,每帧一个停止位,8位数据
// [10] [9] [8] [7] [6] [5] [4] [3:2] [1:0]
// Clock Sel, Tx Int, Rx Int, Rx Time Out, Rx err, Loop-back, Send break, Transmit Mode, Receive Mode
// 0 1 0 , 0 1 0 0 , 01 01
// PCLK Level Pulse Disable Generate Normal Normal Interrupt or Polling
//PCLK时钟 发送/接受时分别用电平/脉冲中断方式 接收超时中断关 接收出错时触发中断 不设置回环 发送中断 发送和接收为中断或者轮询模式
rUCON0 = 0x245; // Control register
rUBRDIV0=( (int)(pclk/16./baud+0.5) -1 ); //Baud rate divisior register 0 //波特率设置 //UART1
rULCON1 = 0x3; //设置UART0无奇偶校验,一位停止位,8位数据
rUCON1 = 0x245; //PCLK为时钟源,接收和发送数据为中断方式
rUBRDIV1=( (int)(pclk/16./baud+0.5) -1 );
//UART2
rULCON2 = 0x3;
rUCON2 = 0x245;
rUBRDIV2=( (int)(pclk/16./baud+0.5) -1 );
for(i=0;i<100;i++);
}
l 串口时钟的设置
pclk = PCLK;使用PCLK作为串口的时钟。 l 寄存器进行了设置 主要是对三种寄存器进行了设置 rUFCONn (n=0,1,2) —— 串口FIFO控制寄存器 rUMCONn (n=0,1)——串口调制控制寄存器 rULCONn (n=0,1,2)——串口线性控制寄存器 rUCONn(n=0,1,2)——串口控制寄存器 rUBRDIVn(n=0,1,2)——串口Tx,Rx收发速率的设定
2)串口的选择
void Uart_Select(int ch)
{
whichUart = ch;
}
2 串口发送 串口发送数据通过判断rUTRSTATn (n=0,1,2)的第2位是不是为1来判断发送缓存是否为空。
1)
串口发送字节
void Uart_SendByte(int data)
{
if(whichUart==0) //选择通道0
{
if(data=='\n') //遇到结束符
{
while(!(rUTRSTAT0 & 0x2)); //直到发送缓存区为空 // Delay(1); //because th
e slow response of hyper_terminal WrUTXH0('\r'); //向发送缓存写入转义字符 } while(!(rUTRSTAT0 & 0x2)); //等发送完上一个数据 //
Delay(1); //because the slow response of hyper_terminal
WrUTXH0(data); //写入下一个数据到发送缓存 }
else if(whichUart==1) //选择通道1
{
if(data=='\n') //遇到结束符
{
while(!(rUTRSTAT1 & 0x2)); //直到发送缓存区为空 //Delay(1); //because the slow response of hyper_terminal rUTXH1 = '\r'; //向发送缓存写入转义字符
}
while(!(rUTRSTAT1 & 0x2)); //等发送完上一个数据 //Delay(1);
rUTXH1 = data; //写入下一个数据到发送缓存 } else if(whichUart==2) //选择通道2
{ isalpha 函数
if(data=='\n') //遇到结束符
{
while(!(rUTRSTAT2 & 0x2)); //直到发送缓存区为空 //Delay(1); //because the slow response of hyper_terminal
rUTXH2 = '\r'; //向发送缓存写入转义字符
}
while(!(rUTRSTAT2 & 0x2)); //等发送完上一个数据 //Delay(1);
rUTXH2 = data; //写入下一个数据到发送缓存
}
}
首先是串口通道的选择;然后判断THR是否为空,直到等到发送缓存为空,退出while循环;再要发送的字节data放到发送缓存中。如果发送的数据是回车的话,直接发送转义字符/r,当然也要等到THR为空才可以发送。
2)
串口发送字符串
void Uart_SendString(char *pt)
{
while(*pt) //判断是否为空指针
Uart_SendByte(*pt++); //发送数据,指针指向下一个数据
}
把字符串看作是字符数组,字符指针*pt来指代字符数组的首地址,读取指针指向的字符,这样就可以把发送的的字符串逐个进行字节发送了。
2 串口接收 串口接收通过判断rUTRSTATn (n=0,1,2)的第1位是不是为1来判断发送缓存是否为空。
1)串口等待接收状态
void Uart_TxEmpty(int ch)
{
if(ch==0)
while(!(rUTRSTAT0 & 0x4)); //等到发送移位寄存器空
else if(ch==1)
while(!(rUTRSTAT1 & 0x4)); //等到发送移位寄存器空
else if(ch==2)
while(!(rUTRSTAT2 & 0x4)); //等到发送移位寄存器空
}
寄存器rUTRSTATn & 0x4 (n=0,1,2)来判断发送移位寄存器是不是为空
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论