【裸机驱动LED】使用汇编代码驱动LED(二)—— 汇编代码编写篇

本文详细介绍了如何使用汇编代码驱动LED,包括使能外设时钟、设置IO复用、初始化GPIO等步骤,并展示了两种不同的时钟源初始化方法。同时,文章还涵盖了编译汇编代码的完整过程,包括生成.o文件、链接、格式转换和反汇编。最后,提到了选择0x87800000作为运行地址的原因,并说明了烧写到SD卡的步骤。

上一部分我们已经整理出了所需寄存器的基地址、初始值,因为我们要给寄存器赋值,其实就是向指定地址写入内容。下面所有用到的基地址和初始化值都在上一篇总结好了。

【裸机驱动LED】使用汇编代码驱动LED(一)—— 寄存器解析篇_仲夏夜之梦~的博客-优快云博客【裸机驱动LED】使用汇编代码驱动LED(一)—— 寄存器解析篇https://blog.youkuaiyun.com/challenglistic/article/details/131047800?spm=1001.2014.3001.5501


目录

一、编写汇编代码

1、使能外设时钟

2、设置 IO 复用

3、初始化复用引脚(设置电气属性)

4、初始化GPIO

二、编译汇编代码

1、编译生成 .o 文件

2、链接 .o 文件(确定链接地址 / 运行地址)

3、格式转换

4、反汇编

三、烧写到SD卡

四、选择运行地址为 0x87800000 的原因

五、完整汇编代码和Makefile文件

1、汇编代码

2、Makefile文件


一、编写汇编代码

汇编代码对应的是 .s 文件,每个 .s 文件都是以 _start 开头,所以汇编代码的起始模板为:

.global _start

_start:
    /* 开始编写汇编代码 */

1、使能外设时钟

上一篇《使能外设时钟》的末尾已经列举了哪些寄存器是需要被初始化的,以及初始化的值是多少,全都一一列举了。一共有 7 个时钟源,每个时钟源的基地址之间相差 4 个字节,初始化的值都是 0xFFFFFFFF。下面给出两种写法

写法一:循环初始化

.global _start 

/*
 * 描述:  _start函数,程序从此函数开始执行此函数完成时钟使能、
 *		  GPIO初始化、最终控制GPIO输出低电平来点亮LED灯。
 */
_start:
    /* 时钟源初始化 */
    ldr r1, =0x020C4068  @ 保存 CCGR0 寄存器基地址到寄存器 r1
    ldr r2, =0xFFFFFFFF  @ 保存初始值到寄存器 r2
    mov r3, #7           @ r3 = 7, 七个时钟源,初始化七次
    bl init              @ 跳转到 init,lr 寄存器会保存下一条指令的地址

init:
    cmp r3, #0             @ 判断 r3 寄存器是否为 0
    moveq pc, lr           @ lr 寄存器保存了回去的地址,如果 r3 == 0,说明已经初始化了7次
    strgt r2, [r1], #4     @ 如果 r3 大于0,将 r2 寄存器的内容保存到 r1,然后 r1 自增4
    sub r3, r3, #1         @ r3 寄存器自减
    b init

写法二:暴力初始化

.global _start 

/*
 * 描述:  _start函数,程序从此函数开始执行此函数完成时钟使能、
 *		  GPIO初始化、最终控制GPIO输出低电平来点亮LED灯。
 */
_start:
    /* 1. 使能所有时钟 */
    ldr r1, =0X020C4068 	/* CCGR0 */
	ldr r2, =0XFFFFFFFF  
	str r2, [r1]		
	
	ldr r1, =0X020C406C  	/* CCGR1 */
	str r2, [r1]

	ldr r1, =0X020C4070  	/* CCGR2 */
	str r2, [r1]
	
	ldr r1, =0X020C4074  	/* CCGR3 */
	str r2, [r1]
	
	ldr r1, =0X020C4078  	/* CCGR4 */
	str r2, [r1]
	
	ldr r1, =0X020C407C  	/* CCGR5 */
	str r2, [r1]
	
	ldr r1, =0X020C4080  	/* CCGR6 */
	str r2, [r1]

2、设置 IO 复用

基地址和初始化值:

/* 2. 设置IO复用 */
ldr r1, =0x20E0068
ldr r2, =0x5        @ 指定为 GPIO 功能
str r2, [r1]

3、初始化复用引脚(设置电气属性)

基地址和初始化值:

/
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值