1.原理分析
UART(Universal Asynchronous Receiver/Transmitter),也叫做通用异步收发传输器(异步全双工收发)。一般UART可以用来打印调试信息,也可以外接模块。
由于是异步的方式,它们没有一个可以共同参照的时钟,所以收发双方要约定好发送数据的速率(也就是波特率),如果没有约定波特率的话就会发生这种情况:ARM发送了持续1s高电平,PC端接收到之后由于没有约定好收发数据的速率,那么PC端不知道这段高电平代表了几个逻辑’1’,如果是0.5s一个数据,那它就是2个’1’,如果是1s一个数据,那它就是1个’1’。
有了波特率,PC端能准确的知道自己接收的是几个’1’ 几个’0’,但这样还是不够的。哪里是开始,哪里是结束,数据是哪几位等等,这些都是需要我们人为的给每个bit定义独特的意义,这就是数据格式。
一般情况下,我们都将串口波特率设置为115200,数据位为8位,没有校验位,停止位为1位。简要表达就是115200,8n1。下面我们将用图示的方式,来解析UART上一帧数据是怎么发送的。
在没有数据传输的时候,内部上拉会让传输线维持在高电平,当发送端需要发送数据时,它会将电平拉低持续1bit时间,告诉接收端"我要开始传数据了",接下来双方便开始按照约定的速率收发数据,直到发送端将电平重新拉至高电平,表示结束。
说完了收发逻辑,下面来看在2440中UART部分的整体结构。
这个结构图中,我们注意到波特率生成部分,它的时钟来源有3个,PCLK、FCLK、UEXTCLK 这些是可选的。并且接受和发送都有64字节的缓存区,这个也是可以配置的。当然了,CPU怎么知道发送完成和接收完成?通常就是两种方式,一种就是CPU轮询了,另一种就是靠中断了。
整体有了大致的印象,接下来我们就可以开始对各个部分进行配置了。
引脚配置
UART所用的TxD和RxD引脚都是复用的,所以需要我们设置引脚功能。
通过查阅芯片原理图或者是直接看芯片手册中IO对应章节中的表项,我们可以得到RXD0和TXD0所在的引脚是GPH3和GPH2
通过配置GPHCON(0x56000070)中GPH3和GPH2,将它们都设置为0b10来使能RXD0和TXD0
之前也有说过,在没有数据传输时,数据线要由内部上拉维持高电平,所以我们还要使能内部上拉,通过配置GPHUP(0x56000078)中对应的第2位和第3位为0。
波特率和数据格式配置
通过配置UBRDIVn这个参数,我们就能获得自己想要的波特率。首先假设UART的时钟来源是PCLK(50M),那么我们想要配置波特率为115200,那么计算得到的UBRDIVn的值如下所示。
首先我们需要通过配置UCON0(0x50000004),来选择UART的时钟来源为PCLK,并且设置传输接收模式为中断/查询模式。这个寄存器还能配置很多功能,文档中描述很详细,当有实际需求的时候查询文档进行相关配置即可。
之后我们将UBRDIV0(0x50000028)设置为之前计算得到的值26,来配置波特率。
最后我们设置ULCON0寄存器,来设置数据格式为8n1(8位数据,无校验位,1位停止位)
发送接收
为了简单,这里我们使用CPU轮询的方式来编写发送接收函数。
UTRSTAT0(0x50000010)是UART0的发送/接收状态寄存器
通过不断查询Transmitter empty位和 Receive buffer data ready位来得知是否能发送/接收数据。发送数据则将数据写入到UTXH0(0x50000020),接受数据则将URXH0(0x50000024)中得数据提取出来。
2.代码编写
#include "s3c2440_soc.h"
/* 115200,8n1 */
void uart0_init()
{
/* 设置引脚用于串口 */
/* GPH2,3用于TxD0, RxD0 */
GPHCON &= ~((3<<4) | (3<<6));
GPHCON |= ((2<<4) | (2<<6));
GPHUP &= ~((1<<2) | (1<<3)); /* 使能内部上拉 */
/* 设置波特率 */
/* UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1
* UART clock = 50M
* UBRDIVn = (int)( 50000000 / ( 115200 x 16) ) –1 = 26
*/
UCON0 = 0x00000005; /* PCLK,中断/查询模式 */
UBRDIV0 = 26;
/* 设置数据格式 */
ULCON0 = 0x00000003; /* 8n1: 8个数据位, 无较验位, 1个停止位 */
}
int putchar(int c)
{
/* UTRSTAT0 */
/* UTXH0 */
while (!(UTRSTAT0 & (1<<2)));
UTXH0 = (unsigned char)c;
}
int getchar(void)
{
while (!(UTRSTAT0 & (1<<0)));
return URXH0;
}
int puts(const char *s)
{
while (*s)
{
putchar(*s);
s++;
}
}
上一篇:《2440裸机》基础知识
下一篇:arm s32440a系统时钟设置
推荐阅读最新更新时间:2024-11-10 10:10
推荐帖子
- TLP3547简单评测
- 测试目的:对光继电器TLP3547进行性能测试测试工具:1、可调直流电源2、示波器3、万用表15B环境:23℃湿度47%根据TLP3547F测试条件,If=5mA,VDD20V,负载200Ω。评估表背边焊接有一个If的限流电阻,拆除后短接,在自己焊接的电路中串接660Ω限流电阻,VCC采用5V,这样If=(5-1.64)/660=5.1mA,Vf典型值1.64V。输入端接波形发生器产生的驱动信号,方波,幅值5V,测试点TP3接示波
- zly1986ZLY 东芝光电继电器TLP3547评测
- 什么是IPTV
- 本帖最后由jameswangsynnex于2015-3-320:00编辑什么是IPTV
- newlooking 移动便携
- 浅谈电子技术中的“地”
- “地”是电子技术中一个很重要的概念。由于“地”的分类与作用有多种,初学者往往容易混淆。为此,笔者觉得有必要谈一谈电子技术中的“地”。一、地的分类与作用1.信号“地”信号“地”又称参考“地”,就是零电位的参考点,也是构成电路信号回路的公共端,图形符号为“┻”。(1)直流地:直流电路“地”,零电位参考点。(2)交流地:交流电的零线。应与地线区别开。(3)功率地:大电流网络器件、功放器件的零电位参考点。(4)模拟地:放大器、采样保持器、A/D转换器和比较器的
- wljmm 模拟电子
- I2C读写问题
- 现在用STM32驱动1音频芯片,初始化已经通过,貌似也能写,为了验证写入数据的正确性,现在要把写的数据读出来加以比较。此时,却发现问题,读出的数据全部为0,求指教!!!I2C读写问题有些芯片读和写操作的不是相同的寄存器,或许读出的就是0呢。这个最好用示波器分析一下,看看从设备是否正常响应了。 初始化已经通过,说明从设备已经响应了。DataSheet有读时序,说明相应寄存器必有数据可读。您若经验丰富的话,是否还有其他情况呢?谢谢!!! 那说明写可能是没问题了,主要是读,可
- liang@bj ARM技术
- 基于Proteus的MSP430单片机仿真实例13-8X8LED点阵数字显示
- 此内容由EEWORLD论坛网友tiankai001原创,如需转载或用于商业用途需征得作者同意并注明出处一、任务要求利用MSP30F247单片机控制一个8X8LED点阵显示模块,使其循环显示数字0~9。二、硬件电路硬件电路如下图所示。选取MSP430F247单片机的P4端口控制LED点阵的列显示数据,P5端口控制LED点阵的行扫描信号。三、程序设计四、程序说明在主循环中对0~9这10个数字进行循环显示,每个数字扫描
- tiankai001 微控制器 MCU
- 国产60V升压芯片LGS6302初步测试结果
- 上个月发了一个国产升压芯片的帖子推荐一款国产60V升降压芯片,这几天收到板子做了测试,因为60V的电压不能满足要求,我参考下边的二级管电容升压电路,做了2倍升压。轻负载时的纹波大概100mV左右(示波器交流耦合)蓝色是SW波形,黄色是VOUT波形(示波器交流耦合),黄色波形在SW切换时的波动应该是示波器的串扰,单独测量不明显。因为我的负载非常小,包括后期的实际应用,这款芯片1.5A的开关电流对我来说属于大材小用了,因为在轻负载时它会进入SKIP
- littleshrimp 国产芯片交流
设计资源 培训 开发板 精华推荐
- 星型网络的湿度和温度传感器节点实现纽扣电池使用寿命长达 10 年以上
- DC1791A-D,基于 LTM2887-5I 的演示板,5V 电源,I2C 模块隔离器
- UC3843B 高性能电流模式 PWM 控制器的典型应用
- 5V DC 至 DC 单路输出电源
- AD9235BCP-40EB,用于评估 AD9235BCP-40 单通道 ADC 流水线 40Msps 12 位并行 32 引脚 LFCSP 的评估套件
- EV-ADF4116SD1Z,用于评估 ADF4116 单整数 N 550MHz PLL 频率合成器的评估板
- PY32F003F2x核心板
- EV-ADF4113HVSD1Z,用于评估 ADF4113HV 整数 N PLL 频率合成器的评估板
- Mini示波器2.0
- 使用 NXP Semiconductors 的 TL431AI 的参考设计