【裸机开发】UART 串口通信(一)—— 寄存器解析

news2024/11/16 7:31:41

目录

一、认识 UART

1、概念

2、帧格式

二、IO 复用为 UART 寄存器解析

1、原理图分析

2、寄存器解析

三、UART 相关寄存器解析

1、UART1_UCR1~4

2、UART1_USR1~2

3、波特率配置

4、UART1_URXD

5、UART1_UTXD


一、认识 UART

1、概念

UART 是一种通用的串行、异步通信总线,该总线有两条数据线,TXD 用于发送数据,RXD用于接收数据,可以实现全双工的发送和接收,在嵌入式系统中常用于主机与辅助设备之间的通信。

2、帧格式

UART帧格式如下:

空闲位:没有任何数据的传输(默认维持在高电平)

起始位:表示要开始发送数据了,此时会变为低电平

数据位:一般有8位,代表一个字节。

校验位:方便接收方核对数据是否被篡改(可有可无)

停止位:表示一帧数据的结束。相当于告知对方数据发送完毕,重新回到高电平(空闲状态)

二、IO 复用为 UART 寄存器解析

既然涉及到 IO,那就需要考虑配置引脚复用为 UART 功能。

1、原理图分析

首先在底板原理图中找到 USB USART 模块,现在电脑上更多的还是 USB 接口,所以便催生出了许多串口TTL转USB 的芯片(如CH340、PL2303) 

然后我们再去核心板找一下 UART1_RXD 和 UART1_TXD 连接到了核心板的哪两个引脚。

因此,我们需要找到和 UART1 相关,而且和 TXD、RXD 相关的寄存器。

2、寄存器解析

既然涉及到引脚复用,那就涉及到复用配置和电气属性配置。

  • IO 复用
    • IOMUXC_SW_MUX_CTL_PAD_UART1_TX_DATA
    • IOMUXC_SW_MUX_CTL_PAD_UART1_RX_DATA

  • 配置电气属性
    • IOMUXC_SW_PAD_CTL_PAD_UART1_TX_DATA
    • IOMUXC_SW_PAD_CTL_PAD_UART1_RX_DATA
/************ 配置 IO 复用 **********/
寄存器: IOMUXC_SW_MUX_CTL_PAD_UART1_TX_DATA
基地址: 0x20E0084
初始化操作:
    IOMUXC_SW_MUX_CTL_PAD_UART1_TX_DATA &= ~(0xF);

寄存器: IOMUXC_SW_MUX_CTL_PAD_UART1_RX_DATA
基地址: 0x20E0088
初始化操作:
    IOMUXC_SW_MUX_CTL_PAD_UART1_RX_DATA &= ~(0xF);

/************ 配置电气属性 **********/
// 主要参考之前 LED 的电气属性配置
寄存器: IOMUXC_SW_PAD_CTL_PAD_UART1_TX_DATA
基地址: 0x20E0310
初始化操作:
    IOMUXC_SW_MUX_CTL_PAD_UART1_TX_DATA = 0x10B0;

寄存器: IOMUXC_SW_PAD_CTL_PAD_UART1_RX_DATA
基地址: 0x20E0314
初始化操作:
    IOMUXC_SW_PAD_CTL_PAD_UART1_RX_DATA = 0x10B0;

电气属性配置参考:LED 驱动寄存器解析 

三、UART 相关寄存器解析

下面是和 UART 初始化相关的寄存器:

  • UARTx_UCR1~4:串口配置寄存器。串口使能、数据位位数、停止位位数等。
  • UARTx_USR1~2:串口状态寄存器。可用于判断是否接收到数据、数据是否发送完毕等。
  • UARTx_UFCR、UARTx_UBIRUARTx_UBMR:搭配使用,用于配置波特率

和 UART 实际应用相关的寄存器:

  • UARTx_URXD:保存接收到的数据、接收是否存在错误等
  • UARTx_UTXD:保存用于发送的数据

1、UART1_UCR1~4

UARTx_UCR1:

        ① bit 0:UART 关闭 / 使能。(0:禁止   1:使能)

        ② bit 14:自动检测波特率使能。这里设为禁止,因为后面我们会通过寄存器手动设置波特率

UARTx_UCR2:

        ① bit 0:软复位。重置发射机、接收机、所有的FIFO以及相关寄存器。

         ② bit 1:接收机使能(接收数据使能。0:禁止    1:使能)

         ③ bit 2:发射机使能(发送数据使能。0:禁止    1:使能)

         ④ bit 5:设置数据位长度(不含起始位、停止位、校验位。0:数据位为7位  1:数据位为8位)

         ⑤ bit 6:设置停止位长度(0:停止位为1位   1:停止位为2位)

         ⑥ bit 7:设置奇偶校验(0:偶校验  1:奇校验)

         ⑦ bit 8:校验使能(0:禁止  1:使能)

         ⑧ bit 14:是否无视RTS引脚(0:使用RTS引脚   1:无视RTS引脚)

UARTx_UCR3:

        ① bit 2:复用选择。如果UART是某个引脚复用的,那么该位需要被置1

UARTx_UCR4(没有需要配置的位)

寄存器: UART1_UCR1
基地址: 0x2020080
初始化操作: 
    /*
     * bit 0: 0 初始禁止(等其他寄存器配置完了再使能)
     * bit 14: 0 禁止自动检测波特率
     */
    UART1_UCR1 &= ~(1 << 0);
    UART1_UCR1 &= ~(1 << 14);

寄存器: UART1_UCR2
基地址: 0x2020084
初始化操作:
    /*
     * bit 0: 0 软复位(放在其他配置之前,等待软复位结束再配置其他寄存器)
     * bit 1: 1 接收使能
     * bit 2: 1 发送使能
     * bit 5: 1 数据位为 8 bit
     * bit 6: 0 停止位占 1 bit
     * bit 8: 0 关闭奇偶校验
     * bit 14: 1 无视RTS引脚(无需硬件流控)
     */
    UART1_UCR2 &= ~(1 << 0);
    while((UART1_UCR2 & 0x01) == 0);    // 等待软复位结束
    UART1_UCR2 |= ((1 << 1) | (1 << 2) | (1 << 5) | (1 << 14));
    UART1_UCR2 &= ~((1 << 6) | (1 << 8));

寄存器: UART1_UCR3
基地址: 0x2020088
初始化操作: 
    UART1_UCR3 |= (1 << 2);        // 只要被复用为 UART1 功能,该位需置1

寄存器: UART1_UCR4
基地址: 0x202008C

2、UART1_USR1~2

这里我们主要关注的是 UARTx_USR2 中的 bit 0 和 bit 3

  • bit 0:数据是否准备就绪(是否接收到数据)
  • bit 3:数据是否发送完毕
寄存器: UART1_USR2
基地址: 0x2020098

3、波特率配置

波特率的计算公式如下。主要涉及到以下三个寄存器,我们主要设置的是:

  • UARTx_UFCR:设置 uart 时钟的分频数。
  • UARTx_UBIR:bit 15-0 
  • UARTx_UBMR:bit 15-0 

(1) Ref Freq

UART 的时钟源来自系统时钟PLL3(480MHz),经过 6 分频和 1 分频以后,得到的uart_clk = 80MHz。

UART 内部还可以再次分频,最终得到的就是 Ref Freq

(2) 寄存器配置

假设我们要设置的波特率是 115200,内部不分频(UARTx_UFCR = 1),因此,接下来需要确定的是 UBMR 和 UBIR。直接公布答案,数字是凑出来的。

  • UARTx_UFCR = 1
  • UBIR = 71
  • UBMR = 3124
寄存器: UART1_UFCR
基地址: 0x2020090
初始化操作:
    /*
     * bit 9-7: 101 分频数为1 
     */
    UART1_UFCR &= ~(7 << 7);
    UART1_UFCR |= (5 << 7);

寄存器: UART1_UBIR
基地址: 0x20200A4
初始化操作:
    UART1_UBIR = 0;
    UART1_UBIR = 71;

寄存器: UART1_UBMR
基地址: 0x20200A8
初始化操作:
    UART1_UBMR = 0;
    UART1_UBMR = 3124;

4、UART1_URXD

寄存器: UART1_URXD
基地址: 0x2020000
获取接收数据: UART1_URXD & 0xFF

5、UART1_UTXD

寄存器: UART1_UTXD
基地址: 0x2020040
设置发送内容: 
    UART1_UTXD &= ~0xFF;        // 低 8 位清零
    UART1_UTXD |= val;          // val 表示要填入的发送内容

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

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

相关文章

web自动化测试如何实现(二)

目录 主流的自动化方案 web自动化测试环境如何搭建 1.安装selenium &#x1f381;更多干货 完整版文档下载方式&#xff1a; 主流的自动化方案 怎么进行选择&#xff1a; 如果有前端开发基础&#xff1a;cypress 如果只打算测试web端&#xff1a;playwright 除此之外&a…

【运维工程师学习】Linux常用命令

Linux常用命令 验证系统版本验证系统类型&#xff08;32位or64位&#xff09;验证分区情况验证CPU配置验证内存配置文件操作1、pwd2、cd3、ls 如何像将ll定义为ls -l的别名&#xff0c;这样去设置定义别名文件操作&#xff08;mkdir、rm、cp、mv&#xff09;文本编辑&#xff0…

Spring专家课程Day03_SpringMVC概述

文章目录 一、SpringMVC 项目搭建1、SpringMVC 简介2、SpringMVC的核心组件和执行流程3、SpringMVC的项目创建&#xff08;Idea&#xff09;3.1 Maven中创建 二、Thymeleaf试图_显示注册试图三、控制器接收表达数据四、接受get请求参数_RequestParm&#xff1b;总结&#xff1a…

2023年网络安全比赛--Web渗透测试国赛篇(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.获取Apache的版本号作为Flag值(例如:5.2.14)提交; 2.获取Samba服务器的版本号作为Flag值(例如:5.0.22)提交; 3.获取系统的内核版本号作为Flag值(例如:2.6.18)提交 4.网站根…

计算机网络 - 第一章(上)

1.1_1 概念及功能_哔哩哔哩_bilibili1.1_1 概念及功能是王道计算机考研 计算机网络的第2集视频&#xff0c;该合集共计76集&#xff0c;视频收藏或关注UP主&#xff0c;及时了解更多相关视频内容。https://www.bilibili.com/video/BV19E411D78Q?p2&spm_id_frompageDriver&…

提高 pyecharts 生成的网页的加载速度

使用 Pyecharts 生成的可视化作品是 HTML 的形式&#xff0c;需要使用特定的 js 代码。如果生成完全离线可用的文件&#xff0c;文件里会包含大量的 js 代码&#xff0c;文件会过大不利于分享。如果生成没有 js 代码的文件&#xff0c;则默认在 pycharts.org 上加载相应的 js&a…

十一、云尚办公系统-微信公众号

云尚办公系统&#xff1a;微信公众号 B站直达【为尚硅谷点赞】: https://www.bilibili.com/video/BV1Ya411S7aT 本博文以课程相关为主发布&#xff0c;并且融入了自己的一些看法以及对学习过程中遇见的问题给出相关的解决方法。一起学习一起进步&#xff01;&#xff01;&…

处理机调度

在多道程序环境下&#xff0c;内存中存在着多个进程&#xff0c;进程的数目往往多于处理机的数目。这就要求系统能按某种算法&#xff0c;动态地将处理机分配给一个处于就绪状态的进程&#xff0c;使之执行。分配处理机的任务是由处理机调度程序完成的。 对于大型系统运行时的…

Vue事件处理@传参

错误写法&#xff1a;将showInfo()函数直接写在vm外面。 <body><div id"root"><h2>欢迎来到{{name}}大学</h2><!--v-on: 当。。。。的时候click 点击事件时候去找showInfo这个函数--><button v-on:click"showInfo">…

图灵学院:用 Explain 查看 SQL 的执行计划

文章目录 一、Explain 概述1.1 Explain 含义及作用1.2 Explain 的基本用法 二、Explain 返回列详解2.1 数据准备2.2 id 列2.3 select_type 列2.3.1 simple2.3.2 primary2.3.3 subquery2.3.4 dependent subquery2.3.5 derived2.3.6 union2.3.7 dependent union2.3.8 union resul…

【保姆级】Redis安装教程(Windows版)

Redis安装教程&#xff08;Windows版&#xff09; 文章目录 Redis安装教程&#xff08;Windows版&#xff09;1.下载安装包2. 安装注意事项3. 注意事项4. 登录Redis客户端5. 停止Redis服务附&#xff1a;详细安装步骤附&#xff1a;RESP&#xff08;Redis桌面管理&#xff09;使…

掌握Tampermonkey,让网页玩出新花样

掌握Tampermonkey&#xff0c;让网页玩出新花样 何为Tampermonkey?Tampermonkey有何神通&#xff1f;操作示例 今天我要向朋友们介绍一个超酷的浏览器插件&#xff0c;Tampermonkey。我把它称之为一根神奇的魔法棒&#xff0c;可以让你对网页的玩法、样式和功能实现自定义。 熟…

windows环境下安装zookeeper

安装 下载地址&#xff1a;Apache Downloads 注意&#xff1a;zookeeper的安装路径不要有中文&#xff0c;建议也不要有空格 文件路径如下&#xff1a; 生成并修改zoo.cfg文件 复制zookeeper的conf目录下的zoo_simple.cfg文件&#xff0c;并重命名为zoo.cfg 修改zoo.cfg文件…

nx.draw报错 ‘_AxesStack‘ object is not callable

文章目录 前言解决办法1、关掉梯子&#xff01;&#xff01;&#xff01;2、更新pip3、更新networkx库和matplotlib库4、再次执行代码画图成功 总结 前言 用Networkx画图时报错&#xff1a; ‘_AxesStack‘ object is not callable。 解决办法 1、关掉梯子&#xff01;&#…

项目计划工具:自动生成项目周期计划的利器,写方案项目计划再也不需要为计算工期而烦恼了

在项目管理中&#xff0c;制定一个合理的项目计划是确保项目顺利进行的关键。然而&#xff0c;对于复杂的项目来说&#xff0c;手动编制项目计划表往往会非常耗时且容易出错。幸运的是&#xff0c;现代项目管理工具的出现解决了这个问题。本文将介绍一种强大的项目计划工具&…

网卡突然自动关闭

故障现象&#xff1a;主机突然不通&#xff0c;登录服务器看网卡的状态是down 解决方案&#xff1a; 1、尝试重启网卡&#xff0c;发现不行&#xff0c;干脆重启服务还是不行 service network restart reboot ifup eth0 #报错如下2、根据报错上网搜了下&#xff0c;猜测网络…

解决bug:Multiple assets emit different content to the same filename index.html

问题描述 同事将他的代码发给我&#xff0c;我下载依赖并用npm run serve运行项目过程中&#xff0c;出现Conflict: Multiple assets emit different content to the same filename index.html的报错 原因分析&#xff1a; 可能是文件在创建打包过程中&#xff0c;文件路径有中…

实现联动滚动

序言 在垂直滑动的过程中可以横向滚动内容。 效果 代码 就一个工具类就行了。可以通过root view向上查找recycleView。自动添加滚动监听。在子view完全显示出来以后&#xff0c;才分发滚动事件。这样用户才能看清楚第一个。 需要一个id资源 <?xml version"1.0&qu…

如何启动Sigrity Power DC直流压降仿真分析工具

如何启动Sigrity Power DC直流压降仿真分析工具 Sigrity Power DC是一款十分强大的直流压降仿真分析工具,用它可以直观和准确的模拟出实际应用场景。 下面介绍如何打开POWER DC 这款工具 首先确保电脑上安装好了Candence打开Candence软件的安装目录

华为手机是如何通过限制风险应用的安装,来保护你的手机的?

你有没有遇到过这种情况&#xff1a;在用手机刷短视频、刷文章的时候&#xff0c;看到感兴趣的广告&#xff0c;点击下载了应用。或者听朋友推荐&#xff0c;在网页上搜索下载了某款应用&#xff0c;结果安装的时候&#xff0c;系统却提示应用有风险无法安装&#xff1f; 为什么…