Chinaunix首页 | 论坛 | 博客
  • 博客访问: 161181
  • 博文数量: 36
  • 博客积分: 830
  • 博客等级: 准尉
  • 技术积分: 409
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-10 16:23
文章分类
文章存档

2013年(1)

2012年(35)

分类: 嵌入式

2012-09-04 11:21:36

    本节做的是一个串口的实验,这是一个非常重要的实验。因为我们在调试、下载的时候会用到这个串口,有时我们控制某些模块如CDMAGPRS等大部分都是用的串口。所以弄清楚它的原理非常重要。

2440上面有三个串口,我们mini2440板上就把串口0接出来了。也就是串口0与我们的pcRS232接口可以进行连接调试。这里就涉及到了电平的问题,凡是用过这个串口与pc进行调试的都知道这里需要进行电平转换。因为我们的串口是TTL电平,而pc上的是负逻辑电平,所以我们一般通过一个MAX232进行转换。转换的时候,怎么连接电路了。一般情况下,只需要三根线就可以了,Tx,Rx,GND.但是我们这里需要用到串口的FIFO等功能的话,mini2440还接了两根流控制的信号线:RSRTS0RSCTS0。在mini2440上面,把三个串口的TTL电平的管脚接口也引出来了,这样我们可以通过自己制作的线,来进行调试。

 

上面就是串口连接图,可以很清楚的看出来串口0被连接出来了。我们可以通过串口调试助手进行相关的操作。当我们从norflash启动时,它进入vivi下载模式,里面显示的各个下载项也就是通过串口0发送出去的。然后我们可以通过串口调试助手进行查看,这样就能够清楚的了解到从上到下,从外到内的种种,这也是学习应该要的态度。

2440串口发送接收的方框图一张。

 

从上面图中,我们可以看到时钟源有三个,一般我们选择PCLK,发送数据时,系统总线将数据传入到发送缓冲中(FIFO模式的话,64个字节都是FIFO,非FIFO模式的话,则是一个字节。)然后传入发送移位寄存器,然后通过TXDn一位一位的移出去。接受的时候是一个相反的过程,RXDn将接受的数据存取移位寄存器,然后到发送缓冲中。注意图中的波特率发生器,这里需要设置一个值UBRDIVn来设置波特率。用到其他几个寄存器ULCON0UCON0UFCON0UMCON0UTRSTAT0URXH0UTXH0,这些寄存器看一下用户手册就比较明白了。

我们这次的是简单的一个通过查询方式来进行数据的接收和发送的一个实验。没有用到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这个东西。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

阅读(1404) | 评论(0) | 转发(0) |
0

上一篇:定时器PWM

下一篇:linux中的IIC设备驱动

给主人留下些什么吧!~~