JZ2440开发板——S3C2440的UART

以下内容源于韦东山课程的学习与整理,如有侵权请告知删除。

一、UART硬件简介

UART,全称是“Universal Asynchronous Receiver Transmitter”,即“通用异步收发器”,也就是我们日常说的“串口”。

它在嵌入式中用途非常广泛,主要包括:

(1)打印调试信息。

(2)外接各种模块,比如GPS、蓝牙等模块。

UART广受欢迎,因为其结构简单、稳定可靠,通过三根线即可,即发送线、接收线、接地线。

二、数据传输流程

2.1 串口的参数

2.2 数据传输流程

2.3 举例说明(传输字符'A')

这里先简单说一下 TTL/CMOS 电平标准、RS232电平标准:

电平信号是用信号线电平减去参考线电平得到电压差,再由这个电压差决定传输值是1还是0。但是在电平信号时多少V代表1,多少V代表0不是固定的,取决于电平标准。有两个电平标准,即RS232 电平标准和 TTL/CMOS 电平标准。

TTL/CMOS电平标准中,+5V表示1,0V表示0(其实应该是一个电压范围表示1,比如+5V~+3V,而不是只有+5V才表示1,同理0也是)。

RS232电平标准中,-3V~-15V(-12V?)表示1,+3~+15V(+12V)表示0。 

电平标准如何表示"1"如何表示“0”
TTL/CMOS电平+5V ~ X0V ~ Y
RS232-3V ~ -15V(-12V)+3~+15V(+12V)

RS232的电平比TTL/CMOS电平高,抗干扰性更强,能传输更远的距离,因此在工业上用的比较多。

比如字符'A',其对应的编码是0x41,或者0b01000001。采用不同电平标准,其传输的流程如下:

步骤细述如下: 

三、看原理图确定硬件如何连接

(1)ARM芯片上的串口都是TTL电平的,然后通过板子上或者外接的电平转换芯片,转换为RS232接口,连接到电脑的RS232串口上。

比如MINI2440开发板,其串口连接方式如下:

(2)现在的电脑很少配置有采用RS232电平的串口接口 ,但几乎都配置有usb口。因此可以使用USB串口芯片,将ARM芯片上的TTL电平,转换为USB串口协议。也就是开发板可以通过USB口与电脑进行通信。

比如JZ2440,串口连接方式如下: 

由原理图可以看出,JZ2440开发板上将三个串口全部引出,其中UART0设置了板载的USB转串口电路,只需连接板上的USB口就可以,所以接下来我们使用UART0进行数据收发实验。 

四、看芯片手册进行寄存器设置

4.1 设置引脚为UART功能(GPHCON)、开启片内上拉(GPHUP)

由原理可知,UART0的TXD0对应着GPH2引脚,RXD0对应着GPH3引脚。

这两个引脚都是普通的GPIO引脚,因此需要设置引脚复用功能,设置为UART0的引脚:

 

由于串口的两根信号线在空闲的时候需要保持高电平,所以要开启这两个引脚的片内上拉电阻:

4.2 设置串口数据帧的格式(ULCONn寄存器)

我们可以通过ULCONn寄存器,来设置串口数据帧的格式。

比如是否采用红外模式、校验模式、停止位宽度、数据位宽度等内容。

这里的n=0,表示设置串口0的数据帧格式,红框圈出的是编程时采用的设置。 

4.3 设置波特率(UBRDIVn寄存器)

比如已知串口所用的时钟源 PCLK=50Mhz,想要设置串口的波特率为115200bit/s,则UBRDIVn的值根据公式可以设置为26,如下所示:

UBRDIVn = (int)(50000000/(115200*16)) - 1= (int)(50000000/1843200) - 1= (int)(27.13) - 1= 27 - 1= 26

4.4 设置时钟源、接收/发送模式(UCONn寄存器)

在JZ2440开发板——S3C2440的时钟体系中,我们设置了时钟PCLK=50Mhz,所以这里在此基础上选择PCLK作为UART0的波特率发生器的时钟来源:

为了简单起见,不使用中断模式和DMA模式,直接采用查询模式(polling mode):

4.5 发送 / 接收状态寄存器(UTRSTATn)

如下图所示,发送器包括发送缓冲寄存器、发送移位寄存器。UTRSTATn[2]=1时,表示发送器空,说明不仅发送缓冲寄存器为空,发送移位寄存器中也没有数据;UTRSTATn[1]=1时,只表示发送缓冲寄存器为空。因此我们一般通过判别 UTRSTATn[2] 是否为1,来判断是否发送完成(发送移位寄存器中没有数据,才说明发送完成)。另外我们通过 UTRSTATn[0] 是否为1,来判断是否收到数据。

4.6 发送缓冲寄存器(UTXHn)、接收缓冲寄存器(URXHn)

值得注意的是,在使用指针访问这两个寄存器时,不能使用int型指针,因为int型指针访问的是4个字节的数据,而此处只能访问 1 个字节数据,所以要使用char型指针

#define UTXH0	(*(volatile unsigned char *)(0x50000020))  //UART 0 transmission hold 
#define URXH0	(*(volatile unsigned char *)(0x50000024))  //UART 0 receive buffer    

五、编程实践

5.1 相关代码文件

1、start.S文件

内容与JZ2440开发板——S3C2440的时钟体系中的start.S文件完全一致。

2、main.c文件

文件内容如下:

#include "s3c2440_soc.h"
#include "uart.h"int main(void)
{unsigned char c;uart0_init();puts("Hello, world!\n\r");while(1){c = getchar();//有些系统回车可能是'\r',则输出'\n'来换行if (c == '\r'){putchar('\n');}//有些系统回车可能是'\n',则输出'\r'来换行if (c == '\n'){putchar('\r');}putchar(c);}return 0;
}

3、uart.c文件

对GPHCON、GPHUP等寄存器进行的是位操作;对UCON0等寄存器,则是利用寄存器位查看小工具计算好之后对其进行赋值。这两者有什么区别或者优劣之分吗? 

#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));  /* PCLK,中断/查询模式 */UCON0 = 0x00000005; /* 设置波特率 *//* UBRDIVn = (int)( UART clock / ( buad rate x 16) ) –1*  UART clock = 50M*  UBRDIVn = (int)( 50000000 / ( 115200 x 16) ) –1 = 26*/UBRDIV0 = 26;/* 设置数据格式 */ULCON0 = 0x00000003; /* 8n1: 8个数据位, 无较验位, 1个停止位 */}//通过串口0输出显示数字c对应的字符
int putchar(int c)
{/* UTRSTAT0、UTXH0 *///UTRSTAT0[2]为0时(表示发送器不为空),这个while会一直循环下去//这意味着发送器还在忙着其他发送任务,你要等它把其他数据发送结束,//才能接受你这次的数据传输while (!(UTRSTAT0 & (1<<2)));//某个数字m的第n位,其表达式是 m&(1<<n)//退出循环,表示上一次数据发送完毕了,可以开始你这次的数据传输了UTXH0 = (unsigned char)c;  //将数值写入UTXH0即可,会自动发送出去//UTXH0是 unsigned char 类型,所以要转换}//通过串口0获取字符
int getchar(void)
{while (!(UTRSTAT0 & (1<<0)));//注意这个分号不能少(其实可以换一行写分号)return URXH0;
}int puts(const char *s)
{while (*s){putchar(*s);//这里*s是一个字符,即char类型,但putchar的参数是int类型//传递时会自动转换?s++;}
}

5.2 烧写与运行

在uboot的shell界面选择n菜单,通过dnw+usb下载线的方式,(要想编译成功,Makefile文件中arm-linux-gcc命令后要添加-nostdlib选项)将上面编译生成的uart.bin文件烧写到NandFlash中,然后以NandFlash方式启动,显示如下:

Hello, world!  #固定输出这行内容。
abcdefg        #下面是你敲什么内容就显示什么内容。
123
38324ajlkdjalk
dasdjakdakjd

六、总结

1、理解了串口通信的协议(串口的参数、数据传输流程);

2、掌握S3C2440这颗芯片的串口使用方法(如何编程使用串口);

3、通过这个案例,掌握了分析某个芯片模块方法,即:
(1)看原理图确定硬件如何连接;

(2)看芯片手册进行寄存器设置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/146476.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

一文彻底让你搞懂轨迹规划(总结)

机器人在运行中不可避免的会进行运动&#xff0c;那么就会产生出轨迹规划的概念。 轨迹规划的特点&#xff1a;用一定的函数形式表示控制量&#xff08;位置&#xff0c;速度&#xff0c;加速度&#xff09;的控制律&#xff0c;根据约束或最优目标&#xff0c;求取控制控制参…

STM32固件库介绍

CMSIS标准介绍 早期的标准库叫STD 不管是hal库还是标准库都是封好库然后给我们使用的 标准库可能兼容不了F1 F4 F7 但是用HAL库就能够兼容那么多 我们可以用cubex来配置一个工程 固件库文件夹介绍 CMSIS的启动文件&#xff0c;RTOS实时操作系统文件 外设驱动文件 Inc外设的头…

Java面试篇基础部分-ReentrantLock详解

ReentrantLock 是继承了Lock接口,并且实现了再接口中定义的方法,属于一个可重入的独占锁。ReentrantLock 通过自定义队列同步器(Abstract Queued Synchroinzed,AQS)来实现锁的获取与释放。   那么什么是独占锁呢?独占锁就是指这个锁在同一时刻只能被一个线程所获取到,…

《关键跃升》读书笔记9

最后一章 《协作》部分 如果你只交代员⼯⼀件事还好&#xff0c;做到靠谱并不难&#xff0c;但如果你交代他3件 事、5件事、8件事甚⾄20件事&#xff0c;这就会带来两个问题。 第⼀&#xff0c;从数量上说&#xff0c;根据⽶勒法则&#xff0c;⼀个⼈的⼤脑最多能同时记住⼤ 约…

网络资源模板--Android Studio 通讯录App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--基于Android studio 通讯录 二、项目测试环境 三、项目详情 首页 MainActivity 类是一个 Android 地址簿应用的核心部分&#xff0c;负责管理联系人列表的显示、搜索和添…

Java | Leetcode Java题解之第421题数组中的两个数的最大异或值

题目&#xff1a; 题解&#xff1a; class Solution {// 字典树的根节点Trie root new Trie();// 最高位的二进制位编号为 30static final int HIGH_BIT 30;public int findMaximumXOR(int[] nums) {int n nums.length;int x 0;for (int i 1; i < n; i) {// 将 nums[i…

Element Plus 中Input输入框

通过鼠标或键盘输入字符 input为受控组件&#xff0c;他总会显示Vue绑定值&#xff0c;正常情况下&#xff0c;input的输入事件会正常被响应&#xff0c;他的处理程序应该更新组件的绑定值&#xff08;或使用v-model&#xff09;。否则&#xff0c;输入框的值将不会改变 不支…

Nginx配置虚拟主机

基于域名的虚拟主机 修改配置 进入nginx里的conf目录 修改nginx配置文件nginx.conf vi nginx.conf worker_processes auto;(自动识别CPU数) worker_rlimit_nofile 20480;&#xff08;指定 worker 子进程可以打开的最大文件句柄数&#xff0c;默认为1024&#xff09; use …

【有啥问啥】摄像头成像质量量化标准解读与测试方法

摄像头成像质量量化标准解读与测试方法 在自动驾驶和智能驾驶舱领域&#xff0c;摄像头是关键的感知设备&#xff0c;直接关系到系统的环境感知能力。为确保摄像头在实际应用中表现出色&#xff0c;需明确了解其成像质量标准和测试方法。本文将围绕成像质量的核心指标、测试方…

103.运行tomcat的Tomcatstartup.bat时,终端打印的中文显示为乱码

目录 原因 解决方法 原因 当运行Tomcat的Tomcatstartup.bat时&#xff0c;如果终端中文显示为乱码&#xff0c;这通常是因为Tomcat使用的日志输出编码与Windows命令行默认的编码不匹配。 解决方法 针对这一问题&#xff0c;你可以尝试以下步骤来解决&#…

2024年9月第3周AI资讯

阅读时间&#xff1a;3-4min 更新时间&#xff1a;2024.9.16-2024.9.20 目录 OpenAI 推出 o1&#xff1a;一种新的“推理”人工智能模型 微软为 Excel 和 Word 添加了更快的 Copilot World Labs 利用 AI 创建 3D 世界 AI 利用文本创建开放世界视频游戏 OpenAI 推出 o1&#x…

【源码+文档+调试讲解】微信小程序的投票系统

摘 要 伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对各种需求进行规范而严格是十分有必要的&#xff0c;所以许许多多的微信小程序应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套微信小程序的投票系统&#xff0c;进行作品信…

Vue3DevTools7是如何在vscode定位指定文件位置的?

Vue3DevTools7是如何在vscode定位指定文件位置的&#xff1f; 背景 今天在使用vue脚手架创建项目的时候&#xff0c;并发现一个新的&#xff08;实验中的新功能&#xff09;&#xff0c;可以直接在我们的项目中集成Vue DevTools插件&#xff0c;浏览器插件devtools即将成为历史…

JAVA毕业设计178—基于Java+Springboot+vue的智能家具管理系统(源代码+数据库+万字论文)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue的智能家具管理系统(源代码数据库万字论文)178 一、系统介绍 本项目前后端分离(可以改为ssm版本)&#xff0c;分为用户、管理员两种角色 1、用户&#xff1…

带你0到1之QT编程:十四、QV/HBoxLayout和QStatckedWidget双剑合璧

此为QT编程的第十四谈&#xff01;关注我&#xff0c;带你快速学习QT编程的学习路线&#xff01; 每一篇的技术点都是很很重要&#xff01;很重要&#xff01;很重要&#xff01;但不冗余&#xff01; 我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点&#xff01; …

如何写一个自动化Linux脚本去进行等保测试--引言

#我的师兄喜欢给我的休闲实习生活加活&#xff0c;说是让我在实习期间写一个自动化脚本去进行等保测试。呵呵哒。 怎么办呢&#xff0c;师兄的指令得完成&#xff0c;师兄说让我使用Python完成任务。 设想如下&#xff1a; 1、将Linux指令嵌入到python脚本中 2、调试跑通 …

【Day02-JS+Vue+Ajax】

1. JS介绍 在前面的课程中&#xff0c;我们已经学习了HTML、CSS的基础内容&#xff0c;我们知道HTML负责网页的结构&#xff0c;而CSS负责的是网页的表现。 而要想让网页具备一定的交互效果&#xff0c;具有一定的动作行为&#xff0c;还得通过JavaScript来实现。那今天,我们就…

如何用 Web 界面 AI 工作流提升科研写作效率?

&#xff08;注&#xff1a;本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 更易用&#xff0c;更高效。 痛点 作为一名研究生导师&#xff0c;我深深体会到学生在撰写论文时拖延症的严重程度。他们往往打开一个空白的 Word 文档&…

CSS01-语法规范、基础选择器

一、CSS语法规范 示例&#xff1a; 二、CSS的基础选择器 选择器(选择符)就是根据不同需求把不同的标签选出来这就是选择器的作用。 简单来说&#xff0c;就是选择标签用的。 选择器的分类&#xff1a; 1、标签选择器 2、类选择器&#xff08;开发最常用&#xff09; 长字符命名…

VScode开发GD32移植(标准库通用),保姆级!!!!!!!

VScode开发GD32移植(标准库通用)&#xff0c;保姆级&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 文章目录 VScode开发GD32移植(标准库通用)&#xff0c;保姆级&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#…