IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 基于STM32汇编程序的编写 -> 正文阅读

[嵌入式]基于STM32汇编程序的编写

基于STM32汇编程序的编写

由于本人的环境在之前已经搭建完成,大家可以看看其他人的文章

1新建工程

双击打开MDK5.26,启动界面如下所示;

在这里插入图片描述

点击菜单栏的Project,在弹出的窗口点击选项New uVision Project,创建新的工程;

在这里插入图片描述

在弹出的窗口分别设置;

  1. 设置项目工程的路径
  2. 设置项目工程的名称,这里使用TEST
  3. 点击保存

在这里插入图片描述

2 配置环境

2.1 选择设备

设置工程的目标环境,本文基于STM32F103ZET6,因此在弹出的窗口选择相应的选项,点击保存即可
在这里插入图片描述

2.2 选择运行环境

ARM的CMSIS已经把开发所需要的软件组件都封装好了,因此直接选择即可;

  1. CMSIS下选择CORE
  2. Device下Startup,其中包含了启动文件

在这里插入图片描述

2.3 添加源文件

鼠标右键单击Source Group 1

在这里插入图片描述

在这里插入图片描述

添加源文件,因为创建汇编项目;

  1. 选择 Asm File (.s) ,创建汇编文件
  2. 设置源文件的名称
  3. 点击保存

在这里插入图片描述

3 测试代码

3.1 源码

编译并调试如下代码

 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

在这里插入图片描述

3.2 仿真器设置

点击菜单中的Project,找到Options for Target ‘Target 1’并点击,选择Debug–>Use Simulator,将Dialog DLL以及Parameter处修改为自己选择的设备,OK。

在这里插入图片描述

3.3 编译调试

点击build进行编译,编译成功后点击红色按钮进入仿真

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

先点击run按钮在这里插入图片描述
再点击旁边的stop按钮,最后可以看到,结果符合预期,寄存器R5R6R7R8的值和程序设置一致,具体如下图所示;
在这里插入图片描述

4分析HEX文件

1.hex 文件

最终生成的 hex 文件的各段大小

在这里插入图片描述

用记事本打开 hex 文件,都是一连串的十六进制

: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

2.扩展线性地址记录

  • 扩展线性地址记录(hex 文件的第一排十六进制)也叫作 32 位地址记录或 HEX386 记录
  • 这些记录包含数据地址的高 16 位
  • 扩展线性地址记录总是有两个数据字节,外观如下(这里我通过标记方便对应原始数据)
内容描述
:020000040800F2
02这个记录当中数据字节的数量
0000地址域,对于扩展线性地址记录,这个域总是 0000
04记录类型 04 (扩展线性地址记录)
0800是地址的高 16 位
F2是这个记录的校验和,计算方法:01h + NOT(02h + 00h + 00h + 04h + 08h + 00h)
  • 当一个扩展线性地址记录被读取,存储于数据域的扩展线性地址被保存,它被应用于从 Intel HEX 文件读取来的随后的记录
  • 线性地址保持有效,直到它被另外一个扩展地址记录所改变
  • 通过把记录当中的地址域与被移位的来自扩展线性地址记录的地址数据相加获得数据记录的绝对存储器地址

3.数据部分

  • Intel HEX 由任意数量的十六进制记录组成。每个记录包含 5 个域,它们按一定格式排列::llaaaatt[dd…]cc

  • 每一组字母对应一个不同的域,每一个字母对应一个十六进制编码的数字

  • 每一个域由至少两个十六进制编码数字组成,它们构成一个字节,就像以下描述的那样:

    内容描述
    :llaaaatt[dd…]cc
    :每个Intel HEX记录都由冒号开头
    ll数据长度域,它代表记录当中数据字节(dd)的数量
    aaaa地址域,它代表记录当中数据的起始地址
    tt代表HEX记录类型的域,它可能是以下数据当中的一个:00(数据记录)、01(文件结束记录)、02(扩展段地址记录)、04(扩展线
    dd数据域,它代表一个字节的数据。一个记录可以有许多数据字节.记录当中数据字节的数量必须和数据长度域(ll)中指定的数字相符
    cc校验和域,它表示这个记录的校验和(校验和的计算是通过将记录当中所有十六进制编码数字对的值相加,以256为模进行以下补足)
  • Intel HEX文件由任意数量以回车换行符结束的数据记录组成

  • 这里我们随便拿一条数据记录分析,比如第二条吧

    内容描述
    :100000001806002031010008390100083B010008F2
    10这个记录当中数据字节的数量
    0000数据将被下载到存储器当中的地址
    00记录类型(数据记录)
    1806…0008数据
    F2这个记录的校验和

4.文件尾

  • 在文件的最后一排,是一个文件的结束标志::00000001FF

    内容描述
    :00000001FF
    00记录的长度为 0
    0000LOAD OFFSET为0000
    01TYPE = 01
    FF校验和为FF
  • 这个是一个 END OF FILE RECORD,标识文件的结尾

5总结

通过本实验,了解HEX文件内容和知道了使用仿真器模式调试时要根据选择的设备更改参数。后面可以配合硬件,把每一条指令过一遍,从而加深理解

6参考资料

基于 MDK 创建 STM32 汇编语言工程并分析 HEX 文件内容

搭建并配置Keil嵌入式开发环境,完成一个基于STM32汇编程序的编写
模式调试时要根据选择的设备更改参数。后面可以配合硬件,把每一条指令过一遍,从而加深理解

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 20:58:04  更:2022-10-08 20:59:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 2:00:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计