一.stm32程序

1.新建工程

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

(2)在左侧的窗口内选择STM32芯片,这里我们选择STM32F103RB,并保存。

(3)勾选相应的选项,并点击OK,这样工程创建完毕。

2.配置环境

(1)工程创建完毕后,在左上角点击新建文件,然后窗口出现了一个Text1的文件。

(2)然后将下列代码复制粘贴到Text1文本框内。

#define PERIPH_BASE           ((unsigned int)0x40000000)//AHB
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x10000)
#define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)
//GPIOA_BASE=0x40000000+0x10000+0x0800=0x40010800,该地址为GPIOA的基地址
#define GPIOB_BASE            (APB2PERIPH_BASE + 0x0C00)
//GPIOB_BASE=0x40000000+0x10000+0x0C00=0x40010C00,该地址为GPIOB的基地址
#define GPIOC_BASE            (APB2PERIPH_BASE + 0x1000)
//GPIOC_BASE=0x40000000+0x10000+0x1000=0x40011000,该地址为GPIOC的基地址
#define GPIOD_BASE            (APB2PERIPH_BASE + 0x1400)
//GPIOD_BASE=0x40000000+0x10000+0x1400=0x40011400,该地址为GPIOD的基地址
#define GPIOE_BASE            (APB2PERIPH_BASE + 0x1800)
//GPIOE_BASE=0x40000000+0x10000+0x0800=0x40011800,该地址为GPIOE的基地址
#define GPIOF_BASE            (APB2PERIPH_BASE + 0x1C00)
//GPIOF_BASE=0x40000000+0x10000+0x0800=0x40011C00,该地址为GPIOF的基地址
#define GPIOG_BASE            (APB2PERIPH_BASE + 0x2000)
//GPIOG_BASE=0x40000000+0x10000+0x0800=0x40012000,该地址为GPIOG的基地址
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))#define LED0  MEM_ADDR(BITBAND(GPIOA_ODR_Addr,8))
//#define LED0 *((volatile unsigned long *)(0x422101a0)) //PA8
//定义typedef类型别名
typedef  struct
{volatile  unsigned  int  CR;volatile  unsigned  int  CFGR;volatile  unsigned  int  CIR;volatile  unsigned  int  APB2RSTR;volatile  unsigned  int  APB1RSTR;volatile  unsigned  int  AHBENR;volatile  unsigned  int  APB2ENR;volatile  unsigned  int  APB1ENR;volatile  unsigned  int  BDCR;volatile  unsigned  int  CSR;
} RCC_TypeDef;#define RCC ((RCC_TypeDef *)0x40021000)
//定义typedef类型别名
typedef  struct
{
volatile  unsigned  int  CRL;
volatile  unsigned  int  CRH;
volatile  unsigned  int  IDR;
volatile  unsigned  int  ODR;
volatile  unsigned  int  BSRR;
volatile  unsigned  int  BRR;
volatile  unsigned  int  LCKR;
} GPIO_TypeDef;
//GPIOA指向地址GPIOA_BASE,GPIOA_BASE地址存放的数据类型为GPIO_TypeDef
#define GPIOA ((GPIO_TypeDef *)GPIOA_BASE)void  LEDInit( void )
{RCC->APB2ENR|=1<<2;  //GPIOA 时钟开启GPIOA->CRH&=0XFFFFFFF0;GPIOA->CRH|=0X00000003;
}//粗略延时
void  Delay_ms( volatile  unsigned  int  t)
{unsigned  int  i,n;for (n=0;n<t;n++)for (i=0;i<800;i++);
}int main(void)
{LEDInit();while (1){LED0=0;//LED熄灭Delay_ms(500);//延时时间LED0=1;//LED亮Delay_ms(500);//延时时间}
}

(3)复制粘贴完后,点击左上角保存按钮,在弹出的窗口内,输入文件名main.c(如果不加后缀,就不会是.c文件),点击保存,而后Text1文件就变成了main.c文件。

(4)右键点击 Source Group 1 ,然后点击 Add Existing Files to Group …(在工程下添加main.c文件)

(8)选中main.c文件,再点击Add,然后关闭窗口,此时你会发现,Source Group 1 文件下新增了一个main.c文件。

3.编译程序

点击左上角编译按钮,开始编译程序,此时0错误,0警告,表示编译成功。

4、stm32程序仿真调试

1)调试前的设置
(1)首先点击 魔法棒,然后在弹出的窗口内,点击 Debug,勾选 Use Simulator ,再选择 ULINK2/ME Cortex Debugger ,并点击 Settings 。

(2)确定一下Port是JTAG,Reset可以设置为Autodetect或SYSRESEETREQ,然后点击OK返回上一级窗口,再点击OK。

2)开始调试
选中带有红色d的放大镜开始调试,在②处就是仿真调试所需要的调试工具。

二、汇编语言

1.创建工程

创建一个新的文件,命名为ARM

2.添加文件

1.鼠标右键单击Source Group 1,选择Add New Item to Group

2.选择 Asm File (.s) ,设置源文件的名称,点击Add

自此,添加文件的过程就完成了,就可以开始编写汇编程序。

3.汇编程序

(1)在test文件中输入如下代码:

 AREA 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

(2)调试
调试前进行debug设置

4.分析文件

生成的hex文件如下:

:020000040800F2
:1000000000060020ED000008F5000008F7000008D9
:10001000F9000008FB000008FD00000800000000D7
:10002000000000000000000000000000FF000008C9
:10003000010100080000000003010008050100089C
:100040000701000807010008070100080701000870
:100050000701000807010008070100080701000860
:100060000701000807010008070100080701000850
:100070000701000807010008070100080701000840
:100080000701000807010008070100080701000830
:100090000701000807010008070100080701000820
:1000A0000701000807010008070100080701000810
:1000B0000701000807010008070100080701000800
:1000C00007010008070100080701000807010008F0
:1000D00007010008070100080701000807010008E0
:1000E00007010008070100080701000809488047C8
:1000F00009480047FEE7FEE7FEE7FEE7FEE7FEE70A
:10010000FEE7FEE7FEE7FEE704480549054A064B21
:1001100070470000FD0100085502000800000020A3
:1001200000060020000200200002002070477047F7
:100130007047000080B500F001F880BD82B041F248
:1001400004000021C4F202000191009150F8041C47
:1001500041F4803140F8041C50F8041C01F40031D3
:100160000091019901310191009919B90199B1F5F5
:10017000A06FF1D150F8041C890354BF0021012164
:1001800000910099012936D142F20001C4F2020126
:100190000A6842F010020A600A6822F003020A604C
:1001A0000A6842F002020A600168016001680160A9
:1001B000016841F480610160016821F47C110160F3
:1001C000016841F4E811016050F8041C41F08071AD
:1001D00040F8041C50F8041C8901FBD5016821F08B
:1001E00003010160016841F002010160016801F052
:1001F0000C010829FAD102B07047000080B541F225
:100200000000C4F202000168002241F00101016017
:100210004168CFF6FF021140416001684FF6FF725E
:10022000CFF6F66211400160016821F4802101607F
:10023000416821F4FE0141604FF41F018160FFF726
:1002400079FF4EF60850CEF200004FF000610160D9
:1002500080BD00004FF00A004FF00B014FF00C0280
:100260004FF00D0300F009F800F00AF800F00BF869
:10027000DFF81CE0DFF81CF0FEE74FF005057047E3
:100280004FF0060670474FF007074FF00808704719
:080290007B0200088702000850
:040000050800025598
:00000001FF

该文件为16进制的一串字符。hex文件的第一排字符称之为扩展线性地址记录,也称为32位地址记录或HEX386记录。
在第一行数据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为校验和。

三、总结

因为没有接入硬件设施,所以只能先进行程序的编译和仿真测试,而没有办法下载到硬件上运行,这个LED灯闪烁的代码不用深入了解,只是进行一个简单的程序编译调试,主要是学会如何安装MDK软件、建立工程、编写代码、编译程序、仿真调试。

ARM汇编程序入门实践相关推荐

  1. ARM指令寻址方式及RealView MDK开发环境ARM汇编程序实践

    内容简介 本文根据作者在CSDN发表的树莓派ARM汇编语言编程十讲(第3讲) (CSDN链接https://blog.csdn.net/yuanzywhu/article/details/104975 ...

  2. ARM 汇编语言入门

    [翻译]二进制漏洞利用(二)ARM32位汇编下的TCP Bind shell:https://bbs.pediy.com/thread-253511.htm ARM汇编语言入门 From:ARM汇编语 ...

  3. python入门实践1-11课视频分享

    分享视频,分享知识,收获友谊,收获财富. 我是你们的老朋友,小雨,QQ:798033502 <Python编程入门实践>在先观看地址: 第一讲:我的第一个python实例 http://w ...

  4. WEB入门实践-张晨光-专题视频课程

    WEB入门实践-256人已学习 课程介绍         WEB开发入门编程,从各种开发工具的讲解到html标签,css元素讲解,js课程系列. 课程收益     培养web开发技术人才 讲师介绍   ...

  5. 这是一次 docker 入门实践

    前言 其实接触 docker 也有一段时间了,但是一直没有做下总结,现在网上关于 docker 的介绍也有很多了,本着好记性不如烂笔头的原则,还是自己再记录一波吧. 实现目标 安装 docker ce ...

  6. Docker快速入门实践-纯干货文章

    Docker快速入门实践-老男孩高级架构师课程内容,如果细看还能发现讲解视频呦!小伙伴们赶紧猛戳吧! 老男孩高级架构师内部学员实践文档分享! Docker快速入门实践-纯干货文章 老男孩教育2016启 ...

  7. ARM 汇编学习——编写简单的ARM汇编程序

    首先,我们先看一个简单的汇编程序: [plain] view plaincopy area ff,code,readonly   :声明代码段 code32  :声明为32位ARM指令 entry   ...

  8. mysql窗口函数_MySQL8.0窗口函数入门实践及总结

    前言 MySQL8.0之前,做数据排名统计等相当痛苦,因为没有像Oracle.SQL SERVER .PostgreSQL等其他数据库那样的窗口函数.但随着MySQL8.0中新增了窗口函数之后,针对这 ...

  9. Linux入门实践笔记(七)——云服务器中配置Java项目的JMX连接失败问题解决记录

    Linux入门实践笔记(七)--云服务器中配置Java项目的JMX连接失败问题解决记录 参考文章: (1)Linux入门实践笔记(七)--云服务器中配置Java项目的JMX连接失败问题解决记录 (2) ...

最新文章

  1. .net core 源码解析-web app是如何启动并接收处理请求(二) kestrel的启动
  2. 三菱plc232通讯实例_「台达ASDA-B2系列伺服使用手册」第八章 通讯机能
  3. 【oracle】sqlnet.ora 访问控制策略
  4. 使用.NET5、Blazor和Electron.NET构建跨平台桌面应用
  5. 最专业的业余数学家!
  6. 美团搜索-搜索引擎关键字智能提示的一种实现[转]
  7. Ubuntu16.04 安装有道词典
  8. 【ajax】前端ajax传值的几种方法
  9. *第七周*数据结构实践项目二【建设链式队列算法库】
  10. 50预训练权重_MMDetection笔记:修改预训练模型权重类别数
  11. 【静态化平台】☞( 一)网页静态化服务
  12. ArcGIS下载在线地图影像上篇(手工版)
  13. 项目管理知识体系指南(PMBOK 指南) 第6版——笔记
  14. 机械类常用英语(一.组装、冲压、喷漆等专业词汇)
  15. 杜教筛 以及积性函数的前世今生 --算法竞赛专题解析(4)
  16. CentOS安装虚拟打印机
  17. 东财《组织行为学X》综合作业
  18. The Learnning of ROS Navigation Source Code---09-17
  19. 康考迪亚计算机科学硕士,康考迪亚大学专业
  20. 两台计算机互相共享一个网络,两台电脑共用一个路由器上网,但两台电脑不能互相访问共享,怎样设置啊?两台电脑系统都XP的...

热门文章

  1. 港科夜闻|香港科大研究团队揭开胶质瘤病人的化学抗性机制
  2. 使用js换算mm,cm,px
  3. 0x80004005,远程桌面发生身份验证错误
  4. Atitit 知识与学科的分类 杜威十进分类法 图书分类法已经采用二十二个大类 目录 1.1. 类知识的积累是一个从少到多的过程 1 1.2. 杜威十进分类法(Dewey Decimal Class
  5. Qt Qwdget 汽车仪表知识点拆解1 速度表示
  6. 汽车机油压力传感器在发动机中发挥着怎样的重要作用?
  7. COMSOL有限元仿真深度指南:如何构建壳物理场所需的模型几何?
  8. 14岁上清华!清华最小数学领军人才程大拙,初中特招8年本硕博连读
  9. python 菜鸟联盟快递查询_快递单号查询接口-极兔速递
  10. 我自杀我容易吗~[转]