STM32
直播中

李波

7年用户 1408经验值
私信 关注
[问答]

怎样去完成一个汇编程序的编写呢

Boot的启动模式分别有哪几种呢?
STM32的三种Boot模式有何差异呢?


回帖(1)

钱丘宝

2021-11-30 14:49:02
1.1、实验准备

实验目的:

  请说明STM32的三种Boot模式的差异,研究至少两种boot模式下,代码下载(烧录)运行后所在的地址位置,与理论对比验证。
实验工具:
硬件:



  • 野火指南者开发板

软件:



  • keil 5
  • 野火串口调试助手

1.2、介绍Boot模式

在 STM32 的板子上,可以看到有 BOOT0 、BOOT1 这两个管脚,刚买的板子,用短路帽将 BOOT0、BOOT1都接地的,也就是 BOOT0 和 BOOT1 的电平都置为 0,用短路帽将 BOOT 连到 3V3 即可置 1。
以下是Boot的三种启动模式:





由于默认BOOT1和BOOT0的电平为0,故我们一般使用的启动模式为主闪存存储器。
1.Main Flash memory(主闪存存储器)



  • 访问地址为0x00000000或0x08000000
  • 是STM32内置的Flash,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。

2.System memory(系统存储器)



  • 访问地址为0x00000000或0x1FF00000
  • 从系统存储器启动,这种模式启动的程序功能是由厂家设置的。系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader,也就是我们常说的ISP程序,这是一块ROM,出厂后无法修改。
    一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的BootLoader中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。但是这个下载方式需要以下步骤:

  Step1:将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoader
Step2:最后在BootLoader的帮助下,通过串口下载程序到Flash中
Step3:程序下载完成后,又有需要将BOOT0设置为GND,手动复位,这样,STM32才可以从Flash中启动可以看到,利用串口下载程序还是比较的麻烦, 需要跳帽跳来跳去的,非常的不注重用户体验。
3.Embedded Memory(内置SRAM)



  • 启动时地址为0x00000000或0x20000000
  • 内置SRAM,既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。

1.3、实例验证


  这次使用的工程来自于之前的实验

下面对主闪存存储器系统存储器进行验证
1.主闪存存储器
首先置BOOT1、BOOT0 均为 0 ,再烧录程序,结果如下:





主闪存存储器的访问地址是从 0x 0800 0000 开始的,最小的地址都没有低于 0x 0800 0000
2.系统存储器
首先置 BOOT1 为 0 、BOOT0 为 1,再烧录程序(更改一丢丢程序内容)。
烧录完后,串口调试助手没有反应。
这时再置 BOOT1 为 0、BOOT0 为 0,并按 RESET 复位键.
串口调试助手有了显示结果,如下:





1.4、对比异同

对比发现两者地址相同,烧录过程不同



  • 主闪存存储器——烧录程序后立马就显示数据;
  • 系统存储器——烧录程序后,需置 BOOT0 为 0,然后按复位显示数据;

原因



  • 主闪存存储器——hex 文件直接储存到 Flash 上,烧录后,程序直接就运行了,开发板和上位机就直接可以进行通信。
  • 系统存储器——将 BOOT0 设置为 1,BOOT1 设置为 0,然后按下复位键,这样才能从系统存储器启动 BootLoader,在 BootLoader 的帮助下,通过串口下载程序到 Flash 中,程序下载完成后,又有需要将 BOOT0 设置为 GND,手动复位,这样,STM32 才可以从 Flash 中启动可以看到(也就是上面的三个步骤)。

2.1、实验准备

实验目的“”

  在Keil下完成一个汇编程序的编写,学习动态调试变量;并注意观察最终生成hex文件的各段的大小,以及Hex文件前8个字节内容,解释其含义,并在此基础上用汇编程序完成一个输出“Hello world”到串口的程序;
实验工具:
硬件:野火指南者开发板
软件:keil 5,野火串口调助手,mcuisp
2.2、汇编语言工程


  完成一个汇编程序的编写,学习动态调试变量;并注意观察最终生成hex文件的各段的大小,以及Hex文件前8个字节内容,解释其含义。
##1.新建工程
Projiect→new μVision projiect





输入工程名称并保存





选择芯片,我选的是芯片STM32F103VE





CMSIS 下选择 CORE;Device 下 Startup(包含有启动文件)





右击 Source Group 1 ,点击 Add New Item to Group 'Source Group 1'...





点击 Asm Files (.s) 添加汇编文件,然后输入文件名并添加





添加完成





2.硬件连接
将ST-LINK V2通过杜邦线与开发板相连,开发板接上u***线

  3.3v——3.3v
GND——GND
SWCLK——SWCLK
SWDIO——SWDIO

两个u***接口同时接入PC
3.相关代码
Test.c写入以下代码

点击魔法棒→Output然后勾选Create HEX File





在 Debug 中,选择 ST-Link Debugger(因为我用的是ST-Link)





然后点击 Settings ,设置端口为 SW





点击 Flash Download →Add 添加 STM32F10x High-density Flash





点击确定即可完成配置
4.编译烧录
点击编译





点击调试





寄存器 R5,R6,R7,R8 的值和程序设置一致





5.hex文件分析
用记事本打开.hex文件,发现全是十六进制数据





分析第一行
第一行内容分别是0x02,0x00,0x00,0x04,0x08,0x00,0xF2。



  • 0x02
    该行数据中有两个数据
  • 0x00 0x00
    本行数据的起始地址位
  • 0x04
    用来标识扩展线性地址的记录
    该字节还可以是其他值,下面是其他值的含义
    00:用来记录数据,HEX文件的大部分记录都是数据记录
    01:用来标识文件结束,放在文件的最后,标识HEX文件的结尾
    02:用来标识扩展段地址的记录
    03:开始段地址记录
    05:开始线性地址记录
  • 0x08 0x00
    该行两个字节的数据
    数据类型是 04 ,即该行记录的是一个拓展地址(0x08 0x00 是地址信息,用法是将该地址(0x0800<<16) 后作为基地址
  • 0xF2
    校验和,校验和= 0x100 - 累加和

2.3输出串口工程


  在以上基础用汇编程序完成一个输出“Hello world”到串口的程序。
1.工程与代码
创建一个新的工程,方法同上

  注意不勾选CORE和Startup





同样创建一个Asm汇编文件,写入以下代码

通过用零或空指令NOP填充,来使当前位置与一个指定的边界对齐     END 2.编译运行
将程序烧录进开发板后,打开野火串口调试助手


举报

更多回帖

发帖
×
20
完善资料,
赚取积分