【裸机开发】UART 串口通信(二)—— 使用 UART 收发数据

2023-11-13

这节其实就是在对上一篇文章涉及到的一些操作进行整理和归纳(不一定完全按照上一篇的顺序来)。


目录

一、UART IO 初始化

二、UART 初始化

1、打开 / 关闭串口

2、软件复位

3、总结:UART 初始化

三、接收数据

四、发送数据


一、UART IO 初始化

IO 初始化其实就是在设置某个引脚复用为 UART,并设置该引脚的电气属性。

void uart1_io_init()
{
    // 设置引脚复用为 uart1
    IOMUXC_SW_MUX_CTL_PAD_UART1_TX_DATA &= ~(0xF);
    IOMUXC_SW_MUX_CTL_PAD_UART1_RX_DATA &= ~(0xF);

    // 配置电气属性
    IOMUXC_SW_MUX_CTL_PAD_UART1_TX_DATA = 0x10B0;
    IOMUXC_SW_PAD_CTL_PAD_UART1_RX_DATA = 0x10B0;
}

二、UART 初始化

1、打开 / 关闭串口

/* 关闭uart1串口 */
void close_uart1()
{
    UART1_UCR1 &= ~(1 << 0);
}
/* 打开uart1串口 */
void open_uart1()
{
    UART1_UCR1 |= (1 << 0);
}

2、软件复位

/* 软件复位 */
void uart1_software_reset()
{
    UART1_UCR2 &= ~(1 << 0);
    while((UART1_UCR2 & 0x01) == 0);    // 等待软复位结束
}

3、总结:UART 初始化

void uart1_init()
{
    // UART IO 初始化
    uart1_io_init();

    // 关闭uart1串口
    close_uart1();

    // uart1 软复位
    uart1_software_reset();

    UART1_UCR1 = 0;
    /*
     * bit 14: 0 禁止自动检测波特率
     */ 
    UART1_UCR1 &= ~(1 << 14);

    /*
     * bit 1: 1 接收使能
     * bit 2: 1 发送使能
     * bit 5: 1 数据位为 8 bit
     * bit 6: 0 停止位占 1 bit
     * bit 8: 0 关闭奇偶校验
     */
    UART1_UCR2 |= ((1 << 1) | (1 << 2) | (1 << 5) | (1 << 14));
    UART1_UCR2 &= ~((1 << 6) | (1 << 8));

    // 复位选择
    UART1_UCR3 |= (1 << 2);

    // 波特率配置
    /*
     * bit 9-7: 101 分频数为1 
     */
    UART1_UFCR &= ~(7 << 7);
    UART1_UFCR |= (5 << 7);
    UART1_UBIR = 71;
    UART1_UBMR = 3124;

    // 打开uart1串口
    open_uart1();
}

三、接收数据

UART1_USR2 的bit 0 可以用于判断数据是否就绪,如果一直没有数据就绪的话,会一直置 0;当数据就绪时,会自动置 1。

/* 接收数据 */
unsigned char readData()
{
    while ((UART1_USR2 & 0x01) == 0);      // 尚未有数据就绪

    return UART1_URXD & 0xFF;
}

四、发送数据

UART1_USR2 的bit 3 可以用于判断上一次的数据是否发送成功,如果没有发送成功会一直置0,先保证之前的数据发送出去;数据发送成功以后,会自动置1。

/* 发送字符 */
void sendCharacter(unsigned char data)
{
    while (((UART1_USR2 >> 3) & 0x01) == 0);        // 上一次的发送还没有完成
    
    UART1_UTXD &= ~0xFF;        // 低 8 位清零
    UART1_UTXD |= (data & 0xFF);
}

/* 发送字符串 */
void sendString(unsigned char* data)
{
    unsigned char* cur = data;
    while (*cur != '\0')            // 字符串以 \0 结尾
    {
        sendCharacter(*(cur++));
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【裸机开发】UART 串口通信(二)—— 使用 UART 收发数据 的相关文章

  • Python自动合并Word文件并添加分页符的方法

    Python自动合并Word文件并添加分页符的方法 在本篇文章中 我们将介绍如何使用Python自动合并多个Word文件 并在合并后的文档中添加分页符 我们将使用Python的python docx库来处理Word文档 该库提供了丰富的功能
  • CMake动态库生成及使用

    命令行生成动态库 现有hello h 和 hello cpp文件 生成动态库 g c fPIC hello cpp hello h c 生成 o文件 fPIC 生成与位置无关的代码 动态库 g shared fPIC o libhello

随机推荐

  • vue——路由之路由跳转、路由传参、路由嵌套、路由模式

    相关认识 后端路由 对于前端的网络请求 不同的pathname 去执行后端的不同业务 前端路由 不同的网址对应各自的页面 vue的前端路由 SPA应用要做出路由效果 就得判断当前网址 然后切换组件 vue router就是专门做切换组件的功
  • 深入浅析TCP/IP——TCP/IP五层模型

    TCP IP五层模型 一 TCP IP五层模型 1 实体层 2 链路层 3 网络层 4 传输层 5 应用层 一 TCP IP五层模型 层与协议的关系 每一层为了完成一种功能 定义了一种规则 这个规则叫作互联网协议 1 实体层 把电脑连接起来
  • 运维面试题-Linux基础篇

    非技术类 你对现在运维工程师的理解以及对其工作的认识 答 运维工程师在公司当中责任重大 需要保证时刻为公司及客户提供最高 最快 最稳定 最安全的服务 运维工程师的一个小小的失误 很有可能会对公司及客户造成重大损失 因此运维工程师的工作需要严
  • GPT大语言模型Alpaca-lora本地化部署实践【大语言模型实践一】

    模型介绍 Alpaca模型是斯坦福大学研发的LLM Large Language Model 大语言 开源模型 是一个在52K指令上从LLaMA 7B Meta公司开源的7B 模型微调而来 具有70亿的模型参数 模型参数越大 模型的推理能力
  • 了解log4j日志平台

    log4j jar 写日志 log4j commonslog logback slf4j 通用的日志平台 推荐使用 还需要引入一个配置文件 log4j properties 需要放入classpath路径下 放在src下会自动加载到bin目
  • regsvr32提示模块加载失败 请确保二进制

    微软官方的一部分解释 https support microsoft com en us kb 249873 关于32位和64位的说明 http csi windows com blog all 73 windows 64 bit 378
  • 2021-05-20

    自我介绍 大家好 我是西安财经大学2019级大二的一名在校生 来自陕西省咸阳市 当时高考完在填报志愿的时候 我雨我的专业 一见钟情 计算机科学科学与技术专业 虽然有很多人告诉我说女孩子学IT这个行业不好 太辛苦太累等等 对于这些我都一笑了之
  • 多项式加法运算(链表实现)

    文章目录 创建结点类型 打印多项式 尾插 插入排序 多项式相加 代码总览 结果展示 创建结点类型 我们用链表存储一个多项式 那么该链表的每一个结点就代表多项式的某一项 所以我们的每一个结点必须包含三个信息 多项式的系数 多项式的指数以及指向
  • tf2报错解决 assertion failed: [predictions must be >= 0] [Condition x >= y did not hold element-wise:]

    环境 tf2 完整报错如下 tensorflow python framework errors impl InvalidArgumentError assertion failed predictions must be gt 0 Con
  • 理解主从设备模式(Master-Slave)

    主从设备模式 主从设备模式也叫做主仆模式英文简称为Master Slave 核心思想是基于分而治之的思想 将一个原始任务分解为若干个语义等同的子任务 并由专门的工作者线程来并行执行这些任务 原始任务的结果是通过整合各个子任务的处理结果形成的
  • 安卓APP_ Fragment(3)—— Fragment的生命周期

    摘自 安卓APP Fragment 3 Fragment的生命周期 作者 丶PURSUING 发布时间 2021 04 16 22 32 12 网址 https blog csdn net weixin 44742824 article d
  • LINUX进程启动时自动挂载调试

    对于某些多进程的应用 子进程是有主进程拉起来的 此时想对子进程的启动流程打断点就比较麻烦 如果在子进程启动时调试器自动挂载就完美了 网上找到了gdbhelpers的开源工具库 其对gdb的现有命令集做了扩展 有一个工具是实现预挂载的 原理也
  • (PPT+官方解读):中国移动5G终端产品2021年要这么干!

    以下内容来自官方解读 1 2020 年终端产品发展回顾 2020 年新冠疫情全球蔓延 生产和生活受到冲击也带来很多改变 应该说这是不平凡的一年 也是在这一年的不断努力之下 中国移动 5G 终端交出了一份还算不错的答卷 中国移动网内 5G 手
  • Html常用正则表达式

    Html常用正则表达式 匹配帐号是否合法 字母开头 允许5 16字节 允许字母数字下划线 a zA Z a zA Z0 9 4 15 验证用户密码 a zA Z w 5 17 正确格式为 以字母开头 长度在6 18之间 只能包含字符 数字和
  • Linux 其他用户(非root用户)设置root权限及免密(Centos7为例)

    在linux系统中我们经常要创建一些非root用户来完成一些特定的操作 有时我们需要执行一些root用户才能执行的命令 这时我们需要给该用户设置root的权限 下面将演示如何操作 1 首先创建一个test用户 root smiletian
  • Postman导出和导入接口

    1 点击Export导出接口 2 点击Export 3 导出成功 4 导入操作 import 5 选择导入文件 7 导入成功
  • vue element的el-select下拉框赋值之后无法选择

    watch监听form applicant applyUnit里值的变化 赋值给form project disposalType 但发现下拉框不能再次选择 watch form applicant applyUnit handler va
  • 2013年9月22日星期日(准备工作:分离ddraw的math和interface)

    在之前 要进行下封装 好吧 先加个类 ddraw math类吧 顺便把ddraw引擎中的几个矩阵弄到ddraw math类中来 让接口和数学相分离开 头文件有这些 pragma once a 2D vertex typedef struct
  • 表单提交时,get,post用哪种方式,如何设定?

    一般来说 使用 HTTP 的 POST 方法来提交表单 因为 POST 方法可以将表单数据作为请求正文发送到服务器 而 GET 方法将表单数据包含在请求 URL 中 在 HTML 中 可以通过在
  • 【裸机开发】UART 串口通信(二)—— 使用 UART 收发数据

    这节其实就是在对上一篇文章涉及到的一些操作进行整理和归纳 不一定完全按照上一篇的顺序来 目录 一 UART IO 初始化 二 UART 初始化 1 打开 关闭串口 2 软件复位 3 总结 UART 初始化 三 接收数据 四 发送数据 一 U