0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何快速排查IO异常输出问题

strongerHuang 来源:鱼鹰谈单片机 作者:鱼鹰谈单片机 2022-03-09 17:55 次阅读

嵌入式开发过程中,IO 操作是不可避免的,很多时候 IO 操作很正常,但有些时候可能因为某些原因导致异常输出,或者说不是你想要的输出(本来应该一直输出高电平,突然出现一个低电平)。

1、时间太久,不知道在哪里操作了这个 IO。

2、程序异常篡改 IO 输出。

3、维护别人的程序,代码太多,不知道哪些地方会修改这个 IO。 针对这些情况,本篇笔记鱼鹰将讨论如何快速排查异常输出问题(软件问题,非单片机本身问题)。

一、全局搜索

一般来说,IO 输出肯定有迹可查,比如我们可以全局搜索 GPIOB 和 GPIO_Pin_0 之类的。

如何快速排查IO异常输出问题

当然,我们也可以借助 SI 之类的工具查看相关定义的使用情况。 总之,这个方法,比较笨,但对付一般的异常输出,问题不大。

二、断点神器

如果上述方法还是没法查出问题,那么只能请出我们的终极杀人王“火云邪神”,不,终极调试神器——断点出场了(关于该调试方法使用与介绍,可以查看历史笔记《打了多年的单片机调试断点到底应该怎么设置?| 颠覆认知》) 既然从源码很难分析这些问题,那就只能靠单片机本身提供的调试手段来查了。 比如,输出时,我们一般都会调用 GPIOB->BSRR 之类的寄存器设置高电平或低电平,所以我们可以使用我们的调试神器跟踪这个寄存器的写入情况,比如我们可以通过设置如下窗口跟踪 GPIOB->BSRR 写入情况:

如何快速排查IO异常输出问题

(这里设置为 4 字节访问,是因为这里的寄存器是 32 位的)

如何快速排查IO异常输出问题

当然,除了要查 BSRR,还有 BRR、ODR 等寄存器,还有别忘了,位绑定的地址操作。 总之,这些地址全部跟踪一遍,如果是软件问题,99% 都能查出来。 另外鱼鹰再教大家一个快速找到寄存器地址方法,比如在调试模式下,可以在命令行中输入下面这个,就能得到对应的地址,当然绑定地址只能通过变量中转一下了,或者直接看汇编代码也很快。 总之,找地址的方法很多,千万不要傻傻的自己手工算,不然怎么早点下班玩游戏啊。

如何快速排查IO异常输出问题

而对于有些 IO 的配置莫名的改变了,比如输入变输出,输出变输入,那还要跟踪 CRL 、 CRH 寄存器。 该方法从根本上跟踪指令,基本上所有代码都将无所遁形(除了 DMA 的操作,不过一般人应该不会用 DMA 去控制 IO 吧),即使你的代码是指针或者其他骚操作,甚至是异常篡改 IO 寄存器这种情况。

如何避免?

一般来说,上面两种方法基本上就可以排查问题了,但是有些情况很复杂,就需要根据情况选择适合自己的方法了,方法二绝对是神器级别的,一般问题不大。 所以现在讨论一下怎么尽量避免这个问题。 1、每个 IO 操作尽量封装在单独一个函数中,或者使用一个枚举参数进行控制,比如一个枚举 OUT_PIN_LED,这样在全局搜索时,搜索这个函数或者枚举就可找出所有操作该 IO 的位置,这也是鱼鹰为什么要实现这个 IO 框架的原因之一(简单实用IO输入输出框架)。绝对不建议直接操作库函数或者寄存器。2、使用 LCKR (锁定)寄存器。很多道友可能听说或者见过这个寄存器,但在实际项目中很少使用。事实上这个寄存器很有用处,特别是你不确定这个 IO 配置是否会被别人的代码修改的情况。如果很确定这个 IO 从始至终只会有一个配置(输入或输出等),那么建议大家在配置完后使用该寄存器锁定对应的引脚,这样,你就不怕别人意外修改这个 IO 的配置了(只要锁定了,就无法修改配置,除非重新上电)。之后你的关注点集中在 IO 输出即可,而不必怀疑配置被修改的可能。当然,在锁定这个 IO 之前的代码问题,可不敢保证。

原文标题:IO 异常输出排查指南

文章出处:【微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43978

    浏览量

    620864
  • 嵌入式
    +关注

    关注

    4983

    文章

    18286

    浏览量

    288494
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66784

原文标题:IO 异常输出排查指南

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    波特率漂移导致通信异常的故障排查过程

    示波器的协议解码功能大家都不生疏,你是否有过波形看起来正常,协议参数、解码设置都正确,却无法正常解码的经历呢?本文以UART协议为例,分享由于波特率漂移导致通信异常的故障排查过程。
    的头像 发表于 01-08 13:51 6060次阅读
    波特率漂移导致通信<b class='flag-5'>异常</b>的故障<b class='flag-5'>排查</b>过程

    描述mcp内核常见问题的排查方法帮助快速排查定位问题

    任何系统,硬件故障和软件故障都不可避免。比如车载系统,由于汽车行驶过程中的震动,发热,电瓶馈电等,很容易影响电子元件的特性,这对设备是致命的影响,会直接改变程序逻辑及运行结果从而产生各种不可预测的异常情况,本文描述常见问题的排查方法帮助
    的头像 发表于 07-12 09:23 1844次阅读
    描述mcp内核常见问题的<b class='flag-5'>排查</b>方法帮助<b class='flag-5'>快速</b><b class='flag-5'>排查</b>定位问题

    什么是准双向IO和开漏输出?上拉电阻的好处和选择原则

    单片机IO口内部的结构,主要是三种:准双向IO、开漏输出、强推挽输出
    的头像 发表于 11-09 16:27 843次阅读
    什么是准双向<b class='flag-5'>IO</b>和开漏<b class='flag-5'>输出</b>?上拉电阻的好处和选择原则

    如何排查 CS1237/CS1238 异常问题?

    首先确认处于量产阶段,还是开发阶段。如果是量产产品,则着重检查芯片是否损坏。简单的方法包括:观察 AD 值是否跳动幅度大;测量工作电流/休眠电流,看是否明显异常;测量芯片的二极管特性( GND-IO
    发表于 03-02 18:02

    寄存器配置IO输入输出问题怎么去解决呢

    寄存器配置IO输入输出问题来源:移植原子哥的IIC例程时,想修改一个SDA和SCL的引脚,却发现原子哥有一部分代码使用了寄存器编程。原函数如下://IO方向设置#define SDA_IN
    发表于 01-19 08:29

    Labview的一个异常崩溃

    起因:昨天升级程序后产线突然反馈程序异常崩溃,排查到了一个神奇的BUG。Labview异常崩溃报告未知异常:0x0000000000.排查
    发表于 03-17 18:05

    STM32的IO口如何输出5V?

    我们知道,STM32的IO都是3.3V输出的,但是有时候我们需要输出5V的电压,那怎么办,这里讲一个比较简单的方法。 1、STM32 IO 输出
    发表于 11-24 17:34 84次下载
    STM32的<b class='flag-5'>IO</b>口如何<b class='flag-5'>输出</b>5V?

    快速IO链接PHY大师决议

    快速IO链接PHY大师决议
    发表于 04-18 19:36 9次下载
    <b class='flag-5'>快速</b><b class='flag-5'>IO</b>链接PHY大师决议

    NXP LPC2214 ARM7芯片的引脚无法输出问题

    NXP LPC2214 ARM7芯片的引脚无法输出问题:工程是从LPC2138用过来的,增加了P2.3口的控制发现GPIOP2.3 无法输出高电平/*配置IO管脚映射*/PINSEL0
    发表于 12-04 10:51 9次下载
    NXP LPC2214 ARM7芯片的引脚无法<b class='flag-5'>输出问题</b>:

    在Kubernetes集群发生网络异常时如何排查

    本文将引入一个思路:“在 Kubernetes 集群发生网络异常时如何排查”。文章将引入 Kubernetes 集群中网络排查的思路,包含网络异常模型,常用工具,并且提出一些案例以供学
    的头像 发表于 09-02 09:45 3125次阅读

    Android异常日志快速定位分析小技巧

    Android异常日志快速定位分析小技巧
    的头像 发表于 08-09 10:06 1113次阅读
    Android<b class='flag-5'>异常</b>日志<b class='flag-5'>快速</b>定位分析小技巧

    java内存溢出排查方法

    过程中常见的问题之一,可能导致应用程序崩溃、性能下降甚至系统崩溃。在本文中,将详细介绍如何排查和解决Java内存溢出问题。 一、什么是Java内存溢出 在开始解决Java内存溢出问题之前,首先需要了解Java内存
    的头像 发表于 11-23 14:46 687次阅读

    Java怎么排查oom异常

    据量的应用中。要排查OOM异常,需要经过以下几个步骤: 理解OOM异常的原因:OOM异常通常有以下几个原因:内存泄露、内存溢出、内存不足以容纳所需的数据等。理解OOM
    的头像 发表于 12-05 13:47 469次阅读

    光伏电站绝缘阻抗异常排查方法

      光伏电站绝缘阻抗异常排查方法 【摘要】近几年,光伏发电技术迅猛发展,光伏扶贫电站及分布式光伏使光伏发电走进千家万户。然而光伏发电设备运行期间仍存在隐患。及时发现并解决*常见异常运行故障,可以很大
    的头像 发表于 01-16 13:57 365次阅读
    光伏电站绝缘阻抗<b class='flag-5'>异常</b><b class='flag-5'>排查</b>方法

    晶振输出频率异常怎么办?

    晶振输出频率异常怎么办? 晶振输出频率异常是指晶振输出信号的频率与预期不符。晶振作为一种常见的时钟源,广泛应用于各种电子设备中,包括计算机、
    的头像 发表于 01-24 16:11 256次阅读