当前位置: 首页 > news >正文

[KEIL]单片机技巧 01

1、查看外设寄存器的值

配合对应的芯片开发手册以查看寄存器及其每一位的意义,可以解决90%以上的单纯的片内外设bug,学会如何通过寄存器的值来排外设上的蛊是嵌入式开发从小白到入门的重要一步,一定要善于使用这个工具,而不是外设出了问题时,一点点的通过表层外设现象排蛊。

2、ARM汇编常用指令集解读

如上图, STM32 的汇编指令(基于 ARM Cortex-M 架构)是调试和底层开发的重要基础。

以下是 STM32 中常用的 ARM Thumb/Thumb-2 汇编指令及其用途:

一、数据操作指令

  1. MOV
    • 作用: 寄存器之间的数据移动或立即数加载

    • 示例:

      MOV R0, R1     ; R0 = R1
      MOV R2, #0x10  ; R2 = 0x10
  2. LDR / STR
    • 作用: 从内存加载数据到寄存器(Load)或存储寄存器数据到内存(Store)

    • 示例:

      
      LDR R0, [R1]    ; R0 = *R1(从地址 R1 加载数据)
      STR R2, [R3]    ; *R3 = R2(将 R2 的值存储到地址 R3)

  3. ADD / SUB
    • 作用: 加减运算

    • 示例:

      ADD R0, R1, R2  ; R0 = R1 + R2
      SUB R3, R4, #5   ; R3 = R4 - 5
       
  4. AND / ORR / EOR / BIC

    • 作用: 逻辑运算(与、或、异或、位清除)

    • 示例:

      
      AND R0, R1, #0xFF  ; R0 = R1 & 0xFF(保留低8位)
      ORR R2, R3, R4      ; R2 = R3 | R4


二、流程控制指令

  1. B
    • 作用: 无条件跳转(Branch)

    • 示例:

      
      B label      ; 跳转到标签 label

  2. BX
    • 作用: 跳转到寄存器指定的地址,并切换指令集(如 ARM ↔ Thumb)

    • 示例:

      
      BX LR        ; 跳转到 LR 寄存器中的地址(常用于函数返回)

  3. BL
    • 作用: 带链接的跳转(保存返回地址到 LR 寄存器)

    • 示例:

      
      BL function  ; 调用函数 function,LR = 下一条指令地址

  4. 条件分支指令
    • 作用: 根据标志位(如 Z、C)跳转

    • 常见指令:

      
      BEQ label   ; 相等时跳转(Z=1)
      BNE label   ; 不等时跳转(Z=0)
      BCS label   ; 进位标志 C=1 时跳转


三、栈操作指令

  1. PUSH / POP
    • 作用: 压栈和出栈操作(保存/恢复寄存器)

    • 示例:

      
      PUSH {R0, R1}  ; 将 R0, R1 压入栈
      POP {R2, R3}   ; 从栈中恢复数据到 R2, R3


四、标志位操作

  1. CMP
    • 作用: 比较两个值(内部执行减法,更新标志位)

    • 示例:

      
      CMP R0, R1  ; 比较 R0 和 R1,更新 Z(Zero)标志

  2. TST
    • 作用: 按位与测试(不保存结果,仅更新标志位)

    • 示例:

      
      TST R0, #0x01  ; 测试 R0 的最低位是否为 1


五、特殊指令

  1. CPSID / CPSIE
    • 作用: 全局中断开关

    • 示例:

      
      CPSID I   ; 关闭中断
      CPSIE I   ; 开启中断

  2. NOP
    • 作用: 空操作(常用于调试时插入断点或延时)

    • 示例:

      
      NOP  ; 空操作

  3. IT (If-Then)
    • 作用: 条件执行指令块(Thumb-2 特有)

    • 示例:

      
      ITE EQ      ; If-Then-Else 条件块(EQ 为条件)
      MOVEQ R0, R1; 如果 EQ 成立,执行此指令
      MOVNE R0, R2; 否则执行此指令


六、调试场景示例

1. 函数调用与返回
BL  HAL_Init    ; 调用 HAL_Init 函数,LR 保存返回地址
...
BX  LR          ; 函数返回
 
2. 中断服务函数

PUSH {R0-R3}    ; 保存寄存器到栈
...
POP {R0-R3}     ; 恢复寄存器
BX  LR          ; 从中断返回
3. 条件分支调试

CMP R0, #10     ; 比较 R0 是否等于 10
BEQ loop_end    ; 如果相等,跳转到 loop_end


 

keil其他技巧

symbols窗口,可以看到每个文件下面包含的函数和成员

寄存器窗口

可以用来查看CPU内部寄存器的使用状态

栈窗口


可以用来查看当前栈内函数调用的使用情况,从图中可以看出在main函数中调用了SystemClock_Config这个函数,紧接着又在SystemClock_Config又调用了HAL_RCC_OscConfig这个函数,可以很清晰的看出函数之间调用的层次关系。

监控变量窗口

可以将需要观察的变量添加到窗口中去,观察变量值的变化。

内存窗口

将需要观察的变量拖动到内存窗口中,即可显示当前变量的值。例如 int i =0;将i拖动到内存窗口即可显示当前变量的值,如果在 i 前面加上取地址符 & 即可显示当前变量的地址。地址后,则显示当前地址的值。

相关文章:

[KEIL]单片机技巧 01

1、查看外设寄存器的值 配合对应的芯片开发手册以查看寄存器及其每一位的意义,可以解决90%以上的单纯的片内外设bug,学会如何通过寄存器的值来排外设上的蛊是嵌入式开发从小白到入门的重要一步,一定要善于使用这个工具,而不是外设…...

云原生监控篇——全链路可观测性与AIOps实战

引言:监控即生命线 2023年某全球支付平台因一次未被捕获的数据库连接泄漏,导致每小时损失120万美元。而另一家社交巨头通过实时异常检测系统,在30秒内自动隔离了大规模DDoS攻击。这两个案例揭示了云原生时代的核心生存法则——监控不是可选项…...

C# 13与.NET 9革新及工业开发应用

摘要 微软推出的C# 13与.NET 9以“高效且智能”为导向,具备扩展类型、半自动属性、锁对象优化等十大革新。本文深入剖析新特性于工业级开发的应用场景,包含性能优化策略、AI集成方案以及EF Core实战技巧,为开发者提供从理论到实践的完整指引…...

Linux系统之DHCP网络协议

目录 一、DHCP概述 二、DHCP部署实操 2.1、安装DHCP软件 2.2、拷贝配置文件 2.3、配置文件详解 2.4、重启软件服务 2.5、新开一台服务器,查看dhcp地址获取 一、DHCP概述 DHCP(Dynamic Host Configuration Protocol)是一种应用层网络协…...

【Linux】【网络】不同子网下的客户端和服务器通信其它方式

【Linux】【网络】不同子网下的客户端和服务器通信其它方式 那么,在 NAT 环境下,应该如何让内网设备做为服务器,使内网设备被外部连接? 1 多拨 部分运营商,支持在多个设备上,通过 PPPoE 登录同一个宽带账…...

【C++/数据结构】栈

零.导言 栈是一种数据结构&#xff0c;在后续的学习中可能经常使用&#xff0c;因此我们今天就来学习如何实现栈&#xff0c;以更好地使用它。 一.栈的实现 栈的形式如下&#xff1a; #include<iostream> #include<cassert>using namespace std;typedef int Stack…...

Qt 对象树详解:从原理到运用

1. 什么是对象树&#xff1f; 对象树是一种基于父子关系的对象管理机制。在 Qt 中&#xff0c;所有继承自 QObject 的类都可以参与到对象树中。 当一个对象被设置为另一个对象的父对象时&#xff0c;子对象会被添加到父对象的内部列表中&#xff0c;形成一种树状结构。 Qt 提…...

【软路由】ImmortalWrt 编译指南:从入门到精通

对于喜欢折腾路由器&#xff0c;追求极致性能和定制化的玩家来说&#xff0c;OpenWrt 无疑是一个理想的选择。而在众多 OpenWrt 衍生版本中&#xff0c;ImmortalWrt 以其更活跃的社区、更激进的特性更新和对新硬件的支持而备受关注。 本文将带你深入了解 ImmortalWrt&#xff0…...

【智能音频新风尚】智能音频眼镜+FPC,打造极致听觉享受!【新立电子】

智能音频眼镜&#xff0c;作为一款将时尚元素与前沿科技精妙融合的智能设备&#xff0c;这种将音频技术与眼镜形态完美结合的可穿戴设备&#xff0c;不仅解放了用户的双手&#xff0c;更为人们提供了一种全新的音频交互体验。新立电子FPC在智能音频眼镜中的应用&#xff0c;为音…...

第2章 windows故障排除(网络安全防御实战--蓝军武器库)

网络安全防御实战--蓝军武器库是2020年出版的&#xff0c;已经过去3年时间了&#xff0c;最近利用闲暇时间&#xff0c;抓紧吸收&#xff0c;总的来说&#xff0c;第2章开始带你入门了&#xff0c;这里给出了几个windows重要的工具&#xff0c;说实话&#xff0c;好多我也是第一…...

深度学习笔记——线性回归的从0开始实现

记录学习到的知识&#xff1a; 语义分割是将标签或类别与图片的每个像素关联的一种深度学习算法。 它用来识别构成可区分类别的像素集合。 图像分割是一个端到端图像分析过程&#xff0c;它将数字图像分成多个片段&#xff0c;并对每个区域中包含的信息进行分类。三种图像分割…...

配置Spring Boot中的Jackson序列化

配置Spring Boot中的Jackson序列化 在开发基于Spring Boot的应用程序时&#xff0c;Jackson是默认的JSON序列化和反序列化工具。它提供了强大的功能&#xff0c;可以灵活地处理JSON数据。然而&#xff0c;Jackson的默认行为可能无法完全满足我们的需求。例如&#xff0c;日期格…...

AWS跨账号服务全解析:安全共享资源的最佳实践

在复杂的云环境中,企业常常需要将不同业务部门、项目或环境分配到独立的AWS账户中,以实现资源隔离和权限管控。然而,跨账户的资源共享与协作需求也随之而来。AWS为此提供了丰富的跨账号服务,允许不同账户之间安全、高效地共享资源。本文将深入解析这些服务,并结合实际场景…...

Rust~String、str、str、String、Box<str> 或 Box<str>

Rust语言圣经中定义 str Rust 语言类型大致分为两种&#xff1a;基本类型和标准库类型&#xff0c;前者由语言特性直接提供&#xff0c;后者在标准库中定义 str 是唯一定义在 Rust 语言特性中的字符串&#xff0c;但也是几乎不会用到的字符串类型 str 字符串是 DST 动态大小…...

SpringBoot五:JSR303校验

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 松散绑定 意思是比如在yaml中写的是last-name&#xff0c;这个和lastName意思是一样的&#xff0c;-后的字母默认是大写的 JSR303校验 就是可以在字段增加…...

Oracle 数据库基础入门(四):分组与联表查询的深度探索(上)

在 Oracle 数据库的学习进程中&#xff0c;分组查询与联表查询是进阶阶段的重要知识点&#xff0c;它们如同数据库操作的魔法棒&#xff0c;能够从复杂的数据中挖掘出有价值的信息。对于 Java 全栈开发者而言&#xff0c;掌握这些技能不仅有助于高效地处理数据库数据&#xff0…...

基于SpringBoot的绿城郑州爱心公益网站设计与实现现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

创建一个简单的spring boot+vue前后端分离项目

一、环境准备 此次实验需要的环境&#xff1a; jdk、maven、nvm和node.js 开发工具&#xff1a;idea或者Spring Tool Suite 4&#xff0c;前端可使用HBuilder X&#xff0c;数据库Mysql 下面提供maven安装与配置步骤和nvm安装与配置步骤&#xff1a; 1、maven安装与配置 1…...

标签使用笔记

文章目录 文件夹结构可以有多个功能吗?标签是如何保存的 标签做成对外接口保存、修改查询删除标签列表标签表设计标签和分类的区别 虽然大体知道怎么设计做&#xff0c;但是整理出来更清晰&#xff0c;那么整理下。 一般来说有两种索引就够。 1、标题文字索引。 # 用于搜索文章…...

Unity图集使用事项

一. 图集布局算法 紧密填充是一种常见的图集布局算法&#xff0c;它的主要目标是尽可能地减少图集的空间浪费。该算法会根据图像的形状和大小&#xff0c;将它们紧密地排列在图集中&#xff0c;以确保最小化空白区域的存在。这样可以有效地利用内存&#xff0c;并减少图集的尺…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...