i.MX6ULL裸机开发 一:LED

一、原理图分析

在这里插入图片描述
在这里插入图片描述
从图中可以看出,LED0 接到了 GPIO_3 上,GPIO_3 就是 GPIO1_IO03,当 GPIO1_IO03 输出低电平(0)的时候发光二极管 LED0 就会导通点亮,当 GPIO1_IO03 输出高电平(1)的时候发 光二极管 LED0 不会导通,因此 LED0 也就不会点亮。

二、时钟配置

每个模块的时钟可以独立的关闭,下表详细说明了每个模块可能的时钟活动条件:
在这里插入图片描述

  • 00:在所有模式下时钟关闭。停止进入硬件握手被禁用。
  • 01:在运行模式下时钟是打开的,但在等待和停止模式下是关闭的
  • 10:保留
  • 11:除STOP模式外,所有模式下时钟都是打开的。

GPIO1 时钟由 CCM_CCGR1[CG13] 控制。

IOMUXC 时钟配置:

0、模块时钟 - 根时钟 - 模块时钟控制开关

1、IPT_CLK_IO - LCDIF_PIX_CLK_ROOT - CCGR2[CG7](IOMUX_IPT_CLK_IO_ENABLE)

2、IPG_CLK_S - IPG_CLK_ROOT - IPG_CLK_ROOT - CCGR2[CG2](IOMUXC_SNVS_CLK_ENABLE)

3、IPG_CLK_S - IPG_CLK_ROOT - IPG_CLK_ROOT - CCGR3[CG15](IOMUXC_SNVS_GPR_CLK_ENABLE)

4、IPG_CLK_S - IPG_CLK_ROOT - IPG_CLK_ROOT - CCGR4[CG1](IOMUXC_CLK_ENABLE)

5、IPG_CLK_S - IPG_CLK_ROOT - IPG_CLK_ROOT - CCGR4[CG2](IOMUXC_GPR_CLK_ENABLE)

注:CCM_CCGRx 寄存器复位后值为 11,也就是复位后所有外设时钟都被打开。

三、IO 配置

1、复用功能

IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03 寄存器控制复用功能。复用功能在《参考手册》第 32 章中描述。
在这里插入图片描述

  • SION:强制选择的多路复用模式输入路径,不管多路复用模式功能如何。
  • MUX_MODE:选择复用功能。

MUX_MODE 值为 0x0101 时,选择复用功能为 GPIO1_IO03SION 必须为 0默认情况,复用功能就是GPIO1_IO03。

2、电气属性

IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03 寄存器控制电气属性。电气属性在《参考手册》中第 28 章中描述。
在这里插入图片描述
在这里插入图片描述

  • HSY:使能迟滞比较器。
  • PUS:设置上下拉电阻。
  • PUE:设置 IO 使用上下拉还是状态保持器(输出使用上下拉,输入使用状态保持器)。
  • PKE:使能或者禁止上下拉/状态保持器功能。
  • ODE:禁止或者使能开路输出。
  • SPEED:设置 IO 速度。
  • DSE:设置IO` 的驱动能力。
  • SRE:设置压摆率。

详细内容看手册。

四、GPIO 配置

不需要配置。

五、控制引脚

1、修改 GPIOx_GDIR 寄存器控制输入或输出。

2、操作 GPIOx_DR 寄存器控制引脚电平。

六、编译

1、将 .c.s 文件变为 .o 文件(使用 gcc 工具)。

arm-linux-gnueabihf-gcc -g -c led.s -o led.o
  • -g 选项是产生调试信息,GDB 能够使用这些调试信息进行代码调试。
  • -c 选项是编译源文件,但是不链接。
  • -o 选项是指定编译产生的文件名字。

2、将所有 .o 文件链接为 elf 格式可执行文件(使用 ld 工具)。

arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
  • -Ttext 就是指定链接地址。
  • -o 选项指定链接生成的 elf 文件名。

3、将 elf 文件转为 bin 文件。

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

4、将 elf 文件转为汇编(反汇编)。

arm-linux-gnueabihf-objdump -D led.elf > led.dis
  • -D 选项表示反汇编所有的段。

特别说明

链接就是将所有 .o 文件链接在一起,并且指定链接起始地址。链接以后所有元素就有固定地址,所以运行地址和链接地址要一致,否则运行时函数调用或变量寻址可能出现异常。

对于 6ULL 可以运行代码位置有内部 RAMOCRAM(地址:0x0090_0000 - 0091_FFFF))和 DDR(前提 DDR 初始化成功(地址:从 0x8000_0000 开始))。裸机实验中使用 DDRDDR 的初始化通过在 bin 文件添加的头部将数据传递给 6ULL 内部 boot,由内部 boot 完成相关初始化。内部 boot 可以从 SDEMMC 等外置存储器中读取头部信息。

bin 文件头部格式见《参考手册》中 IVTBoot dataDCD章节。

链接起始地址选为 0x87800000 ,因为这个地址是 uboot 链接地址,方便记忆。

七、代码烧写

1、imxdownload 详解

保留

2、bin文件添加头

保留

3、烧写bin文件

保留

4、合并后过程

使用 imxdownloadSD卡烧写 led.bin 文件,命令格式如下:

./imxdownload <.bin file> <SD Card>

其中 .bin 就是要烧写的 .bin 文件,SD Card 就是你要烧写的 SD 卡,比如我的电脑使用如下命令烧写 led.bin/dev/sdd 中:

./imxdownload led.bin /dev/sdb //不能烧写到/dev/sda 或 sda1 设备里面!那是系统磁盘
onlylove@ubuntu:~/linux/driver/board_driver/1_leds$ ls
imxdownload  led.bin  led.dis  led.elf  led.o  led.s  leds.code-workspace  Makefile
onlylove@ubuntu:~/linux/driver/board_driver/1_leds$ ./imxdownload led.bin /dev/sdb
I.MX6ULL bin download software
Edit by:zuozhongkai
Date:2019/6/10
Version:V1.1
log:V1.0 initial version,just support 512MB DDR3
    V1.1 and support 256MB DDR3
file led.bin size = 88Bytes
Board DDR SIZE: 512MB
Delete Old load.imx
Create New load.imx
Download load.imx to /dev/sdb  ......
[sudo] password for onlylove: 
6+1 records in
6+1 records out
3160 bytes (3.2 kB, 3.1 KiB) copied, 0.0136816 s, 231 kB/s
onlylove@ubuntu:~/linux/driver/board_driver/1_leds$

八、编写代码

1、汇编代码

.global _start /* 全局标号 */

/*
 * 描述: _start 函数,程序从此函数开始执行此函数完成时钟使能、
 *      GPIO 初始化、最终控制 GPIO 输出低电平来点亮 LED 灯。
 */
/*  从官方SDK中摘取
 *  CCM->CCGR0 = 0x00C0000FU;
 *  CCM->CCGR1 = 0xF00C0000U;
 *  CCM->CCGR2 = 0x003F0030U;
 *  CCM->CCGR3 = 0xFF3CC300U;
 *  CCM->CCGR4 = 0x0000F3FCU;
 *  CCM->CCGR5 = 0x00330033U;
 *  CCM->CCGR6 = 0x00CC0300U;
 */

_start:
    /* 1、使能 GPIO1 时钟(设置 CCM_CCGR1[CG13] 为 0x11) */
    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
    ldr r1, =0X5    /* 将寄存器 SW_MUX_GPIO1_IO03_BASE 加载到 r0 中 */
    str r1,[r0]     /* 设置寄存器 SW_MUX_GPIO1_IO03_BASE 的 MUX_MODE 为5 */

    /* 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
    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:
    b loop

2、C代码

1、C语言环境初始化

1、设置处理器工作模式。

2、设置 SP 指针。

3、跳转到 main 函数。

2、ARM栈结构

ARM 架构函数调用栈遵循 APCS 规则。

ARM 采用满栈(降栈)。

3、代码

1、设置 C 语言环境,并跳转到 main

.global __start /* 全局标号 */

/*
 * 描述: _start 函数,程序从此函数开始执行,此函数主要功能是设置 C 运行环境。
 * 注:I.MX6U 内部的 Boot ROM 会读取 DCD 数据中的 DDR 配置参数然后完成 DDR 初始化。
 */
__start:
    /* 设置处理器进入 SVC 模式 */
    mrs r0, cpsr        /* 将 r0 的低 5 位清零,也就是 cpsr 的 M0~M4 */
    bic r0, r0, #0x1f   /* r0或上 0x13,表示使用 SVC 模式 */
    orr r0, r0, #0x13   /* 将 r0 的数据写入到 cpsr_c 中 */
    msr cpsr, r0

    ldr sp, =0X80200000 /* 设置栈指针 */
    b main              /* 跳转到 main 函数 */

2、寄存器地址映射

#ifndef __MAIN_H__
#define __MAIN_H__

/*
 * CCM相关寄存器地址
 */
#define CCM_CCGR0   *((volatile unsigned int *)0X020C4068)
#define CCM_CCGR1   *((volatile unsigned int *)0X020C406C)
#define CCM_CCGR2   *((volatile unsigned int *)0X020C4070)
#define CCM_CCGR3   *((volatile unsigned int *)0X020C4074)
#define CCM_CCGR4   *((volatile unsigned int *)0X020C4078)
#define CCM_CCGR5   *((volatile unsigned int *)0X020C407C)
#define CCM_CCGR6   *((volatile unsigned int *)0X020C4080)

/*
 * IOMUX 相关寄存器地址
 */
#define SW_MUX_GPIO1_IO03   *((volatile unsigned int *)0X020E0068)
#define SW_PAD_GPIO1_IO03   *((volatile unsigned int *)0X020E02F4)

/*
 * GPIO1 相关寄存器地址
 */
#define GPIO1_DR        *((volatile unsigned int *)0X0209C000)
#define GPIO1_GDIR      *((volatile unsigned int *)0X0209C004)
#define GPIO1_PSR       *((volatile unsigned int *)0X0209C008)
#define GPIO1_ICR1      *((volatile unsigned int *)0X0209C00C)
#define GPIO1_ICR2      *((volatile unsigned int *)0X0209C010)
#define GPIO1_IMR       *((volatile unsigned int *)0X0209C014)
#define GPIO1_ISR       *((volatile unsigned int *)0X0209C018)
#define GPIO1_EDGE_SEL  *((volatile unsigned int *)0X0209C01C)

#endif

3、编写 led 闪烁代码

#include "main.h"

/*
 *  使能 I.MX6U 所有外设时钟
 */
void clk_enable(void)
{
    CCM_CCGR0 = 0xffffffff;
    CCM_CCGR1 = 0xffffffff;
    CCM_CCGR2 = 0xffffffff;
    CCM_CCGR3 = 0xffffffff;
    CCM_CCGR4 = 0xffffffff;
    CCM_CCGR5 = 0xffffffff;
    CCM_CCGR6 = 0xffffffff;
}

void led_init(void)
{
    /* 1、初始化 IO 复用, 复用为 GPIO1_IO03 */
    SW_MUX_GPIO1_IO03 = 0x5;
    /* 2、配置 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 低转换率
     */
    SW_PAD_GPIO1_IO03 = 0X10B0;
    /* 3、初始化 GPIO, GPIO1_IO03 设置为输出 */
    GPIO1_GDIR = 0X0000008;
    /* 4、设置 GPIO1_IO03 输出低电平,打开 LED0 */
    GPIO1_DR = 0X0;
}

/*
 *  打开 LED 灯
 */
void led_on(void)
{
    GPIO1_DR &= ~(1<<3);
}

/*
 *  关闭 LED 灯
 */
void led_off(void)
{
    GPIO1_DR |= (1<<3);
}

void delay_short(volatile unsigned int n)
{
    while(n--){}
}

void delay(volatile unsigned int n)
{
    while(n--){
        delay_short(0x7ff);
    }
}

int main(void)
{
    clk_enable();
    led_init();
    while(1){
        led_off();
        delay(500);

        led_on();
        delay(500);
    }
    return 0;
}

4、设计可执行文件映像结构

注:通过链接脚本完成,详细信息见链接器用户手册。

链接脚本用于描述文件应该如何被链接在一起形成最终的可执行文件。其主要目的是描述输入文件中的段如何被映射到输出文件中,并且控制输出文件中的内存排布

SECTIONS{
    . = 0X87800000;     /* 设置定位计数器(链接起始地址) */
    .text :
    {
        start.o         /* 开始位置的文件为start.o, start.o 里面包含着第一个要执行的指令 */
        main.o          /*  */
        *(.text)
    }
    .rodata ALIGN(4) : {*(.rodata*)}
    .data ALIGN(4) : { *(.data) }
    __bss_start = .;    /* '.' 为定位符, __bss_start 标志方便对 .bss 段清零 */
    .bss ALIGN(4) : { *(.bss) *(COMMON) }
    __bss_end = .;
}

5、编写 Makefile

objs := start.o main.o

ledc.bin:$(objs)
	arm-linux-gnueabihf-ld -T imx6ul.lds -o ledc.elf $^
	arm-linux-gnueabihf-objcopy -O binary -S ledc.elf $@
	arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis

%.o:%.s
	arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<

%.o:%.S
	arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<

%.o:%.c
	arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o $@ $<

clean:
	rm -rf *.o ledc.bin ledc.elf ledc.dis

九、验证

1、编译结果

onlylove@ubuntu:~/linux/driver/board_driver/2_ledc$ ls
imx6ul.lds  main.c  main.h  Makefile  start.s
onlylove@ubuntu:~/linux/driver/board_driver/2_ledc$ make
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o start.o start.s
arm-linux-gnueabihf-gcc -Wall -nostdlib -c -o main.o main.c
arm-linux-gnueabihf-ld -T imx6ul.lds -o ledc.elf start.o main.o
arm-linux-gnueabihf-objcopy -O binary -S ledc.elf ledc.bin
arm-linux-gnueabihf-objdump -D -m arm ledc.elf > ledc.dis
onlylove@ubuntu:~/linux/driver/board_driver/2_ledc$ ls
imx6ul.lds  ledc.bin  ledc.dis  ledc.elf  main.c  main.h  main.o  Makefile  start.o  start.s

2、ledc.dis 内容


ledc.elf:     file format elf32-littlearm


Disassembly of section .text:

87800000 <__start>:
87800000:	e10f0000 	mrs	r0, CPSR
87800004:	e3c0001f 	bic	r0, r0, #31
87800008:	e3800013 	orr	r0, r0, #19
8780000c:	e129f000 	msr	CPSR_fc, r0
87800010:	e51fd000 	ldr	sp, [pc, #-0]	; 87800018 <__start+0x18>
87800014:	ea000061 	b	878001a0 <__main_from_arm>
87800018:	80200000 	eorhi	r0, r0, r0
8780001c:	00001e41 	andeq	r1, r0, r1, asr #28
87800020:	61656100 	cmnvs	r5, r0, lsl #2
87800024:	01006962 	tsteq	r0, r2, ror #18
87800028:	00000014 	andeq	r0, r0, r4, lsl r0
8780002c:	412d3705 	teqmi	sp, r5, lsl #14
87800030:	070a0600 	streq	r0, [sl, -r0, lsl #12]
87800034:	09010841 	stmdbeq	r1, {r0, r6, fp}
87800038:	00040a02 	andeq	r0, r4, r2, lsl #20

8780003c <clk_enable>:
8780003c:	b480      	push	{r7}
8780003e:	af00      	add	r7, sp, #0
87800040:	f244 0368 	movw	r3, #16488	; 0x4068
87800044:	f2c0 230c 	movt	r3, #524	; 0x20c
87800048:	f04f 32ff 	mov.w	r2, #4294967295	; 0xffffffff
8780004c:	601a      	str	r2, [r3, #0]
8780004e:	f244 036c 	movw	r3, #16492	; 0x406c
87800052:	f2c0 230c 	movt	r3, #524	; 0x20c
87800056:	f04f 32ff 	mov.w	r2, #4294967295	; 0xffffffff
8780005a:	601a      	str	r2, [r3, #0]
8780005c:	f244 0370 	movw	r3, #16496	; 0x4070
87800060:	f2c0 230c 	movt	r3, #524	; 0x20c
87800064:	f04f 32ff 	mov.w	r2, #4294967295	; 0xffffffff
87800068:	601a      	str	r2, [r3, #0]
8780006a:	f244 0374 	movw	r3, #16500	; 0x4074
8780006e:	f2c0 230c 	movt	r3, #524	; 0x20c
87800072:	f04f 32ff 	mov.w	r2, #4294967295	; 0xffffffff
87800076:	601a      	str	r2, [r3, #0]
87800078:	f244 0378 	movw	r3, #16504	; 0x4078
8780007c:	f2c0 230c 	movt	r3, #524	; 0x20c
87800080:	f04f 32ff 	mov.w	r2, #4294967295	; 0xffffffff
87800084:	601a      	str	r2, [r3, #0]
87800086:	f244 037c 	movw	r3, #16508	; 0x407c
8780008a:	f2c0 230c 	movt	r3, #524	; 0x20c
8780008e:	f04f 32ff 	mov.w	r2, #4294967295	; 0xffffffff
87800092:	601a      	str	r2, [r3, #0]
87800094:	f44f 4381 	mov.w	r3, #16512	; 0x4080
87800098:	f2c0 230c 	movt	r3, #524	; 0x20c
8780009c:	f04f 32ff 	mov.w	r2, #4294967295	; 0xffffffff
878000a0:	601a      	str	r2, [r3, #0]
878000a2:	46bd      	mov	sp, r7
878000a4:	f85d 7b04 	ldr.w	r7, [sp], #4
878000a8:	4770      	bx	lr
878000aa:	bf00      	nop

878000ac <led_init>:
878000ac:	b480      	push	{r7}
878000ae:	af00      	add	r7, sp, #0
878000b0:	2368      	movs	r3, #104	; 0x68
878000b2:	f2c0 230e 	movt	r3, #526	; 0x20e
878000b6:	2205      	movs	r2, #5
878000b8:	601a      	str	r2, [r3, #0]
878000ba:	f44f 733d 	mov.w	r3, #756	; 0x2f4
878000be:	f2c0 230e 	movt	r3, #526	; 0x20e
878000c2:	f241 02b0 	movw	r2, #4272	; 0x10b0
878000c6:	601a      	str	r2, [r3, #0]
878000c8:	f24c 0304 	movw	r3, #49156	; 0xc004
878000cc:	f2c0 2309 	movt	r3, #521	; 0x209
878000d0:	2208      	movs	r2, #8
878000d2:	601a      	str	r2, [r3, #0]
878000d4:	f44f 4340 	mov.w	r3, #49152	; 0xc000
878000d8:	f2c0 2309 	movt	r3, #521	; 0x209
878000dc:	2200      	movs	r2, #0
878000de:	601a      	str	r2, [r3, #0]
878000e0:	46bd      	mov	sp, r7
878000e2:	f85d 7b04 	ldr.w	r7, [sp], #4
878000e6:	4770      	bx	lr

878000e8 <led_on>:
878000e8:	b480      	push	{r7}
878000ea:	af00      	add	r7, sp, #0
878000ec:	f44f 4340 	mov.w	r3, #49152	; 0xc000
878000f0:	f2c0 2309 	movt	r3, #521	; 0x209
878000f4:	f44f 4240 	mov.w	r2, #49152	; 0xc000
878000f8:	f2c0 2209 	movt	r2, #521	; 0x209
878000fc:	6812      	ldr	r2, [r2, #0]
878000fe:	f022 0208 	bic.w	r2, r2, #8
87800102:	601a      	str	r2, [r3, #0]
87800104:	46bd      	mov	sp, r7
87800106:	f85d 7b04 	ldr.w	r7, [sp], #4
8780010a:	4770      	bx	lr

8780010c <led_off>:
8780010c:	b480      	push	{r7}
8780010e:	af00      	add	r7, sp, #0
87800110:	f44f 4340 	mov.w	r3, #49152	; 0xc000
87800114:	f2c0 2309 	movt	r3, #521	; 0x209
87800118:	f44f 4240 	mov.w	r2, #49152	; 0xc000
8780011c:	f2c0 2209 	movt	r2, #521	; 0x209
87800120:	6812      	ldr	r2, [r2, #0]
87800122:	f042 0208 	orr.w	r2, r2, #8
87800126:	601a      	str	r2, [r3, #0]
87800128:	46bd      	mov	sp, r7
8780012a:	f85d 7b04 	ldr.w	r7, [sp], #4
8780012e:	4770      	bx	lr

87800130 <delay_short>:
87800130:	b480      	push	{r7}
87800132:	b083      	sub	sp, #12
87800134:	af00      	add	r7, sp, #0
87800136:	6078      	str	r0, [r7, #4]
87800138:	bf00      	nop
8780013a:	687b      	ldr	r3, [r7, #4]
8780013c:	1e5a      	subs	r2, r3, #1
8780013e:	607a      	str	r2, [r7, #4]
87800140:	2b00      	cmp	r3, #0
87800142:	d1fa      	bne.n	8780013a <delay_short+0xa>
87800144:	370c      	adds	r7, #12
87800146:	46bd      	mov	sp, r7
87800148:	f85d 7b04 	ldr.w	r7, [sp], #4
8780014c:	4770      	bx	lr
8780014e:	bf00      	nop

87800150 <delay>:
87800150:	b580      	push	{r7, lr}
87800152:	b082      	sub	sp, #8
87800154:	af00      	add	r7, sp, #0
87800156:	6078      	str	r0, [r7, #4]
87800158:	e003      	b.n	87800162 <delay+0x12>
8780015a:	f240 70ff 	movw	r0, #2047	; 0x7ff
8780015e:	f7ff ffe7 	bl	87800130 <delay_short>
87800162:	687b      	ldr	r3, [r7, #4]
87800164:	1e5a      	subs	r2, r3, #1
87800166:	607a      	str	r2, [r7, #4]
87800168:	2b00      	cmp	r3, #0
8780016a:	d1f6      	bne.n	8780015a <delay+0xa>
8780016c:	3708      	adds	r7, #8
8780016e:	46bd      	mov	sp, r7
87800170:	bd80      	pop	{r7, pc}
87800172:	bf00      	nop

87800174 <main>:
87800174:	b580      	push	{r7, lr}
87800176:	af00      	add	r7, sp, #0
87800178:	f7ff ff60 	bl	8780003c <clk_enable>
8780017c:	f7ff ff96 	bl	878000ac <led_init>
87800180:	f7ff ffc4 	bl	8780010c <led_off>
87800184:	f44f 70fa 	mov.w	r0, #500	; 0x1f4
87800188:	f7ff ffe2 	bl	87800150 <delay>
8780018c:	f7ff ffac 	bl	878000e8 <led_on>
87800190:	f44f 70fa 	mov.w	r0, #500	; 0x1f4
87800194:	f7ff ffdc 	bl	87800150 <delay>
87800198:	e7f2      	b.n	87800180 <main+0xc>
8780019a:	bf00      	nop
8780019c:	0000      	movs	r0, r0
	...

878001a0 <__main_from_arm>:
878001a0:	e51ff004 	ldr	pc, [pc, #-4]	; 878001a4 <__main_from_arm+0x4>
878001a4:	87800175 			; <UNDEFINED> instruction: 0x87800175
878001a8:	3a434347 	bcc	888d0ecc <__bss_end+0x10d0ccb>
878001ac:	694c2820 	stmdbvs	ip, {r5, fp, sp}^
878001b0:	6f72616e 	svcvs	0x0072616e
878001b4:	43434720 	movtmi	r4, #14112	; 0x3720
878001b8:	392e3420 	stmdbcc	lr!, {r5, sl, ip, sp}
878001bc:	3130322d 	teqcc	r0, sp, lsr #4
878001c0:	31302e37 	teqcc	r0, r7, lsr lr
878001c4:	2e342029 	cdpcs	0, 3, cr2, cr4, cr9, {1}
878001c8:	00342e39 	eorseq	r2, r4, r9, lsr lr
878001cc:	00003441 	andeq	r3, r0, r1, asr #8
878001d0:	61656100 	cmnvs	r5, r0, lsl #2
878001d4:	01006962 	tsteq	r0, r2, ror #18
878001d8:	0000002a 	andeq	r0, r0, sl, lsr #32
878001dc:	412d3705 	teqmi	sp, r5, lsl #14
878001e0:	070a0600 	streq	r0, [sl, -r0, lsl #12]
878001e4:	09010841 	stmdbeq	r1, {r0, r6, fp}
878001e8:	12040a02 	andne	r0, r4, #8192	; 0x2000
878001ec:	15011404 	strne	r1, [r1, #-1028]	; 0x404
878001f0:	18031701 	stmdane	r3, {r0, r8, r9, sl, ip}
878001f4:	1a011901 	bne	87846600 <__bss_end+0x463ff>
878001f8:	1c031b02 	stcne	11, cr1, [r3], {2}
878001fc:	22061e01 	andcs	r1, r6, #1, 28
87800200:	Address 0x0000000087800200 is out of bounds.
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值