天南地北客
发表于: 2015-11-16 13:19:24 | 显示全部楼层

我们来回顾一下在本系列的前两篇文章中做的事情。在第一篇文章中,我们配置了Eclipse和GCC用来在ARM Cortex平台建立应用程序。我们使用GNU ARM Eclipse插件为STM32 Nucleo板生成一个最小化但能工作的例程(简单的LED闪烁应用)。然后,我们使用ST的CubeMX工具为Nucleo板生成了正确的初始化代码。最后,我们使用ST-Link Utility将生成的二进制代码文件上载到目标MCU。在第二篇文章中,我们更深入的探讨了调试主题。我们配置了OpenOCD和GDB,允许我们的应用程序可以在Nucleo板上一步一步的执行。


在这篇文章中,我们将看到更多的调试工具,它们在调试固件过程中会非常有用。首先,我们将安装Eclipse插件,允许我们查看内部的MCU寄存器。然后,我们将看到如何配置ARM半主机,其属于ARM CMSIS框架的一项功能,允许将来自目标MCU的信息打印输出到OpenOCD的控制台。


安装EmbSysRegView


当我们进行在线调试目标MCU的固件时,检查MCU寄存器是非常有用的,特别是如果我们使用集成的外设如UART、SPI、CAN等等。像STM32F4之类的高级微控制器有非常多的内部寄存器。它们有不同的配置信息。例如,物理PIN可以有几个通过使用专用寄存器的不同设置启用的逻辑函数。EMBedded SYStems REGister VIEW(以下简称EmbSysRegView)是一个非常好的Eclipse插件,允许访问ARM Cortex MCU的内部的存储器映射寄存器。按照以下步骤安装插件。


转到Help->Eclipse Marketplace...,然后在Find文本框输入EmbSysRegView。当插件显示时,点击“Install”。

2014-12-26-10_35_47-Eclipse-Marketplace.png

在下个页面,勾选所有的选项,然后点击“Confirm”。

2014-12-26-10_37_57-Eclipse-Marketplace.png

在下个页面,接受许可,然后点击“Finish”。Eclipse将在一段时间后完成安装。重新启动IDE。

现在我们需要为目标MCU配置EmbSysRegView(我的NUCLEO板的MCU是STM32F401RE)。转到Window-> Preferences,然后转到C/C++->Debug->EmbSys Register View并且选择你的控制器,如下图所示。

2014-12-26-10_43_02-Preferences.png

接下来,调试我们的test1工程(在第一篇文章中我们创建的测试项目)。为显示EmbSysRegView控制台,转到Window->Show View->Other.... ,在选择对话框,转到Debug,然后选择EmbSys Registers。单击“OK”。

2014-12-26-10_47_16-Show-View.png

EmbSysRegView控制台显示在底部区域,如下所示。

2014-12-26-10_48_11-.png

EmbSysRegView插件是非常直观的。然我们来看一个例子。打开BlinkLed.c文件,并在第23行插入一个断点,该断点位于blink_led_init()函数里面,在函数中对PortA端口进行了配置使得第5引脚作为输出端口(Nucleo板的LED LD2连接到该引脚)。

2014-12-26-11_32_28-.png

点击Eclipse工具栏的运行图标。当执行自动停止在该条指令时,打开EmbSysRegView控制台,然后选择GPIO->GPIOA项。默认晴空下,查看寄存器功能是禁用的(可以通过看图标来辨别 - 当查看禁用时,图标是灰色的,否则是绿色的)。

2014-12-26-11_35_53-.png

在靠近寄存器名字的图标上双击。图标转成绿色。

2014-12-26-11_40_08-.png

现在,我们来单击StepOver图标,运行第23行的指令。EmbSysRegView将会显示MODER5寄存器已经改变了状态。

2014-12-26-11_44_00-.png


如果你点击一个寄存器,也可以改变它的值。例如。我们将MODER5寄存器从0x01恢复到0x00,LED LD2停止闪烁,因为该引脚现在配置成了输入引脚。只有当固件暂停执行时才能更改寄存器的值。

跳转到指定楼层
天南地北客
发表于: 2015-11-19 17:05:31 | 显示全部楼层

如何使用ARM Semihosting打印信息


在固件开发过程中,打印输出信息对于理解固件的执行情况是非常有用的。有时候,为了理解程序是否工作正常,打印变量的内容是很重要的。Arduino提供了这个功能,可以使用嵌入的虚拟串口。这个操作对于Nucleo板也是可以的,因为它也提供了一个专用的虚拟串口。但是,对于这种类型的操作,ARM CMSIS框架(集成在STM32Cube库里面)提供了专用的机制:semihosting(半主机)。ARM semihosting是一种远程过程调用。例如,Nucleo MCU调用printf()函数时,实际上有效的执行是发生在开发板连接的PC上。这样允许从特定的硬件(视频终端、键盘等)以及控制代码(设备驱动程序)分离出来。STM32微控制器上运行的代码只响应PC通过OpenOCD传递过来的参数。让我们来看一个例子。为了简单起见,我们将开始一个新的工程,并且在项目向导中使用下列选项。

2014-12-27-12_13_47-C-Project.png

当工程生成后,看一下main.c文件。你会注意到使用了trace_XXX函数。这些函数使用了ARM semihosting来有效的打印信息到OpenOCD的控制台。为了测试该工程,我们需要正确配置_initialize_hardware.c文件的configure_system_clock()函数里面的时钟,以及BlinkLed.h里面的LED LD2端口,如本系列教程的第一篇文章所示。另外,我们需要创建调试配置,如第二部分看到的。而且,我们需要在GDB配置中添加指令,以使能监视ARM semihosting,如下图所示:

2014-12-27-12_20_53-Debug-Configurations.png

该监控命令是一个前缀命令,用来从GDB传输剩余的指令到OpenOCD,并且使用4444 TCP端口。这意味着,OpenOCD将会受到使能semihosting的指令“arm semihosting enable”。

现在可以开始调试测试应用程序了。你会在OpenOCD的控制台看到main()函数打印的信息,如下图所示:

2014-12-27-12_24_19-Debug-test2_src_Timer.c-Eclipse.png

这篇文章结束了这一系列关于如何使用Eclipse、GCC为STM32 Nucleo板建立完整工作的工具链环境的教程。即使我们具体针对的是Nucleo开发板,对于STM32探索平台,这些指令仍然有效。你只需要正确配置具体的硬件,但是我认为,我给出的这些指令已经足以让每个人都能正确设置工作环境。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 37 | 回复: 55



手机版|

GMT+8, 2024-5-9 20:59 , Processed in 0.050956 second(s), 9 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表