当前位置: 首页 > news >正文

03:2440--UART

目录

一:UART

1:概念

2:工作模式

3:逻辑电平

4:串口结构图

5:时间的计算

二:寄存器

1:简单的UART传输数据

A:GPHCON--配置引脚  

B:GPHUP----使能内部上拉​编辑

C: UCON0---设置频率115200

D: ULCON0----数据格式8n1

E:发送数据

A:UTRSTAT0

B:UTXHO--发送数据输缓冲寄存器

F:接收数据

A:UTRSTAT0​​​​​​​

B:URXH0 ---接收缓冲区寄存器

三:代码

1:UART的简单实现


一:UART

1:概念

        S3C2440A通用异步收发器(UART)提供三个独立的异步串行I/O (SIO)端口,每个端口都可以在基于中断或基于dma的模式下工作。换句话说,UART可以生成中断或DMA请求来在CPU和UART之间传输数据。使用系统时钟,UART可以支持高达921.6Kbps的波特率。如果外部设备为UART提供UEXTCLK,则UART可以以更高的速度运行。每个UART信道包含两个64字节的fifo,分别用于接收和发送。

        S3C2440A UART包括可编程波特率,红外(IR)发送/接收,一个或两个停止位插入,5位,6位,7位或8位数据宽度和奇偶校验。

        每个UART包括波特率发生器、发送器、接收器和控制单元。波特率发生器可以通过PCLK, FCLK/n或UEXTCLK(外部输入时钟)进行时钟。

        发射器和接收器包含64字节的fifo和数据移位器。数据被写入FIFO,然后在传输之前复制到传输移位器。然后通过传输数据引脚(TxDn)将数据移出。同时,接收数据从接收数据引脚(RxDn)转移,然后从移位器复制到FIFO。

        1:波特率 : 双方约定每一位占用的时间

        2:格式 : 数据位, 停止位, 校验位, 流量控制

        校验分为奇校验和偶校验, 以前的电解技术没有那么稳定, 使用采用了;  不过现在使用比较少;

        

        数据位+校验位为 " 1"的个数

eg: 数据位为8位--0001 0001 --采用奇校验 使用校验位为1;   3个1所以是奇校验

       如果采用偶校验,  校验位为0----2个1就是偶校验 

        作用 :  串口不仅可以为我们打印调式信息, 还可以连接需要外设模块,  实现之间的通信 (GPS, 蓝牙,  mpu6050......)

       这个和STM32发送的基本一样详情可以参考我的 : 09:STM32-------USART串口通信+串口数据包

2:工作模式

假设2440现在需要向外面的pc端口发送一个数据,  他的工作模式如下

发送 "A" 0x41 0b0100 0001

2440向pc段发送数据  

        A : 首先逻辑电平是高电平

        B : ARM被拉低(开始位)---告诉pc段我要开始发送数据了;  在这里会停留1bit的时间,  也就是我们双方约定的波特率.

        C:通过拉低逻辑电平电平的方式传输数据.  每一位停留一个波特率的时间.  一般数据为采用8位

        D:在一个数据位发送介绍拉高电平告诉, pc段我们发送完了

pc段读取数据:

        在数据位中间的位置开始读取数据

3:逻辑电平

        TTL电平传输方式-----我们2440采用的就是这种的传输方式;      当电平高在某一个范围的时候他就会被判定位高电平, 同理在电平低于某一个范围的时候被判定为低电平. 

          RS232电平传输----我们pc段采用这种方式的传输

2种不同的电平协议是不能相互传输数据的,  我们的2440添加了电平转化芯片或者USB串口芯片. 

原理图:

        可以看到我们引脚需要我们的配置, 来把他变为发送和接收引脚.  而不是普通的GPIO口

4:串口结构图

简单理解:

2440向pc段发送数据:

          A:FIFO会向内存中取到需要发送的数据

          B:在这个UART单元中FIFO把数据发送到移位器里面去,  移位器通过逐步发送,把数据发送到了pc段.

pc段向2440发送数据:

        A:pc段把数据发送给我移位器, 移位器逐步接收.

        B:移位器再把数据发送给我FIFO, FIFO,  程序从FIFO把数据取出来写入内存. 

可以使用中断或者不断查看标志位的方式来查看数据是否发送完毕.

5:时间的计算

二:寄存器

1:简单的UART传输数据

A:GPHCON--配置引脚  

        注意我们使用的发送和接收的是0号,  在下面选择寄存器是也应该选择0号.

        可以看到了我们需要把GPH2 GPH3配置使他为发送和接收引脚,  而不是普通的GPIO口

GPHCON &= ~((3 << 4) | (3 << 6));
GPHCON |= ((2 << 4) | (2 << 6));

B:GPHUP----使能内部上拉

	GPHUP &= ~((1 << 2) | (1 << 3));  /* 使能内部上拉 */

把GPH2和GPH3的接收引脚上拉

C: UCON0---设置频率115200

UART块中有三个UART控制寄存器,包括UCONO、UCON1和UCON2。

        时钟我们选择默认的PCLK时钟----在上一节中我们调节PCLK的频率为50MHZ

        UBRDIVn = (int)(selected clock / (baudrate x 16) ) –1

        我们使用我们的FCLK作为我们的时钟源--在汇编中是50MHZ

        UBRDIVn=(5000 0000 /(115200*16))-1=26

UBRDIV0 = 26;

        我们只需要最简单的实现---所以只有打开发送和接收模式

UCON0 = 0x00000005;

全部代码----实现了频率为11520, 打开接收和发送模式

UCON0 = 0x00000005;
UBRDIV0 = 26;

D: ULCON0----数据格式8n1

/*数据格式*/ULCON0 = 0x00000003;  //不能写为这个ULCON0 |= (3 << 1)因为还要关注其他位;/*数据位=8,停止位=1,无奇偶校验 8n1*/

E:发送数据

A:UTRSTAT0

        发射机空;    当传输缓冲寄存器没有有效数据要传输且传输移位寄存器为空时,自动设置为1。

0 =不空        1=发射机(传输缓冲区和移位寄存器)空

while ((UTRSTAT0 & (1 << 2)) == 0); //while (!(UTRSTAT0 & (1 << 2)));
B:UTXHO--发送数据输缓冲寄存器

        在UART块中有三个UART传输缓冲寄存器,包括UTXHO、UTXH1和UTXH2。UTXHn有一个8位的数据用于传输数据。

return URXH0;

全部代码

while ((UTRSTAT0 & (1 << 2)) == 0); //while (!(UTRSTAT0 & (1 << 2)));UTXH0 = (unsigned char)c;

F:接收数据

A:UTRSTAT0
	while ((UTRSTAT0 & (1 << 0)) == 0); //while (!(UTRSTAT0 & (1 << 0)));
B:URXH0 ---接收缓冲区寄存器

        在UART块中有三个UART接收缓冲区寄存器,包括URXHO, URXH1和URXH2。URXHn对接收的数据有一个8位的数据。

return URXH0

全部代码

while ((UTRSTAT0 & (1 << 0)) == 0); //while (!(UTRSTAT0 & (1 << 0)));
return URXH0;

全部的代码见---三:代码 1:UART的简单实现

三:代码

1:UART的简单实现

#include "sc2440_so.h"
/*在UART块中有三个UART线路控制寄存器,包括ULCONO、ULCON1和ULCON2。我们使用的是--ULCONO*/
//115200 8n1
void UART_init()
{/*引脚设置*/GPHCON &= ~((3 << 4) | (3 << 6));GPHCON |= ((2 << 4) | (2 << 6));GPHUP &= ~((1 << 2) | (1 << 3));  /* 使能内部上拉 *//*设置波特率---设置波特率位115200*//*UBRDIVn = (int)(selected clock / (baudrate x 16) ) –1我们使用我们的FCLK作为我们的时钟源--在汇编中是50MHZUBRDIVn=(5000 0000 /(115200*16))-1=26*/UCON0 = 0x00000005;UBRDIV0 = 26;/*数据格式*/ULCON0 = 0x00000003;  //不能写为这个ULCON0 |= (3 << 1)因为还要关注其他位;/*数据位=8,停止位=1,无奇偶校验 8n1*/
}
int putchar(int c)
{/*发送数据*/while ((UTRSTAT0 & (1 << 2)) == 0); //while (!(UTRSTAT0 & (1 << 2)));UTXH0 = (unsigned char)c;
}int getchar(void)
{/*接收数据*/while ((UTRSTAT0 & (1 << 0)) == 0); //while (!(UTRSTAT0 & (1 << 0)));return URXH0;
}int puts(const char* s)
{while (*s){putchar(*s);s++;}}
#ifndef __UART_H
#define __UART_Hvoid UART_init();
int putchar(int c);
int getchar(void);
int puts(const char* s);#endif

#ifndef __SC2440_SO_H
#define __SC2440_SO_H#define ULCON0 (*((volatile unsigned int*)0x50000000))
#define UCON0 (*((volatile unsigned int*)0x50000004))
#define UBRDIV0 (*((volatile unsigned int*)0x50000028))
#define GPHCON (*((volatile unsigned int*)0x56000070))
#define GPHUP (*((volatile unsigned int*)0x56000078))
#define UFCON0 (*((volatile unsigned int*)0x50000008))
#define UTRSTAT0 (*((volatile unsigned int*)0x50000010))
#define UTXH0 (*((volatile unsigned char*)0x50000020))
#define URXH0 (*((volatile unsigned char*)0x50000024))#endif

#include "uart.h"
#include "sc2440_so.h"
int main(void)
{unsigned char c;UART_init();puts("Hello, world!\n\r");while (1){c = getchar();if (c == '\r'){putchar('\n');}if (c == '\n'){putchar('\r');}putchar(c);}return 0;
}

分析makefile文件

我们要使用makefile文件交叉编译来生成bin文件

all:arm-linux-gcc -c -o uart.o uart.carm-linux-gcc -c -o main.o main.carm-linux-gcc -c -o start.o start.Sarm-linux-ld -Ttext 0 start.o  uart.o main.o -o uart.elfarm-linux-objcopy -O binary -S uart.elf uart.binarm-linux-objdump -D uart.elf > uart.dis
clean:rm *.bin *.o *.elf *.dis

        A: 先把所以的c语言和汇编语言全部, 编译为.o文件

        B:链接: 这是一个链接命令,用于将三个目标文件(start.o、uart.o、main.o)链接成一个可执行文件(uart.elf)。其中-Ttext 0指定了链接地址的起始地址为0,start.o是程序的入口地址。这个命令会将三个目标文件中的符号解析出来,并将它们放到正确的位置上,生成可执行文件

        C:这个命令的作用是将uart.elf文件转换为uart.bin文件。其中,-O binary表示输出格式为二进制文件,-S表示去掉所有的符号信息。这个命令通常用于将可执行文件转换为裸机程序,以便在嵌入式系统中运行。(把连接生成的elf文件转换为单板使用的bin文件)

        D:对连接生成的elf文件进行反汇编,调试错误时用。生成.dis文件

1:UART每发送完一个数据发送停止位, 还是发送完想要发送的数据在发送停止位?

        根据引用中的定义,UART协议的数据传输包括起始位、数据位和终止位。其中,起始位是低电平,终止位是高电平。在UART发送一段数据时,每个数据字节后面都会跟随一个停止位。停止位的数量取决于UART协议的设置,通常为1个或2个。因此,UART发送一段数据,一共发送的停止位数量为1个或2个,具体取决于UART协议的设置

2:UART发送数据是发送完毕,接收端在读取, 还是一边发送, 接收端一边读取

        根据提供的引用内容,UART是一种通用异步接收器/发送器,其主要目的是发送和接收串行数据。在UART发送数据时,数据包以串行方式从发送UART送至接收UART,接收UART以预配置的波特率对数据线进行采样。因此,在UART发送数据时,接收端需要一边接收一边读取数据,否则数据将会丢失

相关文章:

03:2440--UART

目录 一:UART 1:概念 2:工作模式 3:逻辑电平 4:串口结构图 5:时间的计算 二:寄存器 1:简单的UART传输数据 A:GPHCON--配置引脚 B:GPHUP----使能内部上拉​编辑 C: UCON0---设置频率115200 D: ULCON0----数据格式8n1 E:发送数据 A:UTRSTAT0 B:UTXHO--发送数据输…...

Vatee万腾的科技冒险:Vatee独特探索力量的数字化征程

在数字化时代的激流中&#xff0c;Vatee万腾以其独特的科技冒险精神&#xff0c;引领着一场前所未有的数字化征程。这不仅仅是一次冒险&#xff0c;更是对未知的深度探索&#xff0c;将科技的力量推向新的高度。 Vatee万腾在科技领域敢于挑战传统&#xff0c;积极探索未知的可能…...

物联网后端个人第十二周总结

学习工作进度 物联网方面 1.模拟设备通过规则引擎将数据通过mqtt进行转发 在物联网平台上实现模拟设备通过规则引擎将数据通过mqtt进行转发已经全部完成了&#xff0c;所使用的物联网平台在这方面有不少的问题和bug&#xff0c;也可能是没有按照开发者的想法对平台进行使用才导…...

Linux C语言 26-可变参数

Linux C语言 26-可变参数 本节关键字&#xff1a;可变参数、va_list、va_arg、va_end 相关C库函数&#xff1a;va_list、va_arg、va_end 什么是可变参数&#xff1f; C语言中的可变参数是指函数能够接受不定数量的参数。在不确定函数参数时&#xff0c;使用“char *format, …...

Gin 学习笔记02-参数获取

Gin 参数获取 1、获取url 参数2、获取动态 url 参数3、获取 form 表单数据 1、获取url 参数 Query()GetQuery()QueryMap()DefaultQuery() package mainimport ("fmt""github.com/gin-gonic/gin""net/http" )func _query(c *gin.Context) {// 1…...

Uniapp Vue3 基础知识点附带实例

包括数据绑定和计算属性、条件渲染和列表渲染、事件处理、表单输入处理、生命周期钩子、自定义指令和过滤器、路由和导航以及状态管理&#xff08;如Vuex&#xff09;&#xff1a; <template><div><!-- 条件渲染 --><div v-if"showMessage">…...

【迅搜03】全文检索、文档、倒排索引与分词

全文检索、文档、倒排索引与分词 今天还是概念性的内容&#xff0c;但是这些概念却是整个搜索引擎中最重要的概念。可以说&#xff0c;所有的搜索引擎就是实现了类似的概念才能称之为搜索引擎。而且今天的内容其实都是相关联的&#xff0c;所以不要以为标题上有四个名词就感觉好…...

MySql之索引,视图,事务以及存储过程举例详解

一.数据准备 数据准备可参考下面的链接中的数据准备步骤 MySql之内连接&#xff0c;外连接&#xff0c;左连接&#xff0c;右连接以及子查询举例详解-CSDN博客 &#xff08;如有问题可在评论区留言&#xff09; 二.存储过程 1.定义 存储过程 PROCEDURE &#xff0c;也翻译…...

AR眼镜双目光波导/主板硬件方案

AR(增强现实)技术的发展离不开光学元件&#xff0c;而在其中&#xff0c;光波导和Micro OLED被视为AR眼镜光学方案的黄金搭档。光学元件在AR行业中扮演着核心角色&#xff0c;其成本高昂且直接影响用户体验的亮度、清晰度和大小等因素。AR眼镜的硬件成本中&#xff0c;光机部分…...

单片机调试技巧--修改bin文件实现断点

fromelf --text -a -c --outputall.dis F103_Moduel\F103_Moduel.axffromelf --bin --outputtest.bin F103_Moduel\F103_Moduel.axf 在启动文件中&#xff0c;修改UsageFault_Handler UsageFault_Handler\PROC; get current contextTST lr, #0x04 ; if(!EXC_RETURN[2])ITE…...

微信小程序:This Mini Program cannot be opened as your Weixin version is out-of-date.

项目场景&#xff1a; 问题描述 升级基础库3.2.0&#xff0c;然后PC端整个小程序都打不开了&#xff0c;点击小程序提示”This Mini Program cannot be opened as your Weixin version is out-of-date. Update Weixin to the latest version.“&#xff0c;并且点击Update Wei…...

04 C++中的四种强制类型转换

系列文章目录 04 C中的四种强制类型转换 目录 系列文章目录 文章目录 前言 一、静态转换&#xff08;Static Cast&#xff09; 二、动态转换&#xff08;Dynamic Cast&#xff09; 三、常量转换&#xff08;Const Cast&#xff09; 四、重新解释转换&#xff08;Reinte…...

电力感知边缘计算网关产品设计方案-边缘计算自控算法模型

边缘计算网关与其他数据采集的IoT网关设备不同之处在于可以根据应用场景和产品解决方案,单独设置一些边缘计算算法模型,实现离线系统和边缘计算自控逻辑判别+执行系统方案,自控算法逻辑单元也是边缘计算网关自控系统方案的核心单元。 自控算法逻辑单元根据产品应用不同,有…...

C语言进阶之笔试题详解(1)

引言&#xff1a; 对指针知识进行简单的回顾&#xff0c;然后再完成笔试题。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 引言&#xff1a; 知识简单回顾 指针是什么 指针变…...

报道|2023 INFORMS 最佳论文(部分)华人获奖者名单

编者按 本文收集了部分2023年INFORMS年会最佳论文评选的华人获奖者名单&#xff0c;祝贺获奖者们&#xff01;如果读者身边有本文遗漏的获奖者请在文章下方评论区告诉小编。 ● George Nicholson学生论文竞赛一等奖&#xff1a; Bayesian Design Principles for Frequentist …...

【Docker】从零开始:12.容器数据卷

【Docker】从零开始&#xff1a;12.容器数据卷 1.什么是容器数据库卷2.数据的覆盖问题3.为什么要用数据卷4.Docker提供了两种卷&#xff1a;5.两种卷的区别6.bind mount7.Docker managed volumevolume 语法volume 操作参数 1.什么是容器数据库卷 卷 就是目录或文件&#xff0c…...

Spring Boot 整合MyBatis-Plus 详解

MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 全新的 MyBatis-Plus 3.0 版本基于 JDK8&#xff0c;提供了 lambda 形…...

【前端】让列表像Excel单元格一样编辑

前言 领导说了一堆的话,最后总结一句就是客户很懒,客户的员工更加懒。 本着让别人节省时间的原则,提倡出了让列表和Excal的单元格一样,不仅看数据还可以随时更改数据。 查资料 根据 Jeecg-Vue3 源码介绍,从而知道是基于 Vben Admin 开源项目进行改造的。 因此在 Vben…...

数字图像处理-Matlab实验

实验一 图像增强 实验内容: 对于给定的低对比度测试图像,利用灰度图像直方图均衡化算法进行图像视觉效果增强。 对于给定的低照度彩色测试图像,结合颜色空间转换和灰度图像直方图均衡化算法进行图像视觉效果增强。 实验数据: Test1_1.jpg: Test1_2.jpg: 实验步骤: %% …...

Nginx:配置文件详解

一、Nginx配置文件 main配置段&#xff1a;全局配置 events段&#xff1a;定义event工作模式 http {}&#xff1a;定义http协议配置 支持使用变量&#xff1a; 内置变量&#xff1a;模块会提供内建变脸定义 自定义变量&#xff1a;set var_name value 二、 主…...

资源优化攻略:如何在消费级显卡上高效运行lora-scripts训练

资源优化攻略&#xff1a;如何在消费级显卡上高效运行lora-scripts训练 1. 理解LoRA训练的资源挑战 LoRA&#xff08;Low-Rank Adaptation&#xff09;技术已经成为微调大型模型的主流方法&#xff0c;它通过冻结预训练模型的权重&#xff0c;只训练少量低秩矩阵来实现高效适…...

【ArkUI】简述 UIAbility 组件的生命周期、启动模式和基本用法

一、UIAbility 组件概述 UIAbility 组件是一种包含 UI 的应用组件,主要用于和用户交互。例如,图库类应用可以在 UIAbility 组件中展示图片瀑布流。 UIAbility 的设计理念是:支持应用组件级的跨端迁移和多端协同。支持多设备和多窗口形态。 UIAbility 组件是系统调度的基本单…...

【机器学习】从Log Loss到Cross-Entropy:二分类与多分类的损失函数本质解析

1. 从Log Loss到Cross-Entropy&#xff1a;损失函数的本质理解 第一次接触机器学习中的损失函数时&#xff0c;我被各种名词搞得晕头转向。特别是看到Log Loss&#xff08;对数损失&#xff09;、Logistic Loss&#xff08;逻辑损失&#xff09;和Cross-Entropy&#xff08;交叉…...

React Native应用发布苹果商店:解决hermes.framework的dSYM缺失问题

1. 为什么React Native应用发布苹果商店会报dSYM缺失错误 最近在帮团队处理React Native应用上架苹果商店时&#xff0c;遇到了一个让人头疼的问题。打包上传后&#xff0c;苹果商店后台报错提示&#xff1a;"The archive did not include a dSYM for the hermes.framewor…...

VeraCrypt加密U盘实战:从创建加密卷到日常使用的完整指南

VeraCrypt加密U盘实战&#xff1a;从零开始打造移动数据保险箱 在这个数据泄露事件频发的时代&#xff0c;我们随身携带的U盘和SD卡就像一个个行走的数据炸弹。想象一下&#xff0c;当你遗失了存有客户资料、财务报告或个人隐私的移动存储设备时&#xff0c;那种头皮发麻的感觉…...

HPH的构造:核心部件与工作原理

在最近的这几天当中&#xff0c;海口正在举办的第六届中国国际消费品博览会呈现出了很高的热度&#xff0c;在科技消费展区之内&#xff0c;AI赋能的各种各样的新品集中进行了亮相&#xff0c;其覆盖了智能交互、穿戴设备以及智慧健康等多个不同的赛道&#xff0c;前沿科技同消…...

企业级语音合成方案一文详解:IndexTTS-2-LLM生产落地

企业级语音合成方案一文详解&#xff1a;IndexTTS-2-LLM生产落地 1. 项目概述与核心价值 IndexTTS-2-LLM智能语音合成服务是一个基于先进大语言模型技术的高质量语音生成解决方案。这个系统专门为企业级应用设计&#xff0c;能够将文本内容实时转换为自然流畅的语音输出。 传…...

YOLOFuse效果展示:实测RGB+红外融合检测,复杂环境下精度显著提升

YOLOFuse效果展示&#xff1a;实测RGB红外融合检测&#xff0c;复杂环境下精度显著提升 1. 引言&#xff1a;多模态检测的现实需求 在目标检测领域&#xff0c;单一传感器已经难以满足复杂场景下的应用需求。传统RGB摄像头在低光照、烟雾遮挡等恶劣环境下性能急剧下降&#x…...

**雾计算中的边缘智能:基于Python的轻量级任务调度系统设计与实现**

雾计算中的边缘智能&#xff1a;基于Python的轻量级任务调度系统设计与实现 在物联网&#xff08;IoT&#xff09;飞速发展的今天&#xff0c;传统云计算模式已难以满足低延迟、高带宽和实时响应的需求。**雾计算&#xff08;Fog Computing&#xff09;**作为云与终端设备之间的…...

CTF全解析:五大核心模块+零基础学习+参赛指南

CTF全解析&#xff1a;五大核心模块零基础学习参赛指南 摘要&#xff1a;CTF&#xff08;Capture The Flag&#xff0c;夺旗赛&#xff09;作为网络安全领域最具实战性的竞赛形式&#xff0c;是零基础入门网络安全、锤炼技术、积累求职竞争力的最佳路径。但很多新手刚接触时&a…...