STM汇编程序设计
发布日期:2021-11-03 09:33:23 浏览次数:3 分类:技术文章

本文共 3935 字,大约阅读时间需要 13 分钟。

STM汇编程序设计

一、STM32的三种Boot模式的差异

在这里插入图片描述

(1)用户闪存 : 芯片内置的Flash。正常的工作模式。
(2)SRAM: 芯片内置的RAM区,就是内存。可以用于调试。
(3)系统存储器: 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM区。启动的程序功能由厂家设置

1、主闪存存储器:是STM32内置的Flash,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。

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

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

3、内置SRAM:既然是SRAM,自然也就没有程序存储的能力了,这个模式一般用于程序调试。

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

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

1、创建工程

设置工程的目标环境,本文基于STM32F103ZET6
2、配置环境
在这里插入图片描述
3、添加源文件
右键Source Group 1,选择Add New Item to Group
在这里插入图片描述

4、添加代码

编译生成hex文件
在这里插入图片描述

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

5、仿真器设置

在这里插入图片描述

在这里插入图片描述

6、编译生成hex文件并打开
在这里插入图片描述
第一个字节表示本行数据的长度;
第二、三字节表示本行数据的起始地址;
第四字节 表示数据类型;

三、用汇编程序完成 每间隔1秒钟闪烁一次LED的程序

1、重新再创建一个纯汇编语言的STM32工程,不选择运行环境,添加LED.s文件

在这里插入图片描述

2、添加代码

LED0 EQU 0x422101a0 RCC_APB2ENR EQU 0x40021018GPIOA_CRH EQU 0x40010804Stack_Size      EQU     0x00000400                AREA    STACK, NOINIT, READWRITE, ALIGN=3Stack_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                                    ENTRYReset_Handler                 BL LED_InitMainLoop        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

3、编译生成hex文件,烧录

在这里插入图片描述

在这里插入图片描述

转载地址:https://blog.csdn.net/weixin_51118019/article/details/112003873 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:STM32的PWM和DAC练习
下一篇:基于SPI/IIC接口下的OLED显示

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月02日 12时45分59秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章