基于keil实现一个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 记录类型的域:- 00 — 数据记录;
- 01 — 文件结束记录;Intel HEX文件必须以文件结束符EOF记录结束,这个记录必须是: :00000001FF
- 02 — 扩展段地址记录;HEX86记录,它包括4-19位数据地址段;总是包含两个字节数据;例如::020000040800F2;通过地址域与被移位的扩展段地址数据相加获得数据记录的绝对存储器地址;
- 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

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

被折叠的 条评论
为什么被折叠?



