串口控制器

news2024/11/16 1:20:15

1. 串口通信

1.1 什么是串口

是一种通信方式(通信协议) 主要通过串行方式完成设备间的数据通信

通信领域中使用最频繁,实现方式最简单的一种通信方式

串口: 全双工串行异步通信协议 

串口3线:  RX   接收 

  TX   发送

GND  共地信号   参考地  

1.1.1 通信

全双工,同时相互通信

半双工,不能同时但可以相互通信 

单工  ,只能从一方到另一方通信 

1.1.2 串行和并行

串行: 通过一根线传递数据, 按bit位方式 依次传递 使用的IO口少  传输较远  外设 

并行: 通过多根线传递数据, 单次可以传递多个bit 速度快  IO占用过多, 距离较近  

1.1.3 串口协议: 

 就是完成通信任务 约定的一种协议  

协议:  通信双方 约定的一些 规则  需要共同遵守 以完成通信 

1.2 电平的类别   

TTL电平:  +3v 表示1   0v 与gnd电压相同 数字0 

RS232电平:  +12/+5V表示0  -5/-12 表示1 

差分电平:  D+   D-     D+ > D- 表示 1  反之就表示0 

网线  USB  485 

抗干扰能力强 

1.3 波特率

通信双方约定 的 数据传输的速度  单位bps  bit每秒 

例如9600   115200   38400  .... 

1.4 同步通信和异步通信

异步通信:通信双方使用 自己独立 的时钟    对时操作

uart(串口 串行全双工异步协议 ) 

485       串行半双工异步协议 

同步通信: 通信双方使用 共同 的时钟

主机(主设备)(掌握时钟的一方)

从机(从设备)

IIC(串行半双工同步协议)  spi通信 (串行全双工同步协议) 

1.6 知识点

字长:  单次连续传输的 有效数据位数 

启停位: 开始传输 以及 结束传输时  用 1bit / 2bit的时间来对时 同步 

校验: 用于判断通信数据是否正确的 一种手段 

奇偶校验   CRC校验   md5检验 

纠错校验:  发送的数据中 不仅有有效数据 还报包含纠错数据  

流控:  流量控制 

硬件:   CTS RTS

软件:  

2. 串口通信实验

2.1 看原理图

1. 设备  

串口    A9板子 -----   (usb转串口)PC

2. 看电路图 

PC (usb转串口)  ---- CON7 ---- SP3232EEA(RS232电平转TTL电平3.3v)  ----- 

ALVC164245DGG(电压转换信息3.3v-1.8v)   ------ 1.8V TTL ------ GPA1_0 GPA1_1

2.2 串口控制器 

  芯片手册   1381页  28章

专门用于 实现串口通信协议的 一种硬件设备 

原理结构 如图 Figure 28-1 Block Diagram of UART  1384页 

2.3  寄存器

串口寄存器大部分都不需要我们配置,具体看手册

1396页 参考示例程序 

配置GPIO  GPA1_0和 GPA1_1 为串口功能 

2.3.1 下面是几个比较重要的寄存器

UTRSTATn 串口状态寄存器  

[2]  == 1  当发送数据寄存器为空  移位寄存器也空 自动设置1 

[1]  == 1  当发送数据寄存器为空 自动设置1   可以放一下个要发送的数据了

[0]  == 1  表示 串口接收到 一个字节数据 在 rxbuf中 

要发送和接收数据直接往这两个寄存器中仍或者读取就行了

UTXHn 发送数据寄存器  [7:0] 

URXHn 接收数据寄存器  [7:0]

波特率配置:  计算公式如下 

当波特率为115200 bps  

实际 总线时钟  100 MHz

总线时钟如下  446页

公式

DIV_VAL = (100M/(115200 * 16)) – 1

    = 53.25

UBRDIV2 [15:0] 波特率 有关  = 53  (公式求出的值的整数部分)

UFRACVALn [3:0] = 4 (小数部分程16后的结果)

2.4 写程序

uart_test------main

#include "exynos_4412.h"

//串口通信
void  uart_init()
{
    //配置GPA1_0和GPA1_1为串口功能
    //[7:4] = 0x2,[3:0]=0x2 ====>[7:0]=0x22
    GPA1.CON = GPA1.CON & ~(0xff<<0) |(0x22<<0);

    //配置串口控制器
    //ULCON寄存器
    //红外模式[6]=0   ,  校验[5:3]=0  ,  停止位[2]=0  , 字长 [1:0]=3
    UART2.ULCON2 = 3;  //0011

    //设置串口工作模式
    //UCON2  发送模式[3:2]=1   接收模式[1:0]=1
    UART2.UCON2 = 5;   //0101

    //波特率配置
    UART2.UBRDIV2 = 53;
    UART2.UFRACVAL2 = 4;

}

//发送一个字节
void putc(char c){
    //UTXH2 发送数据寄存器

    //等待上一个数据发送完成
    //如果UTRSTAT2 中的 1号bit 为1 证明为空,可以发送数据 为0 证明上一个数据还在发就需要阻塞在while
    // while(!(UART2.UTRSTAT2 & (1<<1)));
    while(((UART2.UTRSTAT2>>1) & 0x1)==0);
    UART2.UTXH2 = c;
}
//发送字符串
void puts(char* s){
    while(*s){
        putc(*s++);
    }
}

//接收一个数据
char getc(){
    //等待数据 如果UTRSTAT2 中的0号bit 为1 证明接收到数据 为0就是没接收到
    // while(!(UART2.UTRSTAT2 & (1<<0)));
    while(((UART2.UTRSTAT2>>0) & 0x1)==0);

    //因为URXH2是32位的寄存器 而我们设置的返回值char只有8位,所以通过[ & 0xff ]操作只保留低8位
    return UART2.URXH2 & 0xff;//返回接受的数据
}

int main()
{
    char c;
    uart_init();
    //发送
    puts("hello world\n");

    while(1){
        //接收数据
        c = getc();
        putc(c);
    }
    return 0;
}

3. printf移植: 

模板参考

E:\peixunQianrushi\jiekoubiancheng\笔记\程序模板

3.1 参考示例 

因为我们没有c库,所以用不了printf,所以在这个参考程序中printf被重写了,但是这个printf的功能是写入串口

printf----main.c

#include"exynos_4412.h"
#include"uart.h"


int main()
{
    int a = 100;
    uart_init();
    //这里是发送到串口
    printf("hello!a=%d\r\n",a);
    while(1);
    return 0;
}

4. 使用串口 发送数据  控制LED 亮灭 

例如: n   亮 

  f  灭 

4.1 写法一  

uart_led3-----uart.h

/*************************************************************************
	> File Name: uart.h
	> Author: 
	> Mail: 
	> Created Time: 2018年01月23日 09时44分27秒 HKT
 ************************************************************************/

#ifndef _UART_H
#define _UART_H

void uart_init(void);
void putc(char c);
void puts(const char *p);
char getc();

#endif

uart_led3-----uart.c

/*************************************************************************
	> File Name: uart.c
	> Author: 
	> Mail: 
    > Created Time: 2018年01月23日 09时42分13秒 HKT
 ************************************************************************/

#include"exynos_4412.h"
#include"uart.h"

void uart_init(void)
{
    //引脚功能配置
        //使能引脚为串口功能
    GPA1.CON = (GPA1.CON & ~0xff) | 0x22; 

    //串口控制器配置
        //设置字长,校验,停止位
    UART2.ULCON2 = 0x03;
        //设置串口工作模式
    UART2.UCON2  = 0x05;
        //设置串口波特率 115200
    UART2.UBRDIV2 = 53;
    UART2.UFRACVAL2 = 4;
}

void putc(char c)
{
    while(!(UART2.UTRSTAT2 & 0x02));
    UART2.UTXH2 = c;
}

void puts(const char *p)
{
    while(*p != '\0')
    putc(*p++);
}

//接收一个数据
char getc(){
    //等待数据 如果UTRSTAT2 中的0号bit 为1 证明接收到数据 为0就是没接收到
    while(((UART2.UTRSTAT2>>0) & 0x1)==0);

    //因为URXH2是32位的寄存器 而我们设置的返回值char只有8位,所以通过[ & 0xff ]操作只保留低8位
    return UART2.URXH2 & 0xff;//返回接受的数据
}




uart_led3-----main.c


#include"exynos_4412.h"
#include"uart.h"

//初始化led3
void led3_init()
{
    //配置引脚模式
    GPX1.CON = (GPX1.CON & ~(0xf<<0)) | (0x1 << 0);
    //配置数据寄存器
    // GPX1.DAT |= 1;
    GPX1.DAT &= ~1;
    //配置上下拉寄存器
    GPX1.PUD &= ~(0x3<<0);
}

int main()
{
    //初始化串口
    uart_init();
    //初始化led3
    led3_init();

    while(1){
        char str = getc();
        printf("%c",str);
        if(str == 'n'){//打开
            GPX1.DAT |= 1;
        }else if(str == 'f'){
            GPX1.DAT &= ~1;
        }
    }
    return 0;
}


4.2 写法二

uart_led-----main

写的不全主要看个思路


#include "exynos_4412.h"

void uart_init()
{
	//1.配置GPA1_0 GPA1_1 为对应串口功能
	//[7:4] =0x2 [3:0] = 0x2 ===>  [7:0] = 0X22
	GPA1.CON = (GPA1.CON &~ (0XFF << 0)) | ( 0X22<< 0);
	//2.配置 串口控制器
	//ULCONn [6] = 0,[5:3] = 0,[2] = 0,[1:0] = 3
	UART2.ULCON2 = 3;
	//UCON2 [5] = 0,[4] =0,[3:2] = 1,[1:0] = 1
	UART2.UCON2 = 5;
	//波特率配置
	UART2.UBRDIV2 = 53;
	UART2.UFRACVAL2 = 4;
}

void putc(char c)
{
	//等待上一个数据发送完成
	while( ! (UART2.UTRSTAT2 & (1<<1)) );
	UART2.UTXH2 = c;
}

void puts(char *s)
{
	while(*s) putc(*s++);
}

//接收一个字符
char getc()
{
	//等待数据到来
	while( ! (UART2.UTRSTAT2 & 1) );
	return UART2.URXH2 & 0XFF;
}

//接收一行 接收结束条件1.buf满了 2. '\n'
int gets(char *buf, int size)
{
	int len = 0;
	if(buf == (char *)0 || size <= 1) return -1;
	while(size - 1)
	{
		buf[len] = getc();
		putc(buf[len]); //回显
		len ++, size --;
		if(buf[len-1] == '\r') break;
	}
	//添加结束符号'\0'
	buf[len] = '\0';
	return len;
}


int strncmp(const char *s1,const char *s2, int len)
{
	int ret = 0;
	while(len--)
	{
		ret = *s1++ - *s2++;
		if(ret) return ret;
	}
	return 0;
}



int main()
{
	//char c;
	char buf[100];
	int len = 0;
	uart_init();
	puts("hello world\n");
	while(1)
	{
	//	c = getc();
	//	putc(c);
		len = gets(buf,sizeof(buf) - 1);
		if(len >= 5  && strncmp(buf,"LEDON",5) == 0)
		{//亮LED
			//...
			puts("ledon ok!\n");
		}
	}
    return 0;
}

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

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

相关文章

纳斯达克VS路透社MIFI大屏直投-大舍传媒

纳斯达克VS路透社MIFI大屏直投-大舍传媒 引言 在数字时代的今天&#xff0c;大屏投放成为一种广泛应用的营销手段和传媒方式。纳斯达克大屏和路透社MIFI大屏作为两个重要的投放平台&#xff0c;为企业和机构提供了广告和宣传的机会。 纳斯达克大屏的魅力 纳斯达克大屏位于纽…

Web网页生成桌面应用

前言&#xff1a;网页生成桌面指的是将一个网页保存为桌面应用程序的形式&#xff0c;使得用户可以在桌面上直接打开该网页&#xff0c;而不必通过浏览器打开。这种桌面应用程序一般具有独立的窗口、菜单、工具栏等界面元素&#xff0c;能够提供更加方便快捷的使用体验。 实现…

基于Java的学生宿舍门禁信息管理系统的设计与实现(源码+lw+部署文档+讲解等

目录 前言 详细视频演示 具体实现截图 技术栈 后端框架SpringBoot 前端框架Vue 持久层框架MyBaitsPlus 系统测试 系统测试目的 系统功能测试 系统测试结论 代码参考 数据库代码参考 源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、…

(2024,MLLM,扩散,中文数据集扩散预训练,多模态提示引导微调)UNIMO-G:通过多模态条件扩散进行统一图像生成

UNIMO-G: Unified Image Generation through Multimodal Conditional Diffusion 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 1. 摘要 2. 方法 3. 结果 1. 摘要 现有的文本到图像…

AIGC:让生成式AI成为自己的外脑(文末送书)

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 什么是AIGC?二. AIGC如何运作&#xff1f;2.1 步骤一&#xff1a;收集数据2.…

算法基础之线段树

文章目录 线段树 线段树 线段树的原理十分简单&#xff0c;但是在代码上会相对复杂一点 他也是用来维护一个序列&#xff0c;是一个完全二叉树的形状 对于每一个节点是一个结构体 struct Node {int L,R; int sum; // 以和为例 };假设序列为1到7&#xff0c;那么根节点存的…

5G安卓手机定制_基于天玑900的安卓主板方案

5G安卓手机方案是一款采用联发科MT6877(天玑900)平台的高性能、可运行安卓操作系统的5G智能模块。该手机采用台积电6纳米低功耗工艺&#xff0c;主频高达2.4GHz&#xff0c;内存支持LPDDR5&#xff0c;并支持5G Sub-6GHz全频段和5G双载波聚合技术等多种制式。同时&#xff0c;该…

统计学-R语言-7.4

文章目录 前言非参数检验两个独立样本的Mann-Whitney检验 练习 前言 本片是对非参数检验最后的介绍。 非参数检验 两个独立样本的Mann-Whitney检验 Mann -Whitney检验也称为Mann- Whitney U检验&#xff08;Mann-Whitney U test&#xff09;或称为 Wilcoxon秩和检验&#xf…

Vue-38、Vue中插件使用

1、新建plugins.js文件 2、可以在plugins.js 定义全局过滤器 定义全局指令 定义混入 给vue原型上添加一个方法 export default {install(Vue){console.log("install",Vue);//全局过滤器Vue.filter(mySlice,function (value) {return value.slice(0,4)});//定义全局…

【TCP】传输控制协议

前言 TCP&#xff08;Transmission Control Protocol&#xff09;即传输控制协议&#xff0c;是一种面向连接的、可靠的、基于字节流的传输层通信协议。它由IETF的RFC 793定义&#xff0c;为互联网中的数据通信提供了稳定的传输机制。TCP在不可靠的IP层之上实现了数据传输的可…

【第十六课】哈希表(acwing-841字符串哈希 / 详解 / 优秀的文章推荐 / c++代码)

目录 思想 代码如下 一些解释 1.基数P的选择 2.unsigned long long类型 可能需要看的文章博客 思想 咳咳&#xff0c;感觉这个刚开始第一遍接触的时候很抽象&#xff0c;&#xff0c;&#xff0c;还好网友们很强&#xff0c;有很通俗的解释办法hh。 字符串的哈希核心思…

浅谈WPF之UI布局

一个成功的软件&#xff0c;离不开人性化的UI设计&#xff0c;如何抓住用户第一视觉&#xff0c;让用户产生依赖感&#xff0c;合适优雅的布局必不可少。本文以一些简单的小例子&#xff0c;简述WPF中布局 面板 控件的使用&#xff0c;仅供学习分享使用&#xff0c;如有不足之处…

精品基于Uniapp+ssm基于java的赈灾系统App救灾救助捐赠

《[含文档PPT源码等]精品基于Uniappssm基于java的赈灾系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;ssm 安卓框架&#xff…

【LeetCode每日一题】2865. 美丽塔 I

2024-1-24 文章目录 [2865. 美丽塔 I](https://leetcode.cn/problems/beautiful-towers-i/) 2865. 美丽塔 I 初始化变量 ans 为0&#xff0c;用于记录最大的和值。获取整数列表的长度&#xff0c;保存到变量 n 中。使用一个循环遍历列表中的每个位置&#xff0c;从0到n-1。在循…

交换机跨VLAN交换数据ip跳转分析(不一定对)

在网上看到这样一个实验&#xff1a; 交换机1、交换机2分别连接到一台防火墙上&#xff0c;要求使VLAN 2、VLAN3、VLAN5、VLAN6中的终端可互相访问。 拓补 参考链接 【数通网络交换基础梳理2】三层设备、网关、ARP表、VLAN、路由表及跨网段路由下一跳转发原理_网管型交的机…

一文详解:信息化时代,企业如何进行维护客户关系?

信息化时代&#xff0c;企业如何进行维护客户关系&#xff1f;有什么具体的方法&#xff1f; 以市场为导向&#xff0c;就是以客户为导向&#xff0c;抓住了客户&#xff0c;就抓住了市场&#xff0c;顺应了客户&#xff0c;也就顺应了市场。 在信息化快速发展的今天&#xff0…

JVM/GC复习

JVM/GC JVM(java虚拟机)MATjstack(将正在运行的JVM的线程进行快照并且打印出来)死锁VisualVM工具(监控线程内存使用情况)JMX GC垃圾回收算法1.引用计数法2.标记清除发3.标记压缩算法4.复制算法5.分代算法 收集器1.串行垃圾收集器2.并行垃圾收集器2.CMS垃圾收集器 3.G1垃圾收集器…

使用 LinkAi 打造自己的知识库和数字人

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、LinkAi 介绍 二、文档库 2.1 创建知识库 2.2 配置知识库 2.3 Ai配置 2.4 导入文档 2.5 接入微信 三、扩展 四、总结…

ITSS服务工程师:开启IT职业生涯的金钥匙

&#x1f525;ITSS是中国电子技术标准化研究院推出的&#xff0c;涵盖了“IT服务工程师”和“IT服务经理”的系列培训。它不仅满足GB/T 28827.1的符合性评估要求&#xff0c;还助力IT服务资质升级。 &#x1f3af;“IT服务工程师”培训从服务技术、服务技巧和服务规范三大板块&…

Device Monitoring Studio 串口监控 使用方法

选择串口 添加监控指令 正常监控 调整 监控数据接收的时间和数据量