STM汇编程序设计
- 一、实验要求
- 二、实验内容
- (一)请说明STM32的三种Boot模式的差异,并在之前第11-12周“C语言各种变量的存储地址”作业代码基础上,研究至少两种boot模式下,代码下载(烧录)运行后所在的地址位置,与理论对比验证。
- (二)参考作业附件或者博客 “基于MDK创建纯汇编语言的STM32工程”( https://blog.csdn.net/u010632165/article/details/106481146 ),在Keil下完成一个汇编程序的编写,学习动态调试变量;并注意观察最终生成 hex文件的各段的大小,以及Hex文件前8个字节内容,解释其含义。
- (三)在上面Keil 汇编基础上,选择完成下列练习中的任意1个:
一、实验要求
一. 请说明STM32的三种Boot模式的差异,并在之前第11-12周“C语言各种变量的存储地址”作业代码基础上,研究至少两种boot模式下,代码下载(烧录)运行后所在的地址位置,与理论对比验证。
二. 参考作业附件或者博客 “基于MDK创建纯汇编语言的STM32工程”( https://blog.csdn.net/u010632165/article/details/106481146 ),在Keil下完成一个汇编程序的编写,学习动态调试变量;并注意观察最终生成 hex文件的各段的大小,以及Hex文件前8个字节内容,解释其含义。
三. 在上面Keil 汇编基础上,选择完成下列练习中的任意1个:
-
用汇编程序完成1~100 求和 (1+2+3+…+100)的程序,并将计算结果通过串口输出;
-
用汇编程序完成一个输出“Hello world”到串口的程序;
-
用汇编程序完成 每间隔1秒钟闪烁一次LED的程序。参考:
https://www.bbsmax.com/A/B0zq8RZdvL/
二、实验内容
(一)请说明STM32的三种Boot模式的差异,并在之前第11-12周“C语言各种变量的存储地址”作业代码基础上,研究至少两种boot模式下,代码下载(烧录)运行后所在的地址位置,与理论对比验证。
1、三种BOOT模式介绍
所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。
① Main Flash memory
是STM32内置的Flash,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。
② System memory
从系统存储器启动,这种模式启动的程序功能是由厂家设置的。一般来说,这种启动方式用的比较少。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader, 也就是我们常说的ISP程序, 这是一块ROM,
出厂后无法修改。一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的BootLoader中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。但是这个下载方式需要以下步骤:
Step1:将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader
Step2:最后在BootLoader的帮助下,通过串口下载程序到Flash中
Step3:程序下载完成后,又有需要将BOOT0设置为GND,手动复位,这样,STM32才可以从Flash中启动可以看到, 利用串口下载程序还是比较的麻烦, 需要跳帽跳来跳去的,非常的不注重用户体验。
③Embedded Memory
内置SRAM,既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。假如我只修改了代码中一个小小的地方,然后就需要重新擦除整个Flash,比较的费时,可以考虑从这个模式启动代码(也就是STM32的内存中),用于快速的程序调试,等程序调试完成后,在将程序下载到SRAM中。
2、开发BOOT模式选择。
① 通常使用程序代码存储在主闪存存储器,配置方式:BOOT0=0,BOOT1=X;
② Flash锁死解决办法:
开发调试过程中,由于某种原因导致内部Flash锁死,无法连接SWD以及Jtag调试,无法读到设备,可以通过修改BOOT模式重新刷写代码。
修改为BOOT0=1,BOOT1=0即可从系统存储器启动,ST出厂时自带Bootloader程序,SWD以及JTAG调试接口都是专用的。重新烧写程序后,可将BOOT模式重新更换到BOOT0=0,BOOT1=X即可正常使用。
(二)参考作业附件或者博客 “基于MDK创建纯汇编语言的STM32工程”( https://blog.csdn.net/u010632165/article/details/106481146 ),在Keil下完成一个汇编程序的编写,学习动态调试变量;并注意观察最终生成 hex文件的各段的大小,以及Hex文件前8个字节内容,解释其含义。
HEX文件都是由记录(RECORD)组成的。在HEX文件里面,每一行代表一个记录。
第一行数据 第一个字节 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 汇编基础上,选择完成下列练习中的任意1个:
1、新建工程
新建工程保存到
2、配置环境
①选择硬件器件
我们选用的是指南针STM32F103VE系列
②运行环境的选择
③点击Source Group 1,添加新ITEM
添加源文件。创建汇编项目,选择Asm File,修改名称,保存
添加成功
3、代码测试
①添加代码到文件中
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
4、仿真器设置
右击target 1,
如果不使用串口下载软件mcuisp的话,在这里选择硬件仿真器
我使用的是软件仿真,所以可以不管这个,但要生成.hex文件
再将生成的.hex文件导入烧录即可