1、操控UART寄存器实现输出功能

        在这一章里,重点需要了解如何通过寄存器操控GPIO、UART,使得MCU通过UART总线输出字符,实现打印功能。

一、GPIO相关寄存器

        如果开发板上引脚资源够用的话,并不需要额外配置GPIO的复用功能。但如果想要复用GPIO为某一路UART的功能引脚,就需要了解如何操作GPIO的相关寄存器了。

        GPIO 寄存器通常属于外设寄存器的一部分,其在芯片的数据手册中会详细列出对应的内存映射地址。比如,GPIO 寄存器组的基地址可能为 0x10012000。在实际操作中,通过该基地址及各个寄存器的偏移量,可以访问和控制对应的硬件功能。这些偏移量通常以特定的单位(如字节或字)表示,允许程序通过对特定寄存器地址的读写操作来控制 GPIO 引脚的状态、模式、配置等功能。

#define GPIOA_BASE 0x10012000

         在查询到 GPIO 外设的基地址后,还需要了解各个寄存器的具体偏移地址。例如,用于控制 GPIO 引脚输入输出方向的寄存器通常位于偏移地址 0x00 处,用于读取 GPIO 引脚输入电平的寄存器通常位于偏移地址 0x04 处,而配置引脚复用功能的寄存器可能位于偏移地址 0x1C 处。通过了解这些偏移地址,可以定义适当的宏来访问和修改相应寄存器的值。通过基地址与偏移地址的组合,能够精确地对对应寄存器进行读写操作,以实现 GPIO 引脚的配置与控制。

#define GPIOA_REG(reg) ((volatile uint32_t *)(GPIOA_BASE + reg))

        其中volatile关键字主要用于告知编译器某个变量的值可能会被外部因素改变,因此不应对该变量进行优化。确保每次访问时都是直接从内存中读取变量的值。

        因此在配置复用功能时,只需要对应的修改0x1C处 管理GPIO复用功能的寄存器即可。

*(GPIOA_REG(MUXCFG)) &= (~((uint32_t)3<<gpio_mux_cfg_shift[gpio_pin]));
*(GPIOA_REG(MUXCFG)) |= (af_fun[gpio_pin]<<gpio_mux_cfg_shift[gpio_pin]);

 二、UART相关寄存器

        一般来说,MCU 通常会配备多个 UART 外设,每个 UART 外设都拥有独立的寄存器组。根据实际需求,你需要查阅芯片文档,确定对应 UART 外设的寄存器基地址,以便进行相应的配置和操作。

#define UART1_BASE 0x10023000

         UART有几个必须要配置的参数,这是收发端能够正常通信的关键。包括波特率(每秒发送bit数)、数据位、停止位、奇偶校验位。这4个参数需要收发端一致,否则无法正常收发数据。在配置波特率时,涉及到三个寄存器,分别是DLL(偏移地址:0x00)、DLM(偏移地址:0x04)、LCR(偏移地址:0x0C)。

        根据数据手册得,我们需要先将LCR寄存器第7位置1,从而允许对DLL和DLM寄存器的操控。 随后根据波特率计算公式得到DLL、DLM寄存器的值。其中DLL存储除数低8位,DLM存储除数高8位。

uint32_t mcu_clk = 2000000;
uint32_t divisor = mcu_clk / baud - 1;
*UART_REG(LCR)= 0x80;//使能操控DLL寄存器
*UART_REG(DLM) = (divisor >> 8 )& 0xFF;
*UART_REG(DLL) = (divisor) & 0xFF;

        对于数据位、停止位、奇偶校验位的操作如下:

    uint32_t stopbit_val = (stopbit == 1) ? 0x0 : 0x1;uint32_t parity_val = (parity_en==1) ? 1 : 0;*UART_REG(LCR) = 0X03 | (stopbit_val << 2);*UART_REG(LCR) |= (parity_val << 3);

三、收发字符 

        UART收发字符也需要操控相关寄存器,即RBR(偏移地址:0x00)、THR(偏移地址:0x00)、LSR(偏移地址:0x14)。可以看到RBR、THR、和上述DLL寄存器共用一个偏移地址。MCU通过LCR寄存器的第7位判断具体操纵的哪个寄存器。为1则操纵DLL配置波特率。为0则操纵RBR、THR控制数据收发。

最简单的发送方式如下,即 往RBR寄存器里写入字符:

void Uart_putc(char c)
{*(UART_REG(THR)) = (uint8_t)c;return;
}
void Uart_puts(char *s)
{while (*s) {Uart_putc(*s++);}
}

最简单的回显输入字符的过程如下:首先从接收缓冲区读取输入字符,然后将该字符发送到发送缓冲区。在此过程中,可以通过读取 LSR(Line Status Register) 寄存器的 第 0 位(Receiver Data Ready, RDR)来判断是否有新字符已被接收。只有在接收到字符后,才能继续进行后续的处理和发送。

uint32_t Uart_CheckLSR()
{return *(UART_REG(LSR)) & 1;
}    
while (1)
{while (Uart_CheckLSR() == 0);Uart_putc(Uart_getc());
}

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

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

相关文章

leetcode 1843 可疑银行账户(postgresql)

需求 表: Accounts -------------------- | Column Name | Type | -------------------- | account_id | int | | max_income | int | -------------------- account_id 是表主键。 每行包含一个银行账户每月最大收入的信息。 表: Transactions ------------------------ |…

【开源代码】图像水印移除-依赖python-tensorflow

下载源码 git clone https://github.com/zuruoke/watermark-removal创建conda环境 conda create -n tensorflow_gpu python=3.7 conda activate tensorflow_gpu conda install tensorflow-gpu==1.15

PyQt信号槽实现页面的登录与跳转 #页面进一步优化

将登录框中的取消按钮使用信号和槽的机制&#xff0c;关闭界面。 将登录按钮使用信号和槽连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为"123456",如果账号密码匹配成功&#xff0c;当前界面关…

自动化立体仓库项目任务调度系统中任务流程可视化实现

在运维自动化平台中,任务系统无疑是最核心的组成部分之一。它承担着所有打包编译、项目上线、日常维护等运维任务的执行。通过任务系统,我们能够灵活地构建满足不同需求的自定义任务流。早期的任务流后端采用了类似列表的存储结构,根据任务流内子任务的排序依次执行,尽管通…

ros sensor_msgs::Imu详细介绍 Eigen::Vector3d 详细介绍

1.ros sensor_msgs::Imu详细介绍 sensor_msgs::Imu 是 ROS&#xff08;Robot Operating System&#xff09;中用于表示惯性测量单元&#xff08;IMU&#xff09;数据的消息类型。IMU 是一种传感器&#xff0c;通常用于测量物体的线性加速度、角速度和方向信息。以下是 sensor_…

WEB安全 PHP学习

PHP基础 PHP编码显示问题 header ("Content-type: text/html; charsetgb2312"); header("Content-Type: text/html;charsetutf-8"); windows需要使用gbk编码显示 源码是 <?php header ("Content-type: text/html; charsetgb2312"); sys…

11.爬虫

前言&#xff1a; 正则表达式的作用&#xff1a; 作用一&#xff1a;校验字符串是否满足规则 作用二&#xff1a;在一段文本中查找满足要求的内容 一.Pattern类和Matcher类&#xff1a; 1.Pattern类&#xff1a;表示正则表达式 a.因此获取Pattern对象就相当于获取正则表达式…

Visual Studio 2022 项目配置常用选项

作为一名C++开发者,经常需要配置第三方库,今天来跟大家截图一下,方便大家快速配置: 头文件包含目录: 或者: 库文件包含目录:

如何搭建JMeter分布式集群环境来进行性能测试

在性能测试中&#xff0c;当面对海量用户请求的压力测试时&#xff0c;单机模式的JMeter往往力不从心。如何通过分布式集群环境&#xff0c;充分发挥JMeter的性能测试能力&#xff1f;这正是许多测试工程师在面临高并发、海量数据时最关注的问题。那么&#xff0c;如何轻松搭建…

Kafka从指定时间开始消费数据

需求-故障定位&#xff1a;flink消费kafka数据&#xff0c;某个时间点漏数据 背景&#xff1a;kafka数据保留3天&#xff0c;如果第二天&#xff0c;发现程序异常导致数据丢失&#xff0c;需要定位是topic源头无数据&#xff0c;还是程序处理出现异常。 # 1, 设置一个新的gro…

WebRover :一个功能强大的 Python 库,用于从 Web 内容生成高质量的数据集,专为训练大型语言模型和 AI 应用程序而设计。

2024-11-30 &#xff0c;由Area-25团队开发的一个专门用于生成高质量网络内容数据集的Python库。该数据集旨在为大型语言模型&#xff08;LLM&#xff09;和人工智能应用的训练提供丰富的数据资源。 数据集地址&#xff1a;WebRover Dataset|自然语言处理数据集|AI模型训练数据…

计算机毕业设计hadoop+spark民宿推荐系统 民宿数据分析可视化大屏 民宿爬虫 民宿大数据 知识图谱 机器学习 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

云原生数据库 PolarDB

PolarDB 是阿里云推出的一款云原生数据库&#xff0c;旨在为企业提供高性能、高可靠性的数据库解决方案。它基于云计算环境设计&#xff0c;特别适用于云上的大规模数据处理和存储需求。PolarDB 是一种兼具关系型数据库&#xff08;RDS&#xff09;和分布式数据库特性的新型数据…

Eureka和Zookeeper、Nacos的区别

目录 一、Eureka与Zookeeper的区别 适用场景&#xff1a; 架构设计&#xff1a; 功能特性&#xff1a; 社区生态&#xff1a; 二、Eureka与Nacos的区别 接口方式&#xff1a; 实例类型&#xff1a; 健康检测&#xff1a; 服务发现&#xff1a; 一致性与可用性&#…

工程无法进行造价鉴定时,应如何确定工程价款?

工程因缺乏施工资料无法进行造价鉴定的&#xff0c;应如何确定工程价款? 阅读提示&#xff1a;工程造价鉴定是建设工程纠纷中最为常用的鉴定&#xff0c;而该鉴定需要以施工图纸、监理日志等材料作为基础。时常出现因保管不当、时间久远等原因&#xff0c;造成施工资料不齐全…

opencv常用图像处理操作

OpenCV 处理图像的通用流程通常包括以下几个步骤&#xff0c;根据具体需求可以调整或跳过某些步骤。以下是一个通用的框架&#xff1a; 读取图像 加载图像文件到内存中以进行后续处理。 import cv2 读取图像 image cv2.imread(‘image.jpg’) # 彩色图像 gray_image cv2…

微服务的负载均衡可以通过哪些组件实现

微服务的负载均衡可以通过多种组件来实现&#xff0c;以下是一些常见的负载均衡组件及其特点&#xff1a; Nginx&#xff1a; Nginx是一款轻量级的HTTP和反向代理服务器&#xff0c;也是一个高性能的负载均衡器。它支持多种负载均衡算法&#xff0c;如轮询、加权轮询、IP哈希等…

zookeeper在确认config无误后仍处于standalone模式的解决方法

jps查看是否有QuorumPeerMain进程 停止服务后该进程仍然存在&#xff0c;输入&#xff1a; ps -ef | grep QuorumPeerMain | grep -v grep | awk {print $2} | xargs kill 之后再启动一次进程 bin/zkServer.sh start 查看状态 bin/zkServer.sh status 发现报错解决&#…

mac中全局 flutter fvm 控制版本遇到的不生效问题解决

1、下载 dart pub global activate fvm 或者 brew tap leoafarias/fvmbrew install fvm fvm use 3.22.1 上面的每次运行都需要加fvm flutter 我觉得麻烦 我期望的是修改全局的 那么就需要使用到fvm global 命令 如&#xff1a; fvm global 3.24.0 但是我发现flutter --vers…

eltable el-table 横向 滚动条常显

又遇到了难受的问题&#xff0c;el-table嵌入在一个div里面&#xff0c;结果因为内容太多,横向、纵向我都得滚动查看&#xff01; 结果发现横向滚动时只能让它纵向触底后才能进行横向操作&#xff0c;这就很变态&#xff0c;明显不符合用户操作习惯。如下图&#xff1a; 要先纵…