• STM汇编程序设计


    一、请说明STM32的三种Boot模式的差异

    说明三种Boot的差异

    STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存=芯片内置的Flash。 2)SRAM=芯片内置的RAM区,就是内存 3)系统存储器=芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。

    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中。

    二、在Keil下完成一个汇编程序的编写,学习动态调试变量;并注意观察最终生成 hex文件的各段的大小,以及Hex文件前8个字节内容,解释其含义。

    1.打开keil新建一个工程,选择芯片并初始化配置

    2.在文件夹下Source Group1中右键点击Add New Item to Group选择添加一个Asm File(.s)创建汇编文件

    源码:

     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.设置仿真器(找到魔法棒debug我的是DAP,根据自己实际情况进行选择)

    4.观察生成的.hex文件

    如图,其中第一行020000040002f2中,可以看做是0x02 0x00 0x00 0x04 0x00 0x02 0xf2,其前四个字节和最后一个字节有特殊含义。中间为数据

    第一个0×02表示该行数据中有两个数据

    第二个,第三个0x00 0x00表示本行数据的起始地址位

    第一字节表示该行的数据字节数;如第1行只有 0x08 0x00 两个字节的数据,类型是 04 ,即该行记录的是一个拓展地址(0x08 0x00 是地址信息,用法是将该地址(0x0800<<16) 后作为基地址。并且表示在下一个04类型行出现之前都要使用该地址.

    第四个字节有0x00 0x01 0x02 0x03 0x04 0x05,分别有以下含义

    '00’Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录

    '01’文件结束记录:用来标识文件结束,放在文件的最后,标识HEX文件的结尾

    '02’扩展段地址记录:用来标识扩展段地址的记录

    '03’开始段地址记录:开始段地址记录

    '04’扩展线性地址记录:用来标识扩展线性地址的记录

    '05’开始线性地址记录:开始线性地址记录

    最后一个字节0xf8为校验和。校验和= 0x100 - 累加和。在nodepad++中,如果该校验和不是绿色,则表示该校验和是错的。

    注意,0×04标识扩展线性地址的记录,所以如上图中的020000040002f8中,拓展地址是0002。那么第二行数据的起始地址就是0002c000,即0x0002c000开始

  • 相关阅读:
    Java的值传递机制
    面向对象
    java中static关键字的作用
    方法的重载和重写
    this和super的用法
    Java中关于return的理解
    java经典的内存图 (数据结构)
    java IO最让初学者误解的取名方式
    UDP 与 TCP简单入门理解示例
    Shiro简单入门
  • 原文地址:https://www.cnblogs.com/Zzxin/p/14212197.html
Copyright © 2020-2023  润新知