STM32MP157AAA3裸机点灯(汇编)

2023-05-16

STM32MP157AAA3裸机点灯(汇编)

MP157的A7核裸机点灯
使用的开发板为华清远见的MP157开发板,默认板内emmc已经烧写好了uboot
这篇就只记录一下汇编点灯过程,uboot等内容暂不涉及。
(MP157AAA3好大一颗)
裸机情况下与单片机操作并没有什么区别
QQ图片20221028184951.jpg

配置交叉编译环境

这里使用的是ubuntu18虚拟机
我们如果用Linux自带的gcc编译器编译出来的程序只能在编译机器CPU架构下运行,
如果想在不同架构开发板上运行电脑编译出来的程序就需要使用交叉编译器,
STM32MP157系列为CrotexA7核心,属于ARMV7架构,所以要用对应的编译器。
这里使用交叉编译器为gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf
下载交叉编译器

wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

解压

tar -vxJf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

在/usr/local目录下新建arm-linux-gcc目录

sudo mkdir /usr/local/arm-linux-gcc

进入解压后的目录复制文件到新建的目录

cd gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf

sudo cp -rd * /usr/local/arm-linux-gcc/

添加环境变量

sudo vim /etc/profile

打开文件后在最后一行添加

PATH=$PATH:/usr/local/arm-linux-gcc/bin

重新加载环境变量

source /etc/profile

测试配置是否生效
在终端输入arm-linux-gnueabihf- 然后按两下tab键,若出现以下图显示说明配置正常
QQ截图20221028192650.png
到这交叉编译环境就配置完成了

写代码

查原理图确定LED引脚

这个可以根据自己开发板的原理图确定LED接在了芯片的哪个GPIO上。
在此用的这个开发板其中一个LED接在PE10上面,在此就点这个灯。

查手册

裸机想要点灯肯定要配寄存器了,配寄存器就需要查寄存器手册。
查内存映射图
QQ截图20221028195150.png
根据内存映射图可以看到GPIO控制器是挂在在AHB4总线上面的。

使能GPIOE外设时钟

找到对应寄存器,然后看翻译😂
对应位置1为使能,那就把第四位置1就是使能GPIOE时钟了
寄存器地址为基地址+偏移地址,基地址为0x50000000,偏移地址为0xa28(手册上面有写)
也就是操作地址为0x0x50000a28
QQ截图20221028200040.png
代码

ldr r0, =0x50000A28
ldr r1, [r0]
orr r1, r1, #(0x1 << 4)
str r1, [r0]

查看GPIOE配置寄存器基地址

根据手册可看到基地址为0x50006000
QQ截图20221028211203.png

配置引脚输入输出

输入输出模式选择.png
根据手册,可以看到配置PE10输出为20,21位置01

ldr r0, =0x50006000
ldr r1, [r0] @取原始值
bic r1, r1, #(0x3 << 20); @先清零
orr r1, r1, #(0x1 << 20); @写入对应值
str r1, [r0] @回写寄存器

设置推挽输出/开漏输出

推挽输出开漏输出选择.png
这里设置推挽输出,所以第10位置0

ldr r0, =0x50006004
ldr r1, [r0]
bic r1, r1, #(0x1 << 10)
str r1, [r0]

设置GPIO速度

gpio速度选择.png
只是点个灯,速度最慢就行了,所以20,21位置0

ldr r0, =0x50006008
ldr r1, [r0]
bic r1, r1, #(0x3 << 20)
str r1, [r0]

设置上下拉

上下拉选择.png
这里设置不拉

ldr r0, =0x5000600C
ldr r1, [r0]
bic r1, r1, #(0x1 << 20)
str r1, [r0]

到这GPIO初始化就完成了
下面往对应寄存器写数据就可以点灯了

点灯

置0置1.png
输出数据寄存器,引脚对应位置1位输出高电平,置0输出低电平
循环点灯代码

@亮灯
ldr r0, =0x50006014
ldr r1, [r0]
orr r1, r1, #(0x1 << 10) @对应位置1
str r1, [r0]
@灭灯
ldr r0, =0x50006014
ldr r1, [r0]
bic r1, r1, #(0x1 << 10)
str r1, [r0]

闪烁

全部代码
asm-led.S

.text 
.global _start
_start: 
	/* 1. led1灯的初始化*/
	/* 1.1 使能GPIOE外设控制器的时钟 
	ldr r0, =0x50000A28
	ldr r1, [r0]
	orr r1, r1, #(0x1 << 4)
	str r1, [r0]


	/* 1.2 设置PE10引脚为输出模式 
	ldr r0, =0x50006000
	ldr r1, [r0] @取原始值
	bic r1, r1, #(0x3 << 20); @先清零
	orr r1, r1, #(0x1 << 20); @写入对应值
	str r1, [r0] @回写寄存器

	/* 1.3 设置PE10引脚为推挽输出 
	ldr r0, =0x50006004
	ldr r1, [r0]
	bic r1, r1, #(0x1 << 10)
	str r1, [r0]

	/* 1.4 设置PE10引脚为低速模式 
	ldr r0, =0x50006008
	ldr r1, [r0]
	bic r1, r1, #(0x3 << 20)
	str r1, [r0]

	/* 1.5 设置PE10引脚禁止上拉和下拉电阻
	ldr r0, =0x5000600C
	ldr r1, [r0]
	bic r1, r1, #(0x1 << 20)
	str r1, [r0]
	/* led1灯的初始化完成 */

loop:
	/* 设置PE10引脚输出高电平, 点亮LED1灯 
	ldr r0, =0x50006014
	ldr r1, [r0]
	orr r1, r1, #(0x1 << 10) @对应位置1
	str r1, [r0]
	bl delay_1s

	/* 设置PE10引脚输出低电平, 熄灭LED1灯 
	ldr r0, =0x50006014
	ldr r1, [r0]
	bic r1, r1, #(0x1 << 10)
	str r1, [r0]
	bl delay_1s

	b loop

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

.end

编译

使用添加 makefil文件
make all编译

# 定义变量
NAME=asm-led
# 定义交叉编译器的前缀的变量
CROSS_COMPILE = arm-linux-gnueabihf-

# arm-linux-gnueabihf-gcc : 交叉编译器
CC = $(CROSS_COMPILE)gcc
# arm-linux-gnueabihf-ld : 链接器
LD = $(CROSS_COMPILE)ld
# arm-linux-gnueabihf-objcopy : 格式化工具
OBJCOPY = $(CROSS_COMPILE)objcopy
# arm-linux-gnueabihf-objdump : 反汇编的工具
OBJDUMP = $(CROSS_COMPILE)objdump

#目标:依赖
#	(tab键)命令

all:
	@# arm-linux-gnueabihf-gcc : 编译器,编译源文件
	@# -O0  : 代码的优化等级,不优化
	@# -g : 添加gdb的调试信息 
	@# -c : 只编译不链接   
	$(CC) -O0 -g -c $(NAME).S -o $(NAME).o
	@# arm-linux-gnueabihf-ld : 链接器,将.o文件链接生成.elf文件
	@# -Ttext=0xC0008000 :代码段中第一条指令的地址为0xc0008000
	$(LD) -Ttext=0xC0008000 $(NAME).o -o $(NAME).elf 
	@# arm-linux-gnueabihf-objcopy : 格式化工具,将elf文件转换为bin文件
	@# bin文件是一个纯粹的二进制文件
	@# -O binary : 输出二进制文件
	$(OBJCOPY) -O binary $(NAME).elf  $(NAME).bin
	@# arm-linux-gnueabihf-objdump : 反汇编的命令, 将elf文件转换为.dis反汇编文件
	$(OBJDUMP) -D $(NAME).elf > $(NAME).dis
	
clean:
	rm -rf *.elf *.bin *.o *.dis

烧录

开发板上电启动,使用secureCRT链接uboot debug所用的串口serial协议链接
波特率等设置根据uboot初始化串口设置进行设置(一般是115200)
QQ截图20221028213935.png
等待uboot初始化完成
QQ截图20221028214120.png
输入loadb 0xc0008000进入加载代码
使用软件写入生成的bin文件
QQ截图20221028214448.png
写入完成后输入go 0xc0008000回车即可运行代码
QQ截图20221028214626.png
效果如下
ezgif-3-19a7e5f771.gif

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32MP157AAA3裸机点灯(汇编) 的相关文章

随机推荐

  • Jetpack Compose 从入门到入门(六)

    本篇说说Compose中的Canvas 1 Canvas span class token annotation builtin 64 Composable span span class token keyword fun span sp
  • Jetpack Compose 从入门到入门(七)

    本篇进入Compose 动画部分 1 动画预览 在本系列第一篇中我们提到过 xff0c 64 Preview可以帮我们实现UI的预览功能 xff0c 简单的交互和播放动画 在Android Studio Bumblebee xff08 大黄
  • Android 12 变更及适配攻略

    这几个月有点忙 xff0c 一年一篇的适配文章来的有点晚了 但其实也还好 xff0c 因为我们项目也是下半年才适配 我这边也是提前调研踩坑 xff0c 评估一下工作量 这个时间点也完全跟得上Google Play的审核要求 xff08 11
  • Jetpack Compose 从入门到入门(八)

    接着上一篇的动画部分 xff0c 本篇主要是自定义动画与Animatable AnimationSpec 上一篇中 xff0c 出现了多次animationSpec属性 xff0c 它是用来自定义动画规范的 例如 xff1a span cl
  • Jetpack Compose 从入门到入门(九)

    本篇是Compose的手势部分 点击 添加clickable修饰符就可以轻松实现元素的点击 此外它还提供无障碍功能 xff0c 并在点按时显示水波纹效果 span class token annotation builtin 64 Comp
  • 记参加 2022 Google开发者大会

    前几天有幸参加了2022年Google 开发者大会 Google Developer Summit xff0c 上一次参加Google开发者大会还是2019年 这期间因为众所周知的原因 xff0c 开发者大会都改为了线上举办 和上次相比可以
  • Jetpack Compose 从入门到入门(十)

    本篇介绍如何将Jetpack Compose 添加到已有应用中 xff0c 毕竟大多数情况都是在现有项目中使用 Jetpack Compose 旨在配合既有的基于 View 的界面构造方式一起使用 如果您要构建新应用 xff0c 最好的选择
  • Flutter状态管理之Riverpod 2.0

    两年前分享过一篇Flutter状态管理之Riverpod xff0c 当时riverpod的版本还是0 8 0 xff08 后来文章更新到0 14版本 xff09 当时提到过有一些不足之处 xff1a 毕竟诞生不久 xff0c 它还不能保证
  • Python:元组和字典简述

    目录 1 列表的方法2 for循环遍历列表2 1 语法2 2 range 函数 3 元组3 1 元组的基本概念3 2 元组的创建3 3 元组的解包3 3 1 号在解包中的用法 4 字典4 1 字典的基本概念4 2 字典的使用4 2 1 字典
  • 七种常见软件开发模型

    目录 瀑布模型 xff08 面向文档的软件开发模型 xff09 演化模型 螺旋模型 增量模型 构件组装模型 统一过程 xff08 up xff09 xff08 迭代的软件过程 xff0c 以架构为中心 xff09 敏捷开发模型 瀑布模型 x
  • IP安全策略:只允许指定IP连接远程桌面,限制IP登录

    一 xff0c 新建IP安全策略 WIN 43 R打开运行对话框 xff0c 输入gpedit msc进入组策略编辑器 依次打开 本地计算机 策略 计算机配置 Windows设置 安全设置 IP安全策略 在 本地计算机上 在右面的空白处右击
  • 2022年终总结

    不知不觉就到了年末 xff0c 感叹时间过的真快 我自己坚持写了七年多的博客 xff0c 但这其实是我第一次去写年终总结 也不知道怎么写 xff0c 就简单聊聊 写博客的初衷就是个人收获 xff0c 学习的记录 xff0c 分享出来如果能帮
  • Rust库交叉编译以及在Android与iOS中使用

    本篇是关于交叉编译Rust库 xff0c 生成Android和iOS的二进制文件 xff08 so与a文件 xff09 xff0c 以及简单的集成使用 1 环境 系统 xff1a macOS 13 0 M1 Pro xff0c Window
  • 利用Rust与Flutter开发一款小工具

    1 起因 起因是年前看到了一篇Rust 43 iOS amp Android xff5c 未入门也能用来造轮子 xff1f 的文章 xff0c 作者使用Rust做了个实时查看埋点的工具 其中作者的一段话给了我启发 xff1a 无论是 Loo
  • 在Android与iOS中使用LLDB调试Rust程序

    在Rust中通过println 打印的日志信息在Xcode中可以显示 xff0c 但是Android Studio里不显示 所以Android可以使用android logger实现日志输出 但是开发中仅使用打印日志的方式进行调试还是不够的
  • 使用jni-rs实现Rust与Android代码互相调用

    本篇主要是介绍如何使用jni rs 有关jni rs内容基于版本0 20 0 xff0c 新版本写法有所不同 入门用法 在Rust库交叉编译以及在Android与iOS中使用中我简单说明了jni rs及demo代码 xff0c 现在接着补充
  • Android 13 变更及适配攻略

    准备工作 首先将我们项目中的 targetSdkVersion和compileSdkVersion 升至 33 影响Android 13上所有应用 1 通知受限 对新安装的应用的影响 xff1a 如果用户在搭载 Android 13 或更高
  • 洛谷 P1185 绘制二叉树

    一道极为恐怖的模拟题 xff0c 以定义函数的方式确定每个点的x xff0c y就能轻松的做出这道题 xff0c 参考神犇题解 洛谷 P1185 KH 39 s blog 洛谷博客 遇到这种题估计就是放弃了 AC代码 xff08 抄的 xf
  • 洛谷 P3366 【模板】最小生成树#Kruskal+并查集

    说了最小生成树 xff0c 那么就用经典的Prim或者Kruskal xff0c 不过Prim实现代码有点多 xff0c 这里用Kruskal举例 注意事项 1 Kruskal是用来找最小生成树的 根据树的定义可以知道 树是无向图 所以Kr
  • STM32MP157AAA3裸机点灯(汇编)

    STM32MP157AAA3裸机点灯 汇编 MP157的A7核裸机点灯 使用的开发板为华清远见的MP157开发板 xff0c 默认板内emmc已经烧写好了uboot 这篇就只记录一下汇编点灯过程 xff0c uboot等内容暂不涉及 xff