zoukankan      html  css  js  c++  java
  • 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)方法修改为:

    主函数修改为:

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

  • 相关阅读:
    构造 非构造 代码块
    Random 类生成随机数
    JAVA寄存器
    PyCharm配置远程python解释器和在本地修改服务器代码
    Java实现常见的排序算法
    推荐系统冷启动问题解决方案
    AVL树C代码
    AVL树->图解2
    AVL树->图解1
    二叉查找树(Binary Sort Tree)
  • 原文地址:https://www.cnblogs.com/FORFISH/p/5188818.html
Copyright © 2011-2022 走看看