Linux 学习记录54(ARM篇)

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

Linux 学习记录54(ARM篇)

Linux 学习记录54(ARM篇),Linux学习记录,linux,学习,arm开发

一、框图分析

以STM32MP157为例

1. 芯片手册内部框图

Linux 学习记录54(ARM篇),Linux学习记录,linux,学习,arm开发

可以看到在STM32MP157A中有三个内核
	2个Cortex-A7 以及 一个Cortex-M4

2. 操作GPIO过程

Linux 学习记录54(ARM篇),Linux学习记录,linux,学习,arm开发

二、通过汇编完成GPIO操作

1. 常用的汇编指令

1、数据操作指令
      1>数据搬移指令 mov
      2>移位操作指令 lsr lsl asr ror
      3>位运算指令 and orr eor bic
      4>算数运算指令 add adc sub sbc mul
      5>比较指令 cmp
2、跳转指令 b / bl
3、特殊功能寄存器操作指令 msr mrs       
4、内存操作指令
    1> 单寄存器操作指令 ldr / str
    2> 多寄存器操作指令 ldm / stm
    3> 栈指针操作指令 stmfd / ldmfd

2. GPIO初始化流程

Linux 学习记录54(ARM篇),Linux学习记录,linux,学习,arm开发

3. 查找相关寄存器

相关数据手册在文章顶部下载

(1. RCC寄存器

2.5.2
Linux 学习记录54(ARM篇),Linux学习记录,linux,学习,arm开发

(2. GPIO寄存器

>1. 模式配置寄存器

Linux 学习记录54(ARM篇),Linux学习记录,linux,学习,arm开发

>2. 输出模式配置寄存器

Linux 学习记录54(ARM篇),Linux学习记录,linux,学习,arm开发

>3. 速度配置寄存器

Linux 学习记录54(ARM篇),Linux学习记录,linux,学习,arm开发

>4. 上下拉配置寄存器

Linux 学习记录54(ARM篇),Linux学习记录,linux,学习,arm开发

>5. GPIO输出寄存器

Linux 学习记录54(ARM篇),Linux学习记录,linux,学习,arm开发

4. 寄存器配置示例

(1. RCC寄存器配置

@RCC_Init:	@RCC时钟初始化 GPIOE
ldr r0,=0x50000A28 @GPIO的RCC地址为0x50000000,E组GPIO需要加上0x0A28的偏移量,上面图片的RCC寄存器可查
ldr r1,[r0] @将0x50000A28寄存器的地址中的数据读出
orr r1,r1,#(0X1<<4) @将E组的GPIO使能位置1
str r1,[r0]	@重新写入寄存器中

(2. GPIO寄存器配置

@LED_Init:	@LED的GPIO初始化
	@初始化GPIOE 8-10
	ldr r0,=0x50006000	@GPIOE模式 基地址
	ldr r1,[r0]			@当前寄存器数据
	and r1,r1,#(~(0x3<<16))	@将要修改的位先清零
	orr r1,r1,#(0x1<<16)	@重新赋值参数到r1寄存器
	str r1,[r0]			@设置GPIO 参数到模式寄存器
	@输出配置
	ldr r0,=0x50006004	@GPIOE输出 基地址
	ldr r1,[r0]			@当前寄存器数据
	bic r1,r1,#(0x1<<8)		@重新赋值参数到r1寄存器
	str r1,[r0]			@设置GPIO 参数到模式寄存器
	@速度配置
	ldr r0,=0x50006008	@GPIOE速度 基地址
	ldr r1,[r0]			@当前寄存器数据
	bic r1,r1,#(0x3<<16)		@将要修改的位先清零
	orr r1,r1,#(0x1<<16)		@重新赋值参数到r1寄存器
	str r1,[r0]			@设置GPIO 参数到模式寄存器
	@上下拉配置
	ldr r0,=0x5000600c	@GPIOE速度 基地址
	ldr r1,[r0]			@当前寄存器数据
	bic r1,r1,#(0x3<<16)		@将要修改的位先清零
	orr r1,r1,#(0x1<<16)		@重新赋值参数到r1寄存器
	str r1,[r0]			@设置GPIO 参数到模式寄存器
	@将该引脚设置为高电平
	ldr r0,=0x50006014	@GPIOE速度 基地址
	ldr r1,[r0]			@当前寄存器数据
	orr r1,r1,#(0x1<<8)		@重新赋值参数到r1寄存器
	str r1,[r0]			@设置GPIO 参数到模式寄存器

思维导图

Linux 学习记录54(ARM篇),Linux学习记录,linux,学习,arm开发

练习代码


.text 
.global _start

_start: 

	bl Init
	mov r5,#0

loop:

	bl LED_ON
	bl delay_1s
	bl LED_OFF
	bl delay_1s

	cmp r5,#10
	add r5,r5,#1

	bls loop

Init:
@RCC_Init:	@RCC时钟初始化
	ldr r0,=0x50000A28
	ldr r1,[r0]
	orr r1,r1,#(0X3<<4)
	str r1,[r0]

@LED_Init:	@LED的GPIO初始化
	@初始化GPIOE 8-10
	ldr r0,=0x50006000	@GPIOE模式 基地址
	ldr r1,[r0]			@当前寄存器数据
	bic r1,r1,#(0x33<<16)
	orr r1,r1,#(0x11<<16)	@重新赋值参数到r1寄存器
	str r1,[r0]			@设置GPIO 参数到模式寄存器
	@输出配置
	ldr r0,=0x50006004	@GPIOE输出 基地址
	ldr r1,[r0]			@当前寄存器数据
	bic r1,r1,#(0x5<<8)		@重新赋值参数到r1寄存器
	str r1,[r0]			@设置GPIO 参数到模式寄存器
	@速度配置
	ldr r0,=0x50006008	@GPIOE速度 基地址
	ldr r1,[r0]			@当前寄存器数据
	bic r1,r1,#(0x33<<16)		@重新赋值参数到r1寄存器
	orr r1,r1,#(0x11<<16)		@重新赋值参数到r1寄存器
	str r1,[r0]			@设置GPIO 参数到模式寄存器
	@上下拉配置
	ldr r0,=0x5000600c	@GPIOE速度 基地址
	ldr r1,[r0]			@当前寄存器数据
	bic r1,r1,#(0x33<<16)		@重新赋值参数到r1寄存器
	orr r1,r1,#(0x11<<16)		@重新赋值参数到r1寄存器
	str r1,[r0]			@设置GPIO 参数到模式寄存器


	@初始化GPIOF 10
	ldr r0,=0x50007000	@GPIOE模式 基地址
	ldr r1,[r0]			@当前寄存器数据
	bic r1,r1,#(0x3<<20)
	orr r1,r1,#(0x1<<20)	@重新赋值参数到r1寄存器
	str r1,[r0]			@设置GPIO 参数到模式寄存器
	@输出配置
	ldr r0,=0x50007004	@GPIOE输出 基地址
	ldr r1,[r0]			@当前寄存器数据
	bic r1,r1,#(0x1<<10)		@重新赋值参数到r1寄存器
	str r1,[r0]			@设置GPIO 参数到模式寄存器
	@速度配置
	ldr r0,=0x50007008	@GPIOE速度 基地址
	ldr r1,[r0]			@当前寄存器数据
	bic r1,r1,#(0x3<<20)		@重新赋值参数到r1寄存器
	orr r1,r1,#(0x1<<20)		@重新赋值参数到r1寄存器
	str r1,[r0]			@设置GPIO 参数到模式寄存器
	@上下拉配置
	ldr r0,=0x5000700c	@GPIOE速度 基地址
	ldr r1,[r0]			@当前寄存器数据
	bic r1,r1,#(0x3<<20)		@重新赋值参数到r1寄存器
	orr r1,r1,#(0x1<<20)		@重新赋值参数到r1寄存器
	str r1,[r0]			@设置GPIO 参数到模式寄存器

	mov pc,lr

LED_ON:

	ldr r0,=0x50006014	@GPIOE速度 基地址
	ldr r1,[r0]			@当前寄存器数据
	orr r1,r1,#(0x5<<8)		@重新赋值参数到r1寄存器
	str r1,[r0]			@设置GPIO 参数到模式寄存器

	ldr r0,=0x50007014	@GPIOE速度 基地址
	ldr r1,[r0]			@当前寄存器数据
	orr r1,r1,#(0x1<<10)		@重新赋值参数到r1寄存器
	str r1,[r0]			@设置GPIO 参数到模式寄存器

	mov pc,lr

LED_OFF:

	ldr r0,=0x50006014	@GPIOE速度 基地址
	ldr r1,[r0]			@当前寄存器数据
	bic r1,r1,#(0x5<<8)		@重新赋值参数到r1寄存器
	str r1,[r0]			@设置GPIO 参数到模式寄存器

	ldr r0,=0x50007014	@GPIOE速度 基地址
	ldr r1,[r0]			@当前寄存器数据
	bic r1,r1,#(0x1<<10)		@重新赋值参数到r1寄存器
	str r1,[r0]			@设置GPIO 参数到模式寄存器

	mov pc,lr
	


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

.end

Linux 学习记录54(ARM篇),Linux学习记录,linux,学习,arm开发文章来源地址https://www.toymoban.com/news/detail-602189.html

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

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

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

相关文章

  • Linux 学习记录53(ARM篇)

    在下图界面中可以搜索指定的内存地址 (1. 前索引方式 (2. 后索引方式 (3. 自动索引 结合了前两者的索引方式 (1. 操作码 (2. 格式 (3. 使用示例 (4. 地址增长方式 1 ia后缀 ia后缀:先往指定的寄存器数值为起始地址中存放数据,然后该寄存器数值自动偏移 例:stmia r6!,{r1-r5} 2 ib后缀

    2024年02月16日
    浏览(29)
  • Linux 学习记录56(ARM篇)

    总线是完成传输的一种媒介,总线可以分为系统总线、数据总线和地址总线 系统总线是连接计算机的主要组成部分,它负责传输数据和控制信息。数据总线用于传输数据,而地址总线用于指定数据的存储位置。 串行总线同一时刻,只可以收发一位数据,并且串行总线只有一

    2024年02月15日
    浏览(28)
  • 记录移植Python3到arm开发板linux系统中

    开发板情况 arm板是公司采购的工控机。主要用来 使用python3解析excel表格处理数据。 配置如下: 配置 版本 cpu imx6dl(armv7架构) 操作系统 linux3.10 python版本 2.7 项目情况 项目中最好使用 python3 。可行的有以下几种方式: 方式 优缺点 可行度 重做文件系统 订制程度比较高,后期增

    2024年02月04日
    浏览(40)
  • ARM+LINUX嵌入式学习路线

    嵌入式学习是一个循序渐进的过程,如果是希望向嵌入式软件方向发展的话,目前最常见的是嵌入式Linux方向,关注这个方向,大概分3个阶段: 1、嵌入式linux上层应用,包括QT的GUI开发 2、嵌入式linux系统开发 3、嵌入式linux驱动开发 嵌入式目前主要面向的几个操作系统是,

    2024年02月02日
    浏览(51)
  • 【Linux下6818开发板(ARM)】硬件空间挂载

    (꒪ꇴ꒪ ),hello我是 祐言 博客主页:C语言基础,Linux基础,软件配置领域博主🌍 快上🚘,一起学习! 送给读者的一句鸡汤🤔: 集中起来的意志可以击穿顽石! 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏         在嵌入式系统开发中,经常需要使用外部硬件

    2024年02月14日
    浏览(31)
  • linux下arm环境启动脚本/etc/init.d/rcS执行命令失败,踩坑记录

    记一次踩坑记录!!! 接触到一个新的系统,需要在这个系统上跑程序,测试的时候,手动执行脚本和程序都没问题,于是将执行命令写入到linux启动脚本/etc/init.d/rcS这个文件中,然后重启,等待程序起来,但是让我意想不到的是,执行到我加的命令的时候,居然报错,找不

    2024年01月21日
    浏览(31)
  • Rust在linux下交叉编译到arm开发板

    前段时间做了rust交叉编译到arm开发板,如果引入的包有些包含OpenSSL,ring...遇见了很多问题在网上也查阅很多资料,今天抽个时间做个汇总吧。 虚拟机里面安装rust环境,做到交叉编译的时候应该都已经有了,这个地方就不过多说了,网上找一下就有的 首先描述一下我的环境

    2024年02月15日
    浏览(36)
  • [ARM+Linux] 基于全志h616外设开发笔记

    修改用户密码 配置网络 nmcli dev wifi  命令扫描周围WIFI热点   nmcli dev wifi connect  xxx  password xxx 命令 连接WiFi 查看ip地址的指令: ifconfig ip addr show wlan0 SSH登录         这是企业开发调试必用方式,比串口来说不用接线,前提是接入网络并获得板子IP 地址,且系统做了SSH的

    2023年04月21日
    浏览(35)
  • 【嵌入式】Linux开发工具arm-linux-gcc安装及使用

    宿主机 执行编译、链接嵌入式软件的计算机 目标机 运行嵌入式软件的硬件平台 “本地”编译器 用来生成在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码,例如 Windows 环境生成 Windows 目标代码。 交叉编译器 用来生成在其它平台上运行的目标代

    2024年01月17日
    浏览(45)
  • ARM_Linux的交叉开发以及交叉编译器

    目录 为什么要使用交叉开发 为什么要使用交叉编译 交叉编译器的安装 交叉编译器的使用 交叉开发是指在通用的电脑上吧程序编写,编译,调试好,再下载到嵌入式产品中去运行,对于一些简单的程序的话,直接在电脑上编译调试好即可,但是对于一些需要操作硬件的开发

    2024年01月23日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包