【ARM -- stm32 汇编代码点亮LED灯】

news2025/1/10 11:15:18

ARM -- stm32 汇编代码点亮LED灯

  • 实现过程
    • 查询开发手册
      • 分析RCC章节
      • 分析GPIO章节
    • 编写代码

实现过程

查询开发手册

分析RCC章节

一、确定RCC基地址
在这里插入图片描述
二、分析RCC_MP_AHB4ENSETR寄存器
在这里插入图片描述
1、RCC_MP_AHB4ENSETR寄存器的功能是使能GPIO组相关控制器;
2、RCC_MP_AHB4ENSETR地址:基地址+偏移地址 =0x5000A28;
2,、使能GPIO组,将第四位置一;

分析GPIO章节

一、寄存器的作用
在这里插入图片描述
二、各个寄存器分析
基地址+偏移地址

1、GPIOx_MODER
在这里插入图片描述
设置PE10引脚为输出模式:将[21:20]置为01;
2、GPIOx_OTYPER
在这里插入图片描述
设置PE10引脚为推挽输出类型:将[10]置为0;
3、GPIOx_OSPEEDR
在这里插入图片描述
设置PE10引脚为低速输出模式:将[21:20]置为00;
4、GPIOx_PUPDR
在这里插入图片描述
设置PE10引脚为禁止外接上下拉电阻:将[21:20]置为00;
5、GPIOx_ODR
在这里插入图片描述
设置PE10引脚输出高低电频:
[10]=0 >>>>低电平LED熄灭
[10]=1 >>>>高电平LED点亮

编写代码

.text 
.global _start
_start: 
	/**********LED1点灯LED1----->PE10/
LED1_INIT:
	/**************RCC章节*************/
	@1.通过RCC_MP_AHB4ENSETR寄存器设置GPIOE时钟使能 0x50000A28[4] = 1
	ldr r0,=0x50000A28
	ldr r1,[r0]
	orr r1,r1,#(0x1 << 4)
	str r1,[r0]

	/**************GPIO章节************/
	@1.通过GPIOE_MODER寄存器设置PE10引脚为输出模式 0x50006000[21:20] = 01
	ldr r0,=0x50006000
	ldr r1,[r0]
	and r1,r1,#(~(0x3<<20))
	orr r1,r1,#(0x1<<20)
	str r1,[r0]

	@2.通过GPIOE_OTYPER寄存器设置PE10引脚为推晚输出模式 0x50006004[10] = 0
	ldr r0,=0x50006004
	ldr r1,[r0]
	and r1,#(~(0x1<<10))
	str r1,[r0]
	@3.通过GPIOE_OSPEEDR寄存器设置PE10引脚为低速输出模式 0x50006008[21:20] = 00
	ldr r0,=0x50006008
	ldr r1,[r0]
	and r1,#(~(0x3<<20))
	str r1,[r0]
	@4.通过GPIOE_PUPDR寄存器设置PE10引脚禁止上下拉电阻 0x5000600C[21:20] = 00
	ldr r0,=0x5000600C
	ldr r1,[r0]
	and r1,#(~(0x3<<20))
	str r1,[r0]

LED2_INIT:
	@1.通过RCC_MP_AHB4ENSETR寄存器设置GPIOE时钟使能 0x50000A28[5] = 1
	ldr r0,=0x50000A28
	ldr r1,[r0]
	orr r1,r1,#(0x1 << 5)
	str r1,[r0]
	@1.通过GPIOE_MODER寄存器设置PF10引脚为输出模式 0x50007000[21:20] = 01
	ldr r0,=0x50007000
	ldr r1,[r0]
	and r1,r1,#(~(0x3<<20))
	orr r1,r1,#(0x1<<20)
	str r1,[r0]

	@2.通过GPIOE_OTYPER寄存器设置PF10引脚为推晚输出模式 0x50007004[10] = 0
	ldr r0,=0x50007004
	ldr r1,[r0]
	and r1,#(~(0x1<<10))
	str r1,[r0]
	@3.通过GPIOE_OSPEEDR寄存器设置PF10引脚为低速输出模式 0x50007008[21:20] = 00
	ldr r0,=0x50007008
	ldr r1,[r0]
	and r1,#(~(0x3<<20))
	str r1,[r0]
	@4.通过GPIOE_PUPDR寄存器设置PF10引脚禁止上下拉电阻 0x5000700C[21:20] = 00
	ldr r0,=0x5000700C
	ldr r1,[r0]
	and r1,#(~(0x3<<20))
	str r1,[r0]

LED3_INIT:
	@1.通过RCC_MP_AHB4ENSETR寄存器设置GPIOE时钟使能 0x50000A28[4] = 1
	ldr r0,=0x50000A28
	ldr r1,[r0]
	orr r1,r1,#(0x1 << 4)
	str r1,[r0]

	@1.通过GPIOE_MODER寄存器设置PE8引脚为输出模式 0x50006000[17:16] = 01
	ldr r0,=0x50006000
	ldr r1,[r0]
	and r1,r1,#(~(0x3<<16))
	orr r1,r1,#(0x1<<16)
	str r1,[r0]

	@2.通过GPIOE_OTYPER寄存器设置PE8引脚为推晚输出模式 0x50006004[8] = 0
	ldr r0,=0x50006004
	ldr r1,[r0]
	and r1,#(~(0x1<<8))
	str r1,[r0]

	@3.通过GPIOE_OSPEEDR寄存器设置PE10引脚为低速输出模式 0x50006008[17:16] = 00
	ldr r0,=0x50006008
	ldr r1,[r0]
	and r1,#(~(0x3<<16))
	str r1,[r0]
	@4.通过GPIOE_PUPDR寄存器设置PE10引脚禁止上下拉电阻 0x5000600C[17:16] = 00
	ldr r0,=0x5000600C
	ldr r1,[r0]
	and r1,#(~(0x3<<16))
	str r1,[r0]

loop:
	bl LED1_ON
	bl delay_1s
	bl LED1_OFF
	bl delay_1s

	bl LED2_ON
	bl delay_1s
	bl LED2_OFF
	bl delay_1s
	
	bl LED3_ON
	bl delay_1s
	bl LED3_OFF
	bl delay_1s
	
	b loop

LED1_ON:
	@1.通过GPIOE_ODR寄存器设置PE10引脚输出高电平 0x50006014[10] = 1
	ldr r0,=0x50006014
	ldr r1,[r0]
	orr r1,r1,#(0x1<<10)
	str r1,[r0]
	mov pc,lr

LED1_OFF:
	@1.通过GPIOE_ODR寄存器设置PE10引脚输出低电平 0x50006014[10] = 0
	ldr r0,=0x50006014
	ldr r1,[r0]
	and r1,r1,#(~(0x1<<10))
	str r1,[r0]
	mov pc,lr

LED2_ON:
	@1.通过GPIOE_ODR寄存器设置PF10引脚输出高电平 0x50007014[10] = 1
	ldr r0,=0x50007014
	ldr r1,[r0]
	orr r1,r1,#(0x1<<10)
	str r1,[r0]
	mov pc,lr

LED2_OFF:
	@1.通过GPIOE_ODR寄存器设置PF10引脚输出低电平 0x50007014[10] = 0
	ldr r0,=0x50007014
	ldr r1,[r0]
	and r1,r1,#(~(0x1<<10))
	str r1,[r0]
	mov pc,lr


LED3_ON:
	@1.通过GPIOE_ODR寄存器设置PE8引脚输出高电平 0x50006014[8] = 1
	ldr r0,=0x50006014
	ldr r1,[r0]
	orr r1,r1,#(0x1<<8)
	str r1,[r0]
	mov pc,lr

LED3_OFF:
	@1.通过GPIOE_ODR寄存器设置PE8引脚输出低电平 0x50006014[8] = 0
	ldr r0,=0x50006014
	ldr r1,[r0]
	and r1,r1,#(~(0x1<<8))
	str r1,[r0]
	mov pc,lr

@ 大概1s的延时函数
delay_1s:
	mov r3, #0x10000000
	mm:
	cmp r3, #0
	subne r3, r3, #1
	bne mm
	mov pc,lr

.end

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

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

相关文章

07第四章:01_常用注解

常用注解 1、Table 作用&#xff1a;建立实体类和数据库表之间的对应关系。 默认规则&#xff1a;实体类类名首字母小写作为表名&#xff0c;如 Employee -> employee 表 用法&#xff1a;在 Table 注解的 name 属性中指定目标数据库的表名&#xff1b; 案例&#xff1…

WPF依赖属性、附加属性、属性继承、类型转换详解

依赖属性 依赖属性回调方法与参数 具有依赖属性的类必须继承自DependencyObject&#xff0c;定义依赖属性要有2个步骤 //1属性包装器&#xff0c;目的是为了向正常属性一样使用依赖属性 public int Name {get { return (int)GetValue(NameProperty); }set { SetValue(NamePr…

国家“数据安全三认证”图解来了

二十大指引新时代新征程。蓝图已经绘就&#xff0c;号角已经吹响&#xff0c;新征程是充满光荣和梦想的远征。二十大报告深刻阐明了实现中华民族伟大复兴的一系列重大问题&#xff0c;系统擘画了以中国式现代化推进民族复兴的宏伟蓝图&#xff0c;是引领中华民族伟大复兴的政治…

论文导读 | GPU上的动态图数据管理技术浅析

一、背景介绍 随着相关技术的发展&#xff0c;图计算与分析系统在大量场景中得到应用。同时&#xff0c;为了解决图规模巨大等因素导致的性能下降问题&#xff0c;研究人员利用GPU这一新型计算硬件&#xff0c;设计了大量高效的图计算与分析解决方案。GPU提供的高并发计算能力…

我司何晓磊受邀参加东盟与中日韩中小企业人工智能产业论坛并担任评委

我司何晓磊受邀参加东盟与中日韩中小企业人工智能产业论坛并担任评委 一、活动背景 为推动东盟与中日韩&#xff08;103&#xff09;中小企业服务联盟务实合作&#xff0c;帮助中小企业提高生产力和技术创新能力&#xff0c;进一步提高国际化发展水平&#xff0c;促进东亚区域…

C++——哈希练习题

文章目录一、编程题1.在长度 2N 的数组中找出重复 N 次的元素2. 两个数组的交集二、面试题给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中。【腾讯】&#xff08;一&#xff09;位图应用1. 给定100亿个整…

C++ :STL:初识

1&#xff1a;STL初识 1.1 STL的诞生 STL 诞生来源 长久依赖&#xff0c;软件界一直希望建立一种可重复利用的东西C 的面向对象和泛型思想&#xff0c;目的就是复用性的提升大多数情况下&#xff0c;数据结构和算法都未能有一套标准&#xff0c;导致被迫从事大量重复的工作为了…

多线程问题(一)

目录 一、为什么引入线程&#xff1f; 二、线程和进程的区别 三、创建线程的五种方式 1、创建类继承Thread类 2、创建类实现Runnable接口 3、构造Thread类的匿名内部类 4、构造Runnable的匿名内部类 5、使用lambda表达式 四、start方法与run方法的区别 五、线程…

Promise对象的使用

一、什么是Promise Promise 是异步编程的一种解决方案&#xff0c;比传统的解决方案&#xff08;回调函数和事件&#xff09;更合理和更强大。从语法上说&#xff0c;Promise 是一个对象&#xff0c;从它可以获取异步操作的消息。Promise 提供统一的 API&#xff0c;各种异步操…

攻略丨在小红书高效种草,品牌要问的7个问题

这个圣诞节&#xff0c;小羊人和冬阴功&#xff08;这个冬天依然阴着的打工人&#xff09;们各怀心事&#xff0c;最有圣诞氛围的地方要数小红书了。打开首页就能看到&#xff0c;宅家自制光影圣诞树&#xff0c;被安利好利来蛋糕&#xff0c;再往下滑一滑&#xff0c;还有圣诞…

[开源工具]2022免费临时邮箱(Temp Free Mail)

2022免费临时邮箱Temp Free Mail1、10分钟邮箱2、45分钟邮箱3、60分钟邮箱4、24小时邮箱5、5日邮箱6、其他临时邮箱7、无时间限制临时邮箱8、临时邮箱常见问题答疑临时邮箱&#xff0c;英文名称 Temp Mail&#xff0c;也被称为一次性邮箱或匿名邮箱&#xff0c;根据它的邮件有效…

Vue - npm 批量升级依赖包

参考&#xff1a; npm 如何更新项目最新依赖包 一行命令更新所有 npm 依赖包 npm 升级依赖包 批量升级有风险&#xff01;&#xff01;&#xff01;升级需谨慎&#xff01;&#xff01; 常规的包升级方式 npm update (包) 检查项目可升级的包 方式一 该命令将检查每个已安装的…

初识C++ - 类与对象(下篇·下)

目录 再谈构造函数 隐式类型的转换 explicit关键字 单参数 多参数 static静态 一道关于static的题目 友元 友元函数 友元类 内部类 匿名对象 拷贝对象时的一些编译器优化 结束语 再谈构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函…

服装进销存管理软件哪个比较好用?

做好库存是服装行业是保障店铺正常运营重要方面。如果只是靠人工清点记录服装库存情况、手工记账&#xff0c;会花费大量的人员和精力&#xff0c;还不能保证一定的效率和准确率。而且服装业具有鲜明的行业特性&#xff1a;服装款式多、季节性强、颜色/尺码等等&#xff0c;如果…

Influxdb双写服务influxdb-relay部署配置【离线】

Background Influxdb社区版未提供集群方案&#xff0c;官方提供的集群模式为闭源收费版本&#xff0c;具体收费明细不太清楚哈&#xff0c;有知道的请留言告知哈。官方开源的influxdb-relay仅仅支持双写功能&#xff0c;并未支持负载均衡能力&#xff0c;仅仅解决了数据备份的问…

【C++初阶】友元(友元函数友元类)、内部类、匿名对象、拷贝对象时的优化

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【C学习与应用】 ✒️✒️本篇内容&#xff1a;友元函数和友元类的概念和基础应用&#xff0c;简单介绍内部类、匿名对象、拷贝对象时的部分编译器优化情况…

Java守护线程简述

Java守护线程简述前言前置知识线程JVM退出代码测试查看子线程是否继承父线程的类型守护线程在程序退出时的表现普通线程在程序退出时的表现总结前言 最近再看《Java并发编程实战》&#xff0c;正好有一小节关于守护线程的知识&#xff0c;这里做一点小总结。 前置知识 这里只…

云原生之Dockerfile简介和基础实践

dockerfile简介和基础实践一、Dockerfile简介1.1、Dockerfile解决的问题1.2、docker build 构建流程1.3、关键字介绍二、Dockerfile 实践2.1、基本语法实践 --- golang问题检查2.2、基本语法实践 --- gcc总结后言一、Dockerfile简介 Dockerfile是一个创建镜像所有命令的文本文…

为行业赋能 助力行业客户业务大放异彩

近日&#xff0c;2022亚马逊云科技re:Invent全球大会已完美落幕&#xff0c;在大会上发布了很多重磅新品&#xff0c;包括云原生数据战略、硬件创新、高性能计算等等在各行各业中的创新应用&#xff0c;下面就来看看医疗与生命科学、市场调研和数据分析、汽车行业&#xff0c;他…

如何理解UML2.5.1(04篇)

第一步&#xff1a; 这里发现UML2.5.1中的一处错误&#xff1a; 图四、Figure9.10中的一处错误。 错误就在于最下面一个关联右端点处的标记redefines&#xff0c;有了这个标记&#xff0c;就应该意味着此关联特化了某个关联&#xff0c;但是如果我们用“A_ownedAttribute_class…