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

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

3天内不再提示

单片机调试方法浅析

j4AI_wujianying 来源:未知 作者:胡薇 2018-07-05 16:02 次阅读

1. 利用I/O

1.1 利用LED进行可视化管理

这种方法需要有多余的I/O。(如果可能,也可以将实现次要功能的I/O暂时借来一用。)

其电路很简单,一个LED通过限流电阻接到VCC电源。I/O设置为输出方式。

我们可以用下面的宏来定义LED的操作。

#define LED_YELLOW_ON() PA6D=0

#define LED_YELLOW_OFF() PA6D=1

#define LED_YELLOW_FLASH() PA6D^=1

举个例子说明它的用法。在低功耗的产品设计中,我们一般采用“睡眠à醒来工作à睡眠à醒来工作”的工作模式,其程序结构如下:

while(1)

{

HLT = 1; //进入睡眠

nop();

clear_WDT(); //清看门狗

//醒来,处理各种事务

}

如果我们在程序醒来时点亮LED,事务处理完毕时熄灭LED,那么我们就能“看见”程序的工作状态,LED将周期性地闪烁。这就是我们称之为可视化管理的原因。(不记得在哪本书上看到“可视化管理”这个概念,我借用一下)

其软件结构是这样:

while(1)

{

HLT = 1; //进入睡眠

nop();

clear_WDT(); //清看门狗

LED_YELLOW_ON(); // debug

//醒来,处理各种事务

LED_YELLOW_OFF(); // debug

}

其实有些仿真器已经提供了这种监视程序睡眠状态的方法。如果没有提供,就可以用以上方法自行实现。

它的使用很灵活。比如可以用来在双时钟系统中监视快时钟的打开和关闭情况(慢时钟一般总是打开,因为要用作实时时钟的时钟源,而且慢时钟耗电很小)。你可以在打开快时钟时点亮LED,关闭快时钟时熄灭LED,这样一来快时钟的打开和关闭就一目了然了。

你也可以在某个中断中将LED的状态取反(使用LED_YELLOW_FLASH()),用来监视此中断的产生是否正常。虽然设置断点也可以知道中断是否产生,但会中断程序的执行,造成不便。

如果你想知道程序有没有执行到某个地方,你也可以将LED_YELLOW_FLASH()放到该位置。

依次类推,你可以用这个方法观察任何你想观察的事件。

当然你必须互斥地观察不同的事件。就是说,对于一个LED,在一次调试中,一般只能观察一个事件,否则你自己也弄不清LED的变化到底是代表发生哪一事件。

另外,你还可以同时使用两个或者更多不同颜色的LED来监视不同的事件,前提你有多余的I/O。

不中断程序的执行,又能看到程序的执行情况,应该说是一种很有效的调试程序的方法。相比开发工具所提供的单步、断点、观察变量等调试手段,这可以算是一种有效的补充。

1.2 利用示波器测试时间

利用上面的方法,再加一个示波器,就可以测量程序执行的时间了。(你可以自己决定接不接LED)。

比如,在初始化程序中,在打开总中断之前,写如下代码:

LED_YELLOW_ON();

nop();

LED_YELLOW_OFF();

使用示波器,在捕获模式下,你应该能捕获到一个脉冲,测试它的宽度,假如为30.5us。以OKI ML610Q431为例,一条nop指令包括1 cycles,1 cycles包括1 system clock。这里system clock等于振荡周期。(注意,不同的单片机对cycles, system clock的定义是不同的,需要参考各自的用户手册)。

那么我们可以这样计算振荡器的频率:1*1*(1/f)=30.5/1000000.

f=32786Hz

当然,如果示波器测量精度不够,可以多放几个nop指令,计算时再求平均。如果嫌示波器的捕获模式太麻烦,还可以采用循环结构,输出一串方波。比如:

while(1)

{

LED_YELLOW_ON();

nop();

LED_YELLOW_OFF();

nop();

clear_WDT(); //清看门狗

}

这种方法的使用也很灵活。你可以用来测试主循环的执行时间,调用某个函数所花的时间,以及某个中断处理的时间(不包括响应中断和退出中断的时间)等等。

当你发现某些时候主循环的执行时间特别长时,可以采用逐步缩小范围的方法来找出到底是哪个函数花费时间长,有没有可能将其优化。

下面是测试主循环执行时间的程序结构。

while(1)

{

HLT = 1; //进入睡眠

nop();

clear_WDT(); //清看门狗

LED_YELLOW_ON(); // debug

Fun1();

Fun2();

Fun3();

Fun4();

LED_YELLOW_OFF(); // debug

}

如果发现上面的执行时间异常(比如太长),你可以调整测试的位置,如下所示:

while(1)

{

HLT = 1; //进入睡眠

nop();

clear_WDT(); //清看门狗

Fun1();

LED_YELLOW_ON(); // debug

Fun2();

Fun3();

Fun4();

LED_YELLOW_OFF(); // debug

}

这样,你就可以确定执行时间过长是不是因为Fun1()引起。如果不是,则继续调整测试位置,逐个排除,直到找到真正费时的函数,对其进行分析,看看有没有可能优化。

当然,我们还可以用两个或更多I/O对多个事件进行逻辑分析,观察他们的先后顺序以及测试其时间间隔。这种方法也很有用,很灵活。在此不详述。

2. 利用LCD进行可视化管理

如果你的产品带LCD显示,又没有多余的IO可供调试,或者你只是想临时的调试某个功能,那么你可以临时使用LCD上的某个图标来指示某个事件。当某个事情发生时,显示该图标,否则清除该图标。

如果想在程序运行中获得更复杂、更丰富的信息,可以对不同的事件显示不同的数值。

3. 小结

不中断程序的执行,又能观察程序的执行情况,应该说是一种很有效的调试程序的方法。相比开发工具所提供的单步、断点、观察变量等调试手段,这可以算是一种有效的补充。实际上,这些调试方法很像PC应用开发的printf调试手段。它可以在不打断程序运行的情况下,借助于I/O,LED,示波器,数码管或LCD显示,给出各种各样的提示信息,帮助我们调试程序。

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

    关注

    237

    文章

    22449

    浏览量

    645872
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620821

原文标题:浅谈单片机调试方法

文章出处:【微信号:wujianying_danpianji,微信公众号:单片机精讲吴鉴鹰】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    单片机串口模块调试方法

    笔者在调试某Cortex-M3内核单片机时遇到一个问题,此单片机不具备在线仿真功能,因此调试代码时只能使用UART输出Log的方式调试
    发表于 07-28 15:48 1001次阅读
    <b class='flag-5'>单片机</b>串口模块<b class='flag-5'>调试</b><b class='flag-5'>方法</b>

    单片机原理及应用: 单片机应用系统设计仿真调试#单片机

    单片机调试
    学习硬声知识
    发布于 :2022年11月09日 00:48:48

    单片机原理及应用: 系统调试#单片机

    单片机调试单片机原理
    学习硬声知识
    发布于 :2022年11月09日 10:42:25

    单片机技术:智能小车联机调试方法#单片机

    单片机调试
    学习硬声知识
    发布于 :2022年11月10日 01:16:30

    《51单片机C语言实例浅析

    《51单片机C语言实例浅析
    发表于 08-20 19:33

    单片机进行音频ADC DAC调试方法是什么

    单片机进行音频ADC DAC调试方法是什么?单片机进行音频ADC DAC调试的工具是什么?
    发表于 11-15 06:08

    单片机实现AT调试命令的方法

    单片机实现AT调试命令文章目录单片机实现AT调试命令实现目的思路关键实现代码实现目的对于日常开发过程,我们经常需要借助串口调试设备,所以增加
    发表于 01-06 06:15

    讲解IAR单片机编程软件的工程调试使用方法

    IAR单片机编程软件的工程调试使用方法是什么?如何对IAR单片机编程软件的工程进行调试呢?
    发表于 01-27 06:45

    单片机的在线调试方法

    本文主要讲述的是单片机的在线调试方法
    发表于 04-22 16:43 33次下载

    ARM单片机开发调试方法

    ARM单片机开发调试方法
    发表于 07-25 13:21 36次下载

    单片机最小系统的调试方法_单片机最小系统设计制作及开发流程

    本文主要介绍了单片机最小系统的调试方法单片机最小系统设计制作及开发流程。
    的头像 发表于 04-24 09:35 1.1w次阅读
    <b class='flag-5'>单片机</b>最小系统的<b class='flag-5'>调试</b><b class='flag-5'>方法</b>_<b class='flag-5'>单片机</b>最小系统设计制作及开发流程

    单片机程序常用的几种调试方法

    单片机程序常用的几种调试方法,这些调试方法都需要结合电脑上位机,以下我罗列一些调试
    发表于 07-17 09:31 1.2w次阅读

    浅析PIC单片机的点阵运用程序

    浅析PIC单片机的点阵运用程序
    发表于 10-18 09:51 0次下载

    浅析PIC单片机的流水灯运用程序

    浅析PIC单片机的流水灯运用程序
    发表于 10-18 09:53 0次下载

    单片机常用的调试方法

    单片机程序调试过程中,串口打印调试方法是非常重要的手段,在使用串口调试时,我们更多的是使用printf。但是下面我们不介绍printf,介
    的头像 发表于 04-04 14:58 3729次阅读