【ARM-day05-led实验】
IOMUXC寄存器地址表-----参考手册1542页
MUX复用功能
PAD电器特性
I.MX6ULL: 管脚名字:PAD BOOT MODE0,
管脚的复用功能:IOMUXC SNVS SW MUX CTL PAD BOOT MODEO.
IOMUXC SNVS SW_PAD_CTL PAD BOOT MODEO.
对于 6ULL,查看管脚复用的步骤:
1、打开参考手册。
2、找到 32 章,10 复用章节,
3、查找对应的管脚。
为什么要学习 Cortex-A 汇编:
1、需要用汇编初始化一些 SOC 外设。
2、使用汇编初始化 DDR,I.MX6U 不需要。
3、设置 sp指针,一般指向 DDR(可以理解为内存),设置好C语言运行环境。
1.MX6ULLIO 初始化:
①、使能时钟,CCGRO~CCGR6这7个寄存器控制着6ULL所有外设时钟的使能。为了简单,设置CCGRO~CCGR6这7个寄存器全部为0XFFFFFFFF,相当于使能所有外设时钟。
②、IO复用:
将寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03的bit 0 ~3设置为0101=5,这样GPIO1_IO03就复用为GPIO。
③、电气特性设置:
将寄存器IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03是设置GPIO1_IO03的电气属性。
重点设置压摆率SRE、驱动能力DSE、速度SPEED、上下拉PUS、开漏
④、配置GPIO功能,设置输入输出。 设置GPIO1_DR寄存器Bit 3 为1, 也就是设置为输出模式。设置GPIO1_GDIR寄存器的bit 3,为1表示高电平,为0表示低电平。
ICR1 / ICR2寄存器:一组ICR寄存最多只能配置16个10,一组GPIO最多有32个I0,因此需要两个ICR寄存器也就是ICR1和ICR2。ICR1负责低16个I0,ICR2负责高16高16个I0
1.链接脚本的作用?各个段存放什么类型数据
自己写的imx6ull.lds文件
链接脚本作用:
链接脚本决定了程序中各个段(代码段、数据段、只读数据段、bss 段)的 存放地址,最终把所有目标文件 .o 链接成一个可执行镜像 .elf
,再由 objcopy
转成 .bin
下载到开发板。
在裸机开发里,必须精确指定起始地址(代码中 . = 0x87800000
),因为 MCU/SoC 没有操作系统来做内存映射,CPU 上电后会从固定地址取指令。
各个段存放的内容
.text
段:存放代码(函数体、指令)。
比如main
、clock_init
、led_init
等函数编译后的指令。.rodata
段:存放只读数据(常量、字符串字面值)。
例如const char *p = "Hello";
中的"Hello"
就在这里。.data
段:存放已初始化的全局变量或静态变量。.bss
段:存放未初始化的全局变量和静态变量,程序启动时清零。
总结:链接脚本就是告诉链接器 把程序放到什么地址、各个段怎么排布。
.text
→ 代码.rodata
→ 常量.data
→ 已初始化全局变量.bss
→ 未初始化全局变量
2.编译过程需要哪些工具,分别什么作用?
gcc (arm-linux-gnueabihf-gcc)
把
.c
文件编译成.o
目标文件。
as(隐含在 gcc 里)
把
.S
汇编文件编译成.o
。
ld (arm-linux-gnueabihf-ld)
链接所有
.o
,按照imx6ull.lds
脚本,把它们放到指定的段地址,生成可执行文件.elf
。
objcopy (arm-linux-gnueabihf-objcopy)
把
.elf
转成纯二进制.bin
,用于烧写到开发板。
objdump (arm-linux-gnueabihf-objdump)
反汇编
.elf
文件,生成.dis
文件,便于调试查看。
imxdownload
自己写的下载工具,把
.bin
文件下载到指定设备/dev/sdb
(TF 卡/U 盘/SD 卡)。
总结:
gcc
/as
→ 编译 C/汇编成目标文件ld
→ 按链接脚本把目标文件拼成.elf
objcopy
→ 生成.bin
objdump
→ 反汇编,供分析imxdownload
→ 下载到板子