背景
使用Cortex-M3已经有一段时间了,大大小小也做过几个项目,可以说对这个系列的片子是有一定的了解。相对于以前的8位单片机来说,其存储空间,外设种类都有较大的提升,这对于产品的应用显得非常便利。最近,因为项目上的原因做了一些汇编工作,个人觉得如果想把Cortex-M3系列的芯片用好,汇编方面的理论知识还是需要学习和补充的,因此就有了写这一系列文档的动力,权当总结一下汇编的基础知识和实用样例。
本文重点不在于学习每一条汇编指令,而是通过使用汇编语言编写一个个简单实例使我们能对GCC汇编有一个基本的了解。
编译环境
主机环境: Ubuntu 16.04.1
目标板名称: TI DB-LM3S9B96
主芯片型号: TI LM3S9B96
交叉编译链: gcc-arm-none-eabi-5_4-2016q3
在另一篇文章 http://blog.csdn.net/pengfei240/article/details/52912833 中,已经详细描述了如何下载和制作交叉编译链,大家如果感兴趣可以参考下这篇文章。
工程目录
工程的结构按下面的目录形式进行组织:
- 根目录以 asm 开始
- source 为源码目录,该目录下每个例程为一个文件夹,分别以example1,example2…的形式进行组织
- toolchain 为各个版本的交叉编译链存放的位置,其中软链接CrossCompile指向当前使用的交叉编译链
$ tree -L 2 asm
asm
├── source
│ └── example1
└── toolchain
├── CrossCompile -> gcc-arm-none-eabi-5_4-2016q3
└── gcc-arm-none-eabi-5_4-2016q3
第一个点灯程序
硬件原理图
由原理图可知,点灯方式为PF3端口设置为高电平。
源码
/*
* example1
*
* Description: It controls the port to turn on the LED.
* Author: Peter Peng
* Ver: 0.1
*/
.equ STACK_BASE, 0x20000000
.equ STACK_TOP, 0x400
.equ SYSCTL_RCGC1_R, 0x400FE104
.equ SYSCTL_RCGC2_R, 0x400FE108
.equ GPIO_PORTF_AFSEL_R, 0x40025420
.equ GPIO_PORTF_DIR_R, 0x40025400
.equ GPIO_PORTF_DEN_R, 0x4002551C
.equ GPIO_PORTF_DATA_R, 0x400253FC
.equ SYSCTL_RCGC2_GPIOF, 0x00000020
.text
.thumb
.syntax unified
.global _start
_start:
.word STACK_BASE + STACK_TOP