文章目录

  • 一.STM32汇编程序
    • 1.keil环境搭建
    • 2.stm32程序
      • (1).新建工程
      • (2).配置环境
      • (3).编译调试
    • 3.分析HEX文件
  • 二、基于MDK创建STM32
    • 1.创建一个新工程
    • 2.添加文件
    • 3.汇编程序
    • 4.分析编译生成的Hex文件
    • 5.使用汇编实现LED闪硕

一.STM32汇编程序

1.keil环境搭建

keil安装
通过以上链接下载mdk和注册器,点击安装mdk,根据提示自行更改软件路径和支持包路径,填写完注册信息后NEXT,等待安装。安装完成,点击Finish。

注册

1.点击运行注册器程序。\n\n2.在桌面找到keil软件图标,点击右键,以管理员身份运行。\n\n3.点击File–>Lincense Management–>Single-User Lincense,找到CID,复制CID中的内容填写到注册器的CID空白处,将注册器中Target选择为ARM,点击Generate,得到注册码。\n\n4.将生成的注册码复制粘贴到Keil的New Lincense ID Code空白处,点击Add LIC,点击Close。

支持包安装
点击运行下载的支持包,NEXT开始安装,安装完成,点击Finish。

2.stm32程序

(1).新建工程

双击打开keil,点击菜单栏Project–>New μVision Project,新建项目,在弹窗中设置工程项目的名称和路径,在这里,我新建名为TEST的工程文件。

(2).配置环境

选择设备\n\n点击菜单中的Project,找到Options for Target ‘Target 1’并点击,在弹窗中选择相应的目标环境,此处我选的是STM32F103ZE

选择运行环境

添加源文件\n\n右键单击Source Group 1,选择Add New Item to Group,添加Asm File (.s)文件,命名为TEST并保存。\n\n为其添加如下代码

AREA MYDATA, DATAAREA MYCODE, CODEENTRYEXPORT __main__mainMOV R0, #10MOV R1, #11MOV R2, #12MOV R3, #13;LDR R0, =func01BL    func01;LDR R1, =func02BL   func02BL    func03LDR LR, =func01LDR PC, =func03B .func01MOV R5, #05BX LRfunc02MOV R6, #06BX LRfunc03MOV R7, #07MOV R8, #08   BX LR

设置仿真器模式

编译调试
![在这里插入图片描述](https://img-blog.csdnimg.cn/92fdcb2b2fb24dae88d1e7dfd8739df6.png#pic_center

(3).编译调试

3.分析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

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


二、基于MDK创建STM32

1.创建一个新工程

(1)点击project在选择保存路径
(2)选择环境配置
对应芯片

运行环境

2.添加文件

1.鼠标右键单击Source Group 1,选择Add New Item to Group,2.选择 Asm File (.s) ,设置源文件的名称,点击Add,随后设置完成。

3.汇编程序

 AREA MYDATA, DATAAREA MYCODE, CODEENTRYEXPORT __main__mainMOV R0, #10MOV R1, #11MOV R2, #12MOV R3, #13;LDR R0, =func01BL   func01;LDR R1, =func02BL   func02BL    func03LDR LR, =func01LDR PC, =func03B .func01MOV R5, #05BX LRfunc02MOV R6, #06BX LRfunc03MOV R7, #07MOV R8, #08   BX LR

###调试结果

选择仿真器\n设置硬件仿真器为ST_Link(根据自己的实际情况进行选择),仿真器的模式设置为JTAG接口或者SW(根据自己的实际情况进行选择)。设置完成,连接相应的仿真器会有对应信息显示。\n仿真调试(断点设置是在代码行前点击,出现红点,即表明断点设置成功
调试结果

4.分析编译生成的Hex文件

1.最终生成程序的各部分大小

2.分析Hex文件内容

第一行内容分别是0x02,0x00,0x00,0x04,0x08,0x00,0xF2。\n\n0x02\n该行数据中有两个数据\n0x00 0x00\n本行数据的起始地址位\n0x04\n用来标识扩展线性地址的记录\n该字节还可以是其他值,下面是其他值的含义\n00:用来记录数据,HEX文件的大部分记录都是数据记录\n01:用来标识文件结束,放在文件的最后,标识HEX文件的结尾\n02:用来标识扩展段地址的记录\n03:开始段地址记录\n05:开始线性地址记录\n0x08 0x00\n该行两个字节的数据\n数据类型是 04 ,即该行记录的是一个拓展地址(0x08 0x00 是地址信息,用法是将该地址(0x0800\u003C\u003C16) 后作为基地址\n0xF2\n校验和,校验和= 0x100 - 累加和

5.使用汇编实现LED闪硕

1.创建一个新工程\n不需要添加启动代码(startup,core),其他步骤跟上面步骤基本一致。\n2.添加一个汇编文件


LED0 EQU 0x40011004;定义引脚PC2
RCC_APB2ENR EQU 0x40021018;配置RCC寄存器,时钟
GPIOC_CRL EQU 0x40011000;配置CRL寄存器
Stack_Size      EQU     0x00000400;栈的大小
;分配一个STACK段,该段不初始化,可读写,按8字节对齐。分配一个大小为Stack_Size的存储空间,并使栈顶的地址为__initial_sp。AREA    STACK, NOINIT, READWRITE, ALIGN=3;NOINIT: = NO Init,不初始化。READWRITE : 可读,可写。ALIGN =3 : 2^3 对齐,即8字节对齐。
Stack_Mem       SPACE   Stack_Size
__initial_spAREA    RESET, DATA, READONLY__Vectors       DCD     __initial_sp               ; Top of StackDCD     Reset_Handler              ; Reset HandlerAREA    |.text|, CODE, READONLY;开始代码段THUMBREQUIRE8PRESERVE8ENTRY
Reset_Handler BL LED_Init;BL:带链接的跳转指令。当使用该指令跳转时,当前地址(PC)会自动送入LR寄存器
MainLoop        BL LED_ONBL DelayBL LED_OFFBL DelayB MainLoop;B:无条件跳转。LED_Init;LED初始化PUSH {R0,R1, LR};R0,R1,LR中的值放入堆栈LDR R0,=RCC_APB2ENR;LDR是把地址装载到寄存器中(比如R0)。ORR R0,R0,#0x04;ORR 按位或操作,将将R0的第二位置1,其他位不变LDR R1,=RCC_APB2ENRSTR R0,[R1];STR是把值存储到寄存器所指的地址中。LDR R0,=GPIOC_CRLBIC R0,R0,#0x0F;BIC 先把立即数取反,再按位与LDR R1,=GPIOC_CRLSTR R0,[R1]LDR R0,=GPIOC_CRLORR R0,R0,#0x03LDR R1,=GPIOC_CRLSTR R0,[R1];将PC2置1MOV R0,#1 LDR R1,=LED0STR R0,[R1]POP {R0,R1,PC};将栈中之前存的R0,R1,LR的值返还给R0,R1,PCLED_ONPUSH {R0,R1, LR}    MOV R0,#0LDR R1,=LED0STR R0,[R1]POP {R0,R1,PC}LED_OFFPUSH {R0,R1, LR}    MOV R0,#1 LDR R1,=LED0STR R0,[R1]POP {R0,R1,PC}             DelayPUSH {R0,R1, LR}MOVS R0,#0MOVS R1,#0MOVS R2,#0DelayLoop0        ADDS R0,R0,#1CMP R0,#330BCC DelayLoop0MOVS R0,#0ADDS R1,R1,#1CMP R1,#330BCC DelayLoop0MOVS R0,#0MOVS R1,#0ADDS R2,R2,#1CMP R2,#15BCC DelayLoop0POP {R0,R1,PC}    ;         NOPEND

相关命令说明:
AREA命令:AREA 命令指示汇编器汇编一个新的代码段或数据段。段是独立的、指定的、不可见的代码或数据块,它们由链接器处理。
格式如下:AREA 段名,段属性1,段属性2,段属性例如: AREA STACK, NOINIT, READWRITE, ALIGN=3.
SPACE命令:SPACE 命令保留一个用零填充的存储器块。
ENTRY命令:声明整个程式的入口点,入口点有且仅有一个。
完成后,编译烧录,最终结果是将开发板上的LED点亮,但是,并没有出现闪烁的现象。

第三周--AEM汇编语言编程入门相关推荐

  1. ARM汇编语言编程入门实践

    文章目录 一.keil的安装 二.安装stm32 pack 三.keil 的简单设置 四.基于STM32汇编程序的编写 4.1 新建工程 4.2 新建test.s文件 4.3 编译程序 4.4 分析H ...

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

    本文目的是主要介绍如何搭建并配置Keil嵌入式开发环境,完成一个基于STM32汇编程序的编写.记录build生成的 hex文件各段的大小,了解Hex文件格式及其前8个字节内容含义,学习在没有硬件条件下 ...

  3. 搭建Keil编程环境,ARM汇编语言编程入门实践

    多看多学 一.安装及配置环境 01 型号分类及缩写 02 资料共享 03 安装器件支持包 04 Keil简单设置 二.简单程序编译 01 新建工程 02 配置环境 03 添加源文件 04 设置仿真器模 ...

  4. 利用keil完成ARM汇编语言编程入门实践

    文章目录 一.安装keil软件 1.下载安装包 2.安装keil 3.安装stm32 pack 二.简单的stm汇编语言的编程 1.新建工程项目 2.新建main.c文件 3.编译 4.stm32仿真 ...

  5. 吴恩达Coursera, 机器学习专项课程, Machine Learning:Advanced Learning Algorithms第三周编程作业...

    吴恩达Coursera, 机器学习专项课程, Machine Learning:Advanced Learning Algorithms第三周所有jupyter notebook文件: 吴恩达,机器学 ...

  6. 哈工大C语言程序设计精髓第三周

    由于这些代码也是我初学时写的代码,故其中的规范程度及简洁程度并不很好(此处我后来写的有可以参考一下->C语言代码规范),但是能很好的接近出初学者的水平,也更有参考价值!排版不易,喜欢就点个赞吧! ...

  7. 【中文】【吴恩达课后编程作业】Course 2 - 改善深层神经网络 - 第三周作业

    [中文][吴恩达课后编程作业]Course 2 - 改善深层神经网络 - 第三周作业 - TensorFlow入门 上一篇: [课程2 - 第三周测验]※※※※※ [回到目录]※※※※※下一篇: [课 ...

  8. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    为什么80%的码农都做不了架构师?>>>    本文原作者:"竹千代",原文由"玉刚说"写作平台提供写作赞助,原文版权归"玉刚说&q ...

  9. GPU 编程入门到精通(三)之 第一个 GPU 程序

    博主由于工作当中的需要,开始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程,因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...

最新文章

  1. 二:SpringAOP
  2. c语言二维数组参数传入,C语言二维数组、参数传递的理解
  3. golang+数据库定时任务
  4. html水平分隔线样式,CSS生成漂亮的水平分隔线(horizontal rule)设计效果
  5. 计算机专业常用图论,同等学力申硕计算机专业--数学公式集合(新增学习笔记)...
  6. php原生态三级联动_ajax php实现三级联动的方法
  7. http 和 https 区别?
  8. jasypt加密_【Jasypt】给你的配置加把锁
  9. java的 jre是什么_Java中JRE介绍,JRE是什么
  10. Java微信公众平台开发之素材管理
  11. 综合练习--The Eighth Week
  12. 【视角】限贷传闻横扫楼市 专家看空房地产业
  13. 学之思考试系统安装详细教程
  14. 浅析部分物化以及冰山立方体的计算方法Star-Cubing
  15. item_password-获得1688平台淘口令真实url,1688短链接搜索商品接口接入解决方案
  16. java如何获取当前时间 年月日 时分秒
  17. 炽热如初 向新而生|ISC2022 HackingClub白帽峰会圆满举办
  18. 智慧之战——农民工大战博士后
  19. MIT 线性代数(16—18)读书笔记
  20. 自动装箱和自动拆箱——源码分析

热门文章

  1. OkHttp基础概念解释
  2. 找到卡顿来源,BlockCanary源码精简分析
  3. Android开发教程--设置ImageView图片的显示比例
  4. SQL server 2012 SP4设置TLS1.2
  5. RetinaFace人脸检测
  6. [转] 在加拿大找不到工作?给你一百个招聘网站够不够?
  7. 广义相对论-学习记录9-第四章-相对论性的引力理论2
  8. 用计算机代码查四六级准考证号,四六级查询忘了准考证: 99宿舍找回四六级准考证查分流程...
  9. 7-3 整除问题 (10 分)
  10. 地名翻译混乱 广东省质监局出台规范