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

保姆级教程:用H3C设备搭建星型(Hub-Spoke)IPsec VPN,实现分支互访

企业级星型IPsec网络架构实战&#xff1a;基于H3C设备的Hub-Spoke模型部署指南 当企业业务规模从单一总部扩展到多分支机构时&#xff0c;网络架构的复杂性和安全性需求呈指数级增长。某零售企业在全国部署300家门店后&#xff0c;发现传统的点对点网络连接方式导致设备配置量激…...

Taotoken Token Plan套餐如何帮助个人开发者控制预算

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken Token Plan套餐如何帮助个人开发者控制预算 应用场景类&#xff0c;聚焦个人开发者或学生用户&#xff0c;其AI调用需求波…...

Go语言DDD实战:领域驱动设计

Go语言DDD实战&#xff1a;领域驱动设计 1. DDD分层 type UserService struct {repo UserRepository }func (s *UserService) CreateUser(cmd *CreateUserCommand) error {// 领域逻辑 }2. 总结 DDD通过统一语言和限界上下文实现复杂业务系统的有效建模。...

终极GTA5安全增强菜单:YimMenu完整使用指南

终极GTA5安全增强菜单&#xff1a;YimMenu完整使用指南 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu Y…...

中国分县林地面积统计数据

一、数据简介 林地是指生长乔木、竹类、灌木及其他林业植物的土地&#xff0c;是陆地生态系统的重要组成部分&#xff0c;也是森林资源的核心载体。CnOpenData中国分县林地面积统计数据基于中国国土三调及国土年度变更调查汇总统计成果整合形成&#xff0c;包括全国、分省、分市…...

美国签证预约机器人:3分钟掌握24小时智能抢号终极方案

美国签证预约机器人&#xff1a;3分钟掌握24小时智能抢号终极方案 【免费下载链接】us-visa-bot US Visa Bot 项目地址: https://gitcode.com/gh_mirrors/us/us-visa-bot 还在为美国签证面试预约的漫长等待而烦恼吗&#xff1f;面对有限的面试名额和激烈的竞争环境&…...

创业团队如何利用Taotoken统一管理多个AI模型API以控制开发成本

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 创业团队如何利用Taotoken统一管理多个AI模型API以控制开发成本 对于资源有限的创业团队而言&#xff0c;在业务开发中引入大模型能…...

实体门店低获客成本增长案例:3 人转介绍模型 + 消费返还机制落地分析

一、案例背景该门店为 60㎡社区夫妻店&#xff0c;位于成熟居住商圈&#xff0c;周边覆盖 3 个社区共 3000 余户居民。此前门店采用传统公域投放 线下发单的获客模式&#xff0c;获客成本偏高&#xff0c;用户留存与老客转介绍率存在较大提升空间。二、核心运营方案设计本次方…...

6款优质降AIGC平台 降痕效果拉满

写论文时不断攀升的AIGC率让人焦虑不已&#xff1f;别担心&#xff0c;这里整理了6款高效实用的降AIGC工具&#xff0c;堪称应对AI痕迹问题的"得力助手"。它们能有效识别并消除AI生成特征&#xff0c;降痕能力出众&#xff0c;助你轻松通过查重审核&#xff0c;彻底摆…...

从‘六度空间’到HNSW:图解这个让推荐系统变快的底层算法

从“六度空间”到HNSW&#xff1a;让推荐系统快如闪电的底层逻辑 你是否想过&#xff0c;为什么社交平台上总能精准推荐你可能认识的人&#xff1f;电商网站能在毫秒间为你匹配心仪商品&#xff1f;这一切背后&#xff0c;都藏着一个将“六度分隔理论”数学化的算法——HNSW&am…...