赞
踩
目录
3.2 安装、认识软件Keil和硬件STM32F103开发板
1.以项目“12-GPIO输出—使用固件库点亮LED”为例子,认识本地工程文件夹:
4、Object and HEX Files目标和Hex类型文件:
5、Build Files编译类型文件 Debugger Files调试类型文件:
查阅资料解释Keil软件Option选项卡下面每个子目录下面可配置的参数,以及实现的功能。
第1处:使用分散文件加载对话框Target页面(Use Memory Layout from Target Dialog)
我们要认识单片机、STM32是什么和认识我们实验使用到的软件Keil和硬件STM32F103开发板,和Keil项目中的目录、文件,认识完这些后我们就可以开始单片机的挑战了。我们需要熟悉Keil软件的断点设置、调试功能和掌握Keil软件的工程配置。
单片机:单片机(Microcontroller)是一种集成了中央处理器(CPU)、存储器(RAM、ROM、闪存等)、输入/输出端口(I/O ports)以及定时/计数器等功能于一体的微型计算机系统。它通常用于嵌入式系统中,用于控制各种设备和系统,例如家电、汽车、医疗设备、工业控制等。
STM32:STM32是STMicroelectronics(意法半导体)推出的一系列32位ARM Cortex-M微控制器(Microcontroller)产品。STM32系列产品具有高性能、低功耗、丰富的外设和灵活的封装等特点,广泛应用于各种嵌入式系统中,包括工业控制、消费电子、汽车电子、智能家居、医疗设备等领域。
Keil软件:Keil软件是一款专业的嵌入式系统开发工具,提供了一套完整的工具链和友好的开发环境,帮助开发者轻松地进行嵌入式系统的软件开发、调试和部署。
通过Keil5安装包安装Keil软件并且安装STM32芯片包。
安装推荐博客(若侵权告知必删):http://t.csdnimg.cn/QKrLf
STM32F103开发板:STM32F103开发板是一种用于STM32F103系列微控制器的软件开发和验证的硬件平台,具有丰富的外设和功能,为开发者提供了方便快捷的开发环境。
图1 F103_霸道V2版本硬件资源标准图
调试工程的目的:
1.仿真调试实时跟踪代码的运行,逐步执行代码,程序出现问题并能跟踪到问题所在;
2.设置调试断点,使程序运行到指定位置停下;
3.能够观察全局变量的变化、寄存器的变化;
4.可以查询某个内存地址的存储的数据;
5.显示调用栈的内容,也就是函数指针和局部变量;
6.可以查询片内外设和片外外设的寄存器变化,对照芯片手册的相应寄存器的说明,便可以知道相应外设寄存器的值是否出错。
7. 调试工具栏是我们在线调试时常用的工具栏(按钮),掌握这些按钮就能快速的调试代码,也即能快速的定位我们程序哪些地方存在不足。
图2 工具栏介绍
图3 代码调试心得
图4 工具栏介绍
图5 工程配置的主要方向 .
利用Keil5打开所给例程中任何一个工程文件,调查资料并解释Keil5左侧Project窗口中每个目录的作用,以及每个文件的作用。
图6 本地工程文件夹
Doc文件夹:用来存放程序说明的文件,由写程序的人添加。(可以放工程说明.txt)
Libraries文件夹:存放的是库文件(CMSIS: 里面放着跟 CM3 内核有关的库文件 STM32F10x_StdPeriph_Driver: STM32 外设库文件)
Listing文件夹:存放编译器编译时候产生的 C/汇编/链接的列表清单
Output文件夹:存放编译产生的调试信息、hex 文件、预览信息、封装库等
Project文件夹:用来存放工程
User:用户编写的驱动文件(stm32f10x_conf.h:用来配置库的头文件
stm32f10x_it.h stmm32fl0x_it.c:中断相关的函数都在这个文件编写,暂时为空 main.c:main 函数文件)
图7 Keil中的project目录
STARTUP文件夹:启动文件,由汇编语言编写, 主要负责启动,因为stm32单片机的内部结构非常复杂,启动代码必须使用更高效率的汇编语言,由ST公司提供,一般不需要修改。启动文件由汇编代码编写,一般命名为startup_xxx.s,xxx为支持的某种芯片,比如stm32f10x(意法半导体stm32f10x系列)等Cortext-M0/M3/M4内核芯片。它们的代码格式非常相近,根据启动文件代码由上到下的编写顺序。(可分为五部分:1.堆栈空间定义;2.存放中断向量表;3.复位中断函数(Reset_Handler);4.其它中断异常服务函数,以及弱[WEAK]声明;5.将堆栈地址传递给库函数,利用库函数初始化堆栈,和库函数自身初始化。)
CMSIS文件夹:STM32固件库的CMSIS。CMSIS是ARM公司与多家不同的芯片和软件供应商一起紧密合作定义的,提供了内核与外设、实时操作系统和中间设备之间的通用接口。
图8 基于CMSIS标准的软件架构
core_cm3.h + core_cm3.c:Cortex-M3内核及其设备文件。访问Cortex-M3内核及其设备:NVIC,SysTick等;访问Cortex-M3的CPU寄存器和内核外设的函数。
stm32f10x.h:这个头文件包含了STM32的大部份定义:
a.定义芯片的类型,如#define STM32F10x_MD
b.定义是否包含标准库,#define USE_STDPERIPH_DRIVER
c.定义外部振荡器频率,#define HSE_VALUE
上面三个定义,建议在main.c文件中刚开始就定义好,或者是在编译器选项中定义好,这样就可以不修改这个文件了。
d.采用枚举的方式定义中断号。定义中断号在stm32f10x_it.c stm32f10x_it.h
e.包含 core_cm3.h,system_stm32f10x.h (#include "core_cm3.h" #include "system_stm32f10x.h" #include <stdint.h> )
f.定义数据类型,例如:typedef uint32_t u32此外还定义了FlagStatus,ITStatus及ErrorStatus等。u8,s8等为了兼容以前的库所定义的数据,建议程序中用标准的uint8_t这样的类型。此外还定义了bool,FlagStatus,alStatus及ErrorStatus
g.定义外设结构体,地址及用到的数据常量。
h.包含stm32f10x_conf.h来配置外设。#ifdef USE_STDPERIPH_DRIVER #include "stm32f10x_conf.h" #endif
i.定义位操作的宏
system_stm32f10x.h和system_stm32f10x.c:
a.定义一个全局变量 extern uint32_t SystemCoreClock: 系统时钟频率与你选择有关
b.SystemInit():这个函数就是启动文件中调用的函数
(1) 在system_stm32f10x.c的开始部份,选择相关的系统时钟频率,如#define SYSCLK_FREQ_24MHz 24000000
(2) 通过SystemInit()函数,就将SYSCLK = HCLK = PCLK1=PCLK2=PLL输出24MHz。注意:这个频率为HSE为8MHz时为条件,如果HSE不为8MHz或用HSI时,就会有问题。
c.SystemCoreClockUpdate():更新SystemCoreClock的值,与系统频率一致。
可能看到,这个文件中的RCC设置很有局限性,所以在程序中,可以不用它,而用标准库存中的stm32f10x_rcc中的函数进行设置。
FWLB文件夹:FWLIB下面存放ST官方提供的外设固件库源文件和头文件。每个.c源文件文件对应一个,h头文件。
USER文件夹:用户程序,其中main.c是主程序文件,是用户需要编写的程序部分;该目录下的库文件,一般不需要修改。stm32f10x_it.c/.h中主要用来定义部分中断服务函数。system_stm32f10x.c主要定义systemInit等时钟初始化函数。stm32fl0x_conf.h:用来配置库的头文件。
DOC文件夹:存放开放文档、需求文档
图9 拓展补充总结
图10 代码层次结构图
Keil文件可以分为7类:
工作空间文件:(这类文件不能删除) *.uvmpw:µVision Project file for Multiple Projects多工程文件,也就是我们说的工作空间文件。
工程文件:(这类文件不能删除) *.uvprojx:µVision5工程文件
*.uvproj:µVision4工程文件 *.uv2:µVision3工程文件
工程选项配置文件:(这类文件不能删除) *.uvoptx:µVision5工程选项配置文件
项目界面布局文件:(这类文件可以删除) *.uvguix[.user-name]:µVision5项目界面布局文件。删除之后,重新打开工程,界面布局会恢复到默认布局。如Demo.uvguix.Administrator。
*.uvguix[.user-name]:µVision4项目界面布局文件。
*.uvopt:µVision4工程选项配置文件
*.c:C源文件 *.h:C头文件 *.cpp:C++源文件 *.s:汇编源文件
*.a51:汇编源文件 *.a66:汇编源文件 *.inc:汇编头文件
*.src:C编译器生成的其他源文件
这一类文件属于中间文件,一般在编译过程中产生。可以在工程目标选项中配置对应的链接文件。Project -> Options for Target -> Listing。
*.map:存储镜像文件
*.i:C预处理器输出文件 *.scr:链接器分散加载器文件
*.lst:C编译器或汇编器生成的文件 *.m51:同样也是map文件
*.m66:同样也是map文件 *.htm:链接器的列表文件
这一类文件同样属于中间文件,一般在编译过程中产生。但这类文件比较重要,调试信息、预览信息、可执行文件等都在这里面。
Project -> Options for Target -> Output。
*.hex:可执行文件
*.axf:包含调试信息的程序文件 有时候我们调试出错,可能是axf没有文件。
*.d:编译生成的依赖文件 一般一个.c文件对应一个.d文件。
*.o:也是目标的依赖文件 重定位定址的依赖文件。
*.lib:库文件 生成的库就在这里。 *.elf:ELF/DWARF链接的文件
*.crf:浏览信息文件 使用Go to Definition Of 功能,就需要有这类文件。
编译和调试,其实是两类不同文件,综合在一起介绍。
*.bat:批处理文件 ._IA, .__I, ._II, .SCR:工具调用文件
*.ini:于初始化源码文件
*.pack:软件(支持)包文件 *.sct:链接控制文件
*.lnp:连接器传递命令文件 *.dep:目标编译依赖文件
*.cdb:µVision设备数据库文件
通过调试源代码“12-GPIO输出—使用固件库点亮LED”,深入熟悉调试功能的用法。
1.理解示例代码:首先,仔细阅读“12-GPIO输出—使用固件库点亮LED”的代码,理解代码中的每一行都在做什么。
2.设置调试环境:确保开发环境已经正确设置,连接了STM32F103开发板到电脑。
3.编译代码:在Keil中编译代码,确保没有语法错误或者编译错误。
4.下载代码到目标板:使用调试器将编译后的代码下载到STM32F103开发板上。
5.启动调试会话:在开发工具中启动调试会话,连接到目标板上的STM32F103。
6.设置断点:在代码中设置断点,例如可以在点亮LED的代码行设置一个断点,这样当程序执行到该行时会暂停。
7.单步执行代码:使用单步执行功能,逐步执行代码,观察代码的执行流程以及变量的值变化。可以在每一步检查GPIO端口的状态,以确保GPIO配置正确。
8.观察LED状态:在单步执行过程中,观察LED的状态是否符合预期。如果LED没有点亮,可以逐步排查问题,例如检查GPIO配置、LED连接是否正确等。
9.使用调试工具:利用调试工具提供的功能,如变量监视器、寄存器查看器等,进一步深入分析代码的执行情况。
10.调试问题:如果遇到问题,可以使用调试工具提供的功能来定位和解决问题。可以通过查看变量的值、观察程序执行流程等方法来调试代码。
Device目录: "search"框可以输入芯片名称,快速找到对应的芯片;芯片结构图里也可以选择芯片,这里芯片是按厂家区分,并且芯片结构图里也可以选择芯片,这里芯片是按厂家区分;”Software Pack”框可以查看当前芯片包的版本。具体的software component 在Manage Run-Time Environment对话框可以看到:点击
Target目录:从内容可以看得出来是工程目标的调试晶振频率、选择的编译器、RAM和ROM分配的地址空间等。” STMicroelectronics”框可以查看芯片型号;” Code Generation”框可以选择编译器版本;
图11 target分区域
这个值主要用于仿真调试用,使用硬件调试则是根据实际的使用频率。
是否选择Keil自带的RTX操作系统,一般都不选。
这里是根据前面选择的device自动确定的对应芯片的svd文件,这个文件一般在安装目录下,如果想要更改就勾选Use Custom SVD File再选择文件所在目录。System Viewer功能是用来仿真时观察和修改芯片的在外设寄存器用的,它按芯片厂家的手册直接列出所有寄存器的位和功能指示。在仿真过程中可以修改和查看。
跨模块优化:使能链接器反馈文件,从而能够更深层次的代码优化。一般不使用
微库:是缺省的C库,而且microLIB进行了高度优化。如果不勾选“Use MicroLIB”,keil会连接标准C库。所以勾选“Use MicroLIB”会减小code大小。它不完全兼容ANSI,但已能满足大多数的应用。
这里的ROM存储指的是程序储存的地址,分片外和片内两种。
程序存储在片内好理解(初学者一般下载程序都是下载到片内FLASH),片外存储程序对于初学者来说比较少见,一般都是项目做大了,或有特殊要求时,片内不够使用了才将程序存储在片外。
Output目录:”Select folder for objects”框可以选择存放编译过程中产生的过程文件的目录;“Name of executable”框显示可执行文件名称;下面的选项为输出可执行文件,输出这些信息都很费时间,如果都不勾选这些选项,编译速度会很快。”Debug Infomation”选项输出调试信息,勾选上这个选项,才可以进行调试;”Create HEX File”选项输出可执行Hex文件;“Browse Information”选项输出浏览信息,勾选上这个才能使用go to definition of这个功能。
Listing目录:生成列表相关的选项,对代码分析比较透彻的工程师就需要了解这个选项。常见的就是map地址的分布,就是在这里配置生成的的。
图12 Listing分区域
选择列表文件输出的文件夹。可设置文件页面的宽度,长宽
勾选上会输出汇编列表信息(产生后缀为 .lst的文件)。如果工程中没汇编文件,则不会输出信息。这个文件包含了有关编译过程的很多信息,比如编译器版本号、源文件名称,由C语言程序编译产生的汇编代码,以及编译过程中产生的错误、警告信息,这些信息和编译时屏幕显示的提示信息相同。
C编译程序列表选项,勾选上可生成.txt, .i文件。
可选择生成或禁止生成.map文件。可设置生成代码的详细信息。可选择性的选取输出MAP文件。map文件是通过编译器编译之后,集程序、数据及IO空间的一种映射文件。在遇到内存越界,或溢出的情况时,可以分析map文件。通过map文件可以知道函数大小,入口地址等一些重要信息。
Memory Map:内存映射 Callgraph:图像映射 Symbols:符号
Cross Reference:交叉引用 Size Info:大小信息
Totals Info:统计信息 Unused Section Info:未调用模块信息
Veneers Info:装饰信息
User目录:这个选项是针对用户而设计的,一般不常用,方便用户执行一些程序。
Before Compile C/C++ File参数: 编译c文件之前
Before Build参数:编译之前 After Build/Rebuild参数:编译之后
注:Compile:只编译选定的目标,可以是单个文件,不管之前是否已经编译过,在这个过程中检查语法错误。但并不生成可执行文件
Build:只编译工程中上次修改的文件及其它依赖于这些修改过的文件的模块,同时重新链接生成可执行文件。如果工程之前没编译链接过,它会直接调用Rebuild All。另外在技术文档中,Build实际上是指increase build,即增量编译。
Rebuild:不管工程的文件有没有编译过,会对工程中所有文件重新进行编译生成可执行文件,因此时间较长。
1. 预处理(Preprocessor Symbols):主要就是预定义功能,相当于程序中的#define xxxx。
2.语言代码生成(Language / Code Generation):编译,链接到最后生成代码,编译优化
[Execute only Code设置编译器命令行]:只生成执行代码,防止编译器生成任何数据访问代码部分。
[Optimize代码优化]:有Level0 - Level3四个选项,初学者、在线调试建议使用Level0,也就是不优化,这样执行的效果才和代码一样。如果配置成Level3,在线调试可能有些地方优化而不能打断点。
[Optimize for Time优化时间]:即优化代码中费时的地方,比如有些算法,本身代码量就比较大,运行需要很长时间(假如需要2秒),这个时候勾选上该功能,会发现运行时间有比较明显的减少(或许不到1秒时间)。
[Split Load and Store Multiple]:加载和存储多个分裂,非对齐数据采用多次访问方式。当 LMD/STM 指令有 4 个以上产生时,列分裂LMD 和 STM 指令,以减不中断延迟。
LDM:(load much)多数据加载,将地址上的值加载到寄存器上
STM:(store much)多数据存储,将寄存器的值存到地址上
[One ELF Section per Function]:优化每一个函数 ELF 段,每个函数都会产生一个 ELF 段,勾选上,允许优化每一个 ELF 段,最会将需要的函数链接成一个大的ELF文件。但是如果没有勾选,Keil将每个文件编译成一个ELF文件(即使文件中用未被使用的函数),最会链接成一个ELF文件。所以勾选会使code变小。这个选项可以减少潜在的共享地址、数据和函数之间的字符串。
[strict ANSI C]:编译时严格按照标准的ANSI C进行检查。
[Enum Container always int]:枚举总是int型
[enum_is_int]:枚举时成员变量类型为int型。
[Plain Char is Signed]:纯字符标记为字符
[Read-Only Position Independent]:为常量生成独立的代码空间。我们定义字库变量为常量,勾选该选项,会将这些字库变量放在独立的代码空间。
[Read-Write Position Independent]:为可读写代码生成独立的代码空间。
[Warnings]:警告
No Warnings:不会有警告提示和输出;
All Warnings:所有警告提示和输出。
Thumb Mode:Thumb模式。
No Auto Includes:不自动添加头文件,不勾选该选项,编译器就会在Keil安装路径寻找你工程中.h文件。
举例:我们定义uint8_t是定义在stdint.h文件里面的,但是我们工程目录下一般是没有stdint.h文件。这时候,编译器就会在Keil路径下去寻找stdint.h文件。
C99 Mode:C99标准模式。(C语音有标准有多个版本,如C89、C90、C99等)
3.include path包含路径:指定工程中使用的h文件的存放位置,让编译器找到对应的文件
4.多功能控件Misc Controls:指定没有单独的对话框控件
5.编译器控制字符串Compiler control string:编译器执行的命名,显示当前在编译器命令行指令。
Asm目录:汇编选项。有条件的装配控制符号(Conditional Assembly Control Symbols):指定汇编条件,这里类似C/C++中的预处理。
语言代码生成(Language / Code Generation)和C/C++中类似
Linker目录:链接配置选项。可以修改、编辑和查看链接的文件。
图13 Linker区域划分
区域介绍:
Make RW Sections Position Independent:使RW段独立
【设置编译器命令行:–rwpi】
启用时:变量区域(包含RW和ZI)具有独立地址。
禁用时:变量区域(包含RW和ZI)位于绝对的内存地址。
Make RO Sections Position Independent:使RO段独立
【设置编译器命令行:–ropi】
启用时:常量和代码区域(RO)具有独立地址。
禁用时:常量和代码区域(RO)位于绝对的内存地址。
Don’t Search Standard Libraries:不搜索标准库
【设置编译器命令行:–noscanlib】
禁用默认编译器运行时库的扫描。
Report ‘might fail’ Conditions as Errors:报告’might fail’条件认为是错误
【设置编译器命令行:–strict】
报告的条件可能导致失败的错误,而不是警告。
X/O Base:X/O基地址
【设置编译器命令行:–xo_base=address】
R/O Base:R/O基地址
【设置编译器命令行:–ro_base=address】
R/W Base:R/W基地址
【设置编译器命令行:–rw_base=address】
disable Warnings:警用警告
【设置编译器命令行:–diag_suppress】
这里可以加载、查看和编辑分散文件。点击后面就的三点“…”可以加载文件;点击“Edit…”查看和编辑对应的文件。
Debug目录:DLL文件属于Keil自身的配置。
CPU/Driver DLL - Parameter:CPU驱动文件和参数
Dialog DLL - Parameter:会话框DLL文件和参数
图14 Debug区域介绍
图15 Debug目录下的setting选项
Utilities目录:配置FLASH菜单命名(Configure Flash Menu Command):这里是二选一选项,一般使用上面的“Update Target Driver for Flash Programming”列表选择和调试接口一致的驱动。
Use Debug Driver:使用调试驱动
Update Target Before Debugging:调试之前更新目标
一般都勾选上,因为我们下载程序之前检测到代码修改了,就会重新编译程序(也就是更新目标)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。