当前位置: 首页 > 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;并减少图集的尺…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...