Linux学习一 使用汇编点亮LED灯

Linux学习一 使用汇编点亮LED灯

1 硬件原理图

GPIO1-IO03经过一个510R的限流电阻直接与LED灯连接。

image-20211120215216242

image-20211120215253225

2.程序源码

在这里插入图片描述

/**************************************************************
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名	: 	 mian.c
作者	   : 左忠凯
版本	   : V1.0
描述	   : 裸机实验1 汇编点灯
			 使用汇编来点亮开发板上的LED灯,学习和掌握如何用汇编语言来
			 完成对I.MX6U处理器的GPIO初始化和控制。
其他	   : 无
论坛 	   : www.wtmembed.com
日志	   : 初版V1.0 2019/1/3 左忠凯创建
**************************************************************/

.global _start  /* 全局标号 */

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

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

	/* 2、设置GPIO1_IO03复用为GPIO1_IO03 */
	ldr r0, =0X020E0068	/* 将寄存器SW_MUX_GPIO1_IO03_BASE加载到r0中 */
	ldr r1, =0X5		/* 设置寄存器SW_MUX_GPIO1_IO03_BASE的MUX_MODE为5 */
	str r1,[r0]

	/* 3、配置GPIO1_IO03的IO属性	
	 *bit 16:0 HYS关闭
	 *bit [15:14]: 00 默认下拉
     *bit [13]: 0 kepper功能
     *bit [12]: 1 pull/keeper使能
     *bit [11]: 0 关闭开路输出
     *bit [7:6]: 10 速度100Mhz
     *bit [5:3]: 110 R0/6驱动能力
     *bit [0]: 0 低转换率
     */
    ldr r0, =0X020E02F4	/*寄存器SW_PAD_GPIO1_IO03_BASE */
    ldr r1, =0X10B0
    str r1,[r0]

	/* 4、设置GPIO1_IO03为输出 */
    ldr r0, =0X0209C004	/*寄存器GPIO1_GDIR */
    ldr r1, =0X0000008		
    str r1,[r0]

	/* 5、打开LED0
	 * 设置GPIO1_IO03输出低电平
	 */
	ldr r0, =0X0209C000	/*寄存器GPIO1_DR */
   ldr r1, =0		
   str r1,[r0]

/*
 * 描述:	loop死循环
 */
loop:
	b loop 				

汇编指令:

LDR:主要用于从存储器加载数据到寄存器Rx中

STR:将数据写入到存储器中

b:跳转到标号,一个标号相当于C语言的函数名,是一个指针

3.需要程序分析

3.1 GPIO1 时钟配置

image-20211120220407321

CCM_CCGR0-CCM-CCGR6 控制着I.MX6ULL所有的外设时钟,具体每个寄存器含义如下:

image-20211120221102935

每个寄存器中两个Bit位配置一个时钟的功能,含义如下:

image-20211120221230885

3.2 设置GPIO的的复用功能

IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00 GPIO命名形式

IOMUXC_SW_MUXCTL_PAD_GPIO1_IO00 用来配置复用功能
IOMUXC_SW
PAD_CTL_PAD_GPIO1_IO00 用来配置电气属性

​ 寄存器 IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO00 是用来配置GPIO1_IO00 的,包括速度设置、驱动能力设置、压摆率设置等

image-20211120222659608

​ I.MX6U 的 GPIO 一共有5 组:GPIO1、GPIO2、GPIO3、GPIO4 和GPIO5,其中 GPIO1 有 32 个 IO,GPIO2 有 22 个 IO,GPIO3 有 29 个 IO、GPIO4 有 29 个 IO,GPIO5最少,只有 12 个 IO,这样一共有 124 个 GPIO。如果只想看每个 IO 能复用什么外设的话可以直接查阅《IMX6ULL 参考手册》的第4 章“Chapter 4 External Signals and Pin Multiplexing”。如果我们要编写代码,设置某个 IO 的复用功能的话就需要查阅第 32 章“Chapter 32: IOMUX Controller(IOMUXC)”,第32 章详细的列出了所有 IO 对应的复用配置寄存器

image-20211120223720595

3.3 配置GPIO属性

image-20211120225021246

image-20211120225039478

对照GPIO功能框图来理解各位的含义:

image-20211120225347388

HYS(bit16):用于设置施密特触发器是否使能,如果要对输入波形进行整形的话可以使能迟滞比较器

PUS(bit15-14):用于选择上下拉电阻大小

PUE(bit13):当IO设置输入的时候,该位用来设置使用上下拉还是状态保持,状态保持的含义为,当外部电路断电以后,此IO口可以保持之前的状态

PKE(bit12):此位用来使能/关闭上下拉或者状态保持寄存器

ORE(bit11):使能、关闭IO开漏输出

SPEED(bit7-6):设置IO的速度

DSE(bit5-3):用来配置IO口的驱动能力,即选择上下拉电阻的大小

SRE(bit0):用来配置压摆率,即IO口电平跳变所需要的时间

4 配置GPIO的输入和输出

SW_MUX_CTL_PAD_* 和SW_PAD_CTL_PAD_*两种寄存器。这两种寄存器前面说了用来设置 IO 的复用功能和 IO 属性配置。左上角部分的GPIO 框图就是,当IO 用作 GPIO 的时候需要设置的寄存器,一共有八个:DR、GDIR、PSR、ICR1、ICR2、EDGE_SEL、IMR 和 ISR。 I.MX6U 一共有GPIO1~GPIO5 共五组 GPIO,每组 GPIO 都有这 8 个寄存器

image-20211120234130883

  • GPIOx_DR:一个GPIO组最大只有32个IO,DR寄存器的每一位都对应一个GPIO。当GPIO为输出时,可以向该为写值改变输出的高低点平,当GPIO为输入时,该位记录GPIO电平。

image-20211120235019474

  • GPIOx_GDIR:配置输入或输出

image-20211120235820134

  • GPIOx_PSR功能和输入状态下的DR寄存器相同

image-20211120235955467

  • GPIOx_ICR1、GPIOx_ICR2 用来配置中断的触发方式

image-20211121000325045

  • GPIOx_IMR:GPIO中断的使能和禁止

image-20211121002146588

GPIOx_ISR:可以查找哪个GPIO中断发生

image-20211121002337433

5 程序编译运行

5.1 编译文件

arm-linux-gnueabihf-gcc -g -c led.s -o led.o

​ 由.s文件生.o文件
上述命令就是将 led.s 编译为 led.o,其中“-g”选项是产生调试信息,GDB 能够使用这些调试信息进行代码调试。“-c”选项是编译源文件,但是不链接。“-o”选项是指定编译产生的文件名字,这里我们指定 led.s 编译完成以后的文件名字为 led.o。执行上述命令以后就会编译生成一个led.o 文件

5.2 生成链接文件

arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf

上述命令中-Ttext 就是指定链接地址,“-o”选项指定链接生成的 elf 文件名,这里我们命名为led.elf。上述命令执行完以后就会在工程目录下多一个 led.elf 文件
将编译出来的.o文件链接到0x87800000这个地址,类似于STM32,编译的文件链接 到ROM的起始地址,在这里插入图片描述

5.3 格式转换

arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
 上述命令中,“-O”选项指定以什么格式输出,后面的“binary”表示以二进制格式输出选项“-S”表示不要复制源文件中的重定位信息和符号信息,“-g”表示不复制源文件中的调试

5.4 反汇编

arm-linux-gnueabihf-objdump -D led.elf  >  led.dis

上述代码中的“-D”选项表示反汇编所有的段,反汇编完成以后就会在当前目录下出现一个名为led.dis 文件

总结:
在这里插入图片描述
先生成.o文件,接着对.o文件进行链接并指定链接起始地址,紧接着进行格式转换

5.5 将imxdownload 拷贝到工程根目录

​ imxdownload 拷贝到工程目录

5.6 给予imxdownload 可执行权限 chmod命令

5.7 向SD卡烧写bin文件

.\imxdownload led.bin /dev/sdd

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

i阳光仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值