Linux 学习记录54(ARM篇)

Linux 学习记录54(ARM篇)

在这里插入图片描述

本文目录

  • Linux 学习记录54(ARM篇)
  • 一、框图分析
    • 1. 芯片手册内部框图
    • 2. 操作GPIO过程
  • 二、通过汇编完成GPIO操作
    • 1. 常用的汇编指令
    • 2. GPIO初始化流程
    • 3. 查找相关寄存器
      • (1. RCC寄存器
      • (2. GPIO寄存器
        • >1. 模式配置寄存器
        • >2. 输出模式配置寄存器
        • >3. 速度配置寄存器
        • >4. 上下拉配置寄存器
        • >5. GPIO输出寄存器
    • 4. 寄存器配置示例
      • (1. RCC寄存器配置
      • (2. GPIO寄存器配置
  • 思维导图
  • 练习代码

一、框图分析

以STM32MP157为例

1. 芯片手册内部框图

在这里插入图片描述

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

2. 操作GPIO过程

在这里插入图片描述

二、通过汇编完成GPIO操作

1. 常用的汇编指令

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

2. GPIO初始化流程

在这里插入图片描述

3. 查找相关寄存器

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

(1. RCC寄存器

2.5.2
在这里插入图片描述

(2. GPIO寄存器

>1. 模式配置寄存器

在这里插入图片描述

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

在这里插入图片描述

>3. 速度配置寄存器

在这里插入图片描述

>4. 上下拉配置寄存器

在这里插入图片描述

>5. GPIO输出寄存器

在这里插入图片描述

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-10ldr 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 参数到模式寄存器

思维导图

在这里插入图片描述

练习代码


.text 
.global _start_start: bl Initmov r5,#0loop:bl LED_ONbl delay_1sbl LED_OFFbl delay_1scmp r5,#10add r5,r5,#1bls loopInit:
@RCC_Init:	@RCC时钟初始化ldr r0,=0x50000A28ldr r1,[r0]orr r1,r1,#(0X3<<4)str r1,[r0]@LED_Init:	@LED的GPIO初始化@初始化GPIOE 8-10ldr 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 10ldr 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,lrLED_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,lrLED_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, #0x10000000mm:cmp r3, #0subne r3, r3, #1bne mmmov pc, lr.end

在这里插入图片描述

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

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

相关文章

Jenkins常用管理功能配置 - 插件管理

Jenkins插件介绍 Jenkins是一个流行的开源持续集成/持续交付(CI/CD)工具&#xff0c;它有大量的插件来扩展其功能。这些插件可以用于构建、测试、部署和监控软件项目。下面是一些常用的Jenkins插件及其简单介绍和使用方法&#xff1a; 1. Git插件&#xff1a;允许Jenkins从Gi…

vue2如何将页面生成 pdf 导出 html2Canvas + jspdf

1.引入两个依赖 npm i html2canvas npm i jspdf 2.在utils文件夹下新建html2pdf.js文件 import html2canvas from html2canvas; import jsPDF from jspdf export const htmlToPDF async (htmlId, title "报表", bgColor "#fff") > { let pdfDom do…

【LeetCode每日一题合集】2023.7.17-2023.7.23(离线算法 环形子数组的最大和 接雨水)

文章目录 415. 字符串相加&#xff08;高精度计算、大数运算&#xff09;1851. 包含每个查询的最小区间⭐⭐⭐⭐⭐解法1——按区间长度排序 离线询问 并查集解法2——离线算法 优先队列 874. 模拟行走机器人&#xff08;哈希表 方向数组&#xff09;918. 环形子数组的最大和…

sentinel深入讲解流量控制/熔断降级

文章目录 sentinelsentinel介绍重要的核心概念引入依赖限流的规则熔断规则yaml 项目配置使用注解 SentinelResource讲解类的静态方法 sentinel sentinel介绍 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构…

【深度学习之YOLO8】环境部署

目录 一、确定版本CUDA toolkit、cuDNN版本Python、PyTorch版本 二、安装Python下载环境变量验证安装 三、安装Anaconda安装环境变量验证安装创建conda虚拟环境常用命令 四、安装CUDA toolkit下载环境变量验证安装 五、配置cuDNN下载 六、安装PyTorch(torchtorchversiontorchau…

华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(五)

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python面试专栏&#xff1a;《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; …

RUST腐蚀基因种植

RUST腐蚀基因种植 试验地址:www.xiaocao.cloud RUST基因: RUST基因计算器&#xff0c;腐蚀基因计算器&#xff0c;前后端分离架构&#xff0c;前端目录/resouce/ui/rust&#xff0c;欢迎大佬评价&#xff0c;

算法笔记(java)——回溯篇

回溯算法解决问题最有规律性&#xff0c;借用一下卡哥的图&#xff1a; 只要遇到上述问题就可以考虑使用回溯&#xff0c;回溯法的效率并不高&#xff0c;是一种暴力解法&#xff0c;其代码是嵌套在for循环中的递归&#xff0c;用来解决暴力算法解决不了的问题&#xff0c;即…

Tensorflow无人车使用移动端的SSD(单发多框检测)来识别物体及Graph的认识

环境是树莓派3B&#xff0c;当然这里安装tensorflow并不是一定要在树莓派环境&#xff0c;只需要是ARM架构就行&#xff0c;也就是目前市场上绝大部分的嵌入式系统都是用这套精简指令集。 在电脑端的检测&#xff0c;有兴趣的可以查阅SSD(Single Shot MultiBox Detector)系列&a…

19 QListWidget控件

Tips: 对于列表式数据可以使用QStringList进行左移一块输入。 代码&#xff1a; //listWidget使用 // QListWidgetItem * item new QListWidgetItem("锄禾日当午"); // QListWidgetItem * item2 new QListWidgetItem("汗滴禾下土"); // ui->…

十、正则表达式详解:掌握强大的文本处理工具(二)

文章目录 &#x1f340;多字符匹配&#x1f340;匹配规则的代替&#x1f340;特殊的匹配&#x1f340;特殊的匹配plus&#x1f340;总结 &#x1f340;多字符匹配 星号&#xff08;*&#xff09;&#xff1a;匹配0个或者多个字符 import retext 111-222-333 result re.matc…

苹果的Apple GPT要来了?

据外媒消息&#xff0c;苹果正在内部开发类 ChatGPT 的产品&#xff0c;与微软、OpenAI、谷歌、Meta 等科技巨头在生成式 AI 赛道展开竞争。该消息使得苹果股价上涨了 2%。据苹果工程师透露&#xff0c;苹果在内部构建了代号为“Ajax”的大语言模型开发框架&#xff0c;并构建了…

Unity自定义后处理——Bloom效果

大家好&#xff0c;我是阿赵。   继续介绍屏幕后处理效果&#xff0c;这一期讲一下Bloom效果。 一、Bloom效果介绍 还是拿这个模型作为背景。 Bloom效果&#xff0c;就是一种全屏泛光的效果&#xff0c;让模型和特效有一种真的在发光的感觉。 根据参数不一样&#xff0c;可…

Packet Tracer – 实施静态 NAT 和动态 NAT

Packet Tracer – 实施静态 NAT 和动态 NAT 拓扑图 目标 第 1 部分&#xff1a;利用 PAT 配置动态 NAT 第 2 部分&#xff1a;配置静态 NAT 第 3 部分&#xff1a;验证 NAT 实施 第 1 部分&#xff1a; 利用 PAT 配置动态 NAT 步骤 1&#xff1a; 配置允许用于 NAT …

【基于CentOS 7 的iscsi服务】

目录 一、概述 1.简述 2.作用 3. iscsi 4.相关名称 二、使用步骤 - 构建iscsi服务 1.使用targetcli工具进入到iscsi服务器端管理界面 2.实现步骤 2.1 服务器端 2.2 客户端 2.2.1 安装软件 2.2.2 在认证文件中生成iqn编号 2.2.3 开启客户端服务 2.2.4 查找可用的i…

AJAX-day03-AJAX进阶

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 同步代码和异步代码 回调函数地狱 Promise - 链式调用 Promise 链式应用 async函数和await async函…

Stable Diffusion入门笔记(自用)

学习视频&#xff1a;20分钟搞懂Prompt与参数设置&#xff0c;你的AI绘画“咒语”学明白了吗&#xff1f; | 零基础入门Stable Diffusion保姆级新手教程 | Prompt关键词教学_哔哩哔哩_bilibili 1.图片提示词模板 2.权重&#xff08;提示词&#xff09; 无数字 (flower)//花的…

MQTT网关 5G物联网网关 PLC控制工业网关

MQTT网关&#xff0c;两个以上的节点之间通信的新型网关&#xff0c;网络节点之间通过互连来实现双向通信。支持PLC协议转MQTT&#xff0c;实现plc数据采集上云&#xff0c;物联网云平台对接&#xff0c;广泛应用于工业自动化plc远程监测控制。 计讯物联5G MQTT物联网网关TG463…

如何解决 Git 合并冲突

在遇到合并冲突时&#xff0c;请不要惊慌。通过一些娴熟的技巧协商&#xff0c;你可以解决任何冲突。 假设你和我正在共同编辑同一个名称为 index.html 的文件。我对文件进行了修改&#xff0c;进行了提交&#xff0c;并将更改推送到 Git 远程仓库。你也对同一个文件进行了修改…

酷雷曼无人机技能培训考试圆满举办

2023年7月18日、19日&#xff0c;以“向云端起航&#xff0c;让技术落地”为主题的酷雷曼无人机技能提升培训会在酷雷曼北京运营中心隆重举行&#xff0c;来自全国各地的众多合作商参加了本次培训&#xff0c;通过系统、全面的学习成功取得了专业无人机飞行员执照&#xff0c;为…