历史上的今天
返回首页

历史上的今天

今天是:2025年02月09日(星期日)

正在发生

2021年02月09日 | 基于S3C6410的ARM11学习(十七) 串口走起来

2021-02-09 来源:eefocus

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


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)。如果是这两个数据的话,就发送0x0d和0x0a。否则就将接收的数据发送出去。关于n和r大家可以自行百度下。

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

clip_image044

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


对比STM32

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


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

       clip_image046

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


和S3C6410的串口流程一样。

一、串口初始化

1、  管脚功能配置。

对于串口1,其使用的管脚是PA9和PA10。STM32的复用功能配置和S3C6410配置就不一样了。S3C6410的GPIO配置中,有对GPIO的功能配置。但是STM32的GPIO配置就没有。只能把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

这个寄存器主要设置停止位的,将13:12设置为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的一样,这里就不说了。

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


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


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

推荐阅读

史海拾趣

Cypress Industries公司的发展小趣事

Cypress在半导体制造领域一直处于技术革新的前沿。公司不断引入新的工艺技术,从早期的0.8微米CMOS技术到后来的0.21微米工艺,不断推动产品性能的提升。这种对技术的持续投入和追求,使Cypress在行业内树立了良好的技术形象,并赢得了客户的广泛认可。

ENOCEAN公司的发展小趣事

为了进一步推动其技术在建筑行业的应用,EnOcean发起并建立了EnOcean联盟。该联盟由来自建筑行业的400多家公司组成,致力于推广基于EnOcean无线标准的免维护无线解决方案。通过与联盟成员的合作,EnOcean不断拓展其市场份额,并为智慧楼宇及能源管理提供更稳定的硬件解决方案。

DAVE Embedded Systems公司的发展小趣事

DAVE Embedded Systems公司于1998年在意大利创立,其初衷是提供嵌入式系统解决方案。在成立初期,公司只有几名工程师和有限的资金,但他们凭借对技术的热爱和对市场的敏锐洞察力,成功设计并销售出了第一款基于微处理器和Linux平台的嵌入式系统模块(SOM)。这款产品因其高性价比和出色的性能,很快赢得了市场的认可,为公司的发展奠定了基础。

灿科盟(Ckmtw)公司的发展小趣事

面对国内外市场变化及成本增长的压力,灿科盟在2012年决定在江西省九江市设立新的生产基地。这一基地主要负责产品的生产组装,有效降低了生产成本,提高了交货速度。同时,公司也加强了与当地供应商的合作,确保原材料的稳定供应。

ALD [Advanced Linear Devices]公司的发展小趣事

灿科盟电子实业有限公司成立于2003年8月,注册资金100万。公司创始人凭借在电子行业多年的积累,决定创立自有品牌“CKMTW”,专注于连接器产品的研发与生产。在初创阶段,公司面临着资金紧张、市场竞争激烈等挑战,但凭借坚定的信念和不断的技术创新,逐渐在市场中站稳脚跟。

德索五金(dosinconn)公司的发展小趣事

问答坊 | AI 解惑

PLC、DCS、FCS三大控制系统的特点(转贴)

FCS是由PLC发展而来的;而在另一些行业,FCS又是由DCS发展而来的,所以FCS与PLC及DCS之间有着千丝万缕的联系,又存在着本质的差异。本文试就PLC、DCS、FCS三大控制系统的特点和差异作一分析,指出它们之间的渊源及发展方向。    摘 要: ...…

查看全部问答>

【请教】superIO 的watchdog 问题

本人在做一个硬件项目的软件方面的东西,现在遇到一个问题,请求解决。 是一个主板连接一个MCU,由MCU控制内存的电压调节或超频从而测试内存的性能。 现在要在DOS下,使用MCU去超频。假如死机,利用superIO的watchdog功能,发出一个信号告诉MCU, ...…

查看全部问答>

易懂的单片机入门书

易懂的单片机入门书…

查看全部问答>

版主这个时序定时器要怎么配置才能实现

版主这个时序怎么定时器要怎么配置才能实现啊! 下载 (21.83 KB) 2010-3-1 14:41 …

查看全部问答>

关于用JLINK调试博创UP-TECH2410板子目标板自动重启的问题的解决方法

问题是这样的大概一个月前,我在IAR6.1上建了一个S3C2410的工程,我这边有两种板子,一块优龙FS2410板子,两块博创UP-TECH2410的板子,对应的也有两种调试器,优龙的使用的是DragonJtag,一端跟电脑的并口相连接,一端连接板子的JTAG接口,优龙的板 ...…

查看全部问答>

编写程序

我想用MSP430编写程序,怎样通过编程输出显示已知频率的幅度值啊…

查看全部问答>

开发板,仿真器,测试样机,串口服务器超低价.

XDS510    100元 KL05Z   开发板,全新.  50元 串口服务器,全新,带光盘.  50元 M动力  F28035开发板,加焊485芯片  100元. 测试样品  推挽正激加并网.  200元. ...…

查看全部问答>

如何利用MSP430对一个信号与定值比较

如何利用MSP430对一个4-20mA信号与给定值进行比较,然后驱动灯泡亮灭,并将信号给上位机。 是利用MSP430的比较器呢?还是如何操作?谁能给个思路?谢谢!!!!! \0\0\0eeworldpostqq…

查看全部问答>

大侠求助!FPGA1.2V对地短路

自己焊了个板子,本来运行好好的,突然程序配置不成功了,测量发现1.2V只要一上电就会短路,最后把1.2V电源芯片下掉也是这个问题,3.3V一接通,1.2V的引脚跟地就短路,是什么问题???按理说不上电时1.2 V对地电阻是120欧左右,3.3V对地是330欧左 ...…

查看全部问答>