- 1、本文档共20页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
本文通过对 STM32 的官方固件库
STM32F10x_StdPeriph_Lib_V3.5.0
里的 MDK 启动文件分析,简化部分不需要的代码,
并从繁杂的固件库里,精炼出一个类似于“hello world”
的入门实战小程序——点亮一个 LED。该工程仅仅包
含一个启动文件和一个有 main 函数的 C 文件。
本文初衷:不用固件库建立自己的工程!
实验软件:Keil u Vis ion4
实验硬件:神舟 IV 号开发板
芯片型号:STM32 F107 VC
STM32 启动代码分析、简化、实战
汇编基础:
1. 伪指令:EQU
语法格式:名称 EQU 表达式{,类型}
EQU 伪指令用于为程序中的常量、标号等定义一个等效的字符名称,类似于 C 语言的#define。
其中 EQU 可以用“*”代替。
名称为 EQU 伪指令定义的字符名称,当表达式为 32 位的常量时,可以指定表达式的数据
类型,可以有一下三种类型:
CODE16、CODE32 和 DATA
2. 伪指令:AREA
语法格式:AR EA 段名{,属性 1}{,属性 2}……
AREA 命令指示汇编程序汇编一个新的代码段或数据段。段是独立的、指定的、不可见的代
码或数据块,它们由链接程序处理。
段名:可以为段选择任何段名。但是,以一个数字开始的名称必须包含在竖杠号内,否则会
产生一个缺失段名错误。例如,|1_DataArea|。
有些名称是习惯性的名称。例如:|.text|用于表示由 C 编译程序产生的代码段,或用于以某
种方式与 C 库关联的代码段。
属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。常用的属性如下:
——CODE 属性:用于定义代码段,默认为 READONLY。
——D ATA 属性:用于定义数据段,默认为 READWRITE。
——READON LY 属性:指定本段为只读,代码段默认为 READONLY。
——READWRITE 属性:指定本段为可读可写,数据段的默认属性为 READWRITE。
——ALIGN 属性:使用方式为 ALIGN 表达式。在默认时,ELF(可执行连接文件)的代码
段和数据段是按字对齐的,表达式的取值范围为 0~31,相应的对齐方式为 2 表达式次方。
——NOINIT 属性:表示数据段是未初始化的或初始化为零。其只包含零初始化的空间保留
命令 SPACE 或 DC B、DCD、DCD U、DCQ、DCQ U、DCW 或 DCW U。可以决定在链接时
AREA 是未初始化的还是零初始化的。
一个汇编语言程序至少要包含一个段,当程序太长时,也可以将程序分为多个代码段和数据
段。
3. 伪指令:SPACE 用于分配一片连续的存储单元
启动代码分析:
定义栈段,不初始化
栈名:STAC K
大小:Stack_Size
只分配空间不做初始化或者初始化为 0:NOINIT
可读可写:READWRITE:
按 8 字节对齐:ALIGN=3
栈顶地址:__in it ia l_sp
Stack_Size EQU 0AR EA STAC K, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPAC E Stack_Size
__in it ia l_sp
定义堆段,不初始化
堆名:HEAP
大小:Heap_Size
只分配空间不做初始化或者初始化为 0:NOINIT
可读可写:READWRITE:
按 8 字节对齐:ALIGN=3
堆起始地址:__heap_base
堆终止地址:__heap_limit
Heap_Size EQU 0AR EA HE AP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPAC E Heap_Size
__heap_limit
4. 伪指令:EXPOR T
语法格式:EX POR T 标号{[WEAK]}
EXPORT 伪指令用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。
EXPORT 可用 GLOBAL 代替。标号在程序中区分大小写,[WEAK]选项声明其他的同名标
号优先于该标号被引用。
5. 伪指令:DCD
语法格式:DCD(或 DCDU) 表达式
DCD(或 DCDU)伪指令用于分配一片连续的字存储单元并用伪指令中指定的表达式初始
化。其中,表达式可以为程序标号或数字表达式。DCD 也可用“”代替。
用 DCD 分配的字存储单元是字对齐的,而用 DCDU 分配的字存储单元并不严格字对齐。
PRESERVE8 ;指示编译器 8 字节对齐(keil 编译器时需要加上)
THUMB ;指示编译器为 THUMB 指令
定义复位段(中断向量表),
文档评论(0)