【嵌入式系统开发05】ARM汇编语言编程入门实践

本文目的是主要介绍如何搭建并配置Keil嵌入式开发环境,完成一个基于STM32汇编程序的编写。记录build生成的 hex文件各段的大小,了解Hex文件格式及其前8个字节内容含义,学习在没有硬件条件下进行仿真调试的方法,观察ARM寄存器变化状况。


(一)keil环境搭建

1.什么是keil?

● Keil MDK-ARM是美国Keil软件公司(现已被ARM公司收购)出品的支持ARM微控制器的一款IDE(集成开发环境)。
● MDK-ARM包含了工业标准的Keil C编译器、宏汇编器、调试器、实时内核等组件。
● 具有业行领先的ARM C/C++编译工具链,完美支持Cortex-M、Cortex-R4、ARM7和ARM9系列器件,包含世界上品牌的芯片。比如:ST、Atmel、Freescale、NXP、TI等众多大公司微控制器芯片。

2.产品组件介绍

● MDK-核心是基于使用的μVision领先的Cortex-M的设备,包括新的ARMv8-M架构的支持。
● DS-MDK包含了基于Eclipse的DS-5 IDE /调试器,并支持32位的Cortex-A和Cortex-M 32位的Cortex-A处理器或混合系统。
● MDK包括两个ARM C/C++编译器与汇编器,连接器和高度优化的量身定制最佳代码大小和性能运行时库。
● 软件包可以从工具链添加任何时候MDK-Core或DS-MDK制造新的设备支持和中间件会更新无关。它们包含的设备支持,CMSIS库,中间件,主板支持,代码模板和示例项目。
在这里插入图片描述

3.下载需求

● keil安装
链接:https://pan.baidu.com/s/1ttrDhv6kXgAvPiYINf9iGw
提取码:1234
通过以上链接下载mdk和注册器,点击安装mdk,根据提示自行更改软件路径和支持包路径,填写完注册信息后NEXT,等待安装。安装完成,点击Finish。
● 注册
链接:https://pan.baidu.com/s/1T11pBKpD6xc-cNmXBskcaw
提取码:1234

步骤顺序具体操作
A点击运行注册器程序。
B在桌面找到keil软件图标,点击右键,以管理员身份运行。
C点击File–>Lincense Management–>Single-User Lincense,找到CID,复制CID中的内容填写到注册器的CID空白处,将注册器中Target选择为ARM,点击Generate,得到注册码。
D将生成的注册码复制粘贴到Keil的New Lincense ID Code空白处,点击Add LIC,点击Close。

● 支持包安装
链接:https://pan.baidu.com/s/1a7UDSVeLC4ktHNN9lV9oIA
提取码:1234
点击运行下载的支持包,NEXT开始安装,安装完成,点击Finish。

4.安装流程

● 首先点开mdk531
在这里插入图片描述
● 点击NEXT
在这里插入图片描述
● 点击同意
在这里插入图片描述
● 默认即可,点击NEXT
在这里插入图片描述

● 随意设置,点击NEXT
在这里插入图片描述
● 耐心等待
在这里插入图片描述

●点击安装即可
在这里插入图片描述

●完成安装
在这里插入图片描述
在这里插入图片描述
※ 至此Keil MDK-ARM就安装完成,可以新建工程使用了。但为了不受编译代码大小限制和用户体验,就需要购买授权,或注册。


(二)基于MDK创建汇编语言STM32工程

1.建立新工程

● 首先打开Keil,点击菜单栏Project–>New μVision Project,新建项目。
在这里插入图片描述
● 在弹窗中设置工程项目的名称和路径,在这里,新建名为Text的工程文件。
在这里插入图片描述

2.环境配置

● 点击菜单中的Project,找到Options for Target ‘Target 1’并点击,在弹窗中选择相应的目标环境,此处选的是 STM32F103ZE
在这里插入图片描述
● 选择合适的运行环境
在这里插入图片描述

3.添加源文件

● 右键单击Source Group 1,选择Add New Item to Group
在这里插入图片描述
● 添加Asm File (.s)文件,命名为Text并保存。
在这里插入图片描述
● 然后就可以代码的编写
在这里插入图片描述


(三)代码编写、仿真与编译调试

1.完成需求分析

※ 完成在没有硬件条件下进行仿真调试的方法,观察ARM寄存器变化状况。

2.代码编写

● 在Text.s下进行代码编写。

 AREA MYDATA, DATA
	
 AREA MYCODE, CODE
	ENTRY
	EXPORT __main

__main
	MOV R0, #10
	MOV R1, #11
	MOV R2, #12
	MOV R3, #13
	;LDR R0, =func01

	BL	func01
	;LDR R1, =func02
	BL	func02
	
	BL 	func03
	LDR LR, =func01
	LDR PC, =func03
	B .
		
func01
	MOV R5, #05
	BX LR
	
func02
	MOV R6, #06
	BX LR
	
func03
	MOV R7, #07
	MOV R8, #08	
	BX LR

在这里插入图片描述
● 生成hex文件,根据以下操作。
在这里插入图片描述
在这里插入图片描述

3.设置仿真器模式

● 选择Debug–>Use Simulator,将Dialog DLL以及Parameter处修改为自己选择的设备,再点击OK。
在这里插入图片描述
注意:这里的Parameter需要改为-pSTM32F103ZE

4.编译调试

● 点击build、rebuild进行编译。
在这里插入图片描述
● 发现此代码无报错。
在这里插入图片描述
●进入调试界面。
在这里插入图片描述
在这里插入图片描述
● 再点击step over,可以得到相应的预期结果。
在这里插入图片描述
在这里插入图片描述
※ 可以看见寄存器R5,R6,R7,R8的值和程序设置一样。


(四)分析HEX文件

1.完成需求分析

※ 记录build生成的 hex文件各段的大小,了解Hex文件格式及其前8个字节内容含义。

2.打开hex文件

● 用记事本打开该文件,该文件为16进制的一串字符。
在这里插入图片描述
在这里插入图片描述

:020000040800F2
:100000000006002031010008390100083B0100080A
:100010003D0100083F010008410100080000000008
:100020000000000000000000000000004301000884
:1000300045010008000000004701000849010008D0
:100040004B0100084B0100084B0100084B01000860
:100050004B0100084B0100084B0100084B01000850
:100060004B0100084B0100084B0100084B01000840
:100070004B0100084B0100084B0100084B01000830
:100080004B0100084B0100084B0100084B01000820
:100090004B0100084B0100084B0100084B01000810
:1000A0004B0100084B0100084B0100084B01000800
:1000B0004B0100084B0100084B0100084B010008F0
:1000C0004B0100084B0100084B0100084B010008E0
:1000D0004B0100084B0100084B0100084B010008D0
:1000E0004B0100084B0100084B0100084B010008C0
:1000F0004B0100084B0100084B0100084B010008B0
:100100004B0100084B0100084B0100084B0100089F
:100110004B0100084B0100084B0100084B0100088F
:100120004B0100084B0100084B0100084B0100087F
:100130000948804709480047FEE7FEE7FEE7FEE77B
:10014000FEE7FEE7FEE7FEE7FEE7FEE704480549B7
:10015000054A064B7047000041020008990200085A
:100160000000002000060020000200200002002005
:10017000704770477047000080B500F001F880BDFF
:1001800082B041F204000021C4F20200019100910A
:1001900050F8041C41F4803140F8041C50F8041C51
:1001A00001F400310091019901310191009919B9CF
:1001B0000199B1F5A06FF1D150F8041C890354BF27
:1001C0000021012100910099012936D142F200015C
:1001D000C4F202010A6842F010020A600A6822F0C2
:1001E00003020A600A6842F002020A6001680160C4
:1001F00001680160016841F480610160016821F4D7
:100200007C110160016841F4E811016050F8041CA0
:1002100041F0807140F8041C50F8041C8901FBD5A2
:10022000016821F003010160016841F002010160F1
:10023000016801F00C010829FAD102B070470000F2
:1002400080B541F20000C4F202000168002241F0D2
:10025000010101604168CFF6FF0211404160016871
:100260004FF6FF72CFF6F66211400160016821F48B
:1002700080210160416821F4FE0141604FF41F01BB
:100280008160FFF779FF4EF60850CEF200004FF084
:100290000061016080BD00004FF00A004FF00B01CB
:1002A0004FF00C024FF00D0300F009F800F00AF8CF
:1002B00000F00BF8DFF81CE0DFF81CF0FEE74FF071
:1002C000050570474FF0060670474FF007074FF0DF
:0C02D00008087047BF020008CB020008BD
:040000050800029954
:00000001FF

3.分析Hex文件格式

Hex文件格式分析
● Intel Hex文件是遵循Intel Hex文件格式的ASCII文本文件。在Intel Hex文件的每一行中都包含了一个hex记录。这些记录是由一些代表机器语言代码和常量的16进制数据组成。Intel Hex文件常用来传输要存储在ROM、EPROM或者Flash中的程序和数据。大部分的EPROM编程器都能使用Intel Hex文件。
● Intel Hex由任意数量的十六进制记录组成。每个记录包含6个域,它们按一下格式排列。
● | MARK | RECLEN | OFFSET | RECTYP | DATA | CHKSUM |
在这里插入图片描述
Hex六域分析

名称
MARK每个 Intel HEX 记录都由冒号开头
RECLEN数据长度域,它代表记录当中数据字节的数量
OFFSET地址域,它代表记录当中数据的起始地址
RECTYP代表HEX记录类型的域,它可能是以下数据当中的一个
DATA数据域,一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域中指定的数字相符
CHKSUM校验和域,它表示这个记录的校验和.校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行补足

4.前8个字节内容含义

※ 在第一行数据020000040800F2中,其实际表达为0x02 0x00 0x00 0x04 0x08 0x00 0xf2。具体含义表达如下:
第一个字节 0x02表示本行数据的长度;
第二、三字节 0x00 0x00表示本行数据的起始地址;
第四字节 0x04表示数据类型,数据类型有:0x00、0x01、0x02、0x03、0x04、0x05
'00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录
'01' End of File Record: 用来标识文件结束,放在文件的最后,标识HEX文件的结尾
'02' Extended Segment Address Record: 用来标识扩展段地址的记录
'03' Start Segment Address Record:开始段地址记录
'04' Extended Linear Address Record: 用来标识扩展线性地址的记录
'05' Start Linear Address Record:开始线性地址记录
然后是数据,0x08 0x00
最后一个字节 0xf2为校验和。


(五)总结

本文介绍了如何搭建并配置Keil嵌入式开发环境,完成一个基于STM32汇编程序的编写。记录build生成的 hex文件各段的大小,了解Hex文件格式及其前8个字节内容含义,学习在没有硬件条件下进行仿真调试的方法,观察ARM寄存器变化状况。
寄语:此番远航归来
   有故事说
   却张口声哑

参考文献:
https://blog.csdn.net/ybhuangfugui/article/details/51501781
https://blog.csdn.net/qq_43279579/article/details/108880667
https://blog.csdn.net/qq_46467126/article/details/120444165?spm=1001.2014.3001.5502
https://blog.csdn.net/xsx669/article/details/83795274

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值