菜鸟入门12,走近STM汇编程序


前言

本次菜鸟要带大家一起走进汇编语言的世界


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

stm32有哪三种BOOT模式?

  • 用户闪存存储器(Main Flash memory)
  • SRAM存储器(Embedded Memory)
  • 系统存储器(System memory)

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

第一种:Main Flash memory【从用户闪存(flash)启动】

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

Flash、System memory和SRAM的访问地址

① Flash:访问地址为0x00000000或0x08000000

② System memory:访问地址为0x00000000或0x1FF00000

③ SRAM:启动时地址为0x00000000或0x20000000(STM32Fxx的参考手册上说,启动后只能在0x20000000开始访问,即启动后这个映射消失,需要重定位中断向量表,这是特例)

中断向量表
主闪存存储器
中断向量表从Flash的起始地址(0x08000000)开始存放。同时映射到0x00000000处。向量表偏移寄存器的值为0x00000000(实际映射到0x08000000)。
内置SRAM
中断向量表还是存放在Flash中(Flash才能固化存储,SRAM只能加电才有效),只不过拷贝到SRAM的首地址0x20000000处。此时向量表偏移寄存器的值也是0x00000000(实际映射到0x20000000)。

无论用哪种模式启动,复位时栈顶指针总能在0x00000000(或0x08000000)处找到,而复位向量总能在0x00000004(或0x08000004)处找到。

通过实验进行验证

具体代码参考菜鸟入门6,STM32串口通信

用串口下载程序(系统存储器)

打开原本usart收发程序,编译
在这里插入图片描述
无误,用USB连接指南者与上位机

在这里插入图片描述不改变跳帽,开发板的BOOT0和BOOT1接地,RXD和TXD分别接PA9和PA10

打开mcuisp,配置如下图
在这里插入图片描述
打开调试助手,配置完按下复位按钮
按下复位键,这样才能从系统存储器启动BootLoader
结果如图
在这里插入图片描述

用ST_Link下载程序( 用户闪存存储器)

上述文件编译无误后使用ST_LINK与指南者开发板连接好接入电脑
点击
在这里插入图片描述
进行配置

在这里插入图片描述
运行结果

在这里插入图片描述
不用按下复位键
串口烧录:打开串口后,没有任何反应,要实现通信必需要按一下复位键,才能够通信。
ST_Link烧录:打开串口之后,开发板和上位机直接就可以直接进行通信。通过这一操作,可以看出程序是直接被放置到FLASH中,而串口烧录的程序就不是位于FLASH中,需要复位才能在FLASH中启动。

二.在Keil下完成一个汇编程序的编写

要想完成汇编程序的编写,首先要知道什么是汇编

汇编语言介绍

汇编语言(assembly language)是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址。在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令。普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植。 许多汇编程序为程序开发、汇编控制、辅助调试提供了额外的支持机制。有的汇编语言编程工具经常会提供宏,它们也被称为宏汇编器。汇编语言不像其他大多数的程序设计语言一样被广泛用于程序设计。在今天的实际应用中,它通常被应用在底层,硬件操作和高要求的程序优化的场合。驱动程序、嵌入式操作系统和实时运行程序都需要汇编语言。

在这里插入图片描述

总体特点

1.机器相关性

这是一种面向机器的低级语言,通常是为特定的计算机或系列计算机专门设计的。因为是机器指令的符号化表示,故不同的机器就有不同的汇编语言。使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程序。

2.高速度和高效率

汇编语言保持了机器语言的优点,具有直接和简捷的特点,可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等,且占用内存少,执行速度快,是高效的程序设计语言。

3.编写和调试的复杂性

由于是直接控制硬件,且简单的任务也需要很多汇编语言语句,因此在进行程序设计时必须面面俱到,需要考虑到一切可能的问题,合理调配和使用各种软、硬件资源。这样,就不可避免地加重了程序员的负担。与此相同,在程序调试时,一旦程序的运行出了问题,就很难发现。

汇编程序编写

首先我们打开KEIL5,新建一个工程为AL
在这里插入图片描述
对工程进行配置,因为我用的是指南者,所以选择STM32F103VE
在这里插入图片描述
勾选这两个选项
在这里插入图片描述
选中Source Group 1,右键,选择Add New Item to Group,添加源文件
在这里插入图片描述
选择 Asm File (.s) ,设置文件名称为TEST,点击保存
在这里插入图片描述
在这里插入图片描述
可以开始汇编程序的编写了,
这里给出代码

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
	end

编译并动态调试,调试界面如下
在这里插入图片描述
用记事本打开方式查看hex文件在这里插入图片描述
在这里插入图片描述
HEX文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量,Intel HEX文件经常被用于将程序或数据传输
存储到ROM、EPROM,大多数编程器和模拟器使用Intel HEX文件。

记录格式
一个Intel HEX文件可以包含任意多的十六进制记录,每条记录有五个域,下面是一个记录的格式。

: llaaaatt[dd。。。]cc

每一组字母是独立的一域,每一个字母是一个十六进制数字,每一域至少由两个十六进制数字组成,下面是字节的描述。
冒号 是每一条Intel HEX记录的开始
ll 是这条记录的长度域,他表示数据(dd)的字节数目。
aaaa 是地址域,他表示数据的起始地址
tt 这个域表示这条HEX记录的类型,他有可能是下面这几种类型
00 —-数据记录
01 —-文件结束记录
02 —-扩展段地址记录
04 —-扩展线性地址记录
dd 是数据域,表示一个字节的数据,一个记录可能有多个数据字节,字节数目可以 查看ll域的说明
cc 是效验和域,表示记录的效验和,计算方法是将本条记录冒号开始的所有字母对 所表示的十六进制数字
都加起来然后模除256得到的余数最后求出余数的补码即是本效验字节cc。
数据记录
Intel HEX文件由若干个数据记录组成,一个数据记录以一个回车和一个换行结束

三.简单的STM32 汇编程序—闪烁LED

按照上述方法新建工程,但是配置环境不需要勾选
添加led.s汇编文件
代码如下

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

在这里插入图片描述
烧录到板子上,
效果如下
在这里插入图片描述


总结

以上就是走近STM32汇编程序的所有内容,通过这次的作业,我了解了汇编语言的使用语法,明白了汇编语言的重要意义。

参考资料

汇编基础入门知识
ARM汇编基础之基于MDK创建纯汇编语言的STM32工程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值