STM32的三种Boot模式的差异和基于MDK创建纯汇编语言的STM32工程


当我们是使用STM32核心板时,我们需要将核心板的BOOT0设置为1,boot1设置为0的调试模式烧录代码。而如果让STM32的boot0置为0,boot为0是正常模式可以执行代码。对于谈到的模式我们可能经常遇到,下面我们简单描述他们三种模式的差异。

三种boot模式具体如下:

启动模式模式名称说明
boot0为0,boot1为x主闪存存储器主闪存存储器设为启动区域
boot0为1,boot1为0系统存储器系统存储器设为启动区域
boot0为1,boot1为1内置SRAM内置SRAM 设为启动区域
主闪存存储器 (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中启动可以看到, 利用串口下载程序还是比较的麻烦, 需要跳帽跳来跳去的,非常的不注重用户体验。

内置SRAM(Embedded Memory)

内置SRAM,既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。假如我只修改了代码中一个小小的地方,然后就需要重新擦除整个Flash,比较的费时,可以考虑从这个模式启动代码(也就是STM32的内存中),用于快速的程序调试,等程序调试完成后,在将程序下载到SRAM中。

代码示例

基于MDK创建纯汇编语言的STM32工程

1、新建文件选择合适的芯片
在这里插入图片描述
2、选择配置
在这里插入图片描述
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、运行程序,不知道为什么会出错,参考博客:ARM汇编基础之基于MDK创建纯汇编语言的STM32工程
在这里插入图片描述
实验结果待补

关于hex文件的说明

hex文件格式是可以烧写到单片机中,被单片机执行的一种文件格式,生成Hex文件的方式有很多种,可以通过不同的编译器将C程序或者汇编程序编译生成hex。

Hex文件格式解析

Hex文件如果用特殊的程序来查看(一般记事本就可以实现)。打开后可发现,整个文件以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示)。

Hex文件可以按照如下的方式进行拆分来分析其中的内容:
例如:

冒号本行数据长度本行数据起始位置地址数据类型数据校验码

第一个字节:表示本行的数据长度.

第二个,第三个字节表示本行数据的起始地址.

第四字节表示数据类型,数据类型有: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:开始线性地址记录

然后是数据,最后一个字节 为校验和。

校验和的算法为:计算校验和前所有16进制码的累加和(不计进位),检验和 = 0x100 - 累加和.

结果如下:
在这里插入图片描述

STM32 汇编每间隔1秒钟闪烁一次LED的程序

代码参考:简单的STM32 汇编程序—闪烁LED
在这里插入图片描述
代码如下:

LED0 EQU 0x422101a0
RCC_APB2ENR EQU 0x40021018
GPIOA_CRH EQU 0x40010804
 
Stack_Size      EQU     0x00000400
 
                AREA    STACK, NOINIT, READWRITE, ALIGN=
Stack_Mem       SPACE   Stack_Size
__initial_sp
 
                AREA    RESET, DATA, READONLY
 
__Vectors       DCD     __initial_sp               ; Top of Stack
                DCD     Reset_Handler              ; Reset Handler
 
                AREA    |.text|, CODE, READONLY
 
                THUMB
                REQUIRE8
                PRESERVE8
 
                ENTRY
Reset_Handler
                BL LED_Init
MainLoop        BL LED_ON
                BL Delay
                BL LED_OFF
                BL Delay
 
                B MainLoop
 
LED_Init
                PUSH {R0,R1, LR}
 
                LDR R0,=RCC_APB2ENR
                ORR R0,R0,#0x04
                LDR R1,=RCC_APB2ENR
                STR R0,[R1]
 
                LDR R0,=GPIOA_CRH
                BIC R0,R0,#0x0F
                LDR R1,=GPIOA_CRH
                STR R0,[R1]
 
                LDR R0,=GPIOA_CRH
                ORR R0,R0,#0x03
                LDR R1,=GPIOA_CRH
                STR R0,[R1]
 
                MOV R0,#
                LDR R1,=LED0
                STR R0,[R1]
 
                POP {R0,R1,PC}
 
LED_ON
                PUSH {R0,R1, LR}    
 
                MOV R0,#
                LDR R1,=LED0
                STR R0,[R1]
 
                POP {R0,R1,PC}
 
LED_OFF
                PUSH {R0,R1, LR}    
 
                MOV R0,#
                LDR R1,=LED0
                STR R0,[R1]
 
                POP {R0,R1,PC}             
 
Delay
                PUSH {R0,R1, LR}
 
                MOVS R0,#
                MOVS R1,#
                MOVS R2,#
 
DelayLoop0
                ADDS R0,R0,#
 
                CMP R0,#
                BCC DelayLoop0
 
                MOVS R0,#
                ADDS R1,R1,#
                CMP R1,#
                BCC DelayLoop0
 
                MOVS R0,#
                MOVS R1,#
                ADDS R2,R2,#
                CMP R2,#
                BCC DelayLoop0
 
                POP {R0,R1,PC}    
 
    ;         NOP
             END

由于没LED这里就不演示了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值