03-串口(UART)的使用

2023-05-16

目录

    • 第一节 UART概述
    • 1.1 UART的用处:
    • 1.2 UART的优点
    • 1.3 UART原理与概念
    • 1.4 UART数据传输原理与过程
    • 1.5 关于电平转换
    • 1.6 UART内部具体机制
  • 第二节 UART编程

第一节 UART概述

1.1 UART的用处:

(1)用于打印调试信息;
(2)用于外接各种模块:GPS、蓝牙等等。

1.2 UART的优点

结构简单且可靠。

1.3 UART原理与概念

如下图11.1所示:
在这里插入图片描述

1.4 UART数据传输原理与过程

我们在使用串口助手时,一般首先设置波特率,然后设置数据位、停止位、校验位、流量控制。那么,为什么这样设置呢,原理是什么?这节课讲了串口的原理就理解了。
注:波特率是指每秒传输的位数。
举例说明原理:
比如说ARM发送1Byte(如’A’)给PC,即发送0x41给PC(‘A’的ASCii码是41),即发送0b01000001给PC。发送过程如下所示:
在这里插入图片描述
对UART的特性和数据传输过程进行总结,如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.5 关于电平转换

先说一下关于USB和UART的几个常识:
(1)根据不同电压uart(即串口)分为只在开发板内部使用的5v的ttl电平,和短距离传输的15v的rs232,和长距离传输的rs485等。ttl和rs232的协议一样,只需要转电平即可。
(2)uart、usb、iic 、spi都是协议接收方式不同。即uart和usb之间的传输还需要满足协议。USB本质上也是一种电平。
(3)说一下2440和PC数据传输机制:
其机制就是2440的串口接电脑的串口。
1.5.1 mini2440(友善之臂)数据传输

mini2440内部有一个电平转换芯片,将TTL转换为RS232,然后连接到电脑的RS232。但是现在的电脑没有RS232接口(9针接头)了,因此解决方案是:mini2440的RS232九针口转成USB,USB接到电脑,电脑端的USB转为串口(也可能不转,我还不清楚)。
在这里插入图片描述
这是Jz2440的传输方式(韦东山的板子):机制是,2440TTL电平转为USB,直接通过USB进行与电脑之间的数据传输。也就是说直接一个USB线即可完成连接传输。
在这里插入图片描述

1.6 UART内部具体机制

程序是如何通过UART写到PC,又怎么将PC的字节通过UART读呢?原理如下:
(1)补充:UART向CPU发出中断,是为了判断数据是否发送完毕,判断数据是否接收到。
(2)2440最高波特率Bandrate:115200。
115200,8n1中的8n1是指:8指Data位数,n指校验位,1指停止位。传输1byte需要10位。经计算2440最大传输速率为11520byte/s或者说115.2Kbit/s。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二节 UART编程

uart.c

#include "s3c2440_soc.h"


/* 115200,8n1 */
void uart0_init()
{
	/* 设置引脚用于串口 */
	/* GPH2,3用于TxD0, RxD0 */
	GPHCON &= ~((3<<4) | (3<<6));//清掉
	GPHCON |= ((2<<4) | (2<<6));//将GPH2,3设置为TxD0, RxD0

	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,中断/查询模式
	                     *UCON0的[11:10]是设置时钟的,设置为00即PCLK;
						 *[3:2]设置为01,即设置为中断/查询模式
						 *注查询模式就是不断地查询某个状态
						 *[1:0]设置为01,即设置为中断/查询模式
						 *故为0x00000005*/
	UBRDIV0 = 26;//26是通过上面公式计算出的

	/* 设置数据格式 */
	ULCON0 = 0x00000003; /* 8n1: 8个数据位, 无较验位, 1个停止位 */

	/*  */

}

int putchar(int c)/*输出*/
{
	/* UTRSTAT0寄存器判断是否发送、接收一个字符 */
	/* UTXH0  */

	while (!(UTRSTAT0 & (1<<2)));/*UTRSTAT0[2]为1则表明发送缓冲
	                              *和移位器为空,跳出循环,发送数据;
								  *为0的话就会循环等待*/
	UTXH0 = (unsigned char)c;/*往UTXH0寄存器存入值用于发送*/
	
}

int getchar(void)/*输入*/
{
	while (!(UTRSTAT0 & (1<<0)));/*UTRSTAT0[0]为0则无数据,陷入循环等待;
	                              *为1则有数据,跳出循环接收值到URXH0*/
	return URXH0;
}

int puts(const char *s)/*输出*/
{
	while (*s)
	{
		putchar(*s);
		s++;
	}
}

uart.h

#ifndef _UART_H
#define _UART_H

void uart0_init();
int putchar(int c);
int getchar(void);
int puts(const char *s);

#endif

main.c

#include "s3c2440_soc.h"
#include "uart.h"

int main(void)
{
	unsigned char c;
	
	uart0_init();//初始化串口设置
	puts("Hello, world!\n\r");/*\r回行首*/
	
	while(1)
	{
		c = getchar();
		
		/*下面这两个if目的是,有的串口工具按回车键
		 *以后只有\n无\r,或只有\r无\n*/
		if (c == '\r')
		{
			putchar('\n');
		}

		if (c == '\n')
		{
			putchar('\r');
		}

		putchar(c);
	}
	return 0;
}

start.S(汇编和上一节一样,无变动)

.text
.global _start

_start:

	/* 关闭看门狗 */
	ldr r0, =0x53000000
	ldr r1, =0
	str r1, [r0]

	/* 设置MPLL, FCLK : HCLK : PCLK = 400m : 100m : 50m */
	/* LOCKTIME(0x4C000000) = 0xFFFFFFFF */
	ldr r0, =0x4C000000
	ldr r1, =0xFFFFFFFF
	str r1, [r0]

	/* CLKDIVN(0x4C000014) = 0X5, tFCLK:tHCLK:tPCLK = 1:4:8  */
	ldr r0, =0x4C000014
	ldr r1, =0x5
	str r1, [r0]

	/* 设置CPU工作于异步模式 */
	mrc p15,0,r0,c1,c0,0
	orr r0,r0,#0xc0000000   //R1_nF:OR:R1_iA
	mcr p15,0,r0,c1,c0,0

	/* 设置MPLLCON(0x4C000004) = (92<<12)|(1<<4)|(1<<0) 
	 *  m = MDIV+8 = 92+8=100
	 *  p = PDIV+2 = 1+2 = 3
	 *  s = SDIV = 1
	 *  FCLK = 2*m*Fin/(p*2^s) = 2*100*12/(3*2^1)=400M
	 */
	ldr r0, =0x4C000004
	ldr r1, =(92<<12)|(1<<4)|(1<<0)
	str r1, [r0]

	/* 一旦设置PLL, 就会锁定lock time直到PLL输出稳定
	 * 然后CPU工作于新的频率FCLK
	 */
	
	

	/* 设置内存: sp 栈 */
	/* 分辨是nor/nand启动
	 * 写0到0地址, 再读出来
	 * 如果得到0, 表示0地址上的内容被修改了, 它对应ram, 这就是nand启动
	 * 否则就是nor启动
	 */
	mov r1, #0
	ldr r0, [r1] /* 读出原来的值备份 */
	str r1, [r1] /* 0->[0] */ 
	ldr r2, [r1] /* r2=[0] */
	cmp r1, r2   /* r1==r2? 如果相等表示是NAND启动 */
	ldr sp, =0x40000000+4096 /* 先假设是nor启动 */
	moveq sp, #4096  /* nand启动 */
	streq r0, [r1]   /* 恢复原来的值 */
	

	bl main

halt:
	b halt

此外,还有s3c2440_soc.h文件

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

03-串口(UART)的使用 的相关文章

  • FPGA学习-UART串口发送单字节(UART时序分析+真正的FPGA设计看图写代码)

    首先看UART发送时序图 xff1a 要发送一个完整字节 xff0c 需要 1位起始位 43 8位数据位 43 1位停止位 xff0c 图上的第11位 xff0c 是确认一个字节发送完的一位 重点是每一位之间的发送时间需要保持一致 xff0
  • 串口UART

    目录 串口概念 串口rs232 数据格式 注意事项 总体结构图 代码verilog 接收模块 结构图 波形图 编辑 代码 verilog 发送模块 结构图 波形图 代码 verilog 串口rs485 串口概念 串口是异步 串行通信接口 x
  • UART协议

    UART协议 简介 UART是通用异步收发传输器 xff08 Universal Asynchronous Receiver Transmitter xff0c 通常称作UART xff0c 是一种异步收发传输器 是设备间进行异步通信的关键
  • Uart串口收发回环验证

    Uart串口收发回环验证 接受模块发送模块波特率设置模块顶层模块TBModelsim仿真结果板级验证总结 本次所做的项目比较复杂 xff08 对我本人来讲 xff09 xff0c 设计一个Uart IP核 xff0c 在其基础 xff0c
  • UART详解

    UART 通用异步收发传输器 xff08 Universal Asynchronous Receiver Transmitter xff0c 通常称作UART 是一种异步全双工串行通信协议 xff0c 它将要传输的资料在串行通信与并行通信之
  • UART

    一 S3C2410内置的UART控制器 S3C2410内部具有3个独立的UART控制器 xff0c 每个控制器都可以工作在Interrupt xff08 中断 xff09 模式或DMA xff08 直接内存访问 xff09 模式 xff0c
  • UART, IIC, SCI, SPI, 232, 485, 422, CAN, SDIO, GPIO, MODBUS, TCP/IP汇总简介

    UART IIC SCI SPI 232 485 422 CAN SDIO GPIO MODBUS TCP IP汇总简介 UART xff1a Universal Asynchronous Receiver Transmitter xff1
  • UART波形分析

    1 逻辑分析仪解码配置 波特率 xff1a 9600 2 逻辑分析仪结果 3 波特率计算 1除以9600 xff0c 结果如下 xff08 e 4表示10的负4次方 xff09 表示 0 00010416秒 61 104 16 微秒 找到发
  • 一文理解UART通信

    还记得当年的打印机 xff0c 鼠标和调制解调器吗 他们都有巨大笨重的连接器和粗电缆 xff0c 并且必须拧到你的电脑上 这些设备正是使用UART协议与计算机进行通信 虽然USB几乎完全取代了旧的电缆和连接器 xff0c 但UART绝对没有
  • UART串口通信协议详解

    UART xff1a 通信异步收发器 xff0c 串行 异步通信总线 xff0c 两条数据线 xff08 收发 xff09 xff0c 全双工 xff08 可以同时接收和发送 xff09 一 UART帧格式 xff08 UART协议 xff
  • RT-Thread记录(十一、I/O 设备模型之UART设备 — 源码解析)

    深入理解 RT Thread I O 设备模型 分析 UART设备源码 目录 前言 一 初识 UART 操作函数 应用程序 二 UART 的初始化 2 1 UART 设备初始化位置 2 2 UART 设备初始化函数分析 stm32 uart
  • 一起学nRF51xx 6 - uart

    前言 通用异步接收器 发送器提供快速 全双工 内置流量控制的异步串行通信 CTS RTS 在硬件方面支持高达1Mbps波特率 支持奇偶校验和第9位数据生成 用于每个UART接口线的GPIO可从芯片上的GPIO中任选 而且可独立配置 这使得芯
  • UART通信原理

    UART 通信格式 串口全称叫做串行接口 通常也叫做 COM 接口 串行接口指的是数据一个一个的顺序传输 通信线路简单 使用两条线即可实现双向通信 一条用于发送 一条用于接收 串口通信距离远 但是速度相对会低 串口是一种很常用的工业接口 I
  • 以字符串形式接收数字(uart)

    我正在尝试通过 uart 接收一个包装为字符串的数字 我发送数字 1000 所以我得到 4 个字节 空字符 但是 当我使用 atoi 将数组转换为数字并将整数与 1000 进行比较时 我并不总是得到正确的数字 这是我用于接收号码的中断处理函
  • 启用并测试 UART 的本地环回

    我正在尝试进行 UART 内部环回测试并提出以下更改 include
  • 从 Linux 用户空间设置 16550A UART 硬件 FIFO 中断级别

    我目前正在使用 16550 兼容的 UART 并且我希望能够更改 FIFO 中断触发级别 我在高 UART 负载下丢失字节 并且我想降低阈值 这是一个动力不足的嵌入式系统 当然 如果我愿意 我可以在 8250 port c 驱动程序中更改它
  • 启用 DMA 的 UART Tx 模式

    我已经为 UART 在传输模式下编写了一个简单的设备驱动程序 并启用了 DMA 和中断 我使用的硬件是 omap 4460 pandaboard 其中加载了 Linux 3 4 下面我分享一下相关部分的代码 在开放阶段 dma map io
  • 英特尔伽利略裸机 UART

    我想编写一些 hello world 程序裸机申请于英特尔伽利略木板 当然 使用 UEFI 打印文本 到 UART 1 效果很好 但我想 手动 访问 UART 而不需要 UEFI 的任何帮助 在 QEMU 中我的代码运行良好 h file
  • GATT 配置文件和 UART 服务

    我是开发通过蓝牙连接到外围设备的移动应用程序的新手 我搜索到 GATT 是用于蓝牙LE 通信的相关配置文件 但我们的客户建议我们使用 UART 服务 现在我很困惑 1 这两件事是如何关联的 2 我们是否必须选择其中之一 如果是的话 每一个的
  • Android Things 5​​.1 - 9 位 UART

    我正在尝试使用 Android Things 支持 9 位 UART 当我尝试将数据大小设置为 9 时 我收到 IO 异常 唯一有效的配置是 7 位和 8 位 我知道可以使用奇偶校验错误中断进行 9 位模拟 但在 Android 上 我没有

随机推荐

  • 小米平衡车plus放久后无法充电解决办法

    半年没在家 xff0c 电池没充电 xff0c 回来后发现已经无法充电 xff0c 看了网上一些 激活神器 的产品 xff0c 有人说是智商税 xff0c 我猜那个东西也没什么神奇的东西 xff0c 像这款plus的充电线上3孔的 xff0
  • c语言宏函数怎么传递宏参数_C语言中的宏参数评估

    c语言宏函数怎么传递宏参数 We can define a function like Macro in which we can pass the arguments When a Macro is called the Macro bo
  • MiniFly V1.1开源四轴驱动代码分析八:旋转矩阵、控制分配矩阵等分析介绍

    很久没更新 看见订阅数量持续增加 感觉得加点料才对得起大家的 旋转矩阵 前言 在网上搜索到的一下关于旋转矩阵的表达形式 看起来很像 都是三角函数组合成 不同资料的正负号或者字母不一样 甚至一些是有模有样的复制粘贴 看的脑壳疼 旋转矩阵的形式
  • 数据区、栈区、堆区、代码区

    简介 1 栈区 stack xff1a 由系统的编译器自动的释放 xff0c 主要用来存放方法中的参数 xff0c 一些临时的局部变量等 xff0c 并且方法中的参数一般在操作完后 xff0c 会由编译器自动的释放掉 2 堆区 heap 由
  • 上位机PC控制UR3机器人实现方式

    一 在计算机上安装urx 库 终端输入 xff1a pip install urx xff1b 参考和例程下载见 xff1a https github com SintefManufacturing python urx xff1b 二 利
  • STM32实战项目-串口打印

    前言 xff1a 本小结主要实现串口打印功能 xff0c 主要将上一结的状态机运行次数 xff0c 通过串口在串口终端上打印出来 xff0c 硬件电路上主要是TTL转USB驱动电路 xff0c 软件上主要有状态机函数 xff0c 串口发送函
  • CURL详解

    原文链接 xff1a https www cnblogs com xishaonian p 6550613 html span class token number 1 span CURL详解 span class token number
  • STM32F103C8T6串口通信

    STMF103C8T6串口通信 串口相关的固件函数 xff1a mainusart cusart h 串口作为 MCU 的重要外部接口 xff0c 同时也是软件开发重要的调试手段 xff0c 其重要性不言而喻 关于STM32F103C8T6
  • 单片机(中断系统-串口通信)

    1 RETI 中断操作指令 这条指令的功能和RET指令相似 xff0c 2条指令的不同之处是 xff1a 本指令清除了中断响应时 xff0c 被置1的MCS 51内部不可寻址的 优先级生效 触发器清零 中断程序完成后 xff0c 一定要执行
  • ESP32 for arduino 的3个hardware serial

    在arduino IDE的开发环境中 xff0c 如果使用的开发板不是arduino的开发平台 xff0c 而是ESP32模组的开发板 xff0c 那么在实际开发中由于ESP32的支持库与arduino不同 xff0c 会使得我们在使用一些
  • 大疆开发板A型基于HAL库驱动M3508直流无刷电机及PID控制

    1 首先 xff0c 我们先了解一下大疆开发板A型的资料 xff0c 官方有提供 官网 xff1a RoboMaster 机甲大师赛 芯片型号STM32F427IIH6 2 了解M3508直流无刷电机的资料 xff0c 官网有提供 3 于是
  • [note] C++ STL初步(二) 迭代器、算法和映射

    STL算法 迭代器和映射总结 迭代器 迭代器的提出 算法函数独立于数据结构无疑是一种很好的思路 xff0c 它高度体现了OOP的核心思想 但很快 xff0c 我们就会发现因各数据结构的访问形式不同 xff0c 困难显而易见 比如 xff1a
  • python 用 xlwings 处理 Excel 中的重复数据

    xlwings 简介 xlwings 是一个 Python 库 简化了 Python 和 Excel 通信 xlwings 让Excel跑得飞快 本文写作背景 amp 需求 amp 方案 因前几个月帮在医院工作的朋友现学现卖用VBA写了段程
  • STM32学习(5)外部中断实验

    STM32 的每个 IO 都可以作为外部中断的中断输入口 xff0c 这点也是 STM32 的强大之处 STM32F103 的中断控制器支持 19 个外部中断 事件请求 每个中断设有状态位 xff0c 每个中断 事件都有独立的触发和屏蔽设置
  • STM32学习(6) 定时器中断实验

    基本定时器功能简介 1 计数器16bit xff0c 只能向上计数 xff0c 只有TIM6和TIM7 2 没有外部的GPIO xff0c 是内部资源 xff0c 只能用来定时 3 时钟来自PCLK1 xff0c 为72M xff0c 可实
  • STM32学习(7)PWM 输出实验

    脉冲宽度调制 PWM xff0c 是英文 Pulse Width Modulation 的缩写 xff0c 简称脉宽调制 xff0c 是利用 微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术 简单一点 xff0c 就是对脉冲宽度的
  • STM32中NVIC_SystemReset()函数的作用?什么时候用?

    STM32软件复位有两种方式 xff08 1 xff09 方式一 xff1a NVIC SystemReset 函数用来复位STM32 注意1 xff1a 从SYSRESETREQ 被置为有效 xff0c 到复位发生器执行复位命令 xff0
  • 一秒钟打印一个100S内的随机数

    1 2 gt Des 一秒钟打印一个100S内的随机数 5 gt Created Time 2021年04月19日 星期一 09时35分27秒 6 7 8 include lt stdio h gt 9 include lt stdlib
  • STM32启动文件学习

    2021 08 09 STM32启动文件学习 启动文件作用 xff1a 初始化堆栈指针SP初始化PC指针初始化中断向量表配置系统时钟调用C库 main函数进入到主程序 启动文件使用的ARM汇编指令 xff1a EQU xff1a 等于 AR
  • 03-串口(UART)的使用

    目录 第一节 UART概述1 1 UART的用处 xff1a 1 2 UART的优点1 3 UART原理与概念1 4 UART数据传输原理与过程1 5 关于电平转换1 6 UART内部具体机制 第二节 UART编程 第一节 UART概述 1