STM汇编实现LED闪烁

目录

创建新工程

  1. 创建工程
    ①点击Project,选择New uvison Project
    STM汇编实现LED闪烁
    ②选择文件保存的路径以及文件的名称

  2. 环境配置
    ①选择对应的芯片,本文章采用的STM32F103RC
    STM汇编实现LED闪烁
    ②运行环境选择,主要是CMSIS下选择CORE;Device下Startup,其中包含了启动文件
    STM汇编实现LED闪烁
    自此,一个工程的建立就算完成了。

  3. 然后添加文件
    ①.鼠标右键单击Source Group 1,选择Add New Item to Group
    STM汇编实现LED闪烁
    ②.选择 Asm File (.s) ,设置源文件的名称,点击Add
    STM汇编实现LED闪烁
    自此,添加文件的过程就完成了,就可以开始编写汇编程序。

汇编程序

代码编写

 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

选择仿真器
设置硬件仿真器为ST_Link(根据自己的实际情况进行选择),仿真器的模式设置为JTAG接口或者SW(根据自己的实际情况进行选择)。设置完成,连接相应的仿真器会有对应信息显示。
仿真调试(断点设置是在代码行前点击,出现红点,即表明断点设置成功)
STM汇编实现LED闪烁

使用汇编实现LED闪烁

1.创建一个新工程
不需要添加启动代码(startup,core),其他步骤跟上面步骤基本一致。
2.添加一个汇编文件
代码内容如下

LED0 EQU 0x40011004;定义引脚PC2 
RCC_APB2ENR EQU 0x40021018;配置RCC寄存器,时钟
GPIOC_CRL EQU 0x40011000;配置CRL寄存器
Stack_Size      EQU     0x00000400;栈的大小
;分配一个STACK段,该段不初始化,可读写,按8字节对齐。分配一个大小为Stack_Size的存储空间,并使栈顶的地址为__initial_sp。
                AREA    STACK, NOINIT, READWRITE, ALIGN=3;NOINIT: = NO Init,不初始化。READWRITE : 可读,可写。ALIGN =3 : 2^3 对齐,即8字节对齐。
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;BL:带链接的跳转指令。当使用该指令跳转时,当前地址(PC)会自动送入LR寄存器
MainLoop        BL LED_ON
                BL Delay
                BL LED_OFF
                BL Delay
                
                B MainLoop;B:无条件跳转。
             
LED_Init;LED初始化
                PUSH {R0,R1, LR};R0,R1,LR中的值放入堆栈
                
                LDR R0,=RCC_APB2ENR;LDR是把地址装载到寄存器中(比如R0)。
                ORR R0,R0,#0x04;ORR 按位或操作,将将R0的第二位置1,其他位不变
                LDR R1,=RCC_APB2ENR
                STR R0,[R1];STR是把值存储到寄存器所指的地址中。
                
                LDR R0,=GPIOC_CRL
                BIC R0,R0,#0x0F;BIC 先把立即数取反,再按位与
                LDR R1,=GPIOC_CRL
                STR R0,[R1]
                
                LDR R0,=GPIOC_CRL
                ORR R0,R0,#0x03
                LDR R1,=GPIOC_CRL
                STR R0,[R1]
                ;将PC2置1
                MOV R0,#1 
                LDR R1,=LED0
                STR R0,[R1]
             
                POP {R0,R1,PC};将栈中之前存的R0,R1,LR的值返还给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

相关命令说明
AREA命令:AREA 命令指示汇编器汇编一个新的代码段或数据段。段是独立的、指定的、不可见的代码或数据块,它们由链接器处理。
SPACE命令:SPACE 命令保留一个用零填充的存储器块。
ENTRY命令:声明整个程式的入口点,入口点有且仅有一个。

格式如下:AREA 段名,段属性1,段属性2,段属性3
例如:AREA STACK, NOINIT, READWRITE, ALIGN=3

完成后,编译烧录,最终结果是将开发板上的LED点亮,但是其中还有点问题,并没有出现闪烁的现象。

参考

简单的STM32 汇编程序—闪烁LED
一步一步写ARM汇编(一)
ARM 汇编学习——编写简单的ARM汇编程序

上一篇:java.lang.IllegalStateException: ActionBarImpl can only be used with a compatible window decor layou


下一篇:常用汇编指令