weiqi7777

基于S3C6410的ARM11学习(十七) 串口走起来

0
阅读(4304)

串口,可说是嵌入式开发中重要的开发工具了。通过串口,我们可以和开发板进行交互,同时也可以打印芯片内部的一些信息。

ARM11的串口使用也是比较简单的。当然首先需要配置一下。

clip_image002

以上是串口驱动开发的流程。首先对串口进行初始化,然后实现发送和接收。

clip_image004

以上是串口的结构图。对于接收和发送,都有一个64字节大小的FIFO。对于发送来说,如果使用FIFO的话,如果FIFO没有满,那么发送的数据首先发送到FIFO中,然后FIFO中的数据会自动的发送到发送移位寄存器中通过串口发送出去。接收也是一样的道理。

简单的使用就是不使用FIFO。数据直接发送到发送移位寄存器中发送。


下面就开始串口程序的设计了,

一、首先是对串口初始化。

1、设置管脚为串口模式

串口端口和普通IO口是共用的。这个就要看OK6410的原理图。

clip_image006clip_image008


从原理图中,接收是GPA0,发送时GPA1。所以第一步要先去配置管脚功能。

clip_image010

GPIO章节得到,对于GPA0-1,配置为0010的时候,是串口的功能。

所以,代码就是

clip_image012


2、设置串口工作模式

我们知道,串口是有几种模式的,数据位是几位,有没有奇偶校验位,停止位是几位。这个就通过ULCONx寄存器控制的。

clip_image014

我们使用的是uart0。配置的寄存器就是ULCON0

配置成8位数据模式,没有奇偶校验位,1位停止位,普通的串口模式。

代码就是

clip_image016


3、设置工作模式

串口是可以工作在三个模式下,一个是中断模式,第二个是DMA方式,第三个就是轮询方式。

这里,不使用DMA,也不使用中断,就配置为轮询模式。

这个配置是通过UCONx寄存器配置。同样,这个寄存器有4个,对应串口0-3。这里配置UCON0寄存器。

主要关心以下几位

clip_image018

clip_image020

第一个是选择串口的时钟源。选择PCLK

后面两个是配置串口的接收和发送模式,是工作在中断或者轮询,还是工作在DMA模式。配置为中断或者轮询。

代码就为:

clip_image022


4、波特率设置

波特率是串口中最重要的设置了,如果这个波特率设置得不对的话,那么就不能正常的接收和发送数据了。

S3C6410的波特率配置通过两个寄存器配置,一个配置整数,一个配置小数。

clip_image024

以上是配置串口波特率的公式。我们使用的是PCLK。使用的公式就是

clip_image025

当然这个除下来不一定能整除,就会有小数部分。所以就需要对小数处理。

num of 1’s in UDIVSLOTn/16 =小数部分。

得到num of 1’s in UDIVSLOTn值,在查上面的表格,得到真正配置小数寄存器的数据。

举例说明:

之前时钟,将PCLK配置成66M。波特率采用115200

clip_image027

得到整数的值是34,小数是0.8

clip_image029

查表,13对应0xDFDD

所以,整数的寄存器配置为34。小数的寄存器配置为0xDFDD

clip_image031

UBRDIVx对应串口x的波特率设置的整数部分。UDIVSLOTx对应串口x的波特率设置的小数部分。

代码就是:

clip_image033

以上,就是整个串口的初始化了。初始化后,我们就可以使用串口发送数据和接收数据了。

二、串口发送数据

这个就比较简单了,和51单片机一样,有一个寄存器用来保存发送的数据。当往这个寄存器写数据,硬件会自动的将该数据通过串口发送出去。

clip_image035

不过呢,在发送之前,是需要检查上一次数据是否发送结束。如果没有发送结束的话,就需要等待。这个也是通过一个状态寄存器来知道的。

clip_image037

从这个寄存器,就可以知道,发送数据是否完成以及是否接受到新数据。对于发送来说,就要检查第二位是否为0。为0,说明上一次数据是发送结束的。

代码就是:

clip_image038


三、串口接收

这个也是比较简单了,同样,有一个寄存器保存接收的数据,不过和51不一样的是,51的发送和接收都是同一个寄存器SBUF。但是S3C6410是有两个的。

clip_image040

同样,在读取数据之前,需要检查下,是否有数据接收,有数据接收,才读取数据。检测之前数据发送说过,检测状态寄存器的第0位。

代码就是

clip_image042

这个地方,在读取中加入了一些处理,为了对接收到的数据进行回显。每接收到一个数据,判断该数据是否是ox0d(换行符\n),0x0a\r)。如果是这两个数据的话,就发送0x0d0x0a。否则就将接收的数据发送出去。关于\n\r大家可以自行百度下。


剩下就是在main函数中,编写简单的测试代码即可。

clip_image044

先串口初始化,然后无限循环的读取串口接收的数据,判断在将数据回发。这样,就可以在串口助手中看到,发什么,就显示什么,因为芯片将发送的数据回发了回来。


对比STM32

STM32的串口驱动开发和S3C6410的驱动开发也差不多,先对串口进行初始化,然后在写串口发送和串口接收。原理都是一样。

以下配置和S3C6410的串口配置一样进行说明。8位数据位,没有奇偶校验位,1位停止位,波特率115200

clip_image046

来看看结构图,这似乎是要比S3C6410的串口模块要复杂些。不过基本的东西是一样的,有发送移位寄存器,接收移位寄存器。发送有个数据寄存器,接收有个数据寄存器,不过对于STM32来说,发送和接收的寄存器是同一个。即这个寄存器即可发送,也可接收。


S3C6410的串口流程一样。

一、串口初始化

1、管脚功能配置。

对于串口1,其使用的管脚是PA9PA10STM32的复用功能配置和S3C6410配置就不一样了。S3C6410GPIO配置中,有对GPIO的功能配置。但是STM32GPIO配置就没有。只能把GPIO配置成之前说的8种模式。

clip_image048

但是手册中,也说明了,对于复用功能,管脚配置的功能应该是什么。

clip_image050

使用全双工模式,发送配置为推挽复用输出。接收配置为浮空输入。

这里,就不说使用寄存器开发了,而是使用库函数开发了。

clip_image052

这个地方要注意的是,对于管脚的复用功能,要打开对应复用功能的时钟,这里是串口1的时钟。另外还要打开总的复用功能时钟,即AFIO时钟。

clip_image054

二、串口初始化

clip_image056

clip_image058

12位要设置为0。表示是8个数据位。10位要设置为0,禁止校验。同时也应该将13位给置1,表示串口使能。

3和位2也要置1,表示使能接收和发送。

其他位是和中断有关系的,这里没有用到中断,都设置为0。所以这个寄存器可以设置为0x200C


clip_image060

这个寄存器主要设置停止位的,将1312设置为00。表示1个停止位。但是默认为这个值就是0。所以这个寄存器不用设置。


最后就是设置波特率了。当然也是有公式计算的。和S3C6410一样,有整数部分和小数部分。这个就参考STM32中文参考手册的524也就好了。不过STM32为我们提供了一个表,有了这个表,我们就不用去计算了。

clip_image062

对于串口1,是挂在APB2总线上的,而APB2总线的时钟一般是配置为72M。对于19200,的波特率,72M下计算出来的值是234.735

对于整数就是234。对于小数,就是0.735*16=11.76,12。注意,这里得到小数后,不用再查表。

clip_image064

将计算出来的值,填写到该寄存器即可。可以看出,STM32的整数和小数合并成一个寄存器了。

以上操作,就对串口1进行初始化了。比较简单吧。就配置几个值就行了。

当然是用库开发的话,就更简单了。

clip_image066


三、串口发送

这个和S3C6410就一样了。检测上次数据是否发完,发完了就发下一个数据。检测是通过检测状态寄存器。

clip_image068

clip_image070

6和发送有关系,位5和接收有关系。

当然有个发送寄存器。不过对于STM32,接收和发送是使用的同一个寄存器,和51一样。

clip_image072

发送的代码就是

clip_image074

四、串口接收

接收的代码就是

clip_image076

测试的方法和S3C6410的一样,这里就不说了。


以上就是整个串口的开发。包括了S3C6410STM32。可见,开发都是差不多一样的,配置各种寄存器,让串口初始化,然后再对串口进行读写。

一般来说,对于串口的读,是通过中断来读的。这样,CPU就不用一直判断是否有数据接收而暂停,就可以去做其他很多事情。中断的配置也是比较容易了,可以参考前面的外部中断,对中断进行配置。


有了串口,以后调试,就不用再靠led了。直接通过串口打印即可了。

Baidu
map