嵌入式程序的下载与调试

2019-07-13 07:46发布

注:本例为:正点原子附带例程:实验 0-2 Template 工程模板- 调试章节使用

一. STM32 软件仿真

MDK 的一个强大的功能就是提供软件仿真,通过软件仿真,我们可以发现很多将要出现的问题,避免了下载到 STM32 里面来查这些错误,这样最大的好处是能很方便的检查程序存在的问题,因为在 MDK 的仿真下面,你可以查看很多硬件相关的寄存器,通过观察这些寄存器,你可以知道代码是不是真正有效。另外一个优点是不必频繁的刷机,从而延长了 STM32的 FLASH 寿命(STM32 的 FLASH 寿命≥1W 次)。当然,软件仿真不是万能的,很多问题还是要到在线调试才能发现。废话不多说了,接下来我们开始进行软件仿真。
在开始软件仿真之前,先检查一下配置是不是正确,在 IDE 里面点击 这里写图片描述。确定 Target 选项卡内容如图 所示(主要检查芯片型号和晶振频率,其他的一般默认就可以):
这里写图片描述
确认了芯片以及外部晶振频率(8.0Mhz)之后,基本上就确定了 MDK5.14 软件仿真的硬件环境了,接下来,我们再点击 Debug 选项卡,设置为如图 所示:
这里写图片描述
在图中,选择:Use Simulator,即使用软件仿真。选择:Run to main(),即跳过汇编代码,直接跳转到 main 函数开始仿真。 设置下方的:Dialog DLL 分别为:DARMSTM.DLL和 和 TARMSTM.DLL ,Parameter 均为:
-pSTM32F103RC ,用于设置支持 STM32F103RC 的软过 硬件仿真(即可以通过 Peripherals ) 选择对应外设的对话框观察仿真结果)。最后点OK,完成设置。接下来,我们点击 这里写图片描述(开始/停止仿真按钮),开始仿真(这里大家要注意,仿真之前,请先编译一下工程),出现如图 所示界面:
这里写图片描述
可以发现,多出了一个工具条,这就是 Debug 工具条,这个工具条在我们仿真的时候是非常有用的,下面简单介绍一下 Debug 工具条相关按钮的功能。Debug 工具条部分按钮的功能如图所示:
这里写图片描述
复位:其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。按下该按钮之后,代码会重新从头开始执行。
执行到断点处:该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的,而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能,前提是你在查看的地方设置了断点。
挂起:此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止下来,进入到单步调试状态。
执行进去:该按钮用来实现执行到某个函数里面去的功能,在没有函数的情况下,是等同
于执行过去按钮的。
执行过去:在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个
函数单步执行。
执行出去:该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的位置。
执行到光标处:该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功能,但是两者是有区别的,断点可以有多个,但是光标所在处只有一个。
汇编窗口:通过该按钮,就可以查看汇编代码,这对分析程序很有用。
观看变量/堆栈窗口:该按钮按下,会弹出一个显示变量的窗口,在里面可以查看各种你想要看的变量值,也是很常用的一个调试窗口。
串口打印窗口:该按钮按下,会弹出一个类似串口调试助手界面的窗口,用来显示从串口打印出来的内容。
内存查看窗口:该按钮按下,会弹出一个内存查看窗口,可以在里面输入你要查看的内存地址,然后观察这一片内存的变化情况。是很常用的一个调试窗口
性能分析窗口:按下该按钮,会弹出一个观看各个函数执行时间和所占百分比的窗口,用来分析函数的性能是比较有用的。
逻辑分析窗口:按下该按钮会弹出一个逻辑分析窗口,通过 SETUP 按钮新建一些 IO 口,就可以观察这些 IO 口的电平变化情况,以多种形式显示出来,比较直观。
Debug 工具条上的其他几个按钮用的比较少,我们这里就不介绍了。以上介绍的是比较常用的,当然也不是每次都用得着这么多,具体看你程序调试的时候有没有必要观看这些东西,来决定要不要看。这样,我们在上面的仿真界面里面 选内存查看窗口、串口打印窗口。然后调节一下这两个窗口的位置,如图 所示:这个是用来查看UART的。
这里写图片描述
我们现在先不忙着往下执行,点击菜单栏的 Peripherals->USARTs->USART 1。可以看到,有很多外设可以查看,这里我们查看的是串口 1 的情况。如图 所示:
这里写图片描述
单击 USART1 后会在 IDE 之外出现一个如图 (a)所示的界面:
这里写图片描述
图 (a)是 STM32 的串口 1 的默认设置状态,从中可以看到所有与串口相关的寄存器全部在这上面表示出来了,而且有当前串口的波特率等信息的显示。我们接着单击一下 ,执行完串口初始化函数,得到了如图 (b)所示的串口信息。大家可以对比一下这两个图的区别,就知道在 uart_init(9600)这个函数里面大概执行了哪些操作。通过图 (b),我们可以查看串口 1 的各个寄存器设置状态,从而判断我们写的代码是否有问题,只有这里的设置正确了之后,才有可能在硬件上正确的执行。同样这样的方法也可以适用于很多其他外设,这个读者慢慢体会吧!这一方法不论是在排错还是在编写代码的时候,都是非常有用的。然后我们继续单击 按钮,一步步执行,最后就会看到在 USART #1 中打印出相关的信息,如图 所示:
这里写图片描述
图中红 {MOD}方框内的数据是串口 1 打印出来的,证明我们的仿真是通过的,代码运行时会在串口 1 不停的输出 t 的值,每 0.5s 执行一次。软件仿真的时间可以在 IDE 的最下面(右下角)观看到,如图 3.4.1.10 所示。并且 t 自增,与我们预期的一致。接下来,我们再点击 这里写图片描述即可退出调试。

二.STM32 串口 程序下载

STM32 的程序下载有多种方法:USB、串口、JTAG、SWD 等,这几种方式,都可以用来给 STM32 下载代码。不过,我们最常用的,最经济的,就是通过串口给 STM32 下载代码。为了让下下载完后可以按复位执行程序,我们建议大家把 BOOT1 和 BOOT0 都设置为 0。
其实USB下载也是通过USB转串口下载的,只不过不用串口线了。串口即UART。(前提是电脑上装好了串口驱动 CH340G)
在安装了 USB 串口驱动之后,我们就可以开始串口下载代码了,这里我们的串口下载软件选择的是flymcu,该软件是 mcuisp 的升级版本(flymcu 新增对 STM32F4 的支持),由ALIENTEK提供部分赞助,mcuisp 作者开发,该软件可以在 www.mcuisp.com 免费下载。
然后我们选择要下载的 Hex 文件,以前面我们新建的工程为例,因为我们前面在工程建立的时候,就已经设置了生成 Hex 文件,所以编译的时候已经生成了 Hex 文件,我们只需要找到这个 Hex 文件下载即可。如图注意红 {MOD}位置:
这里写图片描述

三.JLINK下载与调试程序

如果代码工程比较大,难免存在一些 bug,这时,就有必要通过硬件调
试来解决问题了。串口只能下载代码,并不能实时跟踪调试,而利用调试工具,比如 JLINK、ULINK、STLINK等就可以实时跟踪程序,从而找到程序中的 bug,使开发事半功倍。这里我们以 JLINKV8 为例,说说如何在线调试 STM32。JLINK V8 支持 JTAG 和 SWD,同时 STM32 也支持 JTAG 和 SWD。所以,我们有 2 种方式可以用来调试,JTAG 调试的时候,占用的 IO 线比较多,而 SWD 调试的时候占用的 IO 线很少,只需要两根即可。首先,用 JLINK 进行下载与调试,大家要在硬件上,把 JLINK 用 USB 线连接到电脑 usb和板子的 JTAG 接口上。JLINK V8 的驱动安装比较简单,我们在这里就不说了。在安装了 JLINK V8 的驱动之后,我们接上 JLINK V8,并把 JTAG 口插到 ALIENTEK miniSTM32 开发板上,打开工程点击 这里写图片描述。打开 Options for Target 选项卡,在 Debug 栏选择仿真工具为 Cortex-M3J-LINK,如图 所示:
这里写图片描述
上图中我们还勾选了 Run to main(),该选项选中后,只要点击仿真就会直接运行到 main 函数,如果没选择这个选项,则会先执startup_stm32f10x_hd.s 文件的 Reset_Handler,再跳到main 函数。然后我们点击 Settings,设置 J-LINK 的一些参数,如图所示:
这里写图片描述
我们使用 J-LINK V8 的 SW 模式调试,因为我们 JTAG 需要占用比 SW 模式多很多的 IO 口,而在 ALIENTEK miniSTM32 开发板上这些 IO 口可能被其他外设用到,可能造成部分外设无法使用。所以,我们建议大家在调试的时候,一定要选择 SW 模式。Max Clock,可以点击 Auto Clk 来自动设置,图 中我们设置 SWD 的调试速度为 10Mhz,这里,如果你的 USB 数据线比较差,那么可能会出问题,此时,你可以通过降低这里的速率来试试。单击 OK,完成此部分设置,接下来我们还需要在 Utilities 选项卡里面设置下载时的目标编程器,如图所示:
这里写图片描述
图 中,我们直接勾选 Use Debug Driver,即和调试一样,选择 JLINK 来给目标器件的 FLASH 编程,然后点击 Settings 按钮,进入 FLASH 算法设置,设置如图 所示:
这里写图片描述
上图中我们还勾选了 Run to main(),该选项选中后,只要点击仿真就会直接运行到 main 函数,如果没选择这个选项,则会先执startup_stm32f10x_hd.s 文件的 Reset_Handler,再跳到main 函数。然后我们点击 Settings,设置 J-LINK 的一些参数,如图 所示:
这里写图片描述
这里 MDK5 会根据我们新建工程时选择的目标器件,自动设置 flash 算法。我们使用的是STM32F103RCT6,FLASH 容量为 256K 字节,属于高容量系列,所以 Programming Algorithm里面默认会有 512K 型号的 STM32F10x High-density Flash 算法(注意:256K 和 512K 共用)。另外,如果这里没有 flash 算法,大家可以点击 Add 按钮,自行添加即可。最后选中 Reset and Run选项,以实现在编程后自动启动,其他默认设置即可。设置完成之后,如图 所示:
这里写图片描述
在设置完之后,点击 OK,然后再点击 OK,回到 IDE 界面,编译一下工程。接下来我们就可以通过 JLINK 下载代码和调试代码。配置好 JLINK 之后,使用 JLINK 下载代码就非常简单,大家只需要点击 LOAD 按钮就可以进行程序下载。下载完成之后程序就可以直接在开发板执行。
硬件调试:和 软件仿真一样的方法操作,不过这是真正的在硬件上的运行,而不是软件仿真,其结果更可信。