汇编一个stm32程序

本文介绍了如何使用Keil进行STM32的汇编程序开发,从新建工程、配置环境到编写汇编代码实现HelloWorld。详细解释了.hex文件的结构和意义,同时展示了通过串口输出字符的代码实现。通过实例学习,加深了对STM32汇编语言和程序调试的理解。

学习如何编写stm32汇编

  • 新建一个工程
    打开keil,在菜单栏中点击 project–>New uVision Project ,给工程命名并选择存储位置。

  • 配置工程环境
    创建好工程后,在弹出来的窗口中根据自己的版子选择型号
    在这里插入图片描述

  • 选择运行环境
    勾选CMISI下的CORE和Device下的Startup
    在这里插入图片描述

  • 添加汇编代码文件
    在这里插入图片描述
    因为是汇编工程,所以选择Asm File,创建汇编工程
    在这里插入图片描述

  • 添加代码
    在创建好的 .s文件中添加代码

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
  • 调试keil
    编译成功后,打开魔法棒设置仿真器器,根据自己使用的仿真器选择,点击Debug,选择第一个选项 开始调试
    在这里插入图片描述
    要确保自己的下载器连接成功不然不能调试。点击setting 后即可知道是否成功连接,其中PORT里的两种方式都可以进行程序的调试和下载,但是SW方式更节省端口,只需要两根线就可以,多余的I/O可以释放用作普通用途,SW方式和JTAG方式在普通程序调试下载与调试过程中并无明显差别。
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述
    可以看到寄存器R5,R6,R7,R8的值和程序设置的一样。
    分析 .hex文件
    在这里插入图片描述
    hex文件每一行包含一个HEX记录,由对应机器语言码和/或常量数据的十六进制编码数字组成,并且以回车符,即\r\n 0d0a结束。每个记录包含5个域按如下格式排列: :llaaaatt[dd…]cc
    : 每个记录都以冒号开头
    ll 数据长度域,代表记录中数据字节(dd)的数量;
    aaaa 地址域,代表下载数据到存储器的起始地址;对于扩展线性地址记录,始终为0000;
    tt 记录类型的域:
    1. 00 — 数据记录;
    2. 01 — 文件结束记录;Intel HEX文件必须以文件结束符EOF记录结束,这个记录必须是: :00000001FF
    3. 02 — 扩展段地址记录;HEX86记录,它包括4-19位数据地址段;总是包含两个字节数据;例如::020000040800F2;通过地址域与被移位的扩展段地址数据相加获得数据记录的绝对存储器地址;
    4. 04 — 扩展线性地址记录;32位地址记录或HEX386记录,数据地址的高16位;应该是数据存放的32位地址的高16位;通过与地址域与被移位的来自扩展线性地址记录的地址数据相加,获得数据记录的绝对存储器地址;例如:2462,1234 — 12342462
      dd 数据域,由许多数据字节组成;
      cc 校验和域,这个记录的校验和;所有字节和的低八位,对256取余;例如hex文件的第一行记录::020000040800F2
      在这里插入图片描述

汇编程序输出hello world

基于上面创建汇编程序例子的步骤,略过第三步 选择运行环境 ,其他一样的操作

  • 代码
;RCC寄存器地址映像             
RCC_BASE            EQU    0x40021000 
RCC_CR              EQU    (RCC_BASE + 0x00) 
RCC_CFGR            EQU    (RCC_BASE + 0x04) 
RCC_CIR             EQU    (RCC_BASE + 0x08) 
RCC_APB2RSTR        EQU    (RCC_BASE + 0x0C) 
RCC_APB1RSTR        EQU    (RCC_BASE + 0x10) 
RCC_AHBENR          EQU    (RCC_BASE + 0x14) 
RCC_APB2ENR         EQU    (RCC_BASE + 0x18) 
RCC_APB1ENR         EQU    (RCC_BASE + 0x1C) 
RCC_BDCR            EQU    (RCC_BASE + 0x20) 
RCC_CSR             EQU    (RCC_BASE + 0x24) 
                              
;AFIO寄存器地址映像            
AFIO_BASE           EQU    0x40010000 
AFIO_EVCR           EQU    (AFIO_BASE + 0x00) 
AFIO_MAPR           EQU    (AFIO_BASE + 0x04) 
AFIO_EXTICR1        EQU    (AFIO_BASE + 0x08) 
AFIO_EXTICR2        EQU    (AFIO_BASE + 0x0C) 
AFIO_EXTICR3        EQU    (AFIO_BASE + 0x10) 
AFIO_EXTICR4        EQU    (AFIO_BASE + 0x14) 
                                                           
;GPIOA寄存器地址映像              
GPIOA_BASE          EQU    0x40010800 
GPIOA_CRL           EQU    (GPIOA_BASE + 0x00) 
GPIOA_CRH           EQU    (GPIOA_BASE + 0x04) 
GPIOA_IDR           EQU    (GPIOA_BASE + 0x08) 
GPIOA_ODR           EQU    (GPIOA_BASE + 0x0C
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值