STM汇编程序设计

一、三种BOOT模式启动的介绍

所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。
在这里插入图片描述

1、Main Flash memory【从用户闪存、(flash)启动】

是STM32内置的Flash,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。
跳帽设置如下:
在这里插入图片描述

这里BOOT1设置为1或0都可以

然后在“C语言各种变量的存储地址”作业代码基础上,将相关hex文件烧入,按下复位键,通过串口调试助手查看结果:
在这里插入图片描述

2、System memory【从系统存储器启动】

从系统存储器启动,这种模式启动的程序功能是由厂家设置的。一般来说,这种启动方式用的比较少。系统存储器是芯片内部一块特定的区域,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】

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

4、自己开发BOOT模式的选择

(1)通常使用程序代码存储在主闪存存储器,配置方式:BOOT0=0,BOOT1=X;
(2)Flash锁死解决办法:
开发调试过程中,由于某种原因导致内部Flash锁死,无法连接SWD以及Jtag调试,无法读到设备,可以通过修改BOOT模式重新刷写代码。
修改为BOOT0=1,BOOT1=0即可从系统存储器启动,ST出厂时自带Bootloader程序,SWD以及JTAG调试接口都是专用的。重新烧写程序后,可将BOOT模式重新更换到BOOT0=0,BOOT1=X即可正常使用。

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

1、新建工程

工程建好,并将设备(工程的目标环境,本文基于STM32F103VE)与运行环境配置好后,如下:
在这里插入图片描述

2、添加源文件

鼠标右键单击Source Group 1并选择选择Add New Item to Group
在这里插入图片描述
添加源文件,选择 Asm File (.s) ,创建汇编文件
在这里插入图片描述
完成后如下:
在这里插入图片描述

3、测试代码

(1)编译并调试如下代码;

 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


(2)仿真器设置
设置硬件仿真器为ST-LINK,具体根据自己的实际情况进行选择,如下图所示;
有的电脑可能没有这一驱动,所以需要自行下载
下载最新的ST-LINK / V2驱动程序
在这里插入图片描述
设置仿真器的模式,设置为SW接口,另外还有JTAG,可以根据自己的实际情况进行选择;
在这里插入图片描述
在这里插入图片描述
选择Add后,选择芯片如下,根据自己情况自行选择:
在这里插入图片描述

4、编译调试

将stm32与ST-LINK硬件连接,并连接到电脑
在这里插入图片描述
在这里插入图片描述
然后在keil中编译工程并进入调试模式
在这里插入图片描述
最后可以看到,结果符合预期,寄存器R5,R6,R7,R8的值和程序设置一致,具体如下图所示:
在这里插入图片描述

5、hex文件解析

将生成的hex文件用记事本打开
在这里插入图片描述

一般Hex文件的记录格式如下:
在这里插入图片描述
lntel HEX 由任意数量的十六 进 制 记录组 成。每 个记录 包含5 个 域, 它们按以下格式排列:
每一组字母 对应 一 个 不同的域,每一 个 字母 对应 一 个 十六 进 制 编码 的 数 字。每一 个 域由至少 两个 十六 进制 编码数 字 组 成, 它们构 成一 个 字 节 ,就像以下描述的那 样:
(1):(冒号)每个Intel HEX 记录 都由冒 号开头 ;
(2)LL 是 数 据 长 度域, 它 代表 记录当 中 数 据字 节 (dd) 的 数量 ;
(3)aaaa 是地址域, 它代表 记录当 中 数据的起始地址;
(4)TT是代表HEX 记录类 型的域 , 它 可能是以下 数 据 当 中的一 个:
00 – 数 据 记录(Data Record)
01 – 文件结 束 记录(End of FileRecord)
02 – 扩展段地址 记录(ExtendedSegment Address Record)
03 – 开始段地址 记录(Start Segment Address Record)
04 – 扩展 线 性地址 记录(Extended Linear Address Record)
05 – 开始线性地址 记录(Extended Segment Address Record)
(5)dd 是数 据域 , 它 代表一 个 字 节 的 数 据. 一 个记录 可以有 许 多 数 据字 节 . 记录当 中 数 据字 节 的 数 量必 须 和数 据 长 度域(ll) 中指定的 数字相符.
(6)cc 是校验 和域 , 它 表示 这个记录 的校 验 和. 校 验 和的 计 算是通 过将记录当 中所有十六 进 制 编码数 字 对 的 值相加, 以256 为 模 进 行以下 补 足.
表示为:“:[1字节长度][2字节地址][1字节记录类型][n字节数据段][1字节校验和] ”

在这里的hex文件,其中:
02 是这个记录当中 数 据字 节 的 数量.
0000 是地址域, 对于 扩 展 线 性地址 记录 , 这个 域 总是0000.
04 是记录类型 04( 扩 展 线 性地址 记录)
0800 是基地址是0x0800
F2 是这个记录的校 验 和, 计算如下:
256D-(02H+00H+00H+04H+FFH+FFH)/100H=FFH;

三、Keil 汇编练习

用汇编程序完成 每间隔1秒钟闪烁一次LED的程序。
按照上面的方法建立工程,但不需要配置环境,再添加源文件,输入代码:

LED0 EQU 0x40010c00
RCC_APB2ENR EQU 0x40021018
GPIOA_CRH EQU 0x40010804



Stack_Size      EQU     0x00000400

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
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,#1 
                LDR R1,=LED0
                STR R0,[R1]
             
                POP {R0,R1,PC}

             
LED_ON
                PUSH {R0,R1, LR}    
                
                MOV R0,#0 
                LDR R1,=LED0
                STR R0,[R1]
             
                POP {R0,R1,PC}
             
LED_OFF
                PUSH {R0,R1, LR}    
                
                MOV R0,#1 
                LDR R1,=LED0
                STR R0,[R1]
             
                POP {R0,R1,PC}             
             
Delay
                PUSH {R0,R1, LR}
                
                MOVS R0,#0
                MOVS R1,#0
                MOVS R2,#0
                
DelayLoop0        
                ADDS R0,R0,#1

                CMP R0,#330
                BCC DelayLoop0
                
                MOVS R0,#0
                ADDS R1,R1,#1
                CMP R1,#330
                BCC DelayLoop0

                MOVS R0,#0
                MOVS R1,#0
                ADDS R2,R2,#1
                CMP R2,#15
                BCC DelayLoop0
                
                
                POP {R0,R1,PC}    
             
    ;         NOP
             END

编译并生成hex文件:
在这里插入图片描述
将hex文件烧入stm32芯片,结果如图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值