《2440裸机》UART

发布者:dst2015最新更新时间:2022-04-23 来源: eefocus关键字:2440裸机  UART 手机看文章 扫描二维码
随时随地手机看文章

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的值如下所示。

image.png

  首先我们需要通过配置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裸机  UART 引用地址:《2440裸机》UART

上一篇:《2440裸机》基础知识
下一篇:arm s32440a系统时钟设置

推荐阅读最新更新时间:2024-11-10 10:10

UART的FIFO的理解
FIFO的必要性。在进行UART通信时,中断方式比轮询方式要简便且效率高。但是,如果没有收发FIFO,则每传输一个数据(5~8位)都要中断处理一次,效率仍然不高。如果有了收发FIFO,则可以在连续收发若干个数据(可多至14个)后才产生一次中断,然后一起处理。这就大大提高了收发效率。   接收超时问题。如果没有接收超时功能,则在对方已经发送完毕而接收FIFO未填满时并不会触发中断(FIFO满才会触发中断),结果造成最后接收的有效数据得不到处理的问题。有了接收超时功能后,如果接收FIFO未填满而对方发送已经停,则在不超过3个数据的接收时间内就会触发超时中断,因此数据会照常得到处理。   发送时,只要发送FIFO不满
[单片机]
ARM 平台printf函数定位到uart输出介绍
1.1 ARM 串口输出函数uart_printf ARM如果能使用C函数库自带的printf函数格式输出,那多方便,但是默认的printf都是定位到stdout终端,而不是串口,本文章讲述的是如何定位到ARM的串口。 1.1.1 函数主要代码 有在Mini2440开发板上验证过 //*****************main.c******************************* #include serial.h int Main() { unsignedint plck_val = 50000000; unsignedint buad_val = 115200; un
[单片机]
mini2440裸机程序--LED灯(C语言)
看了mini2440配套光盘里面的例子,C语言的点亮LED程序略显复杂。当时打开工程,看到这么多文件,顿时傻了眼。还好自己能够有良好的心态,慢慢弄。 对于点亮LED灯的C语言程序,相对于汇编程序,除了MDK系统自动添加的启动代码S3C2440.S ,其余的也就和汇编程序的步骤一样了。现在就把程序附在下面: #define rGPBCON (*(volatile unsigned long *)0x56000010) #define rGPBDAT (*(volatile unsigned long *)0x56000014) #define rGPBUP (*(volatile unsigned long *)0x5
[单片机]
三、UART【MSP430学习笔记】
一、UART0串口发送接收数据 MSP430的通用串行结构USCI支持多种串行通信模式。在MSP430F249这个型号含有4个USCI模块,下表是支持UART模式的USCI_Ax的相应寄存器: 1、串口0初始化例程 模式为UART、配置p3.4和p3.5为通信接口、偶校验、波特率:2400 void InitUART0(void) { P3OUT |= BIT4+BIT5; P3SEL |= BIT4+BIT5; //设置p3.4与p3.5为串口通信 UCA0CTL1 |= UCSSEL0 + UCSWRST;//设置串口0时钟为ACLK,置位UCSWRST,初始化所有的USCI寄存器 U
[单片机]
三、<font color='red'>UART</font>【MSP430学习笔记】
s3c2440裸机-异常中断5-irq定时器中断
之前讲过s3c2440时钟体系,看了时钟体系再来看定时器中断会更好的结合运用所学知识点。 S3c2440共有2种定时器: 1.Watchdog看门狗定时器 2.PWM脉冲可调制定时器 下面详细介绍2种定时器的原理,来了解定时器是如何产生定时器中断的。 1. Watchdog看门狗定时器 1)Watchdog看门狗定时器原理 Watchdog定时器的原理很简单,寄存器很少,框图如下: 1.定时器,定时器那肯定是需要用到时钟的,从框图中可以看到Watchdog定时器采用的时钟源是PCLK,从s3c2440时钟体系中也可以体现出来,接的是APB总线。 2.然后到达一个8bit的分频器,可以通过配置WTCON 来设置分频器的预设
[单片机]
s3c2440裸机-内存控制器(五、SDRAM编程实现)
配置内存控制器-SDRAM编程配置 2440内存控制器共有13个寄存器。 BANK0--BANK5只需要设置BWSCON和BANKCONx(x为0~5)两个寄存器; BANK6、BANK7外接SDRAM时,除BWSCON和BANKCONx(x为6、7)外,还要设置REFRESH、BANKSIZE、MRSRB6、MRSRB7等4个寄存器。 下面分别说明各个寄存起的设置: 1.位宽和等待控制寄存器BWSCON(BUSWIDTH&WAITCONTROLREGISTER) 我们SDRAM的位宽为32,DW6 设置成10, 没有使用等待信号,所以WS6 =0。 bank7跟随bank6的配置, 因此BWSCON寄存器的值为:
[单片机]
s3c<font color='red'>2440</font><font color='red'>裸机</font>-内存控制器(五、SDRAM编程实现)
STM32 Uart 接收不定长数据
前面讲了Uart三种不同的方式接收数据,请参照《STM32 Uart及其配置》《STM32 Uart中断接收》《STM32 Uart DMA方式接收数据》,但是,它们都需要指定数据的长度,但实际应用中,会出现不定长度的数据,比如,某些模块的@命令,那么,如何接收不定长度的数据呢?今天,我们就来扒一扒STM32 Uart 变长数据的接收。 问题来了,变长数据包,我们如何确定数据包的长度? 带着问题思考,我们可以得出以下几种思路: 1. 制定严格的通信协议,带有一串特殊字符的数据包头、长度、校验、包尾等,比如,一开始收到:0xAA-0xBB-0xCC-0xDD-0xEE,表示数据包头,接下来两个字节
[单片机]
STM32 <font color='red'>Uart</font> 接收不定长数据
嵌入式UART转CAN应用案例
在如今CAN总线应用越来越广泛的今天,很多人都开始学习使用这一技术,但是由于CAN总线协议的复杂度,不少IT新人只能浅尝辄止。本文将介绍如何致远电子的嵌入式UART转CAN模块来解决这一问题。 一、CSM100产品简介 CSM100系列UART转CAN模块是集成微处理器、CAN-bus 控制器、CAN-bus收发器、DC-DC转换、高速光电隔离于一体的嵌入式UART 转CAN 模块,用户可以不深入了解CAN-bus的相关知识,利用此芯片操作CAN-bus就如同操作UART 一样方便。 模块具有2种转换方式包括透明转换方式和透明带标示转换方式。其中透明转换方式会预先设定数据帧ID,串口只需要发送报文数据段信息,其余信息模块会自动填充
[嵌入式]
嵌入式<font color='red'>UART</font>转CAN应用案例

推荐帖子

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 国产芯片交流
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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