【经验】物联网创客指南:MCU设计的最佳实践和除错技巧(六)
上期《物联网创客指南:MCU设计的最佳实践和除错技巧(五)》中介绍了如何像Pro一样构建源代码在本系列最后部分中,您将了解嵌入式工具箱中最有价值技能的更多信息...在硬件中调试实时代码。
像天才一样调试问题
Simplicity Studio IDE最强大的功能是通过JTAG连接调试在EFM32设备上运行的实时程序。使用此工具,您将不再仅能简单地编程嵌入式设备,然后希望它可以正常工作。相反,您可以使用内省工具来查询软件,还可以人为地更改用于测试的变量和内存的值或发现难以找到的错误。
1.在调试运行之前构建项目
每当你开始调试你的代码,在直接去调试它之前建立代码。工具栏中的调试器图标将同时执行两个步骤,如果构建有错误,调试器将在失败的构建后启动,从而导致由于将项目加载到不存在的调试器中而导致的混乱错误。
2.打开所有调试功能
通过从工具栏中的调试图标旁边的下拉菜单中选择相应的项目,确保您正在使用“Debug”构建配置。
还要确保您的调试版本没有优化(默认值),并且调试级别设置为-g2或-g3,如“Project > Properties >C/C++ Build Settings”菜单中所示。
为了从调试中获得最大的收益,您需要确保调试器在任何“不良”或异常发生时停止并中断。在调试按钮旁边的下拉菜单中,单击Debug Configurations。在“ Debug Configurations ”窗口的“ Exceptions ”选项卡中,单击要调试器捕获的所有异常类型。这些在默认情况下不启用。
3.当调试器拒绝加载时,解锁调试访问
有时,当您为嵌入式应用程序开发代码时,您可能会在引导顺序早期锁定MCU的一些不良事件。系统中没有操作系统或其他主管来挽救您的程序。发生这种情况时,JTAG上的正常闪存例程将失败,调试器通知您调试器无法启动。您应该执行所有显而易见的事情,例如从计算机断开硬件,重新启动计算机或Simplicity Studio IDE,但是如果没有解决这个问题,您可以尝试解锁对MCU的调试访问。
Flash Programmer中的Unlock Debug Access选项将擦除MCU上闪存的内容,并使MCU处于允许通过编程再次写入的状态。只要注意,如果再次使用糟糕的编程,在启动顺序的早期发生不好的事情,您将需要再次解锁调试访问。
只需记住,您必须确保您的Detected Hardware设置为检测主要Simplicity Studio主屏幕中的Detect Target Part,并且您的Debug Mode设置为Kit Manager中的MCU或Out,以便Flash Programmer显示适当的选择。有关如何连接到硬件的更多信息,无论是入门工具包还是您自己的硬件板,请参阅Connect to your own PCB over JTAG,本章的Starter Kit部分。
4.使用一个空白项目来修复调试器启动问题
每当你开始一个新的项目,首先建立一个empty_project.c。然后,在该空文件上启动调试器,以证明主机与EFM32硬件平台之间的所有连接正在运行。有时,您会发现检测到的EFM32部件类型与项目中指定的EFM32部件类型之间存在不匹配。在尝试将自己的代码和库文件添加到组合之前解决这个问题。
一旦你的代码开始运行,有时候事情就会中断,你的代码拒绝加载到硬件中。在以前的步骤,尝试解锁调试访问和其他硬件技巧后,您的问题可能在于项目设置。在你的环境中可能会有变化。加载一个空项目,看看没有任何你自己的代码下是否可以让它重新工作。如果它有效,那么问题就在项目设置的某个地方。您可以选择追查现有项目中的问题或创建一个新项目,并将所有源文件复制到新项目中,然后修改新项目的“Project Properties”,使其与旧项目的项目相匹配。这个过程应该让你恢复。
5.编写代码来帮助调试器
在调试会话期间开发要使用的代码时,您可以执行一些操作来使过程更容易:
定义要在具有常量的监视窗口中检查的数组。如果调试器可以知道数组在编译时有多大,那么可以为您提供适当数量的元素来检查它们。否则,每次启动调试器时,都必须为调试器监视窗口手动添加一系列索引。
使用volatile变量来控制不希望MCU自动执行的代码块的执行。如果您正在调试一些代码,在启动时清除大块闪存或其他危险代码,则每次启动MCU时都会执行此操作。您可以通过将危险代码封装在代码块中来阻止它的执行,只有当您使用调试器功能才能实现时才会执行。例如:
volatile inti=0;
if (i)
{
//Do something dangerous, which could reset the system, etc.
}
1)在if语句上放置一个断点,然后在调试器中的“Move to Line”中移动到要执行的if语句的第一行。然后在随后的重置中,if语句中的代码将永远不会执行。我的volatile声明阻止编译器从if语句内优化代码块。
2)不要在模块中的多个范围内使用相同的变量名。当您将鼠标悬停在实时调试会话中的变量上时,调试器可能会感到困惑,并显示错误的值。如果您有一个名为foo的全局变量和名为foo的本地变量,调试器并不总是基于范围显示foo变量的正确值。保持变量名称唯一,并且调试器将为您提供变量的正确值。
当您的项目正在运行并且Simplicity Studio正在寻找断点时,不要在IDE中设置断点或过多播放。这可能会改变你的代码的定时,并导致它错过中断。在到达断点之前尽量少地碰IDE。
如果您在一行代码上设置中断时出现问题,那意味着您在当前项目中已设置了太多断点,或者编译器认为您尝试中断的代码无法访问。例如,if(0)语句永远不会执行,编译器知道这一点。禁用所有其他断点,必要时重新启动IDE,清理项目并重建。然后,再次尝试设置断点。
6.连接到运行实例,而不需要重置MCU
如果您正在自己的硬件上运行一个加载有Debug configuration的项目,则可以将其附加到它并进行检查,而无需重置设备。如果您的系统已经锁定,并且您想要进入这些检查项目而不启动新的调试会话,这将特别有用。请注意,有时将JTAG从入门工具包连接到您的自定义项目可能会导致重置。您可以通过使用跳线将您的自定义项目与入门套件相接,然后连接JTAG电缆,或者在整个测试过程中将JTAG连接起来,可以缓解此问题。
为了附加到正在运行的项目,选择Run> Attach to menu,然后选择正确的项目。请注意,在目标硬件上运行的软件版本以及从“Attach to”菜单中选择的项目必须是相同的版本,否则您将获得无关紧要的结果。一旦代码编译和调试器附加,您可能需要双击左上角的窗口,称为SILICON LABS ARM MCU,展开旁边的下拉图标,然后找到<project> .axf 文件。一旦找到并突出显示,您可以按暂停按钮或在代码中设置断点,就像从调试工具启动它一样。
7.在配置的外围设备上强制执行
当您第一次配置外设时,可能很难确认您具有正确的GPIO引脚,路由,外围设备配置,并且您已经正确地解释了所有必要的指令让一切顺利。总而言之,以下是启用EFM32设备中任何外设的必要步骤:
1)启用GPIO时钟
2)启用外设时钟(即USART,I2C,DAC等)和其他必要的时钟源
3)配置和启用外设
4)将外围设备使用的引脚连接到GPIO
5)配置外设在GPIO中使用的引脚(即推拉,输入等)
为确保所选外围设备的GPIO引脚按照您的期望连接到硬件中的相应位置,您可以创建一个空项目,并简单地设置或清除GPIO。验证您是否在示波器或万用表上看到更改。一旦您确定连接到正确的GPIO引脚,您可以恢复正在尝试编程的外设的调试。如果你像我一样,那么你忘了启用外设时钟。
8.不要在UART上使用打印语句来调试定时问题
MCU上的调试是一个棘手的事情,因为有限的资源意味着任何观察系统的尝试都会影响系统的性能。调试打印语句引起的定时更改可能会导致您尝试找到的问题消失。您在后台不具备多核和深度内存资源来处理这种调试打印。
您可以通过使用具有基于中断机制的打印缓冲区来缓解调试打印语句的定时效果。如果您只是将一个打印语句的字符放在UART上,那么在将另一个字符放在UART之前,请等待字符完成,否则您的单线程嵌入式应用程序的执行速度将会降低。通过使用缓冲区和中断来供给UART,您将减少对嵌入式应用程序的影响。
如果UART不可用于调试输出,或者如果维修UART打印语句的时间仍然导致定时问题,则可以将所有调试打印语句放在调试缓冲区中,并通过Simplicity Studio调试器检查缓冲区的内容。简单地检查调试器中打印缓冲区的值,它将自动将缓冲区转换为ASCII文本,让您在错误发生之前看到其中传入的消息。
最后,在代码中的各个地方切换不同的GPIO引脚可以帮助说明程序的流程,以及如何按照您期望的顺序执行。您可以将这些GPIO连接到LED,以使事件慢到足以通过示波器观察,这将提供精确的定时信息。
EFM32开发与出错技巧总结
我希望本指南有助于您更好地了解如何设置,开发和调试项目以获得成功。如果遇到很多问题,不要气馁。嵌入式开发并不容易。需要投入大量精力和时间。到处都有机会学习新的东西。坚持下去,你终会获得惊人的成就!
看到这里您是否又有项目灵感需实现,点击下面开发软件帮你忙。
- |
- +1 赞 0
- 收藏
- 评论 1
本网站所有内容禁止转载,否则追究法律责任!
相关推荐
【经验】32位MCU LEUART位周期抖动大,该如何解决?
Silicon Labs 32位MCU EFM32,当基于32.768kHz时钟使用LEUART(@9600bps)进行通讯的时候,发现存约1%误码,原因是什么?如何解决?
设计经验 发布时间 : 2019-09-06
【经验】如何使用32位超低功耗MCU外设反射系统功能?
外设反射系统(PRS)是 Silicon Labs EFM32系列MCU专有的外设互联总线,它允许不同的外设无需CPU干预即可直接相互通信。
设计经验 发布时间 : 2019-09-02
【经验】物联网创客指南:MCU设计的最佳实践和除错技巧(四)
本文讨论类型转换的潜在问题,以及如何在出现问题时用配置锁解决问题。
设计经验 发布时间 : 2019-07-10
世界上最节能的微控制器EFM32之十大低功耗奥秘
Silicon Labs EFM32 32 位微控制器系列是世界上最为节能的微控制器,特别适用于低功耗和能源敏感型应用,包括能源、水表和燃气表、楼宇自动化、警报及安防和便携式医疗/健身器材。本文着重强调10个Silicon Labs32位MCU功耗低的因素。
新产品 发布时间 : 2016-07-11
EFM32系列MCU在Simplicity studio中如何通过 printf 定向到 LEUART?
对于printf函数的使用,与芯片有关,与调试器有关,与软件平台也有关。Silicon Labs公司的EFM32产品,它使用的是J-Link调试器、通过SWO接口对外输出数据,以实现printf函数功能。所以,它不能通过配置LEUART来实现。EFM32可以在simplicity studio、keil、IAR等3个平台下调试,在各自的平台下,都可以实现printf函数功能。需要注意的是,在硬件连接上,EFM32产品的SWO口,务必要连接到调试接口上。具体实现方法及相关例程,请参考应用笔记《AN0043 EFM32的调试和跟踪》。下载地址:http://www.sekorm.com/doc/43632.html
技术问答 发布时间 : 2017-06-12
如何读取EFM32系列32位MCU的多通道AD扫描采样数据?
EFM32系列单片机ADC的数据保存寄存器有两个,一个是单通道模式的采样数据保存寄存器,一个是扫描模式的采样数据保存寄存器。如果使用多通道扫描采样,那么每个通道采样完成后会产生一个ADC扫描模式中断,用户需要在中断里面读取该通道的扫描采样数据以便存储下一个通道的采样数据。建议使用DMA读取方式,将DMA的触发源设置为ADC的扫描模式事件,这样就可以实现不用进入ADC中断以及MCU的参与即可完成ADC扫描采样数据的保存和读取。
技术问答 发布时间 : 2017-05-05
如何为Silicon Labs 32位低功耗MCU EFM32GG230F512实现基于RTC的软件无滴答日历?
在Silicon Labs 32位低功耗MCU EFM32GG230F512上实现软件方式的无滴答日历,可以通过使用日历标准C库 time.h, 在time.h中实现的timer()函数基于RTC计数值来计 算日历时间。
技术问答 发布时间 : 2017-10-10
超低功耗MCUEFM32能耗模式探讨
世强代理的Silicon Labs EFM32 MCU 旨在在低能耗模式下实现高度的自主运行。该MCU 智能结合了外围设备、低漏电 RAM、数据保持、DMA 和互联能力、低功耗振荡器以及极短的唤醒时间,因此长时间在低能耗模式下的运行效果很好,大幅降低了能耗。
技术探讨 发布时间 : 2019-09-05
Silicon Labs 32位低功耗MCU EFM32GG990芯片使用中,将OPAMP(运算放大器)组合成三运放差分放大器时可选的放大倍数为多少?
当将三个OPAMP组合成差分放大器时,差分放大器的增益是由OPA0和OPA1的组合增益所决定的,由于三运放差分电路的电阻网络对应的桥臂要对应成比例,所以只三种有 效的差分增益可供使用,它们分别为1/3、1和3,此时OPA0 RESSEL和OPA2 RESSEL的组合分别为0和4、1和1、4和0。
技术问答 发布时间 : 2017-10-10
Silicon Labs EFM32系列32位低功耗MCU Cortex系列微控制器采用的软件接口标准CMSIS有哪些特性?
嵌入式系统越来越复杂,开发和软件测试的工作量也显著增加,为了减少开发时间并且降低产品中存在的风险,软件重用已经越来越普遍。为了各种软件产品间的配合,ARM同各大 微控制器供应商、工具供应商和软件解决方案提供商一起开发了CMSIS,一个涵盖了大多数Cortex-M处理器和Cortex-M微控制器产品的软件框架。 CMSIS的设计目标和特性包括以下几点: 1、提高软件的可用性。 2、提高软件的兼容性。 3、独立的工具链特性。 4、开放性。 5、易用性。
技术问答 发布时间 : 2017-10-10
Silicon Labs EFM32系列32位低功耗MCU Cortex-M3内核嵌套向量终端控制器(NVIC)有哪些特性?
1、支持最多240个中断输入、不可屏蔽中断输入和多个系统异常。除了NMI外,每个中断都可以被单独使能或禁止。 2、中断和多个系统异常具有可编程的优先级。对于Cortex-M3/M4,优先级可以在运行时动态修改(注意,Cortex-M0/M0+不支持优先级的动态修改)。 3、嵌套中断/异常以及中断/异常按照优先级自动处理。 4、向量中断/异常。意味着处理器会自动取出中断/异常向量,无需软件确定产生的是哪个中断/异常。 5、向量表可以重定位在存储器中的多个区域。 6、低中断等待。对于具有零等待状态的存储器系统,中断等待仅为12个周期。 7、中断和多个异常可由软件触发。 8、多个优化用于降低不同异常上下文切换时的中断处理开销。 9、中断/异常屏蔽功能可以将所有的中断和异常(NMI除外)屏蔽掉,或者将中断/异常屏蔽为某个优先级之下。 为了支持这些特性,NVIC使用了多个可编程寄存器。这些寄存器经过了存储器映射,而CMSIS-Core则为大多数常见的中断控制任务提供了所需的寄存器定义和访问函数 (API),这些访问函数非常已于使用。
技术问答 发布时间 : 2017-10-10
Silicon Labs EFM32系列32位低功耗MCU的硬件设计时要关注什么?
1、对于Silicon Labs EFM32系列32位低功耗MCU的系统设计者,有几个值得关注的因素,包括如何为芯片提供鲁棒性的电源,如何连接外部调试接口以及如何设计外部时钟源。 2、电源: 尽管EFM32支持宽的电压范围并且消耗很小的平均电流,但是正确的去耦是极其重要的。对于高频暂态信号去耦电容能使得电源和MCU以及地之间的电流回路尽量 短。 3、调试接口及外部复位引脚 (RESETn): 除了可选的SWO(串行线输出), 调试接口包括SWCLK(时钟输入)和SWDIO(数据输入输出)线, 除此之外可 选的SWO(串行线输出)。在无需外部复位的情况下因为复位引脚(RESETn)具有内部上拉电阻所以可以不做连接。强行拉低RESETn引脚将对产生EFM32触发复 位。 4、外部时钟源: EFM32除了内部低频和高频RC振荡器模式外也支持不同的外部时钟源来产生低频以及高频时钟。可能的低频LF和高频HF域外部时钟源是外部振荡器(方 波或者正弦波)或者晶体/陶瓷谐振器。
技术问答 发布时间 : 2017-10-10
Silicon Labs 32位低功耗MCU EFM32ZG210F32是否支持Audio jack音频接口通讯?
Silicon Labs 32位低功耗MCU EFM32ZG210F32支持Audio jack音频接口通讯,通过Timer定时器的捕捉功能实现的。原厂有提供音频通讯的参考代码,请参考AN0054。
技术问答 发布时间 : 2017-10-10
32位低功耗MCU EFM32系列内部的LFRCO是32K还是32.768K?
EFM32系列32位低功耗MCU内部的LFRCO为32K。
技术问答 发布时间 : 2017-10-10
Silicon Labs 32位低功耗MCU EFM32G232F128系列微控制器GPIO的最大翻转速度为多少?
EFM32G232F128系列微控制器GPIO的最大翻转速度为系统时钟的1/6。例如,当主频为32MHz时,GPIO最大翻转速度大约为5.3MHz。
技术问答 发布时间 : 2017-10-10
电子商城
现货市场
登录 | 立即注册
提交评论