ARM架构(寄存器点灯)

这篇具有很好参考价值的文章主要介绍了ARM架构(寄存器点灯)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

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

一、LED原理图

ARM架构(寄存器点灯),ARM架构详解,arm开发,架构,单片机
首先第一步我们需要先找到LED的原理图,确定对应的引脚,然后知道是高电平点亮还是低电平点亮。

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

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

1.使能对应的GPIO

2.引脚模式设置

3.引脚方向设置

4.输出电平设置

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

三、如何操作寄存器

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

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

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

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

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

四、实际操作

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

1.使能GPIO端口

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

并且可以从其中得到偏移地址为0x18。
ARM架构(寄存器点灯),ARM架构详解,arm开发,架构,单片机
在第三章中找到对应寄存器的基地址:
ARM架构(寄存器点灯),ARM架构详解,arm开发,架构,单片机
这样我们就可以得到这个寄存器的完整地址了:0x40021000 + 0x18

ARM架构(寄存器点灯),ARM架构详解,arm开发,架构,单片机
在这里可以看到将bit3设置为1可以使能GPIOB端口。

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

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

ARM架构(寄存器点灯),ARM架构详解,arm开发,架构,单片机
在数据手册中找到第九章,GPIO的寄存器,设置MODE可以将GPIO设置为输入或者输出模式。

找到基地址:0x40010C00
ARM架构(寄存器点灯),ARM架构详解,arm开发,架构,单片机
偏移地址:
ARM架构(寄存器点灯),ARM架构详解,arm开发,架构,单片机
最后得到的地址: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
ARM架构(寄存器点灯),ARM架构详解,arm开发,架构,单片机
这里将需要设置为高电平的引脚,设置寄存器对应的位为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架构是有好处的。文章来源地址https://www.toymoban.com/news/detail-555279.html

到了这里,关于ARM架构(寄存器点灯)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Arm汇编---寄存器

    寄存器:r0~r15, sp, lr, sb, sl, fp, ip, pc 条件码:eq, ne, hs, lo, mi, pl, vs, vc, hi, ls, ge, lt, gt, le, al ------------------------------------------ 一、数据寄存器 --------------------------------------------- ------------------------------------------ 二、指针寄存器 --------------------------------------------- --------------------

    2024年02月02日
    浏览(47)
  • ARM寄存器组织

     ARM有37个32位长的寄存器: 1个用做PC(Program Counter); 1个用做CPSR(Current Program Status Register); 5个用做SPSR(Saved Program Status Registers); 30个通用寄存器。 ARM处理器共有37个寄存器,被分为若干个组(BANK),这些寄存器均为32位的寄存器。6个状态寄存器,用以标识CPU的工作状

    2024年02月01日
    浏览(78)
  • ARM寄存器组

    CM3 拥有通用寄存器 R0‐R15 以及一些特殊功能寄存器。 R0-R7也被称为低组寄存器,所有指令可以访问它们,它们的字长为32位,复位后的初始值是不可预料的。 R8-R12也被称为高组寄存器,所有指令可以访问它们,它们的字长为32位,复位后的初始值是不可预料的。 R13寄存器中

    2024年02月10日
    浏览(50)
  • ARM 寄存器

    Cortex A 系列的 ARM 处理器共有 40 个 32 位寄存器,其中 33 个为通用寄存器,7 个为状态寄存器。用户模式和系统模式共用同一组寄存器。 一、未分组寄存器 R0~R7 有些寄存器是所有运行模式共用的,如 R0~R7,它们被称为未分组寄存器。 在所有运行模式下,未分组寄存器都指向同

    2024年02月02日
    浏览(48)
  • ARM处理器有哪些工作模式和寄存器?各寄存器作用是什么?ARM异常中断处理流程?

    快速学习嵌入式开发其他基础知识? 返回专栏总目录 《嵌入式工程师自我修养/C语言》 Tip📌:鼠标悬停双虚线/句,可获得更详细的描述   ARM处理器有多种工作模式,如下表所示。应用程序正常运行时,ARM处理器工作在 用户模式(User mode) ,当程序运行出错或有中

    2024年02月21日
    浏览(133)
  • ARM中的寄存器

    ARM工作模式 ARM有8个基本的工作模式 User 非特权模式,一般在执行上层的应用程序时ARM处于该模式 FIQ 当一个高优先级中断产生后ARM将进入这种模式 IRQ 当一个低优先级中断产生后ARM将进入这种模式 SVC 当复位或执行软中断指令后ARM将进入这种模式 Abort 当产生存取异常时ARM将进

    2024年02月03日
    浏览(43)
  • 12.3 ARM寄存器组织

    目录 ARM寄存器组织(一) 寄存器 概念 作用 分类 ARM寄存器 ARM寄存器组织(二) 专用寄存器 R15(PC,Program Counter) R14(LR,Link Register) R13(SP,Stack Pointer) ARM寄存器组织(三) CPSR寄存器 ARM寄存器组织(一) 寄存器 概念 寄存器是处理器内部的存储器,没有地址 C语言中register存储在寄

    2024年02月13日
    浏览(40)
  • ARM编程模型-寄存器组

    Cortex A系列ARM处理器共有40个32位寄存器,其中33个为通用寄存器,7个为状态寄存器。usr模式和sys模式共用同一组寄存器。 通用寄存器包括R0~R15,可以分为3类: 未分组寄存器R0~R7 分组寄存器R8~R14、R13(SP) 、R14(LR) 程序计数器PC(R15)、R8_fiq-R12_fir为快中断独有 在不同模式下,名称相同的

    2024年02月10日
    浏览(50)
  • ARM64 寄存器、常用汇编指令收集

    ARM64 有34个寄存器,包括31个通用寄存器、SP、PC、CPSR。 寄存器 位数 描述 x0-x30 64bit 通用寄存器,如果有需要可以当做32bit使用:WO-W30 FP(x29) 64bit 保存栈帧地址(栈底指针) LR(x30) 64bit 通常称X30为程序链接寄存器,保存子程序结束后需要执行的下一条指令 SP 64bit 保存栈指针,使用

    2023年04月20日
    浏览(44)
  • 【ARM】——当前程序状态寄存器 CPSR

    Current Program Status Register 即 CPSR,当前程序状态寄存器,可以在任何处理器模式下被访问。它包含了条件标志位、中断禁止位,当前处理器模式标志以及其他的一些控制和状态位。 除了 usr 和 sys 模式外,每一种处理器模式下都有一个专用的物理寄存器,称为 SPSR(备份程序状态寄

    2024年02月03日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包