11_UART串口

2023-05-16

11_UART

文章目录

  • 11_UART
  • 1、串口连接芯片图
  • 2、串口传输一个字节的过程
  • 3、发送接收过程
  • 4、编写UART函数
    • 4.1、初始化函数uart0_init()
      • 4.1.1、设置引脚用于串口
      • 4.1.2、使能上拉
      • 4.1.3、设置波特率
      • 4.1.4、设置数据格式
    • 4.2、int putchar(int c)函数
      • 4.2.1、判断状态
      • 4.2.2、发送数据
    • 4.3、int getchar(void)函数
      • 4.3.1、判断状态
      • 4.3.2、返回接收到的数据
    • 4.4、int puts(const char *s)函数
  • 5、UART头文件
  • 6、main函数
  • 7、编写自己的printf测试函数

串口打印调试信息,外界各种设备

1、串口连接芯片图

在这里插入图片描述

2、串口传输一个字节的过程

在这里插入图片描述
传输数据时的逻辑电平如下两图:
在这里插入图片描述
在这里插入图片描述

3、发送接收过程

在这里插入图片描述
波特率:115200,8n1
每一位:t = 1/115200
传输1Byte:需要10位(start, Data, Stop)
t = 10 / 115200
1秒能传输:1/t = 115200/10 = 11520 byte

4、编写UART函数

4.1、初始化函数uart0_init()

编写初始化函数:void uart0_init()

4.1.1、设置引脚用于串口

//GPH2,3用于TxD0,RxD0 
GPHCON &= ~((3<<4) | (3<<6));
GPHCON |=  ((2<<4) | (2<<6));

4.1.2、使能上拉

//使能内部上拉使得引脚在平时为高电平
GPHUP &= ~((1<<2) | (1<<3));

4.1.3、设置波特率

设置UCON0寄存器
UBRDIV0 = (int)( UART clock / ( buad rate x 16) )1
UART clock = PCLK = 50MHz
UBRDIV0 = (int)( 50000000 / ( 115200 x 16) )1 = 26

UCON0 = 0x00000005;
/* PCLK,中断/查询模式 
* UCON0[11:10] = 00(0x00000005),10(0x00000805) :选为PCLK
* UOCN0[3:2] = 01,Interrupt request or polling mode
* UOCN0[1:0] = 01,Interrupt request or polling mode
*/

4.1.4、设置数据格式

ULCON0 = 0x00000003;
/* 8n1: 8个数据位,无校验位,一个停止位 
* ULCON0[5:4:3] = 0xx :No parity(无校验位)
* ULCON0[2] = 0 :One stop bit per frame(一个停止位)
* ULCON0[1:0] = 11 :8-bits(8个数据位)
*/

4.2、int putchar(int c)函数

4.2.1、判断状态

while (!(UTRSTAT0 & (1<<2)));
此位为0表明上一次的数据还没发送出去,等待。

4.2.2、发送数据

UTXH0 = (unsigned char)c;
寄存器UTXH0定义为unsigned char类型。

4.3、int getchar(void)函数

4.3.1、判断状态

while (!(UTRSTAT0 & (1<<0)));	
此位为0表明上一次的数据还没接收,等待。

4.3.2、返回接收到的数据

	return 	URXH0;

4.4、int puts(const char *s)函数

输出字符串函数:
	while(*s)
	{
		putchar(*s);
		s++;
	}

5、UART头文件

//uart.h
#ifndef _UART_H
#define _UART_H
void uart0_init();
int putchar(int c);
int getchar(void);
int puts(const char *s);
#endif

6、main函数

#include "s3c2440_soc.h"
#include "uart.h"
int main(void) 
{
	unsigned char c;
	uart0_init();
	puts("Hello,world!\n\r");
	while(1) {
		c = getchar();
		if (c == '\r') {
			putchar('\n');
		}
		if (c == '\n') {
			putchar('\r');
		}		
		putchar(c);	/* 若无这个则串口不显示输入的字符,即没有回显 */
	}
	return 0;
}

7、编写自己的printf测试函数

Printf中的格式字符:
在这里插入图片描述
my_printf测试函数:

#include <stdio.h>
//#include <stdarg.h>

typedef char *  va_list;
#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )
//#define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
//#define va_arg(ap,t)	(ap = ap +_INTSIZEOF(t), *(t *)(ap -_INTSIZEOF(t)))
#define va_arg(ap,t)	(*(t *)(ap = ap +_INTSIZEOF(t),ap -_INTSIZEOF(t)))

#define va_end(ap)      ( ap = (va_list)0 )

struct person{
	char *name;
	int age;
	char score;
	int id;
}; 

/* 由于在x86(32位机器)平台下,GCC编译器默认按4字节对齐 */
/*int printf(ocnst char *formt, ...);
 *依据: x86平台,函数调用参数是使用堆栈来实现的
 *目的: 将所有传入的参数全部打印出来
 */
int push_test(const char *format, ...)
{
	//char *p = (char *)&format;
	int i;
	struct person per;
	char c;
	double d;//float d;
	va_list p;
	
	//1==========================
	/* 指针对连续空间操作时: 1)取值 2)移动指针 */	
	printf("arg1: %s\n",format);
		
	//2==========================
	//p = p +sizeof(char *);
	va_start(p, format);
	/* 指针对连续空间操作时: 1)取值 2)移动指针 */
	//i = *((int *)p);
	//p = p + sizeof(int);
	i = va_arg(p, int);
	printf("arg2: %d\n",i);

	//3==========================
	/* 指针对连续空间操作时: 1)取值 2)移动指针 */	
	//per = *((struct person *)p);
	//p = p + sizeof(struct person);
	per =  va_arg(p, struct person);
	printf("arg3: .name = %s, .age = %d, .score= %c, .id=%d\n",\
		       per.name,   per.age,   per.score,  per.id);

	//4==========================
	/* 指针对连续空间操作时: 1)取值 2)移动指针 */
	//c = *((char *)p);
	/* p = p + ((sizeof(char) + 3) & ~3); 
	 * #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
	 * 当sizeof(n)=1/2/4时,_INTSIZEOF(n)都等于4
	 */	
	c = va_arg(p, int); /*c = va_arg(p, char);
	                由于传递参数时保持字符对齐,
	                需要把char类型转换成int类型*/
	printf("arg4: %c\n",c);

	//5==========================
	/* 指针对连续空间操作时: 1)取值 2)移动指针 */	
	//d = *((double *)p); /* 默认按照doubled = *((float *)p); */
	//p = p + sizeof(double);
	d = va_arg(p, double);

	/* 避免"野指针"出现 */
	//p = (char *)0;
	va_end( p );
	printf("arg5: %f\n",d);
	
	return 0;
}

int main(int argc,char **argv)
{
	struct person per={"Zhang Dengyu",23,'A',191040043};

	printf("sizeof(char   )=%d\n",sizeof(char   ));
	printf("sizeof(int    )=%d\n",sizeof(int    ));
	printf("sizeof(char  *)=%d\n",sizeof(char  *));
	printf("sizeof(char **)=%d\n",sizeof(char **));	
	printf("sizeof(struct person)=%d\n",sizeof(struct person));	

	//push_test("HDU_DZ_ZDY");
	//push_test("HDU_DZ_ZDY",8023);
	//push_test("HDU_DZ_ZDY",8023,per);	
	//push_test("HDU_DZ_ZDY",8023,per,'c');
	push_test("HDU_DZ_ZDY",8023,per,'c',3.14);	
	
	return 0;
}	

代码解析:
在这里插入图片描述

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

11_UART串口 的相关文章

  • Jetson nano串口的使用——UART

    UART串口使用两条杜邦线就可以实现数据发送和接收 xff0c 可以很方便的与其他扩展进行数据连接 xff0c 比如微雪的L76X GPS HAT就可以直接连接40Pin的GPIO接口通过UART串口进行数据传递 接下来具体说明Jetson
  • STM32串口接受和发送数据的程序(USART/UART)

    本实验中 STM32通过串口1和串口2上位机对话 xff0c STM32通过串口1在收到上位机发过来的字符串 以回车换行结束 后 xff0c 通过串口2原原本本的返回给上位机 串口 xff08 USART UART xff09 通信配置详解
  • TM4C123系列(四)————UART串口通信

    一 实验简介 使用TM4C123的串口通信功能实现单片机与PC端通信 二 UART介绍 TM4C123有八个串口 xff0c 其中UART0已经与USB集成 xff0c UART0建议只用来和PC端通信 xff0c 不要与外界通信 除此之外
  • (十三)STM32——串口通信(UART)

    目录 学习目标 内容 通信方法 并行通信 串行通信 通信方向 通信方式 UART 特点 串口参数 通信流程 寄存器 USART SR USART DR USART BRR 过程 代码 运行结果 运行结果 遇到的问题 总结 学习目标 本节我们
  • DSP:TMS320C6657 之 UART波特率问题

    6657 设置串口波特率 以614400为例 xff08 1 xff09 根据公式计算分频系数 xff08 2 xff09 1GHz 主频下 UART 输入频率 166666666Hz xff08 1 6 xff09 xff08 3 xff
  • Uart串口收发回环验证

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

    简述核心代码仿真测试 简述 串口发送是以一定速率发送单bit数据 xff0c 通常一组数据为10bit 空闲状态为高电平 xff0c 起始位为0 xff0c 中间以低位在前的方式发送8bit数据 xff0c 终止位为1 采用计数器 cnt
  • 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串口通信

    目录 一 通信特点二 通信应用三 接线示意图三 UART通信协议四 STM32F4 串口使用1 资源分布2 特性3 UART框图4 使用方法5 相关库函数6 函数实例 五 实战 上位机控制开发板小灯 一 通信特点 异步 串行 全双工 一般描
  • C51_day5:串口通信UART

    3 1 串口基本认知 串行接口简称串口 xff0c 也称串行通信接口或串行通讯接口 xff08 通常指COM接口 xff09 xff0c 是采用串行通信方式的扩展接口 串行接口 xff08 Serial Interface xff09 是指
  • 串口通信协议 UART+I2C+SPI

    UART 异步 串行 全双工 I2C SPI 不同通信协议比较 UART UART协议详解 UART通信 xff0c 接收与发送 xff08 详细版 xff0c 附代码 xff09 UART串行通信详解 待整理 UART是Universal
  • UART串口通信

    串口是 串行接口 的简称 xff0c 即采用串行通信方式的接口 串行通信将数据字节分成一位一位的形式在一条数据线上逐个传送 xff0c 其特点是通信线路简单 xff0c 但传输速度较慢 因此串口广泛应用于嵌入式 工业控制等领域中对数据传输速
  • RT-Thread记录(十一、I/O 设备模型之UART设备 — 源码解析)

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

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

    STM32双串口的使用 最近老是需要stm32通过串口去跟WiFi模块 蓝牙模块 openmv进行数据交互 然后需要用到stm32的串口调试 就把这个程序整理成一个工程 方便调试 实验目的 外设模块 WiFi模块 蓝牙模块 openmv 发
  • Verilog功能模块——Uart收发

    摘要 本文分享了一种通用的Uart收发模块 可实现Uart协议所支持的任意波特率 任意位宽数据 5 8 任意校验位 无校验 奇校验 偶校验 1校验 0校验 任意停止位 1 1 5 2 的数据传输 此模块需要搭配FIFO使用 以消除发送端和接
  • STM32CubeMX HAL库串口+DMA+IDLE空闲中断不定长度数据接收和发送

    本文开发环境 MCU型号 STM32F103ZET6 IDE环境 MDK 5 29 代码生成工具 STM32CubeMx 5 3 0 HAL库版本 STM32Cube FW F1 V1 8 0 STM32Cube MCU Package f
  • C语言UART通信(十六进制)

    我想向写入函数发送一个十六进制值 例如 0 90 这是因为需要通信的设备接收到的是十六进制数的命令 未使用的变量在测试时出现 并注释为丢失十六进制值 稍后将被删除 如何编写具有字符串以外的十六进制值的写入函数 对于初学者 请告诉我们如何通过
  • 跨线程操作无效:从创建它的线程以外的线程访问控制“textBox1”[重复]

    这个问题在这里已经有答案了 我想使用 UART 将温度值从微控制器发送到 C 接口并显示温度Label Content 这是我的微控制器代码 while 1 key scan get value of temp if Usart Data

随机推荐

  • ssh远程登录报错:kex_exchange_identification: Connection closed by remote host

    基本信息 系统 xff1a MacOS Catalina 10 15 7 报错信息 xff1a 终端登录远程 服务器 时报错 xff1a kex exchange identification Connection closed by re
  • 如何在Windows的cmd下让程序在后台执行

    如何在Windows的cmd下让程序在后台执行 xff1f Hu Dennis 2008 12 24 在windows下启动JBoss服务器 xff0c 需要在命令行中输入run bat 但是运行后如果你想停止服务器 xff0c 可能的做法
  • 嵌入式LINUX识别U盘的问题

    我试过mount U盘 当开机后mount 第一个U盘时 xff0c 一般设备名为sda xff0c 然后umount xff0c 并重插另外一个U盘 xff0c 再mount xff0c 发现设备名变为sdb了 此试验进行了几次 xff0
  • yolov4+deepsort(yolo目标检测+自适应卡尔曼滤波追踪+毕业设计代码)

    项目介绍 该项目一个基于深度学习和目标跟踪算法的项目 xff0c 主要用于实现视频中的目标检测和跟踪 该项目使用了 YOLOv4 目标检测算法和 DeepSORT 目标跟踪算法 xff0c 以及一些辅助工具和库 xff0c 可以帮助用户快速
  • 集成学习(含常用案列)

    集成学习原理 xff1a 工作原理是生成多个分类器 模型 xff0c 各自独立地学习和作出预测 这些预测最后结合成组合预测 xff0c 因此优于任何一个单分类的做出预测 集成学习算法分类 xff1a 集成学习算法一般分为 xff1a bag
  • 字节序与比特序详解

    字节序的定义 几种类型的字节序 cpu字节序外部bus字节序设备字节序网络协议字节序 Ethernet协议字节序IP协议字节序 编译字节序 比特序的定义字节序与bit序的转换结构体的位域 字节序的定义 字节序就是说一个对象的多个字节在内存中
  • 【动态规划】01背包问题

    问题描述 有n个物品 xff0c 它们有各自的体积和价值 xff0c 现有给定容量的背包 xff0c 如何让背包里装入的物品具有最大的价值总和 xff1f 为方便讲解和理解 xff0c 下面讲述的例子均先用具体的数字代入 xff0c 即 x
  • 献给初学labview数据采集的初学者

    前言 xff1a 参考来源 xff1a http bbs elecfans com jishu 209658 1 5 html xff0c 感谢原作者 zhihuizhou 这里的内容只针对NI的数据采集卡 xff0c 不保证适用于其它公司
  • 如何从科学论文中实现一个算法

    原文 xff1a http codecapsule com 2012 01 18 how to implement a paper 作者 xff1a Emmanuel Goossaert 本文是从科学论文中实现算法的简短指南 我从书籍和科学
  • 国内C/C++刷题网站汇总

    作者 xff1a Luau Lawrence 链接 xff1a https www zhihu com question 25574458 answer 31175374 来源 xff1a 知乎 Welcome To PKU JudgeOn
  • 华为16道经典面试题

    面试过程中 xff0c 面试官会向应聘者发问 xff0c 而应聘者的 回答将成为面试官考虑是否接受他的重要依据 对应聘者而言 xff0c 了解这些问题背后的 猫腻 至关重要 本文对面试中经常出现的一些典型问题进行了整理 xff0c 并给出相
  • 语音信号的预加重和加窗处理

    原文转载于 xff1a http blog csdn net ziyuzhao123 article details 12004603 非常感谢 一 语音信号的预加重 语音信号的预加重 xff0c 目的是为了对语音的高频部分进行加重 xff
  • 单独编译和使用webrtc音频增益模块(AGC)

    原文转载于 xff1a http www cnblogs com mod109 p 5767867 html top 非常感谢 webrtc的音频处理模块分为降噪ns xff08 nsx xff09 xff0c 回音消除aec xff08
  • 功率谱和频谱的区别

    生活中很多东西之间都依靠信号的传播 xff0c 信号的传播都是看不见的 xff0c 但是它以波的形式存在着 xff0c 这类信号会产生功率 xff0c 单位频带的信号功率就被称之为功率谱 它可以显示在一定的区域中信号功率随着频率变化的分布情
  • 如何解决在rviz中,路径规划导航时,点击2D Pose estimate后机器人位置没有改变,终端也没有反应的问题

    在rviz中 xff0c 点击2D Pose estimate后机器人位置没有改变 xff0c 终端也没有反应 xff0c 通常这种情况就是由于客户端和服务端IP地址不一致导致的 xff0c IP地址有时候系统会自动变更 xff0c 这里我
  • 五款免费开源的语音识别工具

    按 xff1a 本文原作者 Cindi Thompson xff0c 美国德克萨斯大学奥斯汀分校 xff08 University of Texas at Austin xff09 计算机科学博士 xff0c 数据科学咨询公司硅谷数据科学
  • 动态内存分配

    动态内存分配 常见的内存分配的错误 先上一个内存分配的思维导图 便于联想想象 xff0c 理解 xff1a 首先我们介绍一下内存分配的方式 xff1a 1 在静态存储区域中进行分配 内存在程序编译的时候就已经分配好 xff0c 这块内存在程
  • UEFI架构

    UEFI架构 UEFI提供系统化的标准方法 xff0c 加载驱动并管理他们之间的交互 前言 xff1a 感谢uefi blog UEFI 提供了一个标准接口 xff0c 以便在硬件发生变更时固件能提供足够信息而保证操作系统不受影响 它包含有
  • C++调试工具(未完)

    C 43 43 调试相关命令 ld so conf https blog csdn net Bruce 0712 article details 78816790相关的命令 ar nm 目标格式文件分析 xff0c 所以也可以分析 a文件
  • 11_UART串口

    11 UART 文章目录 11 UART1 串口连接芯片图2 串口传输一个字节的过程3 发送接收过程4 编写UART函数4 1 初始化函数uart0 init 4 1 1 设置引脚用于串口4 1 2 使能上拉4 1 3 设置波特率4 1 4