原理分析
原理图分析
根据原理图可以得知,连接板子LED灯珠的是GPIO1_3,当GPIO1_3输出低电平时LED被点亮。
初始化步骤
① 使能时钟(CCM模块),CCM_CCGR0到CCM_CCGR6七个寄存器控制了所有的外设时钟,查询数据手册得知CCGR1的27-26位控制了GPIO1外设的时钟

00 关闭外设时钟。01 只在正常运行有时钟。10 保留不用。11 正常使用时钟

② IO复用寄存器IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03

③ 配置电气属性。IOMUXC_SW_PAD_CTL_PAD_GPIO1_IO03寄存器是设置GPIO1_3的电气属性的。重点设置压摆率、速度、驱动能力、开漏、上下拉
1 | HSE bit16 使能迟滞比较器 |



汇编程序编写
根据上面的步骤依次编写汇编代码,寄存器地址在数据手册中查询。
① 使能时钟模块
1 | LDR R0, =0X020C406C |
② 复用IO口
1 | LDR R0, =0X020E0068 |
③ 配置电气属性
1 | LDR R0, =0X020E02F4 |
④ 配置GPIO模块为输出模式,并设置为低电平
1 | LDR R0, =0X0209C004 |
最终代码
1 | .GLOBAL _start |
编译及运行
编译
① 使用arm-linux-gnueabihf-gcc将.c .s文件编译为.o
1 | arm-linux-gnueabihf-gcc -g -c led.s -o led.o |
② 将所有的.o文件链接为elf格式的可执行文件,本实验链接的时候要指定链接起始地址,起始地址是指代码运行的起始地址。对于6ULL来说,链接起始地址应该指向RAM地址。RAM分为内部RAM和外部RAM,也就是DDR。6ULL内部RAM地址范围0X9000000-0X91FFFF,也可以在外部的 DDR 中。本教程所有裸机例程的链接地址都在 DDR 中,链接起始地址为 0X87800000。
1 | arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf |
③ 将elf文件转为bin文件,对于I.MX来说,bin文件不能直接运行,需要添加一个头部信息,这个头部信息包含了DDR的初始化参数,I.MX系列SOC内部boot rom会从SD卡、EMMC等外部存储中读取头部信息并初始化DDR,并且将bin文件拷贝到指定地方(链接起始地址),BIN的运行地址一定要和链接起始地址一致,位置无关代码除外。
1 | arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin |
④ 将elf文件转为汇编(反汇编)
烧写到SD卡
1 | ./imxdownload <.bin file> <SD Card> |
运行结果
