嵌入式学习——硬件(UART)——day55

1. UART

1.1 定义

        UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种用于串行通信的硬件设备或模块。它的主要功能是将数据在串行和并行格式之间进行转换。UART通常用于计算机与外围设备或嵌入式系统之间的数据传输。

1.2 特点

  1. 异步通信:UART不需要发送和接收设备之间的时钟信号同步,数据传输速率和传输格式(如起始位、数据位、校验位、停止位)在通信双方事先协商好。

  2. 全双工通信:UART可以同时进行数据的发送和接收。

  3. 串行数据传输:数据一位一位地传输,减少了连线数量,但需要更多的时间来传输数据。

  4. 组成部分

    • 发送器(Transmitter):将并行数据转换为串行数据并发送出去。
    • 接收器(Receiver):接收串行数据并将其转换为并行数据。

1.3 代码

#include <s3c2440.h>
#include <string.h>
#include <stdio.h>
#include "led.h"
#include "key.h"
#include "interrupt.h"
#include "delay.h"
#include "pwm.h"
#define ADDRESS 0X08void init_wdt(void)	//初始化看门狗,禁止启动,关闭看门狗
{WTCON &= ~(1 << 0);
}void init_clk(void)
{unsigned int t = MPLLCON; //将PCLK频率存入变量设置好再进行修改,防止频率修改中途器件因为频率过高而短路t &= ~((0xff << 12) | (0x3f << 4) | (3 << 0)); //利用锁相环将12MHz倍频t |= ((127 << 12) | (2 << 4) | (1 << 0)); //配置fclk频率大约为400MhzCLKDIVN |= ((2 << 1) | (1 << 0));//分频,配置HCLK为100MHz,HCLK为50MHz	MPLLCON = t;//将所有频率配置好再进行设置,防止器件被烧坏
}unsigned char buffer[128];//存储pc给s3c2440发送,s3c2440接收到的字符串
unsigned char tmpbuffer[128];
unsigned int pos;//已经收到字符的个数,下一个要收到字符的位置void uart0_handler(void)
{if (SUBSRCPND & (1 << 0))//如果UART0接收到了数据{buffer[pos++] = URXH0;			}SUBSRCPND = SUBSRCPND;	
}void init_uart0(void)
{unsigned int t = 0;GPHCON &= ~(0x0f << 4);GPHCON |= ((2 << 6) | (2 << 4));//设置中断模式,串口电路引脚寄存器功能t = ULCON0;		//9600 n 8 1 波特率? 校验位? 数据位? 停止位t &= ~(1 << 6);//不使用红外模式t &= ~(7 << 3);//无奇偶校验t &= ~(1 << 2);//每帧 1 个停止位t |= (3 << 0);//每帧用于发送或接收的数据位的个数8位ULCON0 = t;t = UCON0;	 //s3c2440给电脑发送数据用轮询   电脑给s3c2440发送数据,s3c2440接收数据触发中断t &= ~(3 << 10);//选PCLK给 UART 波特率t &= ~(3 << 8);//发送接收方式改为脉冲方式t &= ~(0x0f << 4);// 都设置为普通模式t &= ~(0x0f << 0);t |= (0x05 << 0);//设置UART模式发送轮询  接收模式为中断UCON0 = t;INTSUBMSK &= ~(1 << 0);//uart子中断改为可服务状态enable_irq(IRQ_UART0);//配置中断为IRQ模式,让中断处于可服务模式	  //配置接收的中断register_irq(IRQ_UART0 ,uart0_handler);UBRDIV0 = 325;//波特率分频寄存器 50000000/9600/16-1约等于325pos = 0;		 	 
}void uart_send_char(unsigned char ch)
{UTXH0 = ch;	// UART0 要发送的数据   UART 发送缓冲 寄存器while (0 == (UTRSTAT0 & (1 << 2)));//数据发完的标志   UART TX/RX 状态 寄存器	
}void send_buffer(const char *p, unsigned int len)
{unsigned int i = 0;for (i = 0; i < len; ++i){uart_send_char(*p++);	}
}int parse(const char *p, unsigned int len)//分析上位机pc端发送的信息
{int i = 0;int n = 0;unsigned char tmpnum = 0;if (p[0] != 0xaa || p[len-1] != 0x0D)//判断起始校验位{n = 0;}if (p[1] != ADDRESS) //判断是否为正确的下位机{n = 0;}for (i = 0; i < 8; i++){tmpnum += p[i];}if (p[8] != tmpnum)	 //判断校验位是否正确{n = 0;}if (0x01 == p[2])//调频{n = 1;}else if (0x02 == p[2]) //点灯{n = 2;}return n;	
}int main(void)
{float f = 0;int ret = 0;int i = 0;unsigned led = 0;init_wdt();init_led();init_clk();init_delay();init_uart0();init_pwm0();while (1){if (pos != 0)//收到数据了{mdelay(100);//让数据接收完成, 若收100字节,即1000比特,要1000/9600=0.1s=100msret = parse((const char *)buffer, pos);if (1 == ret)//调频	  AA 08 01 04 00 00 00 3F F6 0D{buffer[8] = '\0';f = *((float *)buffer[4]);set_duty_ratio(f);buffer[8] = 0xf6;for (i = 0; i < 3; i++){tmpbuffer[i] = buffer[i];					}tmpbuffer[3] = 0x01;tmpbuffer[4] = 0x01;tmpbuffer[5] = buffer[8];tmpbuffer[6] = buffer[9];tmpbuffer[7] = '\0';send_buffer((const char *)tmpbuffer, 7);}else if (2 == ret)//点灯	AA 08 02 04 00 00 00 3F B9 0D{buffer[8] = '\0';led = buffer[7];ledon(led);buffer[8] = 0xB9;for (i = 0; i < 3; i++){tmpbuffer[i] = buffer[i];					}tmpbuffer[3] = 0x01;tmpbuffer[4] = 0x01;tmpbuffer[5] = buffer[8];tmpbuffer[6] = buffer[9];tmpbuffer[7] = '\0';send_buffer((const char *)tmpbuffer, 7);	}else //发送失败{for (i = 0; i < 3; i++){tmpbuffer[i] = buffer[i];					}tmpbuffer[3] = 0x00;tmpbuffer[4] = 0x00;tmpbuffer[5] = buffer[8];tmpbuffer[6] = buffer[9];tmpbuffer[7] = '\0';send_buffer((const char *)tmpbuffer, 7);		}pos = 0;memset(buffer, 0, sizeof(buffer));memset(tmpbuffer, 0, sizeof(tmpbuffer));						 }}
}

1. TCON   2 定时器输出变相开关  0刚开始低电平、  1刚开始低电平

2. 串口是一种串行

串行不一定是串口

串行:一次收发一个比特

3. 传一个字节,8位+1位起始位+1位停止位,传输一个字节即传输十个比特

9600波特率为一秒传输960个字节

9600  n   8   1

波特率  校验位  数据位  停止位

U17作用:将TTL转化为标准RS232

4. UART控制寄存器

TX RX

脉冲:数据收发完产生中断

电平:数据收发过程中产生中断

5. i++和++i(++i效率高)

        若i = 2;

++i printf打印i和++i都是2+1=3

i++(会开辟临时变量保存i++) printf打印i为3,i++为2

6. PC端(电脑)上位机

板子下位机

7. CRC校验算法

8. modbus

成功01失败00

1. 计数器监视寄存器查看计数器从开始减到目前的数字,查看当前的数字减到了多少

modbus重点!!!!!!!!!!!CRC

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

013、MongoDB常用操作命令与高级特性深度解析

目录 MongoDB常用操作命令与高级特性深度解析 1. 数据库操作的深入探讨 1.1 数据库管理 1.1.1 数据库统计信息 1.1.2 数据库修复 1.1.3 数据库用户管理 1.2 数据库事务 2. 集合操作的高级特性 2.1 固定集合(Capped Collections) 2.2 集合验证(Schema Validation) 2.…

防止跨站脚本攻击XSS之Antisamy

目录 一、什么是跨站脚本攻击&#xff08;XSS&#xff09; 二、通常有哪些解决方案 三、常见的XSS攻击例子有哪些 3.1 存储型XSS攻击&#xff08;黑产恶意截流&#xff0c;跳转不法网站&#xff09; 3.2反射型XSS攻击&#xff1a; 四、什么是跨站请求伪造&#xff1f; 五…

2024年上半年典型网络攻击事件汇总

文章目录 前言一、Ivanti VPN 的0 Day攻击(2024年1月)二、微软公司高管账户泄露攻击(2024年1月)三、Change Healthcare网络攻击(2024年2月)四、ConnectWise ScreenConnect漏洞利用攻击(2024年2月)五、XZ Utils软件供应链攻击(2024年3月)六、AT&T数据泄露攻击(20…

【产品经理】订单处理11-订单修改场景梳理

为了应对订单修改的场景&#xff0c;电商ERP系统应该如何设计相应模块&#xff1f; 电商ERP系统&#xff0c;经常遇到需要修改订单的情况&#xff0c;修改订单主要以下几种场景&#xff1a; 一、修改商品 修改商品&#xff0c;包括对正常商品的换货、以及对赠品的增删改。 1…

docker安装ElasticSearchKibana

本文参考以下两篇文章 ✅ElasticSearch&Kibana 部署 云效 Thoughts 企业级知识库 (aliyun.com) docker安装ElasticSearch&Kibana - 飞书 安装elasticsearch 使用docker下载es&#xff1a; docker pull elasticsearch:8.13.0 挂载配置 创建挂在文件目录 mkdir…

无人机企业需要什么资质?

无人机企业所需的资质主要可以分为几大类&#xff0c;以确保其合法、安全、高效地进行相关业务活动。以下是对这些资质的详细解释和归纳&#xff1a; 1. 基础企业资质&#xff1a; - 工商营业执照&#xff1a;这是企业合法经营的基本证书&#xff0c;所有企业都需要取得。无人…

是霍尼韦尔还是柏曼啊??书客、霍尼、柏曼三款护眼大路灯横向PK!

是霍尼韦尔还是柏曼啊&#xff1f;&#xff1f;近年来市面上的劣质护眼大路灯越来越多&#xff0c;很容易使我们选到劣质产品。为了解决这一问题&#xff0c;我自费购买了多个品牌的护眼大路灯进行测评。经过深入研究&#xff0c;我发现市面上确实存在一些光线不稳定、选材做工…

指挥中心操作台的形状及空间布局

在现代化的指挥中心&#xff0c;操作台的形状设计至关重要&#xff0c;它不仅影响着操作人员的工作效率和舒适度&#xff0c;还关系到整个指挥系统的运行效果。常见的指挥中心操作台形状多种多样&#xff0c;以满足不同的功能需求和空间布局。 直线型操作台 直线型操作台是最为…

用python画蜡笔小新

代码地址: https://pan.quark.cn/s/6ae646d2fef3

QT+OpenCV在Android上实现人脸实时检测与目标检测

一、功能介绍 在当今的移动应用领域&#xff0c;随着技术的飞速发展和智能设备的普及&#xff0c;将先进的计算机视觉技术集成到移动平台&#xff0c;特别是Android系统中&#xff0c;已成为提升用户体验、拓展应用功能的关键。其中&#xff0c;目标检测与人脸识别作为计算机视…

Panmnesia发布CXL协议 允许AI GPU以最小的延迟利用各类内存

韩国 科学技术院&#xff08;KAIST&#xff09;的一家初创公司Panmnesia推出了一种尖端 IP&#xff0c;可通过 PCIe 上的 CXL 协议为人工智能 GPU 添加外部存储器&#xff0c;从而打破了存储器容量的障碍&#xff0c;提供有效的基础设施来解决 HBM 的局限性。 目前的人工智能加…

超快的 Python 包管理工具「GitHub 热点速览」

天下武功&#xff0c;无坚不破&#xff0c;唯快不破&#xff01; 要想赢得程序员的欢心&#xff0c;工具的速度至关重要。仅需这一优势&#xff0c;即可使其在众多竞争对手中脱颖而出&#xff0c;迅速赢得开发者的偏爱。以这款号称下一代极速 Python 包管理工具——uv 为例&…

利用DeepFlow解决APISIX故障诊断中的方向偏差问题

概要&#xff1a;随着APISIX作为IT应用系统入口的普及&#xff0c;其故障定位能力的不足导致了在业务故障诊断中&#xff0c;APISIX常常成为首要的“嫌疑对象”。这不仅导致了“兴师动众”式的资源投入&#xff0c;还可能使诊断方向“背道而驰”&#xff0c;从而导致业务故障“…

网站显示不安全怎么解决

网站显示不安全通常表现为浏览器地址栏中出现“不安全”字样或红色感叹号&#xff0c;这意味着用户的个人信息、登录凭证和其他敏感数据可能面临风险。以下是一些步骤和建议&#xff1a; 1、检查URL是否以HTTPS开头&#xff1a; 确保你访问的网址是以https://开头&#xff0c;而…

go-redis源码解析:cluster模式如何选择节点

1. 如何选择节点 1.1. 确定slot 1.1.1. 通过cmdSlot方法确定在哪个槽上, 这一步只是本地计算 首先入口方法_process&#xff0c;先通过cmdSlot方法用key计算此次应该落在哪个槽上 通过crc16sum算法计算key应该属于哪个槽&#xff0c;slotNumber为16384 func Slot(key strin…

ctfshow-web入门-命令执行(web118详解)Linux 内置变量与Bash切片

输入数字和小写字母&#xff0c;回显 evil input 查看源码&#xff0c;发现这里会将提交的参数 code 传给 system 函数 使用 burpsuite 抓包进行单个字符的模糊测试 fuzz&#xff1a; 发现过滤掉了数字和小写字母以及一些符号&#xff0c;下面框起来的部分是可用的 结合题目提…

h5兼容table ,如何实现h5在app内使用h5渲染table表格而且实现横屏预览?

压图地址 横屏div 通过css 实现 transform: rotate(90deg); transformOrigin: 50vw 50vw ; height: 100vw; width: 100vh;<divclass"popup-box":style"{transform: originSet 0 ? rotate(90deg) : ,transformOrigin: originSet 0 ? 50vw 50vw : ,height…

Facebook:数字社交的引领者与创新者

自2004年诞生以来&#xff0c;Facebook从一个校园网络项目迅速成长为全球最大的社交媒体平台&#xff0c;彻底改变了我们与世界互动的方式。作为数字社交的引领者和创新者&#xff0c;Facebook不仅在技术层面上不断突破&#xff0c;也在社会和文化领域留下了深刻的印记。本文将…

如何对GD32 MCU进行加密?

GD32 MCU有哪些加密方法呢&#xff1f;大家在平时项目开发的过程中&#xff0c;最后都可能会面临如何对出厂产品的MCU代码进行加密&#xff0c;避免产品流向市场被别人读取复制。 下面为大家介绍GD32 MCU所支持的几种常用的加密方法&#xff1a; 首先GD32 MCU本身支持防硬开盖…

Flutter第十五弹 Flutter插件

目标&#xff1a; 1.Flutter插件是什么&#xff1f;有什么作用&#xff1f; 插件 (plugin) 是 package 的一种&#xff0c;全称是 plugin package&#xff0c;我们简称为 plugin&#xff0c;中文叫插件。 2.怎么创建Flutter插件&#xff1f; 一、什么是插件 在flutter中&am…