12.2440串口驱动程序设计

发布者:Serendipitous33最新更新时间:2024-11-04 来源: cnblogs关键字:串口  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

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

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)方法修改为:

主函数修改为:

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


关键字:串口  驱动程序 引用地址:12.2440串口驱动程序设计

上一篇:13.Smart210串口驱动基于12的补充
下一篇:11.串口基本知识

推荐阅读最新更新时间:2026-03-24 15:18

S3C2440 nor_flash驱动程序
和前面的nandflash差不多,我们此处来重新学习一下norflash驱动。 1 /* 2 * 参考 driversmtdmapsPhysmap.c 3 */ 4 5 #include linux/module.h 6 #include linux/types.h 7 #include linux/kernel.h 8 #include linux/init.h 9 #include linux/slab.h 10 #include linux/device.h 11 #include linux/platform_device.h 12 #include linu
[单片机]
mini2440 ADC可调电阻驱动程序开发源代码(杂项设备驱动框架)
/*********************************************************/ /****s3c2440 ADC可调电阻驱动程序开发源代码(杂项设备驱动框架)****/ /********************************************************/ #include #include #include #define DEVICE_NAME adc_driver /*设备名称*/ static void __iomem *adc_base; /*定义了一个用来保存经过虚拟映射后的内存地址 */ static struct clk *adc_cl
[单片机]
linux-2.6.32在mini2440开发板上移植 按键驱动程序移植
编者:按键驱动程序涉及到linux中断程序的编写。 1、按键原理图。 2、驱动程序的编写移植。 在/linux-2.6.32.2/drivers/char/目录下创建一个新的驱动程序文件mini2440_buttons.c,内容及详细注释如下: span style= font-size: 18px; #include linux/module.h #include linux/kernel.h #include linux/fs.h #include linux/init.h #include linux/delay.h #include linux/poll.h #include linux/irq.h #include
[单片机]
linux-2.6.32在mini<font color='red'>2440</font>开发板上移植 按键<font color='red'>驱动程序</font>移植
mini2440简单的lcd显示驱动程序
这几天学习了一下lcd显示原理和Linux内核的framebuffer类型的设备驱动框架,值得学习的是内核中对驱动的分层概念,fbmem.c中实现了对framebuffer的共性的抽象,lcd驱动其实就是设置lcd控制器的工作方式,然后对显存进行读写,对显存的操作其实不管什么lcd,都是差不多的,所以这些相似的操作都抽取到了内核的fbmem.c里面,实现驱动的时候只需要填充fb_info结构体,把lcd硬件相关的参数填入该结构体中,然后用register_framebuffer函数进行注册,该函数会根据自动生成设备节点,就是/dev/fb0, /dev/fb1等等,对于显存的读写函数就用内核已经实现的默认的cfb_fillrect
[单片机]
mini<font color='red'>2440</font>简单的lcd显示<font color='red'>驱动程序</font>
mini2440 简单按键中断模式驱动程序
Makefile KERN_DIR = /home/grh/kernel_source_code/linux-2.6.32.2 all : make -C $(KERN_DIR) M=`pwd` modules arm-linux-gcc key_interrupt_app.c -o key_interrupt_app clean : make -C $(KERN_DIR) M=`pwd` modules clean rm -rf modules.order obj-m += key_interrupt.o copy : cp key_interrupt.ko key_interrupt_app
[单片机]
mini<font color='red'>2440</font> 简单按键中断模式<font color='red'>驱动程序</font>
mini2440LED驱动程序开发
/*********************************************************实验源代码 ********************************************************************/ 一、源代码: /***********************mini2440_leds.c*********************** *******************************************************************/ #include linux/miscdevice.h #include
[单片机]
07-S3C2440驱动学习(一)嵌入式linux字符设备驱动-查询+中断+引入poll机制的按键驱动程序
一、查询方式的按键驱动程序 查询方式的按键驱动程序,与LED驱动程序类似,我们来复习一下上节的写好的字符设备驱动程序框架,改写出查询方式的按键驱动程序。 (1)按键驱动程序如下: Open中配置引脚 Read中返回引脚状态 入口函数:地址映射 虚拟地址 #include linux/module.h #include linux/kernel.h #include linux/fs.h #include linux/init.h #include linux/delay.h #include asm/uaccess.h #include asm/irq.h #include asm/io.h #
[单片机]
07-S3C<font color='red'>2440</font>驱动学习(一)嵌入式linux字符设备驱动-查询+中断+引入poll机制的按键<font color='red'>驱动程序</font>
S3C2440 DMA驱动程序编写及测试(三十二)
DMA(Direct Memory Access) 即直接存储访问,DMA传输方式无需CPU直接控制传输,通过硬件为RAM、I/O设备开辟一条直接传输数据的通路,能使CPU的效率大为提高。 学了这么多驱动,不难退出DMA的编写套路: 1)注册DMA中断,分配缓冲区 2)注册字符设备,并提供文件操作集合fops - 2.1)file_operations里设置DMA硬件相关操作,来启动DMA 由于我们是用字符设备的测试方式测试的,而本例子只是用两个地址之间的拷贝来演示DMA的作用,所以采用字符设备方式编写 1、驱动编写之前,先来讲如何分配释放缓冲区、DMA相关寄存器、使用DMA中断 1.1 在linux中,分配释
[单片机]
S3C<font color='red'>2440</font> DMA<font color='red'>驱动程序</font>编写及测试(三十二)
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved