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

news2024/10/5 19:16:36

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 0X08

void 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频率大约为400Mhz
	CLKDIVN |= ((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约等于325
	pos = 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=100ms
			ret = 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.coloradmin.cn/o/1892633.html

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

相关文章

掌握高效实用的VS调试技巧

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 1.编程常见的错误 1.1编译型错误 编程编译型错误是指在编译代码时发现的错误。编译器在编译过程中会检查代码是否符合语法规范和语义要求&#xff0c;如果发现错误会产生编译错误。 直接看错误提示信息&#xff08;双击&#…

阿里云邮件推送邮件发送失败的问题排查解决

阿里云邮件推送为何失败&#xff1f;解决邮件推送失败的步骤指南&#xff01; 即便是功能强大的阿里云邮件推送服务&#xff0c;也可能在实际使用中遇到邮件发送失败的问题。AokSend将详细介绍如何排查和解决阿里云邮件推送邮件发送失败的问题。 阿里云邮件推送&#xff1a;验…

ode45的例程|MATLAB例程|四阶龙格库塔定步长节微分方程

ode45自己编的程序和测试代码 模型 模拟一个卫星绕大行星飞行的轨迹计算。 结果 轨迹图如下: 源代码 以下代码复制到MATLAB上即可运行,并得到上面的图像: % ode45自己编的程序和测试代码 % Evand©2024 % 2024-7-2/Ver1 clear;clc;close all; rng(0); % 参数设定…

ruoyi mybatis pagehelper 分页优化(自定义limit位置)clickhouse 外部数据源

例如加入clickhouse的分页时发现extends 不生效 则可以添加 startPage();registerDialectAlias("clickhouse", PageMySqlDialectPlus.class);List<MyMonitorlog> list monitorlogService.selectMonitorlogList(monitorlog);主要是需要注册 registerDialectAl…

JAVA 快递100wms工具类

快递wms工具类 import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import com.kuaidi100.sdk.api.QueryTrack; import com.kuaidi100.sdk.api.Subscribe; import com.kuaidi100.sdk.contant.ApiInfoConstant; import c…

为什么说牛企查查企业超好用?

步入职场的职场人士&#xff0c;经济相关专业的学生&#xff0c;都有查企业的需求&#xff0c;市面上查企业的软件平台那么多&#xff0c;每个功能都不怎么一样。 有的便宜&#xff0c;但是信息不全。有的信息还可以&#xff0c;但是会员费又很贵&#xff0c;让我这个打工人没…

图像增强方法汇总OpenCV+python实现【第一部分:常用图像增强方法】

图像增强方法汇总OpenCVpython实现【第一部分】 前言常用的图像增强方法1. 旋转&#xff08;Rotation&#xff09;&#xff1a;2. 平移&#xff08;Translation&#xff09;&#xff1a;3. 缩放&#xff08;Scaling&#xff09;&#xff1a;4. 剪切变换&#xff08;Shear Trans…

Java:JDK、JRE和JVM 三者关系

文章目录 一、JDK是什么二、JRE是什么三、JDK、JRE和JVM的关系 一、JDK是什么 JDK&#xff08;Java Development Kit&#xff09;&#xff1a;Java开发工具包 JRE&#xff1a;Java运行时环境开发工具&#xff1a;javac&#xff08;编译工具&#xff09;、java&#xff08;运行…

电机的分类

1.按工作电源种类划分 2.按结构特点分类 3.按启动与运行方式分类 4.按转子结构分类 5.按用途分类 6.按运转速度分类 其他文章介绍了主流电机的原理和使用&#xff1a; 直流电机介绍-CSDN博客 步进电机(STM3228BYJ-48)-CSDN博客 待更新........

使用elasticsearch完成多语言搜索的三种方式

文档目标&#xff1a; 基于elasticsearch&#xff0c;实现不同语言搜索特定语言的文档数据&#xff1b;比如输入中文的内容&#xff0c;搜索中文文档数据&#xff0c;输入英文搜索英文文档数据&#xff0c;日韩文类似 方案概述&#xff1a; 方式一&#xff1a;不同的语言使用不…

Chirp信号生成(FPGA、基于cordic IP核)

一、Chirp生成模块介绍 采用Verilog 生成Chirp&#xff0c;实现输入使能电平&#xff0c;模块输出Chirp信号&#xff0c;Chirp信号频率范围&#xff0c;时间宽度&#xff0c;连续Chirp信号数量可配置。 二、模块例化方法示例 parameter FL d20_000 ; parameter FH…

如何在忘记密码的情况下重置Realme手机?

欢迎阅读我们关于如何在有或没有密码的情况下重置Realme手机的综合指南。无论您是忘记了密码&#xff0c;还是只是需要将设备恢复到出厂设置&#xff0c;我们都会为您提供所需的专业提示和技术专长。 发现分步说明、专家提示和行之有效的方法&#xff0c;轻松重新控制您的 Rea…

如何搭建10万个H100 GPU的集群:电力、并行化、网络拓扑与成本优化

引言 在现代人工智能的发展中&#xff0c;构建大规模GPU集群是提升计算能力的关键手段。今天我们探讨如何搭建一个包含10万个H100 GPU的集群。这个项目不仅涉及巨大的资本支出&#xff0c;还面临电力供应、并行化处理、网络拓扑结构以及可靠性和恢复等多方面的挑战。通过深入分…

zabbix 配置企业微信告警

1、申请一个企业微信&#xff0c; 官网链接 2、群内申请一个机器人 下载电脑版企业微信&#xff0c;登录后&#xff0c;在要接收群消息的群里&#xff0c;点击右上角三个点&#xff0c;添加机器人后&#xff0c;保存机器人的webhook地址 上传应用logo&#xff0c;填写应用名称…

破解电脑卡顿难题,将数据优化,5分钟提升运行速度

当电脑变得缓慢且反应迟钝时&#xff0c;工作效率和娱乐体验都会大打折扣。而电脑卡顿是由于系统资源占用过多、磁盘空间不足等原因引起的。因此&#xff0c;我们经常需要寻找优化措施&#xff0c;提升电脑的运行速度。文章整理了4个优化方法&#xff0c;帮助你破解卡顿难题&am…

5月1日起,《碳排放权交易管理暂行条例》正式施行

2024年5月1日&#xff0c;《碳排放权交易管理暂行条例》&#xff08;以下简称《条例》&#xff09;正式施行&#xff0c;作为我国应对气候变化领域的第一部专门法规&#xff0c;《条例》首次以行政法规的形式明确了碳排放权市场交易制度。 作为碳排放权交易市场的重要补充&…

将KVM虚拟机迁移为Virtualbox虚拟机

1、在KVM宿主机上把qcow2格式磁盘转成vdi格式 [rootkvm ~]# cd /kvm-data [rootkvm kvm-data]# qemu-img convert -f qcow2 wind30.qcow2 -O vdi wind30.vdi 注&#xff1a;把vdi转qcow2命令qemu-img convert -f vdi wind30.vdi -O qcow2 wind30.qcow2 2、把转换成功vdi磁盘…

蓝桥杯开发板STM32G431RBT6高阶HAL库学习FreeRtos——新建工程

一、介绍 ​ 蓝桥杯嵌入式使用的单片机是STM32G431RBT6,内核ARM Cortex - M4,MCU+FPU,170MHz/213DMIPS,高达128KB Flash,32KB SRAM,其余的外设就不多介绍了,参照数据芯片数据手册 ​ CT117E-M4开发板资源:微控制器STM32G431RBT6、一路USB转串口、2.4寸TFT-LCD、4个功…

如何策划交互设计创意?( 计育韬老师高校公益巡讲答疑实录2024)

这是计育韬老师第 8 次开展面向全国高校的新媒体技术公益巡讲活动了。而在每场讲座尾声&#xff0c;互动答疑环节往往反映了高校师生当前最普遍的运营困境&#xff0c;特此计老师在现场即兴答疑之外&#xff0c;会尽量选择有较高价值的提问进行文字答疑梳理。 *本轮巡讲主题除了…

微信小程序一键打造专业简历

在这个竞争激烈的时代&#xff0c;一份出色的简历往往能成为你职业道路上的敲门砖。然而&#xff0c;对于大多数人来说&#xff0c;如何设计一份既美观又专业的简历却是一大难题。为了解决这一痛点&#xff0c;我们团队精心研发了一款微信小程序——“简历君”&#xff0c;它将…