全部博文(36)
分类: 嵌入式
2012-09-04 11:21:36
本节做的是一个串口的实验,这是一个非常重要的实验。因为我们在调试、下载的时候会用到这个串口,有时我们控制某些模块如CDMA,GPRS等大部分都是用的串口。所以弄清楚它的原理非常重要。
2440上面有三个串口,我们mini2440板上就把串口0接出来了。也就是串口0与我们的pc机RS232接口可以进行连接调试。这里就涉及到了电平的问题,凡是用过这个串口与pc进行调试的都知道这里需要进行电平转换。因为我们的串口是TTL电平,而pc上的是负逻辑电平,所以我们一般通过一个MAX232进行转换。转换的时候,怎么连接电路了。一般情况下,只需要三根线就可以了,Tx,Rx,GND.但是我们这里需要用到串口的FIFO等功能的话,mini2440还接了两根流控制的信号线:RSRTS0,RSCTS0。在mini2440上面,把三个串口的TTL电平的管脚接口也引出来了,这样我们可以通过自己制作的线,来进行调试。
上面就是串口连接图,可以很清楚的看出来串口0被连接出来了。我们可以通过串口调试助手进行相关的操作。当我们从norflash启动时,它进入vivi下载模式,里面显示的各个下载项也就是通过串口0发送出去的。然后我们可以通过串口调试助手进行查看,这样就能够清楚的了解到从上到下,从外到内的种种,这也是学习应该要的态度。
2440串口发送接收的方框图一张。
从上面图中,我们可以看到时钟源有三个,一般我们选择PCLK,发送数据时,系统总线将数据传入到发送缓冲中(FIFO模式的话,64个字节都是FIFO,非FIFO模式的话,则是一个字节。)然后传入发送移位寄存器,然后通过TXDn一位一位的移出去。接受的时候是一个相反的过程,RXDn将接受的数据存取移位寄存器,然后到发送缓冲中。注意图中的波特率发生器,这里需要设置一个值UBRDIVn来设置波特率。用到其他几个寄存器ULCON0,UCON0,UFCON0,UMCON0,UTRSTAT0,URXH0,UTXH0,这些寄存器看一下用户手册就比较明白了。
我们这次的是简单的一个通过查询方式来进行数据的接收和发送的一个实验。没有用到FIFO的方式。
/*************************************************
Function name: 这是基础实验的一个模版
Parameter : 无
Description : 做基础实验,直接调用该模板即可
Return : 无
Argument : 无
Autor & date : Daniel
**************************************************/
#define GLOBAL_CLK 1
#include
#include
#include "def.h"
#include "option.h"
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "mmu.h"
#include "profile.h"
#include "memtest.h"
#define LED1 (1<<5)
#define LED2 (1<<6)
#define LED3 (1<<7)
#define LED4 (1<<8)
#define KEY1 (1<<0)
#define KEY2 (1<<3)
#define KEY3 (1<<5)
#define KEY4 (1<<6)
#define Beep (1<<0)
/*************************************************
Function name: delay
Parameter : times
Description : 延时函数
Return : void
Argument : void
Autor & date :
**************************************************/
void delay(int times)
{
int i;
for(;times>0;times--)
for(i=0;i<4000;i++);
}
/**************************************************
Function name: uart_send
Parameter : char *c
Description : 串口发送函数
Return : void
Argument : c
Autor & date :
************************************************/
void uart_send(char *c)
{
for(;*c != 0;c++)
{
while(!(rUTRSTAT0&(1 << 2)));
rUTXH0 = *c;
}
}
/**************************************************
Function name: uart_receive
Parameter : void
Description : 串口接收函数
Return : unsigned char
Argument : void
Autor & date :
************************************************/
unsigned char uart_receive(void)
{
while(!(rUTRSTAT0&(1)));
return rURXH0;
}
void Main(void)
{
char *Tx_String = "fuck you,Japanese girl !";
char Test_String[2] ="b";
Set_Clk();
MMU_Init();
rGPHCON |= 0xa << 4;//设置相应端口为tx rx
rULCON0 = 0x03;//八位数据为,一个停止位,无校验位,正常操作模式
rUCON0 = 0x05;//发送和接受都使用中断或查询的方式
rUBRDIV0 = 26;//波特率分配器,设为115200
uart_send(Tx_String);
uart_send(Test_String);
while(1)//在循环内不断接收,并将接收到的数据发送出去
{
Test_String[0] = uart_receive();
uart_send(Test_String);
}
}
下一篇将会整一下中断发送和接受,还有就是FIFO这个东西。