STM32的程序下载方法有很多,主要有USB下载、串口下载(ISP下载)、JTAG下载和SWD下载等。其中,常用的下载方法是串口下载。但是串口只能下载程序,无法实时跟踪调试。虽然可以通过Keil MDK进行软件仿真调试,但是当工程比较大时,难免会存在一些难以发现的漏洞,仅通过软件仿真调试,很难及时找出程序中存在的错误。而通过JTAG或SWD下载程序,可以通过调试工具(如JLINK等)对程序进行实时跟踪,从而能够及时发现软件仿真调试中未能发现的漏洞,使嵌入式系统设计过程事半功倍。
利用串口实现STM32的程序代码下载,需要串口下载软件的支持,常用的软件是ST官方为CortexM3串口对STM32烧写程序而推出的FLASH_Loader_Demonstrator。首先从网上下载软件安装包,这里使用FLASH_Loader_Demonstrator_v1.3_Setup版本;其次双击打开,单击“Next”按钮并选择“Yes”即可进行用户名和公司名称的填写,之后一直单击“Next”按钮即可完成安装。
以STM32F103ZET6单片机为例,使用串口下载程序时,首先需要将系统BOOT模式设置为从系统存储器启动,即需要将硬件BOOT1接地,BOOT0与电源3.3V连接。在这种模式下,当STM32系统复位后,不会执行用户代码程序,所以每次下载完程序后,BOOT0必须重新接地才能从FLASH开始运行。STM32系统BOOT模式如表3.2所示。
表3.2 STM32系统BOOT模式
设置完启动模式之后,将STM32系统手动复位,并通过串口与计算机相连,之后在计算机控制面板上的设备管理器上查看STM32的串口号(见图3.26),本例中STM32使用的串口为COM7。如果之前没有安装CH340串口驱动,需要先安装CH340串口驱动,否则可能在设备管理器中看不到STM32的串口号。
图3.26 设备管理器串口查看
其次双击FLASH_Loader_Demonstrator图标,打开串口下载配置界面(见图3.27)。如果安装完之后桌面未添加软件图标,则直接在“开始”菜单中搜索,然后发送到桌面即可。在串口下载的配置界面中,将串口名称换成STM32对应的串口,波特率设置为115 200,其他选项默认即可。
图3.27 串口下载配置界面
再次单击“Next”按钮,FLASH_Loader_Demonstrator软件将会自动识别所使用芯片的FLASH型号,如图3.28所示。继续单击“Next”按钮,直到出现选择.hex文件路径的界面,如图3.29所示。单击“Download to device”单选按钮,选择需要下载的.hex文件路径。
图3.28 自动识别所使用芯片的FLASH型号
图3.29 选择.hex文件路径的界面
最后单击“Next”按钮即可下载程序。完成串口程序下载界面如图3.30所示。程序下载完成之后,单击“Finish”按钮,完成串口程序下载任务。
图3.30 完成串口程序下载界面
上述内容就是利用串口下载STM32程序的全过程。在下载完程序之后,一定要记得将BOOT0重新接地,这样才能使单片机从FLASH开始运行,以执行用户代码程序,从而可以在硬件上查看所编写的程序代码是否有效。
前面介绍了如何利用串口下载STM32程序。通过在硬件上进行实际运行可以验证所编写程序代码的正确性,这适用于比较简单的程序代码。但是如果所编写的代码量比较大,难免存在一些漏洞,则有必要通过硬件调试来解决问题。利用串口只能下载代码,并不能实时跟踪调试,而利用调试工具(如J-LINK、ULINK、ST-Link等)可以实时跟踪程序,从而及时发现程序中的错误,提高嵌入式系统开发的效率。
下面以J-LINK V8为例,讲解如何在线调试STM32。J-LINK V8能够支持JTAG和SWD两种模式,STM32也支持JTAG和SWD两种模式。所以,调试方法有两种。这两种调试方法的过程非常相似,区别在于采用JTAG调试时,占用的I/O线比较多;而采用SWD调试时,只需要两根I/O线即可。
同样,使用J-LINK V8之前也需要安装J-LINK V8驱动。
注意
在安装完J-LINK V8驱动之后,会弹出一个第三方软件应用选择窗口,选中Keil MDK软件,即允许Keil MDK使用J-LINK,再单击“OK”按钮就可以了。
安装完驱动后,连接J-LINK V8,并把JTAG接口插到STM32上,打开前面建立的通用工程模板,单击“魔术棒” 按钮,打开Debug选项卡,选择J-LINK仿真工具(见图3.31)。在右上方选择仿真工具为J-LINK/J-TRACE Cortex,如果JTAG工具为ULINK,则仿真工具需要选择为ULINK Debugger;如果JTAG工具为ST-Link,则仿真工具需要选择为ST-Link Debugger。
图3.31 选择J-LINK仿真工具
在图3.31中还勾选了“Run to main()”复选框,该复选框被选中后,只要单击仿真就会直接运行到main函数。如果没选择该复选框,则会先执行startup_stm32f10x_hd.s文件的Reset_Handler,再跳转到main函数。单击“Settings”按钮(注意,如果JLINK固件比较老旧,则可能会提示升级固件,单击“确认”按钮升级即可,但是升级期间一定不能断网或断开J-LINK连接),设置J-LINK参数,如图3.32所示。
图3.32 设置J-LINK参数
在图3.32中,使用J-LINK V8的SWD模式调试,因为JTAG模式需要占用比SWD模式更多的I/O端口,而在实际的工程应用中,这些I/O端口可能会被其他外设用到,从而容易造成部分外设无法使用。所以,建议在进行硬件调试时,选择SWD模式;如果非要选用JTAG模式,则只需要将ort选项设置为JTAG即可。在Max选项中,单击“Auto Clk”按钮,自动设置SWD的调试速度为10MHz。如果所使用的USB数据线比较差,在调试过程中可能会出现问题,可以通过降低调试速度来解决问题。单击“确定”按钮完成J-LINK参数设置。
接下来还需要在Utilities选项卡中设置下载时的目标编程器,直接勾选“Use Debug Driver”复选框。与之前的软件调试一样,选择J-LINK对目标器件的FLASH进行编程,然后单击“Settings”按钮,进入FLASH算法设置界面,如图3.33所示。
图3.33 FLASH算法设置界面
Keil MDK会根据新建工程时所选择的目标器件,自动设置FLASH算法。使用的STM32F103ZET6单片机的FLASH容量为512KB,所以在“Programming Algorithm”选区中默认512KB型号的STM32F10x High-density FLASH算法。另外,如果没有FLASH算法,则可以通过单击“Add”按钮自行添加。最后,选中“Reset and Run”复选框,实现在编程后自动运行,其他默认设置即可。设置完成之后单击“确定”按钮,完成FLASH算法设置。
在全部设置完之后,单击“OK”按钮,回到工程主界面,之后再编译工程。如果需要下载程序,则只需要单击 图标即可将程序下载到STM32中,非常方便。
下面简要讲解如何通过JTAG或SWD实现程序的在线调试。单击 图标开始对STM32进行仿真。J-LINK在线调试如图3.34所示。
图3.34 J-LINK在线调试
注意
STM32上的BOOT0和BOOT1都要接地,否则代码下载后不会自动运行。
因为勾选了“Run to main()”复选框,所以程序直接就运行到了main函数的入口处,把光标放到main.c的第15行最左边的灰色区域上,左击该区域,设置一个断点,单击“执行到断点处” 按钮,程序会执行到该断点处,之后用3.2.3节中所介绍的软件仿真的方法开始调试操作。这次是真正地在硬件上运行,其调试结果更加可信。
ULINK或ST-Link工具的在线调试方法与J-LINK的在线调试方法类似,只是在魔术棒选项卡的配置上稍有不同,这里不再详述,可以根据自己的工具自行尝试不同程序代码的在线调试和下载等操作。