在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

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

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

相关文章

【网络】网络基础

目录 一、前言 1.计算机网络背景 2.认识协议 二、网络协议初识 1.OSI七层模型 2.TCP/IP五层(或四层)模型 3.网络传输基本流程 4.数据包封装和分用 5.网络中的地址管理 1.IP地址 2.MAC地址 一、前言 1.计算机网络背景 网络之前,我们所有在电脑上的操作都是…

LeetCode题练习与总结:二叉树的中序遍历--94

一、题目描述 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2]示例 2: 输入:root [] 输出:[]示例 3: 输入:roo…

Github学习

1.Git与Github 区别: Git是一个分布式版本控制系统,简单的说就是一个软件,用于记录一个或若干个文件内容变化,以便将来查阅特点版本修订情况的软件。 Github是一个为用户提高Git服务的网站,简单说就是一个可以放代码的地方。Gi…

韩顺平0基础学Java——第10天

p202-233 类与对象(第七章) 成员方法 person类中的speak方法: 1.public表示方法是公开的 2.void表示方法没有返回值 3.speak()中,speak表示方法名,括号是形参列表。 4.大括号为方法体&am…

重塑数据架构:云器Lakehouse如何简化组装式架构实现性能与成本的精益平衡

导读本文将介绍云器科技自研的 Lakehouse 产品。通过本次分享,您将了解云器 Lakehouse 产品特性,了解一体化数据平台如何提升数据处理和数据分析的效率,使之更轻松、更简洁、更高效,了解增量计算如何做到平衡数据新鲜度、查询性能…

DE2-115串口通信

目录 一、 内容概要二、 Hello Nios-II2.1 Nios-II编程2.1.1 硬件Ⅰ 搭建环境Ⅱ 编写代码 2.1.2 软件2.1.3 烧录Ⅰ硬件Ⅱ 软件 2.2 verilog编程 三、 心得体会 一、 内容概要 分别用Verilog和Nios软件编程, 实现DE2-115开发板串口输出“Hello Nios-II”字符到笔记本电脑串口助…

【Shell】shell编程之循环语句

目录 1.for循环 例题 2.while循环 例题 3.until循环 1.for循环 读取不同的变量值,用来逐个执行同一组命令 for 变量 in 取值列表 do 命令序列 done [rootlocalhost ~]# for i in 1 2 3 > do > echo "第 $i 次跳舞" > done 第 1 次跳舞 第 …

使用Pycharm编写Python程序时对基本类结构中方法的重写的两种初步操作方式

使用Pycharm编写Python程序时对基本类结构中方法的重写的两种初步操作方式 Python和其他一些高级面向对象的编程语言中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改&…

闲来装个虚拟机Ubuntu24.04和硬盘分区及挂载

简述 最近ubuntu出新版本了,ubuntu24.04, 俗称高贵食蚁兽。5年前进行Android或者linux开发基本是在windows下的虚拟机中进行。目前,虽然物质基础提高了,功能有独立进行编译、代码管理的服务器了。可以通过ssh登录,但是…

【C++11】C++11类与模板语法的完善

目录 一,新的类功能 1-1,默认成员函数 1-2,强制生成关键字 二,可变参数模板 2-1,模板参数包 2-2,STL容器empalce的相关接口 一,新的类功能 1-1,默认成员函数 C11之前的类中有…

Tomcat添加服务以及设置开机自启

下载地址连接 Index of /dist/tomcat👓 注意点:不要出现中文路径 #环境变量 CATALINA_HOMED:\apache-tomcat-7.0.62 TOMCAT_HOMED:\apache-tomcat-7.0.62 JAVA_HOMED:\tool\jdk1.8.0_111 PATH%CATALINA_HOME%\bin;%CATALINA_HOME%\lib;%CATALINA_HOME%\…

对称加密介绍

一、什么是对称加密 对称密钥算法(Symmetric-key algorithm),又称为对称加密、私钥加密、共享密钥加密,是密码学中的一类加密算法。 对称加密的特点是,在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥。 这…

超越传统游戏:生成式人工智能对游戏的变革性影响

人工智能(AI)在游戏中的应用 游戏产业是一个充满活力、不断发展的领域,人工智能(AI)的融入对其产生了重大影响。这一技术进步彻底改变了游戏的开发、玩法和体验方式。本文分析的重点是传统人工智能和生成式人工智能在游…

网络安全之弱口令与命令爆破(下篇)(技术进阶)

目录 一,什么是弱口令? 二,为什么会产生弱口令呢? 三,字典的生成 四,九头蛇(hydra)弱口令爆破工具 1,破解ssh登录密码 2,破解windows登录密码 3&#xf…

java项目之相亲网站的设计与实现源码(springboot+mysql+vue)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的相亲网站的设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 相亲网站的设计与实…

Excel办公技巧之下拉菜单

在日常办工中,经常需在单元格中输入特定的值,此时我们可以使用下拉菜单解决,输入错误和错误值,可以一劳永逸的解决固定数据输入问题。 使用Excel下拉菜单时,它在数据输入和验证方面发挥着重要作用通过点击单元格的下拉…

权限及权限操作

1.命令行解释器 Linux将命令行解释器称为外壳程序shell 命令行解释器的作用就是将用户输入的指令转换为操作系统能够直接执行的指令。同时将操作系统的反馈转换为用户能看懂的反馈,解决了用户和操作系统沟通成本的问题。与此同时,命令行解释器还能够拦…

乡村旅游指标-最美乡村数、旅游示范县数、旅行社数、景区数、农家乐数(2007-2021年)

01、数据介绍 乡村旅游也是促进乡村经济发展的有效途径。通过发展乡村旅游,可以带动乡村相关产业的发展,提高乡村居民的收入,促进乡村的经济发展和社会进步。此外,乡村旅游还能促进城乡交流,推动城乡统筹发展。 数据…

rt-thread 挂载romfs与ramfs

参考: https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/qemu-network/filesystems/filesystems?id%e4%bd%bf%e7%94%a8-romfs https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutor…

香港虚拟主机哪里可以试用?用于企业建站的

香港虚拟主机适合个人、企业建站,包括外贸企业网站、个人博客网站、中小企业官网等,那么作为新手不知道哪家香港虚拟主机好用的时候,该如何找到可以试用的香港虚拟主机呢? 香港虚拟主机也称作香港空间、香港虚拟空间,…