ARM架构(寄存器点灯)

news2024/9/20 12:38:35

文章目录

  • 前言
  • 一、LED原理图
  • 二、使用寄存器点灯的步骤
  • 三、如何操作寄存器
  • 四、实际操作
    • 1.使能GPIO端口
    • 2.将引脚设置为输出模式
    • 3.设置输出状态
  • 五、全部代码
  • 总结


前言

本篇文章我们来讲解一下如何使用寄存器点亮一个LED灯,一般对于新人来说都是使用HAL库或者标准库来操作的,但是学习寄存器有助于我们了解更加深入的知识,这加会提高我们对ARM架构的理解。

一、LED原理图

在这里插入图片描述
首先第一步我们需要先找到LED的原理图,确定对应的引脚,然后知道是高电平点亮还是低电平点亮。

这里我们用到了三个LED,分别是PB0,PB1,PB5。

二、使用寄存器点灯的步骤

1.使能对应的GPIO

2.引脚模式设置

3.引脚方向设置

4.输出电平设置

这个步骤其实和使用那些库的步骤是一样的,只不过在库中我们总是使用一些结构体来完成这些GPIO的初始化。

三、如何操作寄存器

操作寄存器这里我们使用指针来得到对应寄存器的地址,并对他进行操作。

在ARM中,使用指针操作寄存器时,需要进行读取、改写和写入这三个步骤,以确保正确更新寄存器的特定位,同时不影响其他位。

1.读取寄存器:首先,需要读取寄存器中的当前值。

2.改写寄存器:根据需要改写寄存器的对应位。

3.写入寄存器:修改完成后,将修改好的值再次写入对应的寄存器中。

四、实际操作

这里我们来进行实际的操作,首先我们需要找到STM32的数据手册,在数据手册中我们可以查看到对应寄存器的地址,并且知道如何配置对应的寄存器。

1.使能GPIO端口

在数据手册中的第8章找到时钟使能对应的寄存器:

并且可以从其中得到偏移地址为0x18。
在这里插入图片描述
在第三章中找到对应寄存器的基地址:
在这里插入图片描述
这样我们就可以得到这个寄存器的完整地址了:0x40021000 + 0x18

在这里插入图片描述
在这里可以看到将bit3设置为1可以使能GPIOB端口。

	/* 使能GPIOB */
	pReg = (unsigned int *)(0x40021000 + 0x18);
	*pReg |= (1<<3);

2.将引脚设置为输出模式

在这里插入图片描述
在数据手册中找到第九章,GPIO的寄存器,设置MODE可以将GPIO设置为输入或者输出模式。

找到基地址:0x40010C00
在这里插入图片描述
偏移地址:
在这里插入图片描述
最后得到的地址:0x40010C00 + 0x00

	/* 设置GPIOB0为输出引脚 */
	pReg = (unsigned int *)(0x40010C00 + 0x00);
	*pReg |= (1<<1);
	
	/* 设置GPIOB1为输出引脚 */
	pReg1 = (unsigned int *)(0x40010C00 + 0x00);
	*pReg1 |= (1<<4);
	
	/* 设置GPIOB5为输出引脚 */
	pReg2 = (unsigned int *)(0x40010C00 + 0x00);
	*pReg2 |= (1<<20);	

3.设置输出状态

偏移地址:0x0C
最终地址:0x40010C00 + 0x0C
在这里插入图片描述
这里将需要设置为高电平的引脚,设置寄存器对应的位为1即可。

五、全部代码

main.c


void delay(int d)
{
	while(d--);
}

int main()
{
	unsigned int *pReg;
	
	unsigned int *pReg1;
	
	unsigned int *pReg2;
	
	/* 使能GPIOB */
	pReg = (unsigned int *)(0x40021000 + 0x18);
	*pReg |= (1<<3);
	
	/* 设置GPIOB0为输出引脚 */
	pReg = (unsigned int *)(0x40010C00 + 0x00);
	*pReg |= (1<<1);
	
	/* 设置GPIOB1为输出引脚 */
	pReg1 = (unsigned int *)(0x40010C00 + 0x00);
	*pReg1 |= (1<<4);
	
	/* 设置GPIOB5为输出引脚 */
	pReg2 = (unsigned int *)(0x40010C00 + 0x00);
	*pReg2 |= (1<<20);	

	pReg = (unsigned int *)(0x40010C00 + 0x0C);
	
	pReg1 = (unsigned int *)(0x40010C00 + 0x0C);
	
	pReg2 = (unsigned int *)(0x40010C00 + 0x0C);
	
	while (1)
	{
		/* 设置GPIOB0输出1 */
		*pReg |= (1<<0);
		
		delay(500000);

		/* 设置GPIOB0输出0 */
		*pReg &= ~(1<<0);
		
		delay(500000);		

		/* 设置GPIOB1输出1 */
		*pReg1 |= (1<<1);
		
		delay(500000);

		/* 设置GPIOB1输出0 */
		*pReg1 &= ~(1<<1);
		
		delay(500000);	

		/* 设置GPIOB5输出1 */
		*pReg2 |= (1<<5);
		
		delay(500000);

		/* 设置GPIOB5输出0 */
		*pReg2 &= ~(1<<5);
		
		delay(500000);			
	}
	
	return 0;
}

start.s启动文件:


                PRESERVE8
                THUMB


; Vector Table Mapped to Address 0 at Reset
                AREA    RESET, DATA, READONLY
				EXPORT  __Vectors
					
__Vectors       DCD     0                  
                DCD     Reset_Handler              ; Reset Handler

				AREA    |.text|, CODE, READONLY

; Reset handler
Reset_Handler   PROC
				EXPORT  Reset_Handler             [WEAK]
                IMPORT  main

				LDR SP, =(0x20000000+0x10000)
				BL main

                ENDP 
                
                 END


这个启动文件的内容我们后续再来讲解。

总结

本篇文章就讲解到这里,希望大家能够多加练习,学习寄存器的编程对深入了解ARM架构是有好处的。

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

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

相关文章

SpringBoot3【④ 基础特性】

1. SpringApplication 1.1. 自定义 banner 类路径添加banner.txt或设置spring.banner.location就可以定制 banner推荐网站&#xff1a;Spring Boot banner 在线生成工具&#xff0c;制作下载英文 banner.txt&#xff0c;修改替换 banner.txt 文字实现自定义&#xff0c;个性化…

操作系统面试知识点

1、进程、线程和协程的区别和联系 1、进程是资源调度的基本单位&#xff0c;运行一个可执行程序会创建一个或多个进程&#xff0c;进程就是运行起来的可执行程序 2、线程是程序执行的基本单位&#xff0c;是轻量级的进程。每个进程中都有唯一的主线程&#xff0c;且只能有一个…

机器学习第三课(sklearn接口)

一、sklearn基本知识 中文官网 英文官网 注意&#xff1a;sklearn第三方模块的安装 要用pip install scikit-learn from sklearn.neighbors import KNeighborsClassifier # 1 准备数据 # 训练集的特征数据 2维 x [[-2],[-1],[2],[3],[4]] # 训练集的目标数据 1维 y [0,0,1,…

HTML培训心得体会五篇(合集)

HTML5培训心得一 关于html5培训心得总结? 一&#xff1a;了解HTML5前端开发技术? ?? HTML?指的是超文本标记语言?(Hyper?Text?Markup?Language)&#xff0c;标记语言是一套标记标签?(markup?tag)&#xff0c;HTML?使用标记标签来描述网页。HTML5区别于HTML的标…

北京大学2015计算机学科夏令营上机考试(未完)

A:整数的个数 #include<iostream> using namespace std; int main(){int k,a;cin>>k;int sum10,sum20,sum30;for(int i0;i<k;i){cin>>a;if(a1) sum1;if(a5) sum2;if(a10) sum3;}cout<<sum1<<endl<<sum2<<endl<<sum3;retur…

quiche编译

netty http3使用了rust语言的quiche&#xff0c;quiche使用了c语言的boringssl&#xff0c; 网上没有找到编译好的quiche&#xff0c;只能自己搭建rust环境编译 1、rust安装 见官网https://www.rust-lang.org/tools/install 我是用的是windows的ubuntu&#xff0c;所以直接使…

苹果市值再度突破3万亿美元

KlipC报道&#xff1a;当地时间周五&#xff0c;苹果市值再度突破3万亿美元&#xff0c;这是近43年来&#xff0c;苹果第二次市值达到3万亿。 KlipC的合伙人Andi Duan表示&#xff1a;“得益于苹果股价上涨&#xff0c;以及硅谷银行引发的金融市场动荡&#xff0c;再加上高端IP…

【嵌入式Qt开发入门】如何创建并连接信号与槽

创建信号 我们先新建一个项目&#xff0c;命名为 signal_slot_example&#xff0c;如果还不会新建项目&#xff0c;请回到 【嵌入式Qt开发入门】初识信号与槽查看项目如何建立的。取消勾选*ui 文件&#xff0c;其他步骤不变。 由于信号只需声明&#xff0c;无需定义。所以我们只…

Mac端显示服务器上show的内容

Mac端显示服务器上show的内容 1. 需求描述 在Mac端&#xff08;终端和PyCharm中&#xff09;编写代码&#xff0c;在服务器端运行程序。需要在Mac端显示服务器端运行的内容&#xff0c;比如&#xff0c;运行的视频等。 2. 常见报错 SSH 运行命令时报错示例。 (cv) czjing…

旋转链表:给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。

解题思路&#xff1a; 1.找到原链表的最后一个节点 2.计算链表长度n 3.将原链表的尾节点指向链表的头节点&#xff0c;使链表形成环 4.新链表根据画图可知&#xff0c;会在环的&#xff08;n-k%n&#xff09;的地方断开&#xff0c;这个节点newtail是新链表的尾节点 5.将新…

Ubuntu 20.04 LTS x86_64 安装 stable-diffusion-webui

官网 Stable Diffusion官网 Stability AI 官方github GitHub - Stability-AI/stablediffusion: High-Resolution Image Synthesis with Latent Diffusion Models stable-diffusion-webui github https://github.com/AUTOMATIC1111/stable-diffusion-webui 安装 下载sta…

ruoyi页面切换查询条件保留

场景描述 业务遇到需求&#xff0c;管理平台的页面打开后输入的查询条件、已经点击的页码、已经查询的数据要求保留下来&#xff0c;在tab菜单切换时保留&#xff0c;在关闭菜单时重置清空。 解决方案 1.使用cookie、localStorage或者sessionStorage 这个方式能解决部分需求…

windows10或者Ubuntu20.04内启动USB外接摄像头并拍照

1. windows10系统内启动摄像头并拍照 1.1 把带摄像头的USB接口插到电脑的USB接口上。 1.2 左下角搜索“设备管理器”&#xff0c;并点击&#xff0c;主要是确保笔记本自带的摄像头被禁用&#xff0c;和usb连接的外部摄像头被起用。 1.3 左下角搜索“相机”&#xff0c;并点击拍…

读《effective modern c++》笔记总结

文章目录 一、类型推导与auto模板类型推导ParamType是一个指针或引用&#xff0c;但不是通用引用ParamType是一个通用引用ParamType即不是指针也不是引用数组实参函数实参 auto类型推导 二、decltype的理解三、优先考虑auto而非显示类型声明四、区别使用&#xff08;&#xff0…

大华 海康 宇视 摄像头 onvif协议 调整时间 开发过程 整理

1、onvif官网 查看SetSystemDateAndTime 方法。 2、下载 ONVIF Device Test Tool 工具&#xff0c;使用教程可以 在这查看。 3、根据Test Tool 工具生成的request进行 Send request 测试。 有了这个本质就是http请求了&#xff0c;我认为可以自己写http请求尝试&#xff0c;我…

大地200C

8芯网线 【24&#xff0c;M03&#xff0c;冷却&#xff0c; m35&#xff0c;m34&#xff0c;m33&#xff0c;m32&#xff0c;24】 冷却【m08开&#xff0c;m09关】 M10夹紧M11松开 M18润滑【m127开&#xff0c;m227关】 X轴&#xff1a;5000 3.0A Y轴&#xff1…

Mybatis-Plus学习4 Page分页

ctrl P 查看可填的属性类型 alt 回车 自动填充数据类型 1、使用Page分页需要先配置config类&#xff0c;加上拦截器 Configuration MapperScan("com/learn/mybatisplus/mapper") public class MybatisPlusConfig {Beanpublic MybatisPlusInterceptor mybatisP…

TiDB 升级利器(参数对比)——TiDBA

作者&#xff1a; 啦啦啦啦啦 原文来源&#xff1a; https://tidb.net/blog/299f0bdc 一.背景 针对 LTS 版本&#xff0c;PingCAP 会提供最多至 3 年时间的常规版本更新&#xff0c;以解决版本运行过程中遇到的问题&#xff0c;以及安全相关的漏洞修复。而对于已经结束维护…

Css面试题

快速居中 flex margin:auto translate position padding和maring的区别 作用对象不同&#xff1a; padding是针对自身的 margin是作用于外部对象的 VW和百分比的区别 百分比有继承关系&#xff0c;继承父级 VW只和设备的宽度有关系 块元素和行内元素 行内元素&…

Vuex基础

Vuex介绍 为什么会有Vuex&#xff1f; https://v3.vuex.vuejs.org/zh/ Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 Vue是采用集中式管理组件依赖的共享数…