当前位置: 首页 > news >正文

在STM32中用寄存器方式点亮流水灯

文章目录

  • 实验资料
  • 一、对寄存器的理解
    • 1.通俗认识寄存器
    • 2.深入了解寄存器
      • (1)端口配置低寄存器(配置0到7引脚的寄存器)
      • (2)端口配置高寄存器(配置8到15引脚)
    • 3.GPIO口的功能描述
  • 二、配置寄存器点亮流水灯
    • 1.配置寄存器
      • (1)时钟设置
      • (2)配置端口寄存器的输入输出模式
      • (3)配置端口输出数据寄存器
    • 2.完整代码
    • 3.proteus仿真
    • 4.STM32实际效果
  • 三、将PC13的自带灯也引入流水灯
    • 1.添加的代码
    • 2.完整代码
    • 3.proteus仿真
    • 4.STM32实际效果
  • 四、总结
  • 五、参考资料

实验资料

链接:https://pan.baidu.com/s/1tYno7wmj11_bh1-UgL8HTQ?pwd=o1hk
提取码:o1hk

一、对寄存器的理解

1.通俗认识寄存器

首先我们来看一张图。在这里插入图片描述
试想如果没有寄存器,要控制8个LED灯的亮灭那么我们需要8个开关一对一进行控制。扳到ON,控制灯的亮。扳到OFF,控制灯的灭。而单片机中控制的东西太多太多,用开关来控制的话,至少需要成百上千个开关,显然这是不明智的。
因此,我们引入“寄存器”,顾名思义,寄存器,应当是用来寄存东西的而在单片机中的寄存器,就是用来寄存二进制数的。在上面的实例中,我们仅需一个8位寄存器就可以实现对这8个LED的控制。我们拨动开关相当于往寄存器里写数据,我们观察的开关的状态,相当于读取寄存器的数值。因此,一个8位寄存器,可以理解成8个小开关组成。
我们查阅资料可知,寄存器通常是由晶体管组成,它的体积微乎其微,非常适合在CPU中寄存数据。

2.深入了解寄存器

我们已经知道单片机中有很多寄存器。就相当于有很多组“开关”。那么我们如何来管理这些“开关”呢?因此,我们可以利用寄存器的符号(名字)地址

下图是与I/O口相关的寄存器
在这里插入图片描述
**注意:STM32单片机中的寄存器是32位的。(有些寄存器没有用高16位寄存器,比如:端口输出数据寄存器)**但是,不管哪款单片机,道理都是相通的。
在这里插入图片描述

下表是STM32F10xxx的寄存地址分布情况
在这里插入图片描述
STM32C8T6芯片共有48个引脚
在这里插入图片描述
具体功能如下:
在这里插入图片描述
我们可以看出GPIOA/B都有从0到15,都是16个引脚。
在GPIO配置寄存器中,每个引脚的模式由4位进行配置,16个端口就需要64位。

(1)端口配置低寄存器(配置0到7引脚的寄存器)

在这里插入图片描述
①CNF:configure。配置对应端口的输入输出模式。
②MODE:配置对应端口的输出速度。

(2)端口配置高寄存器(配置8到15引脚)

在这里插入图片描述
思考:为什么GPIOx_CRH的起始地址会偏移了4个字节(32位),而GPIOx_CRL却没有?
这是因为GPIOx_CRH恰好接在GPIOx_CRL后面,GPIOx_CRL恰好占了32位。

3.GPIO口的功能描述

在这里插入图片描述

在STM32中,GPIO(通用输入输出)接口通常是与APB2(Advanced Peripheral Bus 2,即高级外设总线)关联,是APB2的外设。

二、配置寄存器点亮流水灯

1.配置寄存器

框起来的是要用的寄存器的地址。
在这里插入图片描述

(1)时钟设置

由上面我们知道,GPIO口是APB2总线的外设。故我们在手册中要去查找APB2的外设时钟使能寄存器进行设置。

在这里插入图片描述
观察到时钟配置是置1打开,置0关闭。
在这里插入图片描述
因为本次实验要同时用到三个端口,要配置三个时钟,那我就不客气了,我直接打开GPIOA、B、C三个口的时钟。

RCC->APB2ENR=0x0000001C; //配置三个端口的时钟

(2)配置端口寄存器的输入输出模式

以配置GPIOA2引脚为例
在这里插入图片描述

GPIOA->CRL=0x00000300;//配置GPIOA2的输入输出模式

(3)配置端口输出数据寄存器

在这里插入图片描述
ODR:OutputDataRegister

GPIOA->ODR=0x00000000; //低电平点亮

2.完整代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"int main()
{//配置三个口的时钟RCC->APB2ENR=0x0000001C; 				//给GPOIA、B、C口配置时钟//配置GPIOA2口的输出模式及输出电平GPIOA->CRL=0x00000300;					//使用GPIOA2引脚//GPIOA->ODR=0x00000000; 			    //GPIOA2引脚低电平点亮GPIOA->ODR=0x00000004; 				//GPIOA2引脚高电平熄灭//配置GPIOB12口的输出模式及输出电平GPIOB->CRH=0x00030000;		 			//使用GPIOB12引脚//GPIOB->ODR=0x00000000; 	 			//GPIOB12引脚低电平点亮GPIOB->ODR=0x00001000; 		 		//GPIOB12引脚高电平熄灭//配置GPIOC15口的输出模式及输出电平GPIOC->CRH=0x30000000;					//使用GPIOC15引脚//GPIOC->ODR=0x00000000; 				//GPIOC15引脚低电平点亮GPIOC->ODR=0x00008000;    			//GPIOc15引脚高电平熄灭while(1){GPIOA->ODR=0x00000000; 			    //GPIOA2引脚低电平点亮Delay_s(1);GPIOA->ODR=0x00000004; 				//GPIOA2引脚高电平熄灭GPIOB->ODR=0x00000000; 	 			//GPIOB12引脚低电平点亮Delay_s(1);GPIOB->ODR=0x00001000; 		 		//GPIOB12引脚高电平熄灭GPIOC->ODR=0x00000000; 				//GPIOC15引脚低电平点亮Delay_s(1);GPIOC->ODR=0x00008000;    			//GPIOc15引脚高电平熄灭}
}

3.proteus仿真

在这里插入图片描述

4.STM32实际效果

2024年5月5日001

与预期结果一致。

三、将PC13的自带灯也引入流水灯

太简单了,仍然去手册里查找GPIOC13相应寄存器的值进行配置,加上几行代码不就OK了!

1.添加的代码

注意:这两者的端口输出模式须同时配置,不然前面配置的会被覆盖,导致只配置成功后面配置的。

	//配置GPIOC13口和GPIOC15口的输出模式及输出电平GPIOC->CRH=0x30300000;					//使用GPIOC13和15引脚//GPIOC->ODR=0x00000000; 				//GPIOC13和15引脚低电平点亮GPIOC->ODR=0x0000A000; 					//GPIOC13和15仍然保持高电平
		GPIOC->ODR=0x00008000; 				//GPIOC13引脚低电平点亮,GPIOC15仍然保持高电平Delay_s(1);GPIOC->ODR=0x0000A000;    			//GPIOC13和GPIOC15引脚高电平熄灭

2.完整代码

#include "stm32f10x.h"                  // Device header
#include "Delay.h"int main()
{//配置三个口的时钟RCC->APB2ENR=0x0000001C; 				//给GPOIA、B、C口配置时钟//配置GPIOA2口的输出模式及输出电平GPIOA->CRL=0x00000300;					//使用GPIOA2引脚//GPIOA->ODR=0x00000000; 			    //GPIOA2引脚低电平点亮GPIOA->ODR=0x00000004; 				//GPIOA2引脚高电平熄灭//配置GPIOB12口的输出模式及输出电平GPIOB->CRH=0x00030000;		 			//使用GPIOB12引脚//GPIOB->ODR=0x00000000; 	 			//GPIOB12引脚低电平点亮GPIOB->ODR=0x00001000; 		 		//GPIOB12引脚高电平熄灭//配置GPIOC13口和GPIOC15口的输出模式及输出电平GPIOC->CRH=0x30300000;					//使用GPIOC13和15引脚//GPIOC->ODR=0x00000000; 				//GPIOC13和15引脚低电平点亮GPIOC->ODR=0x0000A000; 					//GPIOC13和15仍然保持高电平while(1){GPIOA->ODR=0x00000000; 			    //GPIOA2引脚低电平点亮Delay_s(1);GPIOA->ODR=0x00000004; 				//GPIOA2引脚高电平熄灭GPIOB->ODR=0x00000000; 	 			//GPIOB12引脚低电平点亮Delay_s(1);GPIOB->ODR=0x00001000; 		 		//GPIOB12引脚高电平熄灭GPIOC->ODR=0x00008000; 				//GPIOC13引脚低电平点亮,GPIOC15仍然保持高电平Delay_s(1);GPIOC->ODR=0x0000A000;    			//GPIOC13和GPIOC15引脚高电平熄灭GPIOC->ODR=0x00002000; 				//GPIOC15引脚低电平点亮,GPIOC13仍然保持高电平Delay_s(1);GPIOC->ODR=0x0000A000;    			//GPIOC13和GPIOC15引脚高电平熄灭}
}

3.proteus仿真

在这里插入图片描述

4.STM32实际效果

2024年5月2日002

与预期结果一致。

四、总结

做完实验之后,我发现通过使用寄存器的方式点亮流水灯是比较底层的方法,也是比较笨的方法。但是,它能让我们更深刻地理解,STM32单片机中寄存器大致有哪些,对应的位置又在哪。
通过本实验,一步一步自己配置要用的寄存器数据,其实挺有意思的。当在同时使用GPIOC15和PC15端口时,我一开始是一个一个端口去配置模式的,发现只有后面配置那个能亮,最后仔细检查发现这两者得同时配置,否则,后面配置的会覆盖前面配置的。
本人才疏学浅,仍然有一处不太明白,就是我Proteus仿真的时候,为啥灯亮灭得那么快?而在板子上实验的时候又是符合预期的。希望各位大佬不吝赐教。

五、参考资料

1.https://www.bilibili.com/video/BV1Lr4y137Yx/?spm_id_from=333.337.search-card.all.click&vd_source=f8a9b6d51762562d444c27daa5c18d81
2.https://www.bilibili.com/video/BV1th411z7sn/?p=5&spm_id_from=333.880.my_history.page.click

相关文章:

在STM32中用寄存器方式点亮流水灯

文章目录 实验资料一、对寄存器的理解1.通俗认识寄存器2.深入了解寄存器(1)端口配置低寄存器(配置0到7引脚的寄存器)(2)端口配置高寄存器(配置8到15引脚) 3.GPIO口的功能描述 二、配…...

TCP(TCP客户端、服务器如何通信)

一、TCP介绍 TCP的特点: 面向连接的协议:TCP是一种可靠的、面向连接的协议,在通信之前需要建立连接,以确保数据的可靠传输。这意味着在传输数据之前,发送方和接收方之间需要建立一条可靠的连接通道。流式协议&#x…...

pdf 文件版面分析--PyMuPDF (python 文档解析提取)

1.介绍 PyMuPDF 和Fitz 是用于Python中处理PDF文件的相关模块。Fitz是P有MuPDF的字模块。提供一个简化和封装版本的P有MuPDF功能。 关系: PyMuPDF: 提供广泛的功能,用于操作PDF文档, 包括方便的高级函数与底层操作Fitz &#x…...

sql update 多表关联 inner join

当您需要更新一个表或者多个表中的数据,而多个表又存在关联时,可以使用 INNER JOIN 子句将多个表关联起来,并使用 SET更新。 格式如下: UPDATE table1 INNER JOIN table2 ON table1.column1 table2.column1 SET table1.column2…...

【OceanBase诊断调优】—— 租户资源统计项及其查询方法

本文主要介绍 OceanBase 数据库中租户资源统计项及其查询方法。 适用版本 OceanBase 数据库 V4.1.x、V4.2.x 版本。 CPU 资源统计项 逻辑 CPU 使用率(线程处理请求的时间占比)。 通过虚拟表 __all_virtual_sysstat 在 SYS 系统租户下,查看…...

【一键录音,轻松转换:用Python打造个性化音频记录工具】

在数字化时代,音频记录已成为日常学习、工作和娱乐不可或缺的一部分。想象一下,只需简单按下几个键,即可随时随地捕捉灵感,记录会议要点,或是珍藏孩子的童言稚语。本文将引领您步入Python编程的奇妙世界,展示如何借助几个强大的库,构建一个既简单又实用的音频录制及转换…...

Java类与对象(一)

类的定义与使用 在Java中使用关键字class定义一个类,格式如下: class 类名{// 成员变量/字段/属性//成员方法/行为 }Java中类和c语言中的结构体有点类似, 在Java中类名一般采用大驼峰(每个首字母大写)的形式&#xf…...

python中的装饰器,例子说明

在Python中,嵌套装饰器是指在一个函数上应用多个装饰器。每个装饰器都可以为函数添加一些特定的功能。以下是一个稍微复杂一些的例子,我们将创建一个记录日志和验证权限的嵌套装饰器。 ### 例子:记录日志和权限验证的嵌套装饰器 假设我们正…...

Leetcode经典题目之用队列实现栈

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 目录 1、题目展示2、题目分析3、完整代码演示4、结语 1、题目展示 前面我们了解过如何实现队列…...

DBSCAN聚类算法

目录 背景DBSCAN算法DBSCAN算法原理DBSCAN算法基本步骤DBSCAN算法调优DBSCAN算法优缺点参考文献 背景 如果有车队在某一片区域经常规律性作业,现在要让你来绘制这一片的路网,你会选择让一辆车从头到尾把所有路网跑一遍还是基于历史轨迹点通过技术手段构…...

【tauri】安装

https://blog.csdn.net/freewebsys/article/details/136092092 1 安装nodejs curl -sL https://deb.nodesource.com/setup_18.x -o nodesource_setup.sh sudo bash nodesource_setup.sh sudo apt install nodejs # 查看版本 node -v2 安装webkit2 sudo apt update sudo apt i…...

(Java)心得:LeetCode——19.删除链表的倒数第 N 个节点

一、原题 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出:[]示例 3&…...

树莓派安装opencv

安装opencv 上述步骤完成后,输入以下代码(基于python3) sudo apt-get install python3-opencv -y不行的话,试试换源,然后 sudo apt-get update成功! 测试opencv是否安装成功 输入 python3 然后再输入 import cv2 没有报错就…...

bert 的MLM框架任务-梯度累积

参考:BEHRT/task/MLM.ipynb at ca0163faf5ec09e5b31b064b20085f6608c2b6d1 deepmedicine/BEHRT GitHub class BertConfig(Bert.modeling.BertConfig):def __init__(self, config):super(BertConfig, self).__init__(vocab_size_or_config_json_fileconfig.get(vo…...

Nginx配置/.well-known/pki-validation/

当你需要在Nginx上配置.well-known/pki-validation/时,这通常是为了支持SSL证书的自动续订或其他验证目的。以下是配置步骤: 创建目录结构: 在你的网站根目录下创建一个名为.well-known的目录(SSL证书申请之如何创建/.well-known/…...

iOS LQG开发框架(持续更新)

基本规则 开发便利性为前提,妥协性能可维护性为前提可读性MVC各部分职责一定要清晰,controll类里面功能尽量抽离成helper,功能一定要清晰,这个非常重要,对代码可读性提升非常高方法内部尽量使用局部变量,最…...

Python 自动化脚本系列:第3集

21. 使用 cryptography 自动化文件加密 Python 的 cryptography 库提供了一种安全的方式,使用对称加密算法对文件进行加密和解密。你可以自动化加密和解密文件的过程来保护敏感数据。 示例:文件加密和解密 假设你想使用对称加密算法加密一个文件&…...

Matlab-粒子群优化算法实现

文章目录 一、粒子群优化算法二、相关概念和流程图三、例题实现结果 一、粒子群优化算法 粒子群优化算法起源于鸟类觅食的经验,也就是一群鸟在一个大空间内随机寻找食物,目标是找到食物最多的地方。以下是几个条件: (1) 所有的鸟都会共享自己的位置以及…...

python 新特性

文章目录 formatted字符串字面值formatted字符串支持 字符串新方法变量类型标注二进制表示中数字为1的数量统计字典的三个方法新增mapping属性函数zip()新增strict参数dataclass字典合并match 语法 formatted字符串字面值 formatted字符串是带有’f’字符前缀的字符串&#xf…...

十一、Redis持久化-RDB、AOF

Redis提供了两种持久化数据的方式。一种是RDB快照,另一种是AOF日志。RDB快照是一次全量备份,AOF日志是连续的增量备份。RDB快照是以二进制的方式存放Redis中的数据,在存储上比较紧凑;AOF日志记录的是对内存数据修改的指令文本记录…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

WebRTC调研

WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...

工厂方法模式和抽象工厂方法模式的battle

1.案例直接上手 在这个案例里面,我们会实现这个普通的工厂方法,并且对比这个普通工厂方法和我们直接创建对象的差别在哪里,为什么需要一个工厂: 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类: 两个发…...

精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑

精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑 在电子商务领域,转化率与网站性能是决定商业成败的核心指标。今天,我们将深入解析不同类型电商平台的转化率基准,探讨页面加载速度对用户行为的…...

C#中用于控制自定义特性(Attribute)

我们来详细解释一下 [AttributeUsage(AttributeTargets.Class, AllowMultiple false, Inherited false)] 这个 C# 属性。 在 C# 中,Attribute(特性)是一种用于向程序元素(如类、方法、属性等)添加元数据的机制。Attr…...

npm install 相关命令

npm install 相关命令 基本安装命令 # 安装 package.json 中列出的所有依赖 npm install npm i # 简写形式# 安装特定包 npm install <package-name># 安装特定版本 npm install <package-name><version>依赖类型选项 # 安装为生产依赖&#xff08;默认&…...