1)实验平台:正点原子stm32f103战舰开发板V4
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html#
第四章 APM32初体验
本章并不涉及程序代码的编写,而是介绍如何编译工程、烧录程序以及进行程序的调试仿真,让读者体验APM32的开发流程,并会介绍一些MDK的使用技巧。通过本章的学习,读者将对APM32的开发流程及MDK的使用方法有一个大概的了解,为后续的深入学习打好基础。
本章分为如下几个小节:
4.1 使用MDK编译实验例程
4.2 使用串口烧录程序
4.3 使用DAP烧录及调试程序
4.4 MDK使用技巧
4.1 使用MDK编译实验例程
在编写完程序代码后,需要对程序进行编译,只有在程序编译成功后,才能将编译出的二进制文件烧录至芯片中运行以及进行仿真调试等操作。
本书配套提供的实验例程在A盘4,程序源码目录中,如下图所示:
图4.1.1 配套提供的实验例程源码
在上图“标准例程”文件夹中,就包含了基于Geehy提供的标准库编写的各个实验例程,如下图所示:
图4.1.2 标准例程
从上图中可以看到,除了“实验0 基础入门实验”是用于创建MDK工程等MDK基础使用例程外,共有40个实验,其中部分实验内有多个实验例程,总的实验例程多大55个。
秉承着简单易懂的原则,本章以跑马灯实验例程(“实验1 跑马灯实验”)作为示例例程,例程的根目录如下图所示:
图4.1.3 跑马灯实验例程根目录
所有实验例程的目录结构都与上图中的目录结构类似,这会在后续创建MDK工程相关的章节中进行介绍(其实光看文件夹的名称,就能知道文件夹大概的作用了)。
接下来打开MDK工程文件,其路径为ProjectsMDK-ARMatk_f407.uvprojx,如下图所示:
图4.1.4 跑马灯实验例程MDK工程文件
注意:打开MDK工程文件的前提是正确地安装了MDK软件。
使用MDK打开跑马灯的MDK工程文件后,如下图所示:
图4.1.5 使用MDK软件打开跑马灯MDK工程
如上图所示,在MDK软件的左上方可以看到两个快捷按钮,这两个按钮都是用于编译工程的,区别如下:
①:Build按钮,快捷键F7,该按钮用于编译工程,并且该按钮比较“聪明”,使用该按钮编译工程时,只会编译在上次编译后被改动或需要重新编译的文件,并不会重新地编译整个工程,从而可以大大地缩短编译时间,推荐使用。
②:Rebuild按钮,无快捷键,该按钮会重新地编译整个工程,因此整体上会比Build按钮耗时。
虽然Build按钮和Rebuild按钮存在一些差别,但是对于没有编译过的工程,这两个按钮的作用都是一样的,因此接下来按下任意一个编译按钮或直接点击快捷键F7编译跑马灯工程,编译完成后,MDK软件底部的Build Output窗口会输出编译信息,如下图所示:
图4.1.6 编译结果输出信息
从上图中,就可以查看到本次编译的许多信息,这里介绍输出信息的后四行,如下:
Code:程序代码占用的空间大小(3376Bytes);
RO-data:只读数据(一般是const关键字修饰的常量)占用的空间大小(436Bytes);
RW-data:有初值(初值不为0)的可读写数据(Flash中存放初值,取出至RAM中被访问)占用的空间(同时占用Flash和RAM)大小(12Bytes);
ZI-data:无初值(初值为0)的可读写数据占用的空间大小(1836Bytes);
从上面的信息就可以看出,在不考虑动态内存分配的情况下,编写的程序将占用3824Bytes(Code+RO-data+RW-data)的Flash空间和1848Bytes(RW-data+ZI-data)的RAM空间;
创建了Hex文件(能够被单片机执行的文件,可直接烧录至单片机内部的Flash执行,使用串口烧录程序时使用);
创建了AXF文件(不仅包含了能够被单片机执行的文件,还附加了其他的调试信息,能够进行仿真调试都靠它,使用调试器烧录程序时使用);
编译结果有0个错误和0个警告;
编译耗时为1秒钟。
实验例程编译出的文件默认会输出在Output文件夹下,如下图所示:
图4.1.7 编译文件和编译过程产生的中间文件
从上图中可以看到,编译成功后,不仅生成了Hex和AXF文件,还生成了许多中间文件,对此,本书将在后续的MAP文件分析时进行介绍。
至此就完成了实验例程的编译,对于其他的实验例程,读者可以用同样的方式进行编译。
4.2 使用串口烧录程序
APM32烧录程序有三种常见的方式,如下表所示:
表4.2.1 APM32常见程序烧录方式对比
通过上表对比,推荐读者在没有仿真器的情况下使用串口方式烧录程序,若有仿真器则使用SWD的方式烧录程序,同时也强烈建议读者购买一个仿真器(如CMSIS-DAP仿真器),可以极大的方便学习和开发。
上表中BOOT0和BOOT1引脚是APM32F407上的两个引脚,这两个引脚可以用于配置APM32F407上电或复位时的启动模式,具体如下表所示:
表4.2.2 APM32F407启动模式配置
从上表中可以看出,通过设置BOOT[1:0]引脚,可以配置APM32F407从不同的地址运行程序,其中Flash中的程序就是用户烧录至芯片的用户程序,系统存储器中的程序是芯片厂家在芯片出厂前被固化(不可修改)到芯片内部的程序,也就是芯片内嵌的BootLoader程序。
通过芯片内嵌的BootLoader程序,用户可以非常轻松地将用户程序烧录到Flash中,即使某些在使用Flash启动时无法烧录程序的情况,例如,Flash中的用户程序关闭了SWJ-DP(Serial Wire/JTAG Debug Poet,串行/JTAG调试端口)的情况。芯片内嵌BootLoader提供了多种烧录用户程序至Flash的接口,如:USART1、USART3、CAN2、USB OTG_FS从设备模式,当然,也可以在BootLoader程序运行过程中通过仿真器烧录程序至Flash。
本章就介绍如何使用串口1(USART1)实现APM32F407的程序烧录。
从前文本小节的介绍中可知,若要使用串口1烧录程序,则需让APM32F407运行在芯片内嵌的BootLoader程序中,而进入芯片内嵌BootLoader的方法为:在芯片上电或复位时将BOOT0引脚置为高电平、BOOT1引脚置为低电平,进入芯片内嵌BootLoader后就能够使用相关的上位机软件将事先编译出的Hex文件烧录置Flash中,烧录成功之后,还需要将BOOT0引脚置为低电平,然后重新上电或复位芯片,芯片才能运行烧录的用户程序,在这整个过程中,至少需要手动改变两次BOOT0引脚的电平和进行两次复位,比较繁琐。为此,APM32F407最小系统板利用串口的DTR和RST信号,设计了一键下载电路。
一键下载电路使用串口的DTR信号控制APM32F407的BOOT0引脚,使用串口的RST信号控制APM32F407的NRST引脚(芯片复位引脚),再配合上位机软件(ATK-XISP),设置“DTR的低电平复位,RST高电平进BootLoader”,这样就能够由软件自动控制APM32F407芯片的BOOT0引脚和复位,从而实现一键下载。一键下载电路的原理图级介绍,请参考《APM32F407最小系统板硬件参考手册.pdf》。
在使用串口烧录程序之前,需要将芯片通过串口和和PC进行连接,除了按照3.4小节中事先安装好USB虚拟串口的驱动并将板卡与PC进行连接,还需保证板卡上的PA9和PA10端子通过跳线帽分别与RX和TX端子进行连接,以保证板载CH340C芯片与APM32F407ZGT6 MCU通过串口相连接,如下图所示:
图4.2.1 板卡设置
使用一键下载电路烧录程序的时候,需要使用到的上位机软件为ATK-XISP,读者可以前往正点原子资料下载中心下载该软件,也可以在A盘6,软件资料1,软件ATK-XISP中找到该软件,如下图所示:
图4.2.2 ATK-XISP软件
打开ATK-XISP软件后,需先根据实际情况进行一些配置,如下图所示:
图4.2.3 ATK-XISP配置
①:先在“串口”列表中根据实际的情况选择连接至板卡的COM口,串口通信波特率可以选择最大值(若后续程序烧录失败,再适当降低串口通信波特率);
②:选择4.1小节编译出的Hex文件;
③:勾选“编程后运行”和“校验”复选框,这样可以保证烧录程序的正确性,并在程序烧录完成后自动运行程序,省去了手动复位的操作;
④:务必正确设置为“DTR低电平复位 RST高电平进BootLoader”,以保证能够配合一键下载电路控制APM32F407进入BootLoader烧录程序并且控制器复位。
设置好ATK-XISP软件之后,就能够点击“开始编程”按钮,即可一键将程序烧录至APM32F407,烧录成功后,如下图所示:
图4.2.4 烧录成功
从上图中可以看到,ATK-XISP软件会输出烧录过程中的相关操作信息,例如如何控制APM32F407进入BootLoader、烧录了多大的程序至Flash、耗时多久等信息。同时,也能看到提示“运行成功”,这就表明APM32F407已经在运行Flash中的用户程序了,此时便可以看到APM32F407最小系统板上的LED0和LED1闪烁。
至此就完成了跑马灯实验例程程序的烧录,对于其他的实验例程,读者也可以使用同样的方式使用串口进行程序烧录。
4.3 使用DAP烧录及调试程序
在上一节中介绍了使用串口给APM32烧录程序,但仅通过串口,并不能很方便地进行代码调试和仿真,而只能观看程序的运行结果,因此在需要调试程序代码的时候,最好还是使用仿真器进行程序的烧录和调试,本节就将介绍,如何使用正点原子DAP仿真器给APM32进行程序的烧录和调试,对于其他型号的仿真器,具体的操作步骤也都是类似的。
正点原子DAP仿真器与APM32F407最小系统板的连接步骤如下:
①:通过板卡USB_UART接口为板卡供电,也可以连接至PC,这样可同时查看串口输出的数据;
②:通过USB接口将正点原子DAP仿真器与PC进行连接,若连接正常,DAP仿真器的蓝灯常亮;
③:通过4P排线将正点原子DAP的SWD接口与板卡的SWD接口相连。
4.3.1 使用DAP烧录程序
同样以第4.1小节中的跑马灯实验例程为例,在MDK软件界面下,点击 按钮(快捷键Alt+F7)打开“Options for Target”窗口,同时打开窗口顶部的“Debug”选项卡,如下图所示:
图4.3.1.1 Debug选项卡配置
如上图所示,打开“Debug”选项卡后,在①处根据使用的仿真器型号选择对应的调式工具,本章使用DAP仿真器,因此选择“CMSIS-DAP Debugger”,读者若使用其他仿真器,则对应选择调试工具即可。勾选②处的“Run to main()”复选框可以在开启调试后,程序自动运行到main()函数,否则程序会从启动文件中的“Reset_Handler”(复位异常)标号开始运行,读者可根据实际情况选择勾选或不勾选改复选框。接着再打开③处的“Settings”按钮,打开对应调试器的配置窗口,如下图所示:
图4.3.1.2 DAP仿真器配置窗口
如上图所示,若PC上连接了多个DAP仿真器,则需要在①处选择对应的DAP仿真器,若DAP仿真器与板卡连接正常,则会在②处显示“IDCODE”和“Device Name”,若连接异常,则会显示“Error”,此时应该检查接线和供电。接着在③处的“Port”下拉框选择“SW”,该选项对应4Pin的SWD接口,另外一个选项为“JTAG”,其对应的是20Pin的JTAG接口。该窗口下的其他配置项保持默认,或根据实际情况进行配置。接着打开④处的“Flash Download”选项卡,如下图所示:
图4.3.1.3 烧录选项配置
如上图所示,勾选①处的“Reset and Run”复选框,可以在烧录完成后自动完成复位并运行程序,若不勾选,则需要手动进行复位,程序才能运行。在②处可以选择烧录算法,程序代码一般是烧录到芯片内部的Flash中的,在烧录过程中,需要对芯片内部的Flash进行读写等操作,烧录算法就是用来告诉MDK软件,在烧录程序的时候应怎样读写芯片内部的Flash。烧录算法一般有芯片厂商在芯片的设备包中提供,在安装设备包时,会一并安装烧录算法,在创建MDK工程时候,MDK会自动选择芯片对应的烧录算法,若②处没有显示烧录算法,或烧录算法不符合实际使用的芯片,则需点击改窗口底部的“Add”按钮,添加对应的烧录算法。至此,使用DAP烧录程序的配置项均已配置完毕。
配置完成后,回到MDK软件主界面对工程进行编译,编译完成后,点击按钮(快捷键F8),随后MDK会自动将编译好的程序通过仿真器烧录到芯片上,同时会在“Build Output”窗口中提示烧录信息,如下图所示:
图4.3.1.4 烧录结果输出信息
程序烧录完成后,就能看到APM32F407最小系统板上的LED0和LED1闪烁。
4.3.2 使用DAP调试程序
本小节依然以第4.1小节中的跑马灯实验例程为例,按照第4.3.1小节中的介绍配置好MDK软件中仿真器相关的配置并成功编译好程序后,点击按钮(快捷键Ctrl+F5)即可进入调试界面,进入调试界面前,若编译好的程序还未进行烧录操作,MDK自会自动进行烧录操作,然后进入调试界面,调试界面如下图所示:
图4.3.2.1 MDK调试界面
上图中各个窗口的作用如所示:
①:Registers窗口,该窗口显示了Cortex-M4内核寄存器R0~R15的值,并且还显示了内核当前的模式(Handler模式或Thread模式)、当前使用的堆栈指针(MSP或PSP)等等一系列信息。Registers窗口对查找Bug和掌握程序运行窗台有很大的帮助。
②:Disassembly窗口,该窗口显示了反汇编代码和C语言代码的对比,包含了指令的保存地址、指令代码和指令等一系列信息,并且窗口的左侧有一个黄色的箭头用于指示程序当前将要执行的位置。Disassembly窗口对查找Bug和优化程序有很大的帮助。
③:文本窗口,该窗口主要用于展示代码(C代码或汇编代码),窗口左侧有一个青色和一个黄色的箭头,其中青色箭头用于指示当前光标所在的行,黄色箭头用于指示程序当前将要执行的位置。
④:Call Stack + Locals窗口,该窗口用于显示当前函数的调用关系和函数局部变量的信息。该窗口在调试代码的候时非常有用的。
在调试界面中,还有一系列非常有用的工具,这些工具可通过Debug工具栏上的快捷按钮进行访问,Debug工具栏,如下图所示:
图4.3.2.2 Debug工具栏
复位:其功能等同于硬件上按复位按钮。按下该按钮之后,代码会重新从头开始执行(跳转到复位异常服务函数)。
执行到断点处:该按钮用来快速执行到断点处,有时候并不需要观看每步是怎么执行的,而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能,但前提是在需要查看的地方设置了断点,否则程序将全速运行。
停止运行:该按钮在程序执行过程中变为有效,按下该按钮,可以使程序停止运行。
执行进去:该按钮用于跳转进当前将要执行的函数中单步执行。
执行过去:该按钮用于单步执行过当前将要执行的函数,而不跳转进函数里面。
执行出去:该按钮用于执行出当前函数,跳转到函数返回后的位置。
执行到光标处:该按钮用于执行到光标所在的位置,相当于在光标处打了一个临时的断点,当然,如果在执行到光标处前遇到了断点,程序也是会停止运行的。
Disassembly窗口:该按钮用于打开或关闭Disassembly窗口。
Call Stack窗口:该按钮用于打开或关闭Call Stack + Locals窗口。
Watch窗口:该按钮用于打开或关闭Watch窗口,MDK提供了两个Watch窗口,在调试界面,可以将想要观察的变量或表达式添加到Watch窗口中,便可以实时地查看变量或表达式的值等信息。
Memory窗口:该按钮用于打开或关闭Memory窗口,MDK提供了四个Memory窗口,在Memory窗口中可以查看一段指定起始地址内存的值。
Serial窗口:该按钮用于打开或关闭Serial窗口,MDK提供了四个Serial窗口,通过前三个Serial窗口可以查看MCU串口输出的数据,通过最后一个Serial窗口可以查看MDK提供的Event Recorder等工具标准输出的数据。
系统分析窗口:该按钮可以使用MDK提供的一些工具来查看系统运行的状态,不过部分功能对仿真器有一定要求。
系统查看窗口:该按钮可以用来查看MCU各个外设的寄存器值。
以上就介绍了Debug工具栏中比较常用的几个快捷按钮,这些快捷按钮对调试程序是很有帮助的。接下来就实际地演示一下简单的调试。
首先打开Watch 1窗口,并双击“Enter expression”添加一个变量名为“g_fac_us”的表达式,该变量是在delay.c中定义的全局变量,主要用于微秒级延时,此时可以看到这个变量的值显示为“”,意思是无法计算,这时可以单击main()函数中调用的delay_init()函数(第30行)左侧灰色的部分来添加断点,如下图所示:
图4.3.2.3 添加观察表达式和断点
随后点击Debug工具栏中的按钮(快捷键F5),即可运行到delay_init()函数调用前(断点处),然后点击Debug工具栏中的按钮(快捷键F11),即可跳转到delay_init()函数中,如下图所示:
图4.3.2.4 执行进入delay_init()函数
因此函数delay_init()会对变量g_fac_us进行初始化,因此可以看到Watch 1窗口中的表达式已经显示了具体的值,接下来可以连续单击Debug工具栏上的按钮(快捷键F10),让程序单步执行到变量g_fac_us被赋值的地方(大概第139行),此时再次单击Debug工具栏上的按钮,随后便可在Watch 1窗口中看到变量g_fac_us被赋值后的结果,也可将鼠标光标放置在变量g_fac_us上停留一会,MDK可会自动的提示该变量当前的值,如下图所示:
图4.3.2.5 观察变量或表达式的值
接下来可以单击Debug工具栏上的按钮(快捷键Ctrl+F11),跳出delay_init()函数回到main()函数,然后在main()函数中while循环的第一个“LED0(0)”语句前打上断点单击Debug工具栏上的按钮,让程序执行到该断点处,如下图所示:
图4.3.2.6 执行到“LED0(0)”语句处
此时,不断点击Debug工具栏上的按钮,便可以看到板卡上的LED0和LED1依次闪烁(执行到LED0()语句和LED1()语句时,需多次单击按钮才能跳到下一行并看到对应的板载LED状态发生变化,这是因为LED0()语句和LED1()语句是两个宏定义,这两个宏定义由多条语句组成,因此需要多次单击按钮才能执行到下一行)。
此时,单击“LED0(0)”语句前的断点,将其取消掉,然后点击Debug工具栏上的按钮,使程序全速执行,则可以看到板载LED自动地交替闪烁,随后打开delay.c文件并定位到delay_us函数(大概221行),并在该函数左侧任意有灰色的地方打上断点,可以看到程序马上停在了断点的位置,如下图所示:
图4.3.2.7 执行进入delay_us()函数
此时,便可在Call Stack + Locals窗口查看到函数的调用情况,如下图所示:
图4.3.2.8 Call Stack + Locals窗口
如上图所示,可以很清楚地查看到delay_us()函数是如何被调用的,从下往上看,main()函数调用了delay_ms()函数,然后delay_ms()函数调用了delay_us()函数。
以上就是使用DAP调试程序的全部内容,这方便的内容也是比较重要的,掌握好调试程序的方法,对解决程序Bug是很有帮助的,并且对了解第三方库等的代码也很有帮助。
4.4 MDK使用技巧
本小节将介绍MDK的一些使用技巧,这些技巧对提供开发效率是很有帮助的,读者可以实际操作一下,加深印象。
4.4.1 自定义编辑器
点击MDK软件顶部的按钮,打开MDK配置窗口,并切换到顶部的Editor选项卡,如下图所示:
图4.1.1.1 Editor选项卡配置
①:“Encoding”用于设置在MDK中新建文件保存时使用的编码格式,推荐使用“Chinese GB2312(Simplified)”,该编码格式对中文的支持比较好。
②:勾选“View White Space”复选框可以在文本编辑器中以一个浅灰色的“·”代替一个空格进行显示,有助于代码对齐。
③:勾选“Insert spaces for tabs”复选框可以设置在文本编辑器输入时,使用空格来代替TAB,TAB键常用于代码对齐,但由于不同的文本编辑器对TAB长度的定义各不相同,因此使用TAB对齐可能在不同的文本编辑器中会出现不对其的情况,因此可以使用空格来代替TAB,以解决这个问题,同时可以设置使用多少个空格来代替一个TAB,正点原子的编写代码均是以四个空格代替一个TAB,建议读者进行相同的设置。
接着是Colors & Fonts选项卡,如下图所示:
图4.1.1.2 Colors & Fonts选项卡配置
①:“Window”窗口用于选择要修改的窗口对象,例如要修改的对象为C/C++文本编辑器窗口,则选择“C/C++ Editor files”。
②:“Element”窗口用于选择窗口对象中要修改的元素,例如要修改的对象为C/C++文本编辑器窗口中的文本,则选择“Text”。
③:“Font”和“Colors”用于修改被选中窗口对象中元素的字体、字号、样式、前景色和背景色等参数,读者可以根据自己的喜好进行修改。
接着是User Keywrds选项卡,如下图所示:
图4.1.1.3 User Keywords选项卡配置
该选项卡用于添加一些自定义的关键字,例如,在C语言中大约有37个关键字(C99标准),MDK在C/C++文本编辑器可以高亮显示这些关键字(可以在Colors & Fonts选项卡C/C++ Editor filesKeyword中进行自定义高亮的颜色),让用户更容易地阅读代码,但是在代码中用typedef定义的变量类型名称或struct定义的结构体名称等,MDK默认并不会高亮显示这些用户自定义的“关键字”,因此可以在User Keyword选项卡中添加自定义的“关键字”,如上图所示,就添加了三个自定义的关键字,以上文提到的delay_init()函数为例,该函数如使用到上述被添加的三个关键字,则都会被高亮,如下图所示:
图4.1.1.4 自定义关键字效果
4.4.2 动态语法检测&代码自动补全
在Configuration窗口的Text Completion选项卡中可以配置动态语法检测和代码自动补全功能,如下图所示:
图4.4.2.1 Text Completion选项卡配置
①:用于使能代码自动补全功能,并可以配置在手动输入多少个字符后提示匹配自动补全的内容,实际的使用效果,如下图所示:
图4.4.2.2 代码自动补全功能
②:用于使能动态语法检测,这可以帮助用户在编写代码时,实时地观察代码语法的问题,实际的使用效果,如下图所示:
图4.4.2.3 动态语法检测功能
如上图所示,动态语法检测功能可以对编写的代码进行提示,没有语法错误的代码则不会有任何提示,若语法有误,则会有警告()和错误()两种提示,如第33行有警告提示,是因为delay_ms()函数的形参是16位无符号整型,但实际传入的参数已经超出了16位无符号整型的范围,因此给出了警告的提示,警告并不会导致编译出错,但是在程序实际运行过程中可能会有意料之外的结果;再如第34行有错误提示,是因为delay_ms()函数调用后面少了一个分号(“;”),错误提示会直接导致程序编译失败。
4.4.3 代码编辑技巧
本小节介绍几个常用的MDK代码编辑技巧,希望对读者提高MDK代码编辑效率有所帮助。
- TAB键的妙用
在前面的章节中也提到了可以使用TAB键来进行代码对齐,那具体的使用方法呢?按下TAB键可以使被选中的代码段或光标后的代码向右侧对齐,同时也可以按下Shift+TAB键使被选中的代码段或光标后的代码向左侧对齐,如下图所示:
图4.4.3.1 未对齐的代码
如上图所示,未对齐的代码一看就令人头大,若在每一行需要对齐的代码前手动敲入多个空格,那效率是非常低的,此时可以多行选中需要对齐的代码段,然后按以下TAB键,即可使被选中的代码段向右对齐,如下图所示:
图4.4.3.2 用TAB键进行对齐
接着对于while语句块中的代码再进行一次TAB键对齐,最终对齐效果,如下图所示:
图4.4.3.3 使用TAB键的最终对齐效果
2. 快速定位函数/变量被定义的地方
在编写或调试代码的时候,经常会需要查看函数或变量的定义,如果每个都手动查找,那效率就太低了,MDK软件提供了一键跳转到函数或变量定义地方的功能,但该功能是可选的,需要开启该功能后才能使用,开启方式也很简单,在Options for Target窗口的Output选项卡中勾选Browse Information复选框即可开启该功能,如下图所示:
图4.4.3.4 开启Browse Information功能
开启Browse Information功能后,还需进行一次编译才能使用跳转功能,使用方式也很简单,仅需单击或自定义选中函数或变量名,然后点击快捷键F12即可进行跳转,在查看完相关定义后,可以直接点击工具栏上的按钮(快捷键Ctrl±),即可一步一步地返回。
3. 快速注释/取消注释
MDK提供了一键注释或取消注释代码段的功能,使用方法也很简单,若要注释或取消一段代码,则先选中代码段,然后点击工具栏上的(注释)或(取消注释),即可一键对代码段进行注释或取消注释。
4.4.4 其他小技巧
本小节再介绍几个MDK软件使用的小技巧。
①:右键#include包含的头文件,弹出的菜单中有“Open document “xxx””的选项,可以快速地在文本编辑器中打开头文件,如下图所示:
图4.4.4.1 快速打开头文件
②:“Ctrl+H”、“Ctrl+F”和“Ctrl+Shift+F”的组合快捷键可一键打开替换、查找和跨文件查找的功能窗口,如下图所示:
图4.4.4.2 替换、查找和跨文件查找的功能窗口
MDK软件是一个非常强大的代码编辑和编辑工具,熟悉MDK的使用方法还是很有必要的。