OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 957|回复: 0

《STM32F103 精英开发指南V1.3》第四章 STM32初体验

[复制链接]

1117

主题

1128

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4667
金钱
4667
注册时间
2019-5-8
在线时间
1224 小时
发表于 2024-6-4 14:31:39 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2024-6-3 14:49 编辑

第四章 STM32初体验
1)实验平台:正点原子 精英STM32F103开发板

2) 章节摘自【正点原子】STM32F103开发指南 V1.3

3)购买链接:https://detail.tmall.com/item.htm?&id=609294889447

4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boar ... 103_jingyingV2.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子STM32技术交流QQ群:672399978


155537c2odj87vz1z9vj6l.jpg

155537nfqovl2gg9faaol9.png

本章,我们不介绍如何编写代码,而是向大家介绍如何编译、串口下载、仿真器下载、仿真调试开发板例程,体验一下STM32的开发流程,并介绍MDK5的一些使用技巧,通过本章的学习,将对STM32的开发流程和MDK5使用有个大概了解,为后续深入学习打好基础。
本章将分为如下几个小节:
4.1 使用MDK5编译例程
4.2 使用串口下载程序
4.3 使用DAP下载与调试程序
4.4 MDK5使用技巧

4.1 使用MDK5编译例程
我们在编写完代码以后,需要对代码进行编译,编译成功以后,才能下载到开发板进行验证、调试等操作。精英开发板标准例程源码路径:A盘à4,程序源码,如图4.1.1所示:
       image001.png
图4.1.1 精英开发板例程源码
这5个压缩包说明如表4.1.1:
QQ截图20240603142507.png
表4.1.1 源码压缩包说明
本书主要针对“标准例程-HAL库版本”源码进行讲解,所以,这里我们先解压该压缩包,得到HAL库版本的标准例程源码如图4.1.2所示:
image003.png
图4.1.2 标准例程-HAL库版本
精英总共有48个实验的标准例程,部分实验有多个例程,比如:通用定时器实验、高级定时器实验、ADC实验等,所以我们的总例程数达到了63个。这里我们没有把实验0统计进来,因为实验0主要是新建工程等MDK使用基础教学例程。
秉着简单易懂的原则,我们选择:实验1,跑马灯实验 作为STM32入门体验,例程目录如图4.1.3所示:     
image005.png
图4.1.3 跑马灯例程工程目录结构
工程目录下有5个文件夹,我们将在后续“新建HAL库版本MDK工程”这一章给大家详细介绍其作用(其实看文件夹名字的字面意思基本就知道是做啥用的了),这里我们不多说。例程MDK工程文件的路径为:ProjectsàMDK-ARMàatk_f103.uvprojx,如图4.1.4所示:   
image007.png
图4.1.4 跑马灯实验例程MDK工程
注意:一定要先安装MDK5(详见第三章),否则无法打开该工程文件!
双击atk_f103.uvprojx打开该工程文件,进入MDK IDE界面,如图4.1.5所示:
image009.png
图4.1.5 MDK打开跑马灯实验例程
①    是编译按钮,表示编译当前工程项目文件,如果之前已经编译过了,则只会编译有改动的文件。所以一般第一次会比较耗时间,后续因为只编译改动文件,从而大大缩短了编译时间。该按钮可以通过F7快捷键进行操作。
②    是重新编译当前工程所有文件按钮,工程代码较多时全部重新编译会耗费比较多的时间,建议少用。
按①处的按钮,编译当前项目,在编译完成后,可以看到如图4.1.6所示的编译提示信息:     
image011.png
图4.1.6 编译提示信息
图中:
Code:表示代码大小,占用5442字节。
RO-Data:表示只读数据所占的空间大小,一般是指const修饰的数据大小。
RW-Data:表示有初值(且非0)的可读写数据所占的空间大小,它同时占用FLASH(存放其初始值)和RAM空间。
ZI-Data:表示初始化为0的可读写数据所占空间大小,它只占用RAM空间。
因此图4.1.6的提示信息表示:代码总大小(Porgram Size)为:FLASH占用5832字节(Code + RO + RW),SRAM占用1928字节(RW + ZI);成功创建了Hex文件(可执行文件,放在Output目录下);编译0错误,0警告;编译耗时2秒钟。
编译完成以后,会生成Hex可执行文件,默认输出在Output文件夹下,如图4.1.7所示:     
image013.png
图4.1.7 Hex可执行文件
注意:必须编译成功,才会生成Hex可执行文件,否则是不会有这个文件的!!
Output文件夹下除了.hex文件还有很多其他文件(.axf、.htm、.dep、.lnp、.o、.d、.lst等),这些文件是编译过程所产生的中间文件,我们将在后续的.map文件分析给大家详细介绍这些文件的作用。至此,例程编译完成。其他实验例程,大家可以用同样的方法进行编译。
4.2 使用串口下载程序
STM32常见的下载方式有三种:
QQ截图20240603142548.png
表4.2.1 STM32常见下载方式对比
经过以上对比,因此我们推荐使用SWD下载,强烈推荐大家购买一个仿真器(如ST LINK、CMSIS DAP等),可以极大的方便学习和开发。不推荐使用串口下载(速度慢、无法仿真和调试)和JTAG下载(占用IO多)。
表中BOOT0和BOOT1是STM32芯片上面的两个引脚,用于控制STM32的启动方式,具体如表4.2.2所示:
QQ截图20240603142557.png
表4.2.2 STM32启动模式
BOOT引脚接VCC,是从系统存储器启动,进入后直接运行ST官方的Bootloader程序,就可以通过ST官方预设的接口下载程序,如:USART1等。该模式除了可以通过上述的接口下载程序,其实还有一个作用:可用于异常关闭JTAG/SWD导致仿真器无法下载程序时的补救措施(在此模式下,下载一个不关闭JTAG/SWD接口的程序即可救活)。
接下来,我们将向大家介绍,如何利用串口给STM32F103(以下简称STM32)下载代码。
STM32通过串口1实现程序下载, 战舰开发板通过自带的USB转串口来实现串口下载。看起来像是USB下载(只需一根USB线,并不需要串口线)的,实际上,是通过USB转成串口,然后再下载的。
下面,我们就一步步教大家如何在实验平台上利用USB串口来下载代码。
首先确保开发板接线正确,并成功上电,如图4.2.1所示:     
image015.png
图4.2.1开发板设置
a) ①处的USB_UART通过USB线连接电脑,实现USB转串口,同时支持给开发板供电。
b) 确保电源灯②亮起(蓝色),如果不亮检查供电和电源开关③是否按下?
c) 确保P3端子的RXD和PA9(STM32的TXD),TXD和PA10(STM32的RXD)通过跳线帽连接起来(标号④),这样我们就把CH340C和STM32的串口1连接上了。
d) ⑤处的BOOT设置为BOOT0(简称B0)和BOOT1(简称B1)都接GND(一键下载电路自动控制,待会介绍)。
由表4.2.1可知,STM32串口下载的标准方法是四个步骤:
1, 把B0接V3.3
2, 保持B1接GND
3, 按一下复位按键
4, 使用上位机软件下载代码
通过这几个步骤,我们就可以通过串口下载代码了,下载完成之后,如果没有设置从0X08000000开始运行,则代码不会立即运行,此时,你还需要把B0接回GND,然后再按一次复位,才会开始运行你刚刚下载的代码。所以整个过程,你得跳动2次跳线帽,还得按2次复位,比较繁琐。而我们的一键下载电路,则利用串口的DTR和RTS信号,分别控制STM32的复位和B0,配合正点原子团队研发的上位机软件ATK-XISP,设置:DTR的低电平复位,RTS高电平进BootLoader,这样,B0和STM32的复位,完全可以由下载软件自动控制,从而实现一键下载。一键下载的原理图级别解释详见:精英硬件参考手册.pdf
串口程序下载需要用到:ATK-XISP这个上位机软件。这个软件可以实现对STM32F1到STM32H7等系列芯片的串口编程。ATK-XISP软件在光盘路径:A盘à 6,软件资料à1,软件àSTM32串口下载软件(ATK-XISP),如图4.2.2所示:     
image017.png
图4.2.2 ATK-XISP串口编程软件
双击打开ATK-XISP,进行如图4.2.3所示的设置:     
image019.png
图4.2.3 ATK-XISP设置
① 搜索串口选择CH340虚拟的串口(我的是COM23,不同电脑可能不同,需要根据实际情况选择对应的串口,详见3.4节),然后设置波特率为460800,保证最大速度下载。
② 选择4.1节编译生成的hex文件(在Output文件夹)
③ 勾选校验和编程后执行两项,可以保证下载代码的正确性,并下载完后自动运行,省去按复位的麻烦。注意:千万不要勾选:使用RamIsp和连续烧录模式!否则下载失败!
④ 选择DTR的低电平复位,RTS高电平进BootLoader(别选错!),以匹配一键下载电路,实现一键下载代码,省去设置BOOT0、按复位的麻烦。
设置好之后,我们就可以通过按开始编程(P这个按钮,一键下载代码到STM32上,下载成功后如图4.2.4所示:     
image021.png
图4.2.4 下载完成
图4.2.4中,我们圈出了ATK-XISP对一键下载电路的控制过程,先是获取芯片信息,然后对全片擦除,还显示了文件的首地址以及文件大小等。
另外,下载成功后,会有“共写入xxxxKB,进度100%,耗时xxxx毫秒”的提示,并且从0X80000000处开始运行了。此时表示代码下载完成,并已经成功运行了,我们查看开发板就可以看到DS0(红灯)、DS1(绿灯)开始交替闪烁了,如图4.2.5所示:     
image023.png
图4.2.5开发板运行代码
至此,STM32使用串口下载程序完成。其他实验例程,大家可以用同样的方法进行下载。
4.3 使用DAP下载与调试程序
上一节我们使用串口给STM32下载程序,但是串口下载并不能仿真调试代码,只能下载后观看运行结果,所以在调试代码bug的时候,最好还是用仿真器进行下载调试,本节我们将给大家介绍如何使用仿真器给STM32下载代码,并调试代码。
这里我们以DAP仿真器为例给大家进行讲解,如果你用的是其他仿真器,基本上也是一样的用法,只是选择仿真器的时候,选择对应的型号即可。
DAP与开发板连接如图4.3.1所示:
a)      DAP通过USB线连接电脑,且仿真器①处的蓝灯常亮。
b)      DAP通过20P灰排线连接开发板,如图③处所示。
c)       确保开发板已经正常供电(可经由图中的⑤⑥给开发板供电,但我们建议使用⑤处的电源插座+开发板适配的DC直流电源,以避免部分需要用到大电流的例程运行不正常),供电后确保⑦处的开关是按下的状态,这里蓝色电源灯亮起表示开发板已经正常供电。
d)      B0,B1都接GND,如图④处所示。     
image025.png
图4.3.1 DAP与开发板连接
4.3.1 使用DAP下载程序
       在4.1节的跑马灯例程MDK IDE界面下,点击 image027.png 按钮,打开Options for Target选项卡,在Debug栏选择仿真工具为use:CMSIS-DAP Debugger,如图4.3.1.1所示:     
image029.png
图4.3.1.1 Debug选项卡设置
①    选择使用CMSIS-DAP Debugger仿真器仿真调试代码。如果你使用的是其他仿真器,比如STLINK、JLINK等,请在这里选择对应的仿真器型号。
②    该选项选中后,只要点击仿真就会直接运行到main函数,如果没选择这个选项,则会先执行startup_stm32f103xe.s文件的Reset_Handler,再跳到main函数。
然后我们点击Settings,设置DAP的一些参数,如图4.3.1.2所示:     
image031.png
图4.3.1.2 DAP仿真器参数设置
①    表示MDK找到了ATK CMSIS-DAP仿真器,如果这里显示为空,则表示没有仿真器被找到,请检查你的电脑是否接了仿真器?并安装了对应的驱动?
②    设置接口方式,这里选择SW(比JTAG省IO),通信速度设置为10Mhz(实际上大概只有4M的速度,MDK会自动匹配)。
③    表示MDK通过仿真器的SW接口找到了目标芯片,ID为:0x1BA01477。如果这里显示:No target connected,则表示没找到任何器件,请检查仿真器和开发板连接是否正常?开发板是否供电了?
其他部分使用默认设置,设置完成以后单击“确定”按钮,完成此部分设置,接下来我们还需要在Utilities选项卡里面设置下载时的目标编程器,如图4.3.1.3所示:     
image033.png
图4.3.1.3 FLASH编程器选择
上图中,我们直接勾选Use Debug Driver,即和调试一样,选择DAP来给目标器件的FLASH编程,然后点击Settings,进入FLASH算法设置,设置如图4.3.1.4所示:     
image035.png
图4.3.1.4 FLASH算法设置
这里MDK5会根据我们新建工程时选择的目标器件,自动设置flash算法。我们使用的是STM32F103ZET6,FLASH容量为512K字节,所以Programming Algorithm里面默认会有512K型号的STM32F10x High-density Flash算法。另外,如果这里没有flash算法,大家可以点击Add按钮,自行添加即可。最后,选中Reset and Run选项,以实现在编程后自动运行,其他默认设置即可。
在设置完之后,点击“确定”,然后再点击“OK”,回到IDE界面,编译(可按F7快捷键)一下工程,编译完成以后(0错误,0警告),我们按 image037.png (快捷键:F8)这个按钮,就可以将代码通过仿真器下载到开发板上,在IDE下方的Build Output窗口就会提示相关信息,如图4.3.1.5所示:     
image038.png
图4.3.1.5 仿真器下载代码
下载完后,就可以看到DS0和DS1交替闪烁了,说明代码下载成功。
4.3.2 使用DAP仿真调试程序
在正常编译完例程以后(0错误,0警告),点击: image040.png (开始/停止仿真按钮),开始仿真(如果开发板的代码没被更新过,则会先更新代码(即下载代码),再仿真),如图4.3.2.1所示:
image041.png
图4.3.2.1 开始仿真
①    Register:寄存器窗口,显示了Cortex M3内核寄存器R0~R15的值,还显示了内部的线程模式(处理者模式、线程模式)及特权级别(用户级、特权级),并且还显示了当前程序的运行时间(Sec),该选项卡一般用于查看程序运行时间,或者比较高级的bug查找(涉及到分析R0~R14数据是否异常了)。
②    Disassembly:反汇编窗口,将C语言代码和汇编对比显示(指令存放地址,指令代码,指令,具体操作),方便从汇编级别查看程序运行状态,同样也属于比较高级别的bug查找。
③    代码窗口,在左侧有黄绿色三角形,黄色的三角形表示将要执行的代码,绿色的三角形表示当前光标所在代码(C代码 或当前汇编行代码对应的C代码)。一般情况下,这两个三角形是同步的,只有在点击光标查看代码的时候,才可能不同步。
④    Call Stack + Locals:调用关系&局部变量窗口,通过该窗口可以查看函数调用关系,以及函数的局部变量,在仿真调试的时候,是非常有用的。
开始仿真的默认窗口,我们就给大家介绍这几个,实际上还有一些其他的窗口,比如Watch、Memory、外设寄存器等也是很常用的,可以根据实际使用选择调用合适的窗口来查看对应的数据。
图4.3.2.1中,还有一个很重要的工具条:Debug工具条,其内容和作用如图4.3.2.2所示:
image044.png
图4.3.2.2 Debug工具条
复位:其功能等同于硬件上按复位按钮。相当于实现了一次硬复位。按下该按钮之后,代码会重新从头开始执行。
执行到断点处:该按钮用来快速执行到断点处,有时候你并不需要观看每步是怎么执行的,而是想快速的执行到程序的某个地方看结果,这个按钮就可以实现这样的功能,前提是你在查看的地方设置了断点。
停止运行:此按钮在程序一直执行的时候会变为有效,通过按该按钮,就可以使程序停止下来,进入到单步调试状态。
执行进去:该按钮用来实现执行到某个函数里面去的功能,在没有函数的情况下,是等同于执行过去按钮的。
执行过去:在碰到有函数的地方,通过该按钮就可以单步执行过这个函数,而不进入这个函数单步执行。
执行出去:该按钮是在进入了函数单步调试的时候,有时候可能不必再执行该函数的剩余部分了,通过该按钮就可以一步执行完该函数的余部分,并跳出函数,回到函数被调用的位置。
执行到光标处:该按钮可以迅速的使程序运行到光标处,其实是挺像执行到断点处按钮功能,但是两者是有区别的,断点可以有多个,但是光标所在处只有一个。
反汇编窗口:通过该按钮,就可以查看汇编代码,这对分析程序很有用。
Call STACK窗口:通过该按钮,显示调用关系&局部变量窗口,显示当前函数的调用关系和局部变量,方便查看,对分析程序非常有用。
观察窗口:MDK5提供2个观察窗口(下拉选择),该按钮按下,会弹出一个显示变量的窗口,输入你所想要观察的变量/表达式,即可查看其值,是很常用的一个调试窗口。
内存查看窗口:MDK5提供4个内存查看窗口(下拉选择),该按钮按下,会弹出一个内存查看窗口,可以在里面输入你要查看的内存地址,然后观察这一片内存的变化情况。是很常用的一个调试窗口
串口打印窗口:MDK5提供4个串口打印窗口(下拉选择),该按钮按下,会弹出一个类似串口调试助手界面的窗口,用来显示从串口打印出来的内容。
系统分析窗口:该图标下面有6个选项(下拉选择),我们一般用第一个,也就是逻辑分析窗口(LogicAnalyzer),点击即可调出该窗口,通过SETUP按钮新建一些IO口,就可以观察这些IO口的电平变化情况,以多种形式显示出来,比较直观。
系统查看窗口:该按钮可以提供各种外设寄存器的查看窗口(通过下拉选择),选择对应外设,即可调出该外设的相关寄存器表,并显示这些寄存器的值,方便查看设置的是否正确。
Debug工具条上的其他几个按钮用的比较少,我们这里就不介绍了。以上介绍的是比较常用的,当然也不是每次都用得着这么多,具体看你程序调试的时候有没有必要观看这些东西,来决定要不要看。
我们在图4.3.2.1的基础上:关闭反汇编窗口(Disassembly)、添加观察窗口1(Watch1)。然后调节一下窗口位置,然后将全局变量:g_fac_us (在delay.c里面定义)加入Watch1窗口(方法:双击Enter expression添加/直接拖动变量t到Watch1窗口即可),如图4.3.2.3所示:     
image045.png
图4.3.2.3 开始仿真
此时可以看到Watch1窗口的g_fac_us的值提示:无法计算,我们把鼠标光标放在第32行左侧的灰色区域,然后按下鼠标左键,即可放置一个断点(红色的实心点,也可以通过鼠标右键弹出菜单来加入),这样就在delay_init函数处放置一个断点,然后点击: image047.png ,执行到该断点处,然后再点击: image049.png ,执行进入delay_init函数,如图4.3.2.4所示:
image050.png
图4.3.2.4 执行进入delay_init函数
此时,可以看到g_fac_us的值已经显示出来了,默认是0(全局变量如果没有赋初值,一般默认都是0),然后继续单击: ,单步运行代码到 g_fac_us = sysclk / 8; 这一行,再把鼠标光标放在sysclk上停留一会,就可以看到MDK自动提示sysclk(delay_init的输入参数)的值为:0X0048,即72,如图4.3.2.5所示:     
image052.png
图4.3.2.5 单步运行到g_fac_us赋值
然后再单步执行过去这一行,就可以在Watch1窗口中看到g_fac_us的值变成9了,如图4.3.2.6所示:     
image054.png
图4.3.2.6 Watch1窗口观看g_fac_us的值
由此可知,某些全局变量,我们在程序还没运行到其所在文件的时候,MDK仿真时可能不会显示其值(如提示:cannot evaluate),当我们运行到其所在文件,并实际使用到的时候,此时就会显示其值出来了!
然后,我们再回到main.c,在第一个LED0(0)处放置一个断点,运行到断点处,如图4.3.2.7所示:     
image056.png
图4.3.2.7 运行到LED0(0)代码处
此时,我们点击: image058.png ,执行过这一行代码,就可以看到开发板上的DS0(红灯)亮起来了,以此继续点击 ,依次可以看到:DS0灭àDS1亮àDS0亮àDS1灭àDS0灭àDS1亮……,一直循环。这样如果全速运行,就可以看到DS0,DS1交替亮灭,不过全速运行的时候,一般是看不出DS0和DS1全亮的情况的,而通过仿真,我们就可以很容易知道有DS0和DS1同时亮的情况!
最后,我们在delay.c文件的delay_us函数,第二行处设置一个断点,然后运行到断点处,如图4.3.2.8所示:
image059.png
图4.3.2.8 查看函数调用关系及局部变量
此时,我们可以从Call Stack + Locals窗口看到函数的调用关系,其原则是:从下往上看,即下一个函数调用了上一个函数,因此,其关系为:main函数调用了delay_ms函数,然后delay_ms函数调用了delay_us函数。这样在一些复杂的代码里面(尤其是第三方代码),可以很容易捋出函数调用关系并查看其局部变量的值,有助于我们分析代码解决问题。
关于DAP的仿真调试,我们暂时就讲这么多。
4.3.3 仿真调试注意事项
1,  由于MDK5.23以后对中文支持不是很好,具体现象是:在仿真的时候,当有断点未清除时点击 image061.png 结束仿真,会出现如图4.3.3.1所示的报错:     
image062.png
图4.3.3.1 仿真结束时报错!
此时我们点击确定,是无法关闭MDK的,只能到电脑的任务管理器里面强制结束MDK,才可以将其关闭,比较麻烦。
该错误就是由于MDK5.23以后的版本对中文支持不太好导致的,这里提供2个解决办法:a,仿真结束前将所有设置的断点都清除掉,可以使用File工具栏的: image064.png 按钮,快速清除当前工程的所有断点,然后再结束仿真,就不会报错;b,将工程路径改浅,并改成全英文路径(比如,将源码拷贝到:E盘àSourceCode文件夹下。注意:例程名字一般可以不用改英文,因为只要整个路径不超过10个汉字,一般就不会报错了,如果还报错就再减少汉字数量)。通过这两个方法,可以避免仿真结束报错的问题。我们推荐大家使用第二种方法,因为这样就不用每次都全部清除所有断点,下回仿真又得重设的麻烦。
2,  关于STM32软件仿真,老版本的教程,我们给大家介绍过如何使用MDK进行STM32软件仿真,由于其限制较多(只支持部分F1型号),而且仿真器越来越便宜,硬件仿真更符合实际调试需求,调试效果更好。所以后续我们只介绍硬件仿真,不再推荐大家使用软件仿真了!
3,  仿真调试找bug是一个软件工程师必备的基本技能。MDK提供了很多工具和窗口来辅助我们找问题,只要多使用,多练习,肯定就可以把仿真调试学好。这对我们后续的独立开发项目,非常有帮助。因此极力推荐大家多练习使用仿真器查找代码bug,学会这个基本技能。
4,  调试代码不要浅尝辄止,要想尽办法找问题,具体的思路:先根据代码运行的实际现象分析问题,确定最可能出问题的地方,然后在相应的位置放置断点,查看变量,查看寄存器,分析运行状态和预期结果是否一致?从而找到问题原因,解决bug。特别提醒:一定不要浅尝辄止,很多朋友只跟踪到最上一级函数,就说死机了,不会跟踪进去找问题!所以一定要一层层进入各种函数,越是底层(甚至汇编级别),越好找到问题原因。
4.4 MDK5使用技巧
本节,我们将向大家介绍MDK5软件的一些使用技巧,这些技巧在代码编辑和编写方面会非常有用,希望大家好好掌握,最好实际操作一下,加深印象。
4.4.1 文本美化
文本美化,主要是设置一些关键字、注释、数字等的颜色和字体。如果你刚装MDK,没进行字体颜色配置,以跑马灯例程为例,你的界面效果如图4.4.1.1所示:     
image066.png
图4.4.1.1 MDK默认配色效果
上图是MDK默认的设置,可以看到其中的关键字和注释等字体的颜色不是很漂亮,而MDK提供了我们自定义字体颜色的功能。我们可以在工具条上点击 image068.png (配置对话框)弹出如图4.4.1.2所示界面:     
image069.png
图4.4.1.2置对话框
①    设置代码编辑器字体使用:ChineseGB2312(Simplified),以更好的支持中文。
②    设置编辑器的空格可见:View White Space,所有空格使用“.”替代,TAB使用“à”替代,这样可以方便我们对代码进行对齐操作。同时,我们推荐所有的对齐都用空格来替代,这样在不同软件之间查看源代码,就不会引起由于TAB键大小不一样导致代码不对齐的问题,方便使用不同软件查看和编辑代码。
③    设置C/C++文件,TAB键的大小为4个字符,且字符使用空格替代(Insert spaces for tabs)。这样我们在使用TAB键进行代码对齐操作的时候,都会用空格替代,保证不同软件使用代码都可以对齐。
然后,选择:Colors & Fonts选项卡,在该选项卡内,我们就可以设置自己的代码的字体和颜色了。由于我们使用的是C语言,故在Window下面选择:C/C++ Editor Files在右边就可以看到相应的元素了。如图4.4.1.3示:     
image071.png
图4.4.1.3 Colors& Fonts选项卡
然后点击各个元素(Element)修改为你喜欢的颜色(注意双击,且有时候可能需要设置多次才生效,MDK的bug),当然也可以在Font栏设置你字体的类型,以及字体的大小等。
然后,点击User Keywords选项卡,设置用户定义关键字,以便用户自定义关键字也显示对应的颜色(对应图4.4.1.3中的User Keyword/Lable颜色)。在User Keywords选项卡对话框下面输入你自己定义的关键字,如图4.4.1.4示:     
image073.png
图4.4.1.4 用户自定义关键字
这里我们设置了uint8_t、uint16_t和uint32_t等三个用户自定义关键字,相当于unsigned char、unsigned short和unsigned int。如果你还有其他自定义关键字,在这里添加即可。设置成之后,点击OK,就可以在主界面看到你所修改后的结果,例如我修改后的代码显示效果如图4.4.1.5示:     
image075.png
图4.4.1.5设置完后显示效果
这就比开始的效果好看一些了。字体大小,则可以直接按住:ctrl+鼠标滚轮,进行放大或者缩小,或者也可以在刚刚的配置界面设置字体大小。
同时,上图中可以看到空白处有很淡的一些……显示,这就是我们勾选了View White Space选项后体现出来的效果,可以方便我们对代码进行规范对齐整理。一开始看的时候可能有点不习惯,看多了就习惯了,大家慢慢适应就好了。
其实在这个编辑配置对话框里,还可以对其他很多功能进行设置,比如动态语法检测等,我们将4.4.2节介绍。

4.4.2 语法检测&代码提示
MDK4.70以上的版本,新增了代码提示与动态语法检测功能,使得MDK的编辑器越来越好用了,这里我们简单说一下如何设置,同样,点击 ,打开配置对话框,选择Text Completion选项卡,如图4.4.2.1所示:     
image077.png
图4.4.2.1 Text Completion选项卡设置
Strut/ Class Members,用于开启结构体/类成员提示功能。
FunctionParameters,用于开启函数参数提示功能。
Symbols after xx characters,用于开启代码提示功能,即在输入多少个字符以后,提示匹配的内容(比如函数名字、结构体名字、变量名字等),这里默认设置3个字符以后,就开始提示。如图4.4.2.2所示:     
image079.png
图4.4.2.2 代码提示
ENTER/TABas fill-up character,使用回车和TAB键填充字符。
Dynamic Syntax Checking,则用于开启动态语法检测,比如编写的代码存在语法错误的时候,会在对应行前面出现 image081.png 图标,如出现警告,则会出现 image082.png 图标,将鼠标光标放图标上面,则会提示产生的错误/警告的原因,如图4.4.2.3所示:     
image083.png
图4.4.2.3 语法动态检测功能
这几个功能,对我们编写代码很有帮助,可以加快代码编写速度,并且及时发现各种问题。不过这里要提醒大家,语法动态检测这个功能,有的时候会误报(比如sys.c里面,就有误报),大家可以不用理会,只要能编译通过(0错误,0警告),这样的语法误报,一般直接忽略即可。
4.4.3 代码编辑技巧
这里给大家介绍几个我常用的技巧,这些小技巧能给我们的代码编辑带来很大的方便,相信对你的代码编写一定会有所帮助。
1. TAB键的妙用
首先要介绍的就是TAB键的使用,这个键在很多编译器里面都是用来空位的,每按一下移空几个位。如果你是经常编写程序的对这个键一定再熟悉不过了。但是MDK的TAB键和一般编译器的TAB键有不同的地方,和C++的TAB键差不多。MDK的TAB键支持块操作。也就是可以让一片代码整体右移固定的几个位,也可以通过SHIFT+TAB键整体左移固定的几个位。
假设我们前面的串口1中断回调函数如图4.4.3.1所示:     
image085.png
图4.4.3.1 头大的代码
上图的代码很不规范,这还只是短短的30来行代码,如果你的代码有几千行,全部是这个样子,不头大才怪。这时我们就可以通过TAB键的妙用来快速修改为比较规范的代码格式。
选中一块然后按TAB键,你可以看到整块代码都跟着右移了一定距离,如图4.4.3.2所示:     
image087.png
图4.4.3.2 代码整体偏移
接下来我们就是要多选几次,然后多按几次TAB键就可以达到迅速使代码规范化的目的,最终效果如图4.4.3.3所示     
image089.png
图4.4.3.3 修改后的代码
图4.4.3.3中的代码相对于图4.4.3.1中的要好看多了,经过这样的整理之后,整个代码一下就变得有条理多了,看起来很舒服。
2. 快速定位函数/变量被定义的地方
上一节,我们介绍了TAB键的功能,接下来我们介绍一下如何快速查看一个函数或者变量所定义的地方。
大家在调试代码或编写代码的时候,一定有想看看某个函数是在那个地方定义的,具体里面的内容是怎么样的,也可能想看看某个变量或数组是在哪个地方定义的等。尤其在调试代码或者看别人代码的时候,如果编译器没有快速定位的功能的时候,你只能慢慢的自己找,代码量比较少还好,如果代码量一大,那就郁闷了,有时候要花很久的时间来找这个函数到底在哪里。型号MDK提供了这样的快速定位的功能。只要你把光标放到这个函数/变量(xxx)的上面(xxx为你想要查看的函数或变量的名字),然后右键,弹出如图4.4.3.4所示的菜单栏 :     
image091.png
图4.4.3.4 快速定位
在图4.4.3.4中,我们找到Go to Definition Of‘sys_stm32_clock_init’ 这个地方,然后单击左键就可以快速跳到sys_stm32_clock_init函数的定义处(注意要先在Options forTarget的Output选项卡里面勾选Browse Information选项,再编译,再定位,否则无法定位!)。如图4.4.3.5所示:
image093.png
图4.4.3.5 定位结果
对于变量,我们也可以按这样的操作快速来定位这个变量被定义的地方,大大缩短了你查找代码的时间。
很多时候,我们利用Go to Definition看完函数/变量的定义后,又想返回之前的代码继续看,此时我们可以通过IDE上的 image095.png 按钮(Back to previous position)快速的返回之前的位置,这个按钮非常好用!
3. 快速注释与快速消注释
接下来,我们介绍一下快速注释与快速消注释的方法。在调试代码的时候,你可能会想注释某一片的代码,来看看执行的情况,MDK提供了这样的快速注释/消注释块代码的功能。也是通过右键实现的。这个操作比较简单,就是先选中你要注释的代码区,然后右键,选择AdvancedàCommentSelection就可以了。
以led_init函数为例,比如我要注释掉下图中所选中区域的代码,如图4.4.3.6所示:     
image096.png
图4.4.3.6 选中要注释的区域
我们只要在选中了之后,选择右键,再选择AdvancedàComment Selection就可以把这段代码注释掉了。执行这个操作以后的结果如图4.4.3.7所示:     
image098.png
图4.4.3.7 注释完毕
这样就快速的注释掉了一片代码,而在某些时候,我们又希望这段注释的代码能快速的取消注释,MDK也提供了这个功能。与注释类似,先选中被注释掉的地方,然后通过右键àAdvanced,不过这里选择的是Uncomment Selection。

4.4.4 其他小技巧
除了前面介绍的几个比较常用的技巧,这里还介绍几个其他的小技巧,希望能让你的代码编写如虎添翼。
第一个是快速打开头文件。在将光标放到要打开的引用头文件上,然后右键选择OpenDocument“XXX”,就可以快速打开这个文件了(XXX是你要打开的头文件名字)。如图4.4.4.1所示:     
image100.png
图4.4.4.1 快速打开头文件
第二个小技巧是查找替换功能。这个和WORD等很多文档操作的替换功能是差不多的,在MDK里面查找替换的快捷键是“CTRL+H”,只要你按下该按钮就会调出如图4.4.4.2所示界面:     
image102.png
图4.4.4.2 替换文本
这个替换的功能在有的时候是很有用的,它的用法与其他编辑工具或编译器的差不多,相信各位都不陌生了,这里就不啰嗦了。
第三个小技巧是跨文件查找功能,先双击你要找的函数/变量名(这里以系统时钟初始化函数:sys_stm32_clock_init为例),然后再点击IDE上面的 image104.png ,弹出如图4.4.4.3所示对话框:     
image105.png
图4.4.4.3 跨文件查找
点击Find All,MDK就会帮你找出所有含有Stm32_Clock_Init字段的文件并列出其所在位置,如图4.4.4.4所示:     
image107.png
图4.4.4.4 查找结果
该方法可以很方便的查找各种函数/变量,而且可以限定搜索范围(比如只查找.c文件和.h文件等),是非常实用的一个技巧。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 19:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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