无锡做网站排名,南昌专业网站制作公司,做兼职去哪个网站,wordpress 添加文章列表系列文章目录 文章目录 系列文章目录前言IMX6ULL介绍主要资料IO表现形式 汇编LED驱动原理图初始化流程时钟设置IO复用设置电气属性设置使用GPIO 编写驱动编译程序编译.o文件地址链接.elf格式转换.bin反汇编#xff08;其他#xff09; 综合成Makefile完成一步编译烧录程序imx…系列文章目录 文章目录 系列文章目录前言IMX6ULL介绍主要资料IO表现形式 汇编LED驱动原理图初始化流程时钟设置IO复用设置电气属性设置使用GPIO 编写驱动编译程序编译.o文件地址链接.elf格式转换.bin反汇编其他 综合成Makefile完成一步编译烧录程序imxdownload准备SD卡向SD卡烧写程序 前言
现在开始正式在开发板上进行开发仍然看的是正点原子的资料 IMX6ULL介绍
主要资料
使用的是Cortex-A7 点击芯片名字打开介绍主要参考的手册是 以及数据手册
IO表现形式
对于一般的STM32来说IO的表现形式为 管教名为PA1管脚的功能在倒数第二列
对于IMX6ULLIO形式在参考手册里面且没有上面的表格目录列表即管教名SNVS_TAMPER2这样格式的是对寄存器介绍的。 下图的这两种有MUX的表示本节介绍的是复用功能 配置其电气模式就是速度、上下拉类似stm32那些 汇编LED驱动
Cortex-A汇编的功能
初始化SOC外设初始化DDR一般内部ROM存放了启动代码读取DDR配置信息完成DDR初始化设置SP指针一般指向DDR设置好C语言环境
原理图 初始化流程
参考STM32的初始化过程
使能GPIO时钟设置IO复用复用为GPIO配置电气属性使用
时钟设置
对IMX6ULL来说CCM为其时钟控制 打开发现CCGR0-6控制了其所有的外设时钟 有几种模式但先直接初始化为11所有模式下都开启且CG0-CG15都这样即0xfffffff 这里有地址0x20C4068
IO复用设置 需要设置为0101即复用为GPIO模式 SION寄存器设置为默认0就行
电气属性设置 SRE(bit0) 对应图 8.1.4.2 中的 SRE设置压摆率当此位为 0 的时候是低压摆率当为 1的时候是高压摆率。这里的压摆率就是 IO 电平跳变所需要的时间高速通信就用高压摆率要过EMC就用低压摆率。
DSE(bit5:3)对应图 8.1.4.2 中的 DSE当 IO 用作输出的时候用来设置 IO 的驱动能力111驱动能力最强。 SPEED(bit7:6) 对应图 8.1.4.2 中的 SPEED当 IO 用作输出的时候此位用来设置 IO 速度 PUE(bit13)当 IO 作为输入的时候为 0 的时候使用状态保持器当为 1 的时候使用上下拉。状态保持器在当外部电路断电以后此 IO 口可以保持住以前的状态。
PKE(bit12) 此位为0 时禁止上下拉/状态保持器为 1 时使能上下拉和状态保持器。
ODE(bit11)当 IO 作为输出的时候此位为 0 的时候禁止开路输出 当此位为 1 的时候就使能开路输出功能。
PUS(bit15:14) 用来设置上下拉电阻的 HYS(bit16)使能迟滞比较器当 IO 作为输入功能的时候有效用于设置输入接收器的施密特触发器是否使能。如果需要对输入波形进行整形的话可以使能此位。此位为 0 的时候禁止迟滞比较器为 1 的时候使能迟滞比较器。
使用GPIO DR读写数据 GDIRIO是输入还是输出 PSR功能和输入状态下的DR寄存器一样读取IO状态 ICR1、ICR2中断控制寄存器ICR1配置IO0-15ICR2配置IO16-31 要设置 GPIO1_IO15为上升沿触发中断那么 GPIO1.ICR1230 IMR中断屏蔽寄存器使能某个 GPIO 的中断那么设置相应的位为 1 即可反之如果要禁止中断那么就设置相应的位为 0使能 GPIO1_IO00 的中断那么就可以设置 GPIO1.MIR1 ISR中断状态寄存器32 位寄存器只要某个 GPIO 的中断发生那么ISR 中相应的位就会被置 1 EDGE_SEL边沿选择寄存器设置边沿中断这个寄存器会覆盖 ICR1 和 ICR2 的设置同样是一个 GPIO 对应一个位。如果相应的位被置 1那么就相当与设置了对应的 GPIO 双边沿触发。
各个地址在这里 以GDIR为例子每一位代表一个IOIO3为1即0x8
编写驱动
.global _start //全局start入口_start://使能所有外设时钟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]// 设置 GPIO1_IO03 复用为 GPIOldr 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, 0X10B0str r1,[r0]//设置为输出模式ldr r0, 0X0209C004 /*寄存器 GPIO1_GDIR */ ldr r1, 0X0000008str r1,[r0]//输出低电平ldr r0, 0X0209C000 /*寄存器 GPIO1_DR */ldr r1, 0str r1,[r0]//loop循环
loopb loop编译程序
编译.o文件 arm-linux-gnueabihf-gcc -g -c leds.s -o leds.o用交叉编译器进行编译“-g”选项是产生调试信息 GDB 能够使用这些调试信息进行代码调试。“-c”选项是编译源文件但是不链接。“-o”选项是指定编译产生的文件名字这里我们指定 led.s 编译完成以后的文件名字为 led.o。
地址链接.elf
在STM32中keil会链接存储的起始地址和运行地址0x80000000 我们烧写到SD卡中上电以后 I.MX6U 的内部 boot rom 程序会将可执行文件拷贝到链接地址处这个链接地址可以在 I.MX6U 的内部 128KB RAM 中(0X900000~0X91FFFF)也可以在外部的 DDR 中。
拷贝到DDR中 链接起始地址为 0X87800000。 I.MX6U-ALPHA 开发板的 DDR 容量有两种 512MB 和256MB起始地址都为 0X80000000只不过 512MB 的终止地址为 0X9FFFFFFF而 256MB 容量的终止地址为 0X8FFFFFFF。之所以选择 0X87800000 这个地址是因为后面要讲的 Uboot 其链接地址就是 0X87800000这样我们统一使用 0X87800000 这个链接地址不容易记混。
arm-linux-gnueabihf-ld -Ttext 0X87800000 leds.o -o leds.elf最后还需要格式转换到bin文件
arm-linux-gnueabihf-objcopy -O binary -S -g leds.elf leds.bin格式转换.bin
arm-linux-gnueabihf-objcopy -O binary -S -g leds.elf leds.bin“-O”选项指定以什么格式输出后面的“binary”表示以二进制格式输出选项“-S”表示不要复制源文件中的重定位信息和符号信息“-g”表示不复制源文件中的调试信息。
反汇编其他
反汇编多数是用 C 语言写的有时候查看其汇编代码来调试一般可以将 elf 文件反汇编
arm-linux-gnueabihf-objdump -D leds.elf leds.dis“-D”选项表示反汇编所有的段反汇编完成以后就会在当前目录下出现一个名为 led.dis 文件
综合成Makefile完成一步编译
创建Makefile文件
leds.bin:leds.sarm-linux-gnueabihf-gcc -g -c leds.s -o leds.oarm-linux-gnueabihf-ld -Ttext 0X87800000 leds.o -o leds.elfarm-linux-gnueabihf-objcopy -O binary -S -g leds.elf leds.binarm-linux-gnueabihf-objdump -D leds.elf leds.dis
clean:rm -rf *.o leds.bin leds.elf leds.dis烧录程序
imxdownload
I.MX6U 支持从外置的 NOR Flash、 NAND Flash、 SD/EMMC、 SPI NOR Flash和 QSPI Flash 这些存储介质中启动所以我们可以将代码烧写到这些存储介质中中。在这些存储介质中除了 SD 卡以外其他的一般都是焊接到了板子上的我们没法直接烧写。
将 imxdownload 拷贝到工程根目录下也就是和 leds.bin 处于同一个文件夹下给予 imxdownload 可执行权限,给予 imxdownload 可执行权限以后其名字变成了绿色的如果没有可执行权限的话其名字颜色是白色的。
chmod 777 imxdownload准备SD卡
ls /dev/sd*查看可知该SD卡挂载/dev/sdb、/dev/sdb1/dev/sdd 是我的 SD 卡 /dev/sdd1 是 SD 卡的第一个分区
向SD卡烧写程序
./imxdownload .bin file SD Card注意如果出现MB/s的烧写速度肯定烧写失败需要重启Ubuntu这里我下载错了应该是/dev/sdb
烧写完成以后会在当前工程目录下生成一个 load.imx 的文件
之后设置为SD卡启动按下复位键