Keil环境下完成STM32汇编程序的编写以及Hex文件内容分析

一. 新建工程

1.1 工程创建

点击菜单栏的project->new uVision project

在这里插入图片描述
设置工程路径,点击保存

在这里插入图片描述
设备选择(本文基于STM32F103C8),如下图所示:
在这里插入图片描述

1.2 选择运行环境

CMSIS下选择CORE
Device下选择Startup(其中包含启动文件)

在这里插入图片描述

1.3 添加源文件

右键点击Source Group,选择如下图所示
在这里插入图片描述
选择Asm File(.s),创建汇编文件,输入文件名,然后点击Add
在这里插入图片描述

1.4 最终结果

在这里插入图片描述

二. 测试代码

2.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.2 仿真器设置(没有硬件条件下)

初始设置
在这里插入图片描述

想生成Hex文件,进行下图操作
在这里插入图片描述
因为没有硬件需要进行如下设置
在这里插入图片描述

2.3 代码运行

点击Rebuild进行编译

在这里插入图片描述
编译成功,没有错误
在这里插入图片描述

2.4 程序调试

在这里插入图片描述
结果如下:
在这里插入图片描述
动态调试:我们在代码最后一行设置断点(在数字左边点击一下),如下图所示

在这里插入图片描述
右击断点,选择如下:

在这里插入图片描述
最后得到如下结果:
在这里插入图片描述

三. 分析hex文件

文件位于创建的项目位置的Objects中
在这里插入图片描述
用记事本打开hex文件,具体如下:
在这里插入图片描述

官方定义:
<0x3a>[数据长度1Byte][数据地址2Byte][数据类型1Byte][数据nByte][校验1Byte]<0x0d><0x0a>

例如第一行:

第一行:020000040800F2
断句02,0000,04,0800,F2。
也即0x02,0x00,0x00,0x04,0x08,0x00,0xF2。

“:” 对应格式中的<0x3a>,0x3a就是冒号的ASCII码。
“02”对应的就是长度,这里就如所见,就是长度为2。
“0000”对应数据地址,长度为2个字节。
“04”对应的数据类型。
“0800”对应的是数据,长度是浮动的,这里是2个字节,和前面的长度相呼应。
“F2”对应的是校验结果。
“”对应<0x0d><0x0a>,就是回车和换行,这个东西大家应该很熟悉,因为stm32串口发送例程中,串口数据的结束用的就是这两个符号做标识。

四. 参考文献

在keil上使用汇编语言创建STM32工程

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的汇编语言程序,用于在Keil环境编写STM32F407串口程序: ``` ; STM32F407串口程序 ; 串口配置:波特率9600,无校验位,8位数据位,1位停止位 ; 定义寄存器 USART1_BASE equ 0x40011000 USART_SR equ 0x00 USART_DR equ 0x04 USART_BRR equ 0x08 USART_CR1 equ 0x0C ; 定义常量 AHB1ENR equ 0x40023830 USART1EN equ 0x00000010 RCC_CFGR equ 0x40023808 PLL_M equ 8 PLL_N equ 336 PLL_P equ 2 PLL_Q equ 7 SYSCLK equ 168000000 ; 初始化USART1 init_usart1: ; 使能USART1时钟 ldr r0, =AHB1ENR ldr r1, [r0] orr r1, #USART1EN str r1, [r0] ; 设置USART1波特率 ldr r0, =USART1_BASE mov r1, #0 mov r2, #0 mov r3, #0 ldr r4, =SYSCLK add r4, r4, #PLL_N mov r5, #0 mov r6, #0 mov r7, #0 mov r8, #0 mov r9, #0 mov r10, #0 mov r11, #0 mov r12, #0 mov r13, #0 mov r14, #0 mov r15, #0 bl set_usart_baud_rate ; 配置USART1 ldr r0, =USART1_BASE ldr r1, [r0, #USART_CR1] orr r1, #0x2000 orr r1, #0x0008 orr r1, #0x0004 str r1, [r0, #USART_CR1] bx lr ; 发送一个字符 send_char: ldr r0, =USART1_BASE ldr r1, [r0, #USART_SR] tst r1, #0x0080 bne send_char strb r2, [r0, #USART_DR] bx lr ; 发送一个字符串 send_string: push {r4, r5, lr} ldr r4, =0 ldr r5, =0 loop: ldrb r5, [r0, r4] cmp r5, #0 beq end_loop bl send_char add r4, #1 b loop end_loop: pop {r4, r5, pc} ; 设置USART波特率 set_usart_baud_rate: push {r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, lr} mov r4, #PLL_M mov r5, #PLL_N mov r6, #PLL_P mov r7, #PLL_Q mul r5, r5, r8 udiv r5, r5, r4 udiv r9, r8, r4 sub r10, r8, r9 mul r7, r7, r10 udiv r7, r7, r9 lsl r7, r7, #4 orr r6, r6, r7 str r6, [r0, #USART_BRR] pop {r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, pc] ; 主程序 main: ; 初始化USART1 bl init_usart1 ; 发送一个字符串 ldr r0, =message bl send_string ; 无限循环 loop: b loop ; 数据段 message: dc.b "Hello, World!", 0 ``` 该程序使用汇编语言编写,实现了STM32F407的串口功能。首先,`init_usart1`函数用于初始化USART1,包括使能USART1时钟,设置波特率和配置USART1。然后,`send_char`函数用于发送一个字符,`send_string`函数用于发送一个字符串。最后,`main`函数初始化USART1并发送一个字符串,然后进入一个无限循环。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值