12.2440串口驱动程序设计

12.2440串口驱动程序设计

    串口的功能就是接受数据跟发送数据的,在上一节已经了解串口的引脚信号。但是数据的收发需要一定的条件,也就是串口的初始化。所以所以今天的内容就会被划分为三个部分:

1.串口的初始化:

    

创建一个uart.c来对串口进行处理,然后把它加入到Makefile工程文件里:

接着就是串口处理程序的实现了。

程序的刚开始是对串口进行初始化,初始化的步骤:

  1. 配置引脚功能
  2. 设置数据模式
  3. 设置工作模式
  4. 设置波特率。

1)配置引脚功能:

在2440里的串口底板原理图:

上面的11 TXD0和12 RXD0就是串口的发送和接受引脚,对应的编号里的3,2口,5口是接地的。接下来在核心板原理图里找对应的共用引脚。在核心板原理图里搜索TXD0:

从核心板原理图知道,RXD0对应核心板原理图的GPH3引脚,TXD0对应核心板原理图的GPH2引脚。所以要实现串口的发送和接收,就是在初始化的时候,配置好这核心板两个引脚的功能为:发送和接收即可。

接下来就是在2440芯片手册里找到GPH的配置寄存器。

首先是定义GPHCON控制寄存器的地址出来:

我们要配置的是GPH2和GPH3这两个引脚:

从上面的信息知道,只要把GPHCON里的[5:4]配置为10,GPH2对应的引脚就是TXD[0]发送功能,只要把GPHCON里的[7:6]配置为10,GPH3对应的引脚就是RXD[0]接收功能。

下面就是往[4:7]四位写入1010的实现代码:0xf左移四位,取反,就是往[4:7]位写入全0,然后GPHCON的值与[4:7]四位全0的相与,就是置GPHCON的[4:7]四位为全0。

接着要往GPHCON写入0b1010=0xa,先把0xa左移四位,与要写入的位对应,最后,0xa或上GPHCON,就是把0xa写入到GPHCON的[4:7]位,完成寄存器的设置。

2.设置数据格式的寄存器:

上面知道[1:0]两位是设置字长的,[2]位是设置数据的停止位的,[5:3]位是设置校验位的方式的。这是我们设置的串口是8位数据位,所以[1:0]=11。1位停止位,所以[2]=0。没有校验位,所以[5:3]=0xx,没有校验位。[6:7]位保持默认。所以要往ULCON0寄存器写入的值是:0b11。实现如下:

2)设置串口的工作模式指的是串口收发的工作模式

串口可以工作在DMA模式,中断模式和轮询模式。一般,我们会让操作系统工作在DMA和中断模式,但是如果仅仅是在uboot中设置串口驱动的时候,会让它工作在轮询的这种简单的方式。

下面就是就是设置工作模式:

在上面寄存器的下面,有串口的控制寄存器:

UCON0寄存器里的[0:3]位就是控制串口收发的工作模式的:

从上面知道,在接受模式里,只要把串口控制寄存器的[0:1]位设置为01,就是工作在中断或者轮询模式。在发送模式,只要把串口控制寄存器的[2:3]位设置为01,就是工作在中断或者轮询模式。所以该寄存器UCON0的是应该是设置为0b0101=0x5。代码实现:

3)设置波特率:

定义该寄存器的值:

从前面的时钟知道MPLL的大小是405MHZ,分频因子是1:4:8,则PCLK的值是50000000HZ的。然后波特率是115200。定义和求解波特率:

上面的波特率,就算出来了。这样串口初始化结束。

 

2.数据发送:

在通过串口发送数据,我们不用去管串口的停止位和校验位等,我们只要将数据提交给串口去发送,串口会自动加上这些信息。

串口数据发送状态的寄存器:

在该寄存器的[1]位,是判断buffer是否为空的,如果该位为0,就是表示buffer不为0,就是数据还没发送完成,需要继续发送。如果该位位1,就是表示buffer里为0,数据已经发送完成了。

持续发送的代码:

当UTRSTAT0的[2]位为1时,该循环才会结束。UTRSTAT0的[2]位为1由上面注释知道1 = Transmitter (transmit buffer & shifter register) empty,就是完成了数据传输,里面已经是空的了。如果UTRSTAT0的[2]位为0,该位为0表示Not empty,继续发送,循环不会结束。

 

上面的串口如果发送完一次数据,我们还得把数据送到串口,让它继续发送:

实现代码:

上面就是把数据不断的往串口发送,通过UTXH0寄存器。

3.数据接受:

接受到的数据存放在的缓冲寄存器:

可以看到UTRSTAT0寄存器的[0]位的值,如果为0,表示没有收掉数据,就继续等待。如果为1,则表示收到数据了。实现代码:

串口收到数据后会放在URXH0寄存器里。然后我们把它读出来就可以了。

 

下面是测试串口数据发送和接受实现:在主函数里加入测试代码:

加上上面的测试代码后,重新make编译,烧写到开发板,设置开发板从NandFlash启动,在串口的终端可以看到有换行,最后输出了一个大H。说明了上诉的操作代码没有问题,串口的操作成功了。

Uart.c

Main.c

在串口终端里,当我们选择选项之后,该选项的序号会被回显在串口里,这是在串口的接受里来实现的。

Uart.c里的unsigned char getc(void)方法修改为:

主函数修改为:

上面的代码就实现了,当在串口终端输入信息的时候,会在窗口显示着。

posted @ 2016-02-14 10:59  cestlavie  阅读(454)  评论(0编辑  收藏  举报