ARM架构(寄存器点灯)

文章目录

  • 前言
  • 一、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启动文件:

PRESERVE8THUMB; Vector Table Mapped to Address 0 at ResetAREA    RESET, DATA, READONLYEXPORT  __Vectors__Vectors       DCD     0                  DCD     Reset_Handler              ; Reset HandlerAREA    |.text|, CODE, READONLY; Reset handler
Reset_Handler   PROCEXPORT  Reset_Handler             [WEAK]IMPORT  mainLDR SP, =(0x20000000+0x10000)BL mainENDP END

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

总结

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

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

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

相关文章

Vue3 Diff 算法简易版

背景 学习一下Vue3中的diff算法~ 逻辑概述 这个算法的过程不算太复杂&#xff1a; 同时从新旧列表的头部遍历&#xff0c;找出相同的节点&#xff0c;则patch&#xff0c;否则就停止遍历&#xff1b;同时从新旧列表的尾部遍历&#xff0c;找出相同的节点&#xff0c;则patc…

ASM Java字节码操作框架入门学习 输出Hello World

ASM Java字节码操作框架入门学习 输出Hello World 1.类信息 package org.example;public class Hello {public void say(){System.out.println("hello world");}}查看字节码信息 //动态设置栈大小ClassWriter classWriter new ClassWriter(ClassWriter.COMPUTE_FR…

在vscode中配置git bash终端

将以下配置添加到vscode中的settings.json中 "terminal.integrated.profiles.windows": {"PowerShell": {"source": "PowerShell","icon": "terminal-powershell"},"Command Prompt": {"path"…

Vue3+Vite 项目配置 vue-router,并完成路由模块化

前言 我的技术栈&#xff1a;Vue3 Vite TypeScirpt我的包管理工具&#xff1a;pnpm&#xff08;v8.6.6&#xff09;我的 node.js 版本&#xff1a;v16.14.0 一、安装vue-router pnpm install vue-router二、创建页面 在 /src/views 文件夹下创建 home、login、test文件夹…

【数据挖掘从入门到实战】——专栏导读

目录 1、专栏大纲 &#x1f40b;基础部分 &#x1f40b;实战部分 &#x1f40b;竞赛部分 2、代码附录 数据挖掘专栏&#xff0c;包含基本的数据挖掘算法分析和实战&#xff0c;数据挖掘竞赛干货分享等。数据挖掘是从大规模数据集中发现隐藏模式、关联和知识的过程。它结合…

绝了!阿里大佬的“Redis深度核心笔记“,从基础到源码,全是精华

Redis怎么学习&#xff1f; 我晕了&#xff0c;竟然没人好好回答怎么学习Redis&#xff0c;全都是介绍redis的长文。。。这还让人怎么学。我来分享下我自学Reids看过的资料吧 为什么要学习Redis&#xff1f; Redis 是互联网技术架构在存储系统中使用得最为广泛的中间件&…

【环境配置】Conda报错 requests.exceptions.HTTPError

问题&#xff1a; conda 创建新的虚拟环境时报错 Collecting package metadata (current_repodata.json): done Solving environment: done# >>>>>>>>>>>>>>>>>>>>>> ERROR REPORT <<<<<<…

Installation request for phpoffice/phpspreadsheet

办法 composer update --ignore-platform-reqs

SwiftUI的优缺点

2019年WWDC大会上&#xff0c;苹果在压轴环节向大众宣布了基于Swift语言构建的全新UI框架——SwiftUI&#xff0c;开发者可通过它快速为所有的Apple平台创建美观、动态的应用程序。推荐大量使用struct代替类。 SwiftUI 就是⼀种声明式的构建界面的用户接口工具包。 SwiftUI使用…

会话机制【Cookie 和 Session】,登陆页面的模拟实现

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启JavaEE的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 目录 前言 Cookie 和 Session 是什么 Cookie…

Android Binder进程间通讯原理分析

Binder IPC原理 Android系统是基于Linux内核开发的。Linux开发提供了丰富的进程间通讯机制&#xff0c;例如管道、信号、消息队列、共享内存、插口&#xff08;Socket&#xff09; 。而Binder是一套新的通讯工具。 Binder通信采用了c/s架构&#xff0c;所以我们包含了 Client&…

LwIP系列(5):TCP 3次握手+4次挥手+状态机转换

前言 TCP的3次握手、4次挥手以及TCP状态机&#xff0c;是TCP的核心概念&#xff0c;我们在分析LwIp中TCP相关代码流程&#xff0c;也需要熟悉这些流程&#xff0c;本文就详细介绍这些概念。 TCP 3次握手、应用数据交互、4次挥手完整流程 TCP 为什么是3次握手&#xff0c;而不…